mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-26 16:26:24 +01:00
The handle_info clause that treats routing order is now converted.
In-memory sets and dict still use the short JID form with empty strings for unspecified fields. Users are able to connect to ejabberd but some features don't seem to work proprerly. SVN Revision: 1376
This commit is contained in:
parent
e95df7999f
commit
4e2e68a3fb
@ -1,3 +1,10 @@
|
|||||||
|
2008-06-24 Jean-Sébastien Pédron <js.pedron@meetic-corp.com>
|
||||||
|
|
||||||
|
* src/ejabberd_c2s.erl: The handle_info clause that treats routing
|
||||||
|
order is now converted. In-memory sets and dict still use the short
|
||||||
|
JID form with empty strings for unspecified fields. Users are able to
|
||||||
|
connect to ejabberd but some features don't seem to work proprerly.
|
||||||
|
|
||||||
2008-06-23 Jean-Sébastien Pédron <js.pedron@meetic-corp.com>
|
2008-06-23 Jean-Sébastien Pédron <js.pedron@meetic-corp.com>
|
||||||
|
|
||||||
* src/ejabberd_c2s.erl (session_established): Convert JID to the
|
* src/ejabberd_c2s.erl (session_established): Convert JID to the
|
||||||
|
@ -872,8 +872,8 @@ session_established({xmlstreamelement, El}, StateData) ->
|
|||||||
PresenceEl = exmpp_xml:xmlelement_to_xmlel(PresenceElOld,
|
PresenceEl = exmpp_xml:xmlelement_to_xmlel(PresenceElOld,
|
||||||
?DEFAULT_NS, ?PREFIXED_NS),
|
?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
% XXX OLD FORMAT: PresenceElOld, *JID.
|
% XXX OLD FORMAT: PresenceElOld, *JID.
|
||||||
FromJIDOld = exmpp_jid:to_ejabberd_jid(FromJID),
|
FromJIDOld = exmpp_jid:to_ejabberd_jid(FromJID),
|
||||||
ToJIDOld = exmpp_jid:to_ejabberd_jid(ToJID),
|
ToJIDOld = exmpp_jid:to_ejabberd_jid(ToJID),
|
||||||
ejabberd_hooks:run(
|
ejabberd_hooks:run(
|
||||||
user_send_packet,
|
user_send_packet,
|
||||||
Server,
|
Server,
|
||||||
@ -893,15 +893,17 @@ session_established({xmlstreamelement, El}, StateData) ->
|
|||||||
StateData)
|
StateData)
|
||||||
end;
|
end;
|
||||||
#xmlel{ns = ?NS_JABBER_CLIENT, name = 'iq'} ->
|
#xmlel{ns = ?NS_JABBER_CLIENT, name = 'iq'} ->
|
||||||
% XXX OLD FORMAT: JIDs.
|
% XXX OLD FORMAT: JIDs.
|
||||||
FromJIDOld = exmpp_jid:to_ejabberd_jid(FromJID),
|
FromJIDOld = exmpp_jid:to_ejabberd_jid(FromJID),
|
||||||
ToJIDOld = exmpp_jid:to_ejabberd_jid(ToJID),
|
ToJIDOld = exmpp_jid:to_ejabberd_jid(ToJID),
|
||||||
case exmpp_iq:get_payload(El) of
|
case exmpp_iq:get_payload(El) of
|
||||||
#xmlel{ns = ?NS_PRIVACY} ->
|
#xmlel{ns = ?NS_PRIVACY} ->
|
||||||
% XXX OLD FORMAT: IQ was #iq.
|
% XXX OLD FORMAT: IQ was #iq.
|
||||||
IQ_Record = exmpp_iq:to_ejabberd_iq(El),
|
ElOld2 = exmpp_xml:xmlel_to_xmlelement(El,
|
||||||
|
?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
|
IQ = jlib:iq_query_info(ElOld2),
|
||||||
process_privacy_iq(
|
process_privacy_iq(
|
||||||
FromJIDOld, ToJIDOld, IQ_Record, StateData);
|
FromJIDOld, ToJIDOld, IQ, StateData);
|
||||||
_ ->
|
_ ->
|
||||||
% XXX OLD FORMAT: NewElOld.
|
% XXX OLD FORMAT: NewElOld.
|
||||||
NewElOld = exmpp_xml:xmlel_to_xmlelement(NewEl,
|
NewElOld = exmpp_xml:xmlel_to_xmlelement(NewEl,
|
||||||
@ -919,8 +921,8 @@ session_established({xmlstreamelement, El}, StateData) ->
|
|||||||
% XXX OLD FORMAT: NewElOld, JIDs.
|
% XXX OLD FORMAT: NewElOld, JIDs.
|
||||||
NewElOld = exmpp_xml:xmlel_to_xmlelement(NewEl,
|
NewElOld = exmpp_xml:xmlel_to_xmlelement(NewEl,
|
||||||
?DEFAULT_NS, ?PREFIXED_NS),
|
?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
FromJIDOld = exmpp_jid:to_ejabberd_jid(FromJID),
|
FromJIDOld = exmpp_jid:to_ejabberd_jid(FromJID),
|
||||||
ToJIDOld = exmpp_jid:to_ejabberd_jid(ToJID),
|
ToJIDOld = exmpp_jid:to_ejabberd_jid(ToJID),
|
||||||
ejabberd_hooks:run(user_send_packet,
|
ejabberd_hooks:run(user_send_packet,
|
||||||
Server,
|
Server,
|
||||||
[FromJIDOld, ToJIDOld, NewElOld]),
|
[FromJIDOld, ToJIDOld, NewElOld]),
|
||||||
@ -1055,15 +1057,20 @@ handle_info(replaced, _StateName, StateData) ->
|
|||||||
send_element(StateData, exmpp_stream:error('conflict')),
|
send_element(StateData, exmpp_stream:error('conflict')),
|
||||||
send_element(StateData, exmpp_stream:closing()),
|
send_element(StateData, exmpp_stream:closing()),
|
||||||
{stop, normal, StateData#state{authenticated = replaced}};
|
{stop, normal, StateData#state{authenticated = replaced}};
|
||||||
handle_info({route, From, To, Packet}, StateName, StateData) ->
|
handle_info({route, FromOld, ToOld, PacketOld}, StateName, StateData) ->
|
||||||
{xmlelement, Name, Attrs, Els} = Packet,
|
%% XXX OLD FORMAT: From, To and Packet are in the old format.
|
||||||
|
Packet = exmpp_xml:xmlelement_to_xmlel(PacketOld,
|
||||||
|
?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
|
From = exmpp_jid:from_ejabberd_jid(FromOld),
|
||||||
|
To = exmpp_jid:from_ejabberd_jid(ToOld),
|
||||||
{Pass, NewAttrs, NewState} =
|
{Pass, NewAttrs, NewState} =
|
||||||
case Name of
|
case Packet of
|
||||||
"presence" ->
|
#xmlel{ns = ?NS_JABBER_CLIENT, name = 'presence', attrs = Attrs} ->
|
||||||
case xml:get_attr_s("type", Attrs) of
|
case exmpp_presence:get_type(Packet) of
|
||||||
"probe" ->
|
'probe' ->
|
||||||
LFrom = jlib:jid_tolower(From),
|
% XXX OLD FORMAT: LFrom and LBFrom.
|
||||||
LBFrom = jlib:jid_remove_resource(LFrom),
|
LFrom = short_jid(From),
|
||||||
|
LBFrom = short_jid(exmpp_jid:jid_to_bare_jid(From)),
|
||||||
NewStateData =
|
NewStateData =
|
||||||
case ?SETS:is_element(
|
case ?SETS:is_element(
|
||||||
LFrom, StateData#state.pres_a) orelse
|
LFrom, StateData#state.pres_a) orelse
|
||||||
@ -1075,6 +1082,8 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
|||||||
case ?SETS:is_element(
|
case ?SETS:is_element(
|
||||||
LFrom, StateData#state.pres_f) of
|
LFrom, StateData#state.pres_f) of
|
||||||
true ->
|
true ->
|
||||||
|
% XXX OLD FORMAT: Stores old short
|
||||||
|
% JIDs.
|
||||||
A = ?SETS:add_element(
|
A = ?SETS:add_element(
|
||||||
LFrom,
|
LFrom,
|
||||||
StateData#state.pres_a),
|
StateData#state.pres_a),
|
||||||
@ -1083,6 +1092,8 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
|||||||
case ?SETS:is_element(
|
case ?SETS:is_element(
|
||||||
LBFrom, StateData#state.pres_f) of
|
LBFrom, StateData#state.pres_f) of
|
||||||
true ->
|
true ->
|
||||||
|
% XXX OLD FORMAT: Stores
|
||||||
|
% old short JIDs.
|
||||||
A = ?SETS:add_element(
|
A = ?SETS:add_element(
|
||||||
LBFrom,
|
LBFrom,
|
||||||
StateData#state.pres_a),
|
StateData#state.pres_a),
|
||||||
@ -1092,40 +1103,51 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
process_presence_probe(From, To, NewStateData),
|
% XXX OLD FORMAT: FromOld and ToOld
|
||||||
|
process_presence_probe(FromOld, ToOld, NewStateData),
|
||||||
{false, Attrs, NewStateData};
|
{false, Attrs, NewStateData};
|
||||||
"error" ->
|
'error' ->
|
||||||
NewA = remove_element(jlib:jid_tolower(From),
|
% XXX OLD FORMAT: LFrom.
|
||||||
|
LFrom = short_jid(From),
|
||||||
|
NewA = remove_element(LFrom,
|
||||||
StateData#state.pres_a),
|
StateData#state.pres_a),
|
||||||
{true, Attrs, StateData#state{pres_a = NewA}};
|
{true, Attrs, StateData#state{pres_a = NewA}};
|
||||||
"invisible" ->
|
'invisible' ->
|
||||||
Attrs1 = lists:keydelete("type", 1, Attrs),
|
% XXX OLD FORMAT: Create a function to change 'type'.
|
||||||
{true, [{"type", "unavailable"} | Attrs1], StateData};
|
Attrs1 = exmpp_stanza:set_type_in_attrs(Attrs,
|
||||||
"subscribe" ->
|
"unavailable"),
|
||||||
|
{true, Attrs1, StateData};
|
||||||
|
'subscribe' ->
|
||||||
{true, Attrs, StateData};
|
{true, Attrs, StateData};
|
||||||
"subscribed" ->
|
'subscribed' ->
|
||||||
{true, Attrs, StateData};
|
{true, Attrs, StateData};
|
||||||
"unsubscribe" ->
|
'unsubscribe' ->
|
||||||
{true, Attrs, StateData};
|
{true, Attrs, StateData};
|
||||||
"unsubscribed" ->
|
'unsubscribed' ->
|
||||||
{true, Attrs, StateData};
|
{true, Attrs, StateData};
|
||||||
_ ->
|
_ ->
|
||||||
|
% XXX OLD FORMAT: From, To, Packet.
|
||||||
case ejabberd_hooks:run_fold(
|
case ejabberd_hooks:run_fold(
|
||||||
privacy_check_packet, StateData#state.server,
|
privacy_check_packet, StateData#state.server,
|
||||||
allow,
|
allow,
|
||||||
[StateData#state.user,
|
[StateData#state.user,
|
||||||
StateData#state.server,
|
StateData#state.server,
|
||||||
StateData#state.privacy_list,
|
StateData#state.privacy_list,
|
||||||
{From, To, Packet},
|
{FromOld, ToOld, PacketOld},
|
||||||
in]) of
|
in]) of
|
||||||
allow ->
|
allow ->
|
||||||
LFrom = jlib:jid_tolower(From),
|
% XXX OLD FORMAT: LFrom and LBFrom.
|
||||||
LBFrom = jlib:jid_remove_resource(LFrom),
|
LFrom = short_jid(From),
|
||||||
|
LBFrom = short_jid(
|
||||||
|
exmpp_jid:jid_to_bare_jid(From)),
|
||||||
%% Note contact availability
|
%% Note contact availability
|
||||||
|
% XXX OLD FORMAT: Els are #xmlelement.
|
||||||
|
Els = PacketOld#xmlelement.children,
|
||||||
Caps = mod_caps:read_caps(Els),
|
Caps = mod_caps:read_caps(Els),
|
||||||
mod_caps:note_caps(StateData#state.server, From, Caps),
|
% XXX OLD FORMAT: From.
|
||||||
NewAvailable = case xml:get_attr_s("type", Attrs) of
|
mod_caps:note_caps(StateData#state.server, FromOld, Caps),
|
||||||
"unavailable" ->
|
NewAvailable = case exmpp_presence:get_type(Packet) of
|
||||||
|
'unavailable' ->
|
||||||
?DICT:erase(LFrom, StateData#state.pres_available);
|
?DICT:erase(LFrom, StateData#state.pres_available);
|
||||||
_ ->
|
_ ->
|
||||||
?DICT:store(LFrom, Caps, StateData#state.pres_available)
|
?DICT:store(LFrom, Caps, StateData#state.pres_available)
|
||||||
@ -1164,10 +1186,14 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
|||||||
{false, Attrs, StateData}
|
{false, Attrs, StateData}
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
"broadcast" ->
|
% XXX OLD FORMAT: broadcast?
|
||||||
|
#xmlel{ns = _NS, name = 'broadcast', attrs = Attrs} ->
|
||||||
|
% XXX OLD FORMAT: Els are #xmlelement.
|
||||||
|
Els = PacketOld#xmlelement.children,
|
||||||
?DEBUG("broadcast~n~p~n", [Els]),
|
?DEBUG("broadcast~n~p~n", [Els]),
|
||||||
case Els of
|
case Els of
|
||||||
[{item, IJID, ISubscription}] ->
|
[{item, IJID, ISubscription}] ->
|
||||||
|
% XXX OLD FORMAT: IJID is an old #jid.
|
||||||
{false, Attrs,
|
{false, Attrs,
|
||||||
roster_change(IJID, ISubscription,
|
roster_change(IJID, ISubscription,
|
||||||
StateData)};
|
StateData)};
|
||||||
@ -1182,76 +1208,82 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
|||||||
false ->
|
false ->
|
||||||
{false, Attrs, StateData};
|
{false, Attrs, StateData};
|
||||||
NewPL ->
|
NewPL ->
|
||||||
PrivPushIQ =
|
PrivPushEl = exmpp_server_privacy:list_push(
|
||||||
#iq{type = set, xmlns = ?NS_PRIVACY,
|
StateData#state.jid, PrivListName),
|
||||||
id = "push",
|
|
||||||
sub_el = [{xmlelement, "query",
|
|
||||||
[{"xmlns", ?NS_PRIVACY}],
|
|
||||||
[{xmlelement, "list",
|
|
||||||
[{"name", PrivListName}],
|
|
||||||
[]}]}]},
|
|
||||||
PrivPushEl =
|
|
||||||
jlib:replace_from_to(
|
|
||||||
jlib:jid_remove_resource(
|
|
||||||
StateData#state.jid),
|
|
||||||
StateData#state.jid,
|
|
||||||
jlib:iq_to_xml(PrivPushIQ)),
|
|
||||||
send_element(StateData, PrivPushEl),
|
send_element(StateData, PrivPushEl),
|
||||||
{false, Attrs, StateData#state{privacy_list = NewPL}}
|
{false, Attrs, StateData#state{privacy_list = NewPL}}
|
||||||
end;
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
{false, Attrs, StateData}
|
{false, Attrs, StateData}
|
||||||
end;
|
end;
|
||||||
"iq" ->
|
#xmlel{ns = ?NS_JABBER_CLIENT, name = 'iq', attrs = Attrs} ->
|
||||||
IQ = jlib:iq_query_info(Packet),
|
case exmpp_iq:is_request(Packet) of
|
||||||
case IQ of
|
true ->
|
||||||
#iq{xmlns = ?NS_VCARD} ->
|
case exmpp_iq:get_request(Packet) of
|
||||||
Host = StateData#state.server,
|
#xmlel{ns = ?NS_VCARD} ->
|
||||||
case ets:lookup(sm_iqtable, {?NS_VCARD, Host}) of
|
Host = StateData#state.server,
|
||||||
[{_, Module, Function, Opts}] ->
|
% XXX OLD FORMAT: sm_iqtable contains strings
|
||||||
gen_iq_handler:handle(Host, Module, Function, Opts,
|
% for namespaces.
|
||||||
From, To, IQ);
|
case ets:lookup(sm_iqtable, {atom_to_list(?NS_VCARD), Host}) of
|
||||||
[] ->
|
[{_, Module, Function, Opts}] ->
|
||||||
Err = jlib:make_error_reply(
|
% XXX OLD FORMAT: IQ is an old #iq,
|
||||||
Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
|
% From, To.
|
||||||
ejabberd_router:route(To, From, Err)
|
IQ = jlib:iq_query_info(PacketOld),
|
||||||
end,
|
io:format("IQ = ~p~n", [IQ]),
|
||||||
{false, Attrs, StateData};
|
gen_iq_handler:handle(Host, Module, Function, Opts,
|
||||||
#iq{} ->
|
FromOld, ToOld, IQ);
|
||||||
case ejabberd_hooks:run_fold(
|
[] ->
|
||||||
privacy_check_packet, StateData#state.server,
|
Err = exmpp_stanza:error('feature-not-implemented'),
|
||||||
allow,
|
Res = exmpp_iq:error(Packet, Err),
|
||||||
[StateData#state.user,
|
% XXX OLD FORMAT: To, From, Res.
|
||||||
StateData#state.server,
|
ResOld = exmpp_xml:xmlel_to_xmlelement(
|
||||||
StateData#state.privacy_list,
|
Res, ?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
{From, To, Packet},
|
ejabberd_router:route(ToOld, FromOld, ResOld)
|
||||||
in]) of
|
end,
|
||||||
allow ->
|
{false, Attrs, StateData};
|
||||||
{true, Attrs, StateData};
|
_ ->
|
||||||
deny ->
|
% XXX OLD FORMAT: From, To and Packet.
|
||||||
Err = jlib:make_error_reply(
|
case ejabberd_hooks:run_fold(
|
||||||
Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
|
privacy_check_packet, StateData#state.server,
|
||||||
ejabberd_router:route(To, From, Err),
|
allow,
|
||||||
{false, Attrs, StateData}
|
[StateData#state.user,
|
||||||
|
StateData#state.server,
|
||||||
|
StateData#state.privacy_list,
|
||||||
|
{FromOld, ToOld, PacketOld},
|
||||||
|
in]) of
|
||||||
|
allow ->
|
||||||
|
{true, Attrs, StateData};
|
||||||
|
deny ->
|
||||||
|
Err = exmpp_stanza:error(
|
||||||
|
'feature-not-implemented'),
|
||||||
|
Res = exmpp_iq:error(Packet, Err),
|
||||||
|
% XXX OLD FORMAT: To, From, Res.
|
||||||
|
ResOld = exmpp_xml:xmlel_to_xmlelement(
|
||||||
|
Res,
|
||||||
|
?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
|
ejabberd_router:route(ToOld, FromOld, ResOld),
|
||||||
|
{false, Attrs, StateData}
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
_ ->
|
false ->
|
||||||
{true, Attrs, StateData}
|
{true, Attrs, StateData}
|
||||||
end;
|
end;
|
||||||
"message" ->
|
#xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = Attrs} ->
|
||||||
|
% XXX OLD FORMAT: From, To and Packet.
|
||||||
case ejabberd_hooks:run_fold(
|
case ejabberd_hooks:run_fold(
|
||||||
privacy_check_packet, StateData#state.server,
|
privacy_check_packet, StateData#state.server,
|
||||||
allow,
|
allow,
|
||||||
[StateData#state.user,
|
[StateData#state.user,
|
||||||
StateData#state.server,
|
StateData#state.server,
|
||||||
StateData#state.privacy_list,
|
StateData#state.privacy_list,
|
||||||
{From, To, Packet},
|
{FromOld, ToOld, PacketOld},
|
||||||
in]) of
|
in]) of
|
||||||
allow ->
|
allow ->
|
||||||
{true, Attrs, StateData};
|
{true, Attrs, StateData};
|
||||||
deny ->
|
deny ->
|
||||||
{false, Attrs, StateData}
|
{false, Attrs, StateData}
|
||||||
end;
|
end;
|
||||||
_ ->
|
#xmlel{attrs = Attrs} ->
|
||||||
{true, Attrs, StateData}
|
{true, Attrs, StateData}
|
||||||
end,
|
end,
|
||||||
if
|
if
|
||||||
@ -1259,19 +1291,22 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
|||||||
catch send_text(StateData, ?STREAM_TRAILER),
|
catch send_text(StateData, ?STREAM_TRAILER),
|
||||||
{stop, normal, StateData};
|
{stop, normal, StateData};
|
||||||
Pass ->
|
Pass ->
|
||||||
Attrs2 = jlib:replace_from_to_attrs(jlib:jid_to_string(From),
|
Attrs2 = exmpp_stanza:set_sender_in_attrs(NewAttrs, From),
|
||||||
jlib:jid_to_string(To),
|
Attrs3 = exmpp_stanza:set_recipient_in_attrs(Attrs2, To),
|
||||||
NewAttrs),
|
FixedPacket = Packet#xmlel{attrs = Attrs3},
|
||||||
FixedPacket = {xmlelement, Name, Attrs2, Els},
|
send_element(StateData, FixedPacket),
|
||||||
Text = xml:element_to_string(FixedPacket),
|
% XXX OLD FORMAT: From, To, FixedPacket.
|
||||||
send_text(StateData, Text),
|
FixedPacketOld = exmpp_xml:xmlel_to_xmlelement(FixedPacket,
|
||||||
|
?DEFAULT_NS, ?PREFIXED_NS),
|
||||||
ejabberd_hooks:run(user_receive_packet,
|
ejabberd_hooks:run(user_receive_packet,
|
||||||
StateData#state.server,
|
StateData#state.server,
|
||||||
[StateData#state.jid, From, To, FixedPacket]),
|
[StateData#state.jid, FromOld, ToOld, FixedPacketOld]),
|
||||||
ejabberd_hooks:run(c2s_loop_debug, [{route, From, To, Packet}]),
|
% XXX OLD FORMAT: From, To, FixedPacket.
|
||||||
|
ejabberd_hooks:run(c2s_loop_debug, [{route, FromOld, ToOld, PacketOld}]),
|
||||||
fsm_next_state(StateName, NewState);
|
fsm_next_state(StateName, NewState);
|
||||||
true ->
|
true ->
|
||||||
ejabberd_hooks:run(c2s_loop_debug, [{route, From, To, Packet}]),
|
% XXX OLD FORMAT: From, To, FixedPacket.
|
||||||
|
ejabberd_hooks:run(c2s_loop_debug, [{route, FromOld, ToOld, PacketOld}]),
|
||||||
fsm_next_state(StateName, NewState)
|
fsm_next_state(StateName, NewState)
|
||||||
end;
|
end;
|
||||||
handle_info({'DOWN', Monitor, _Type, _Object, _Info}, _StateName, StateData)
|
handle_info({'DOWN', Monitor, _Type, _Object, _Info}, _StateName, StateData)
|
||||||
@ -1981,3 +2016,7 @@ fsm_reply(Reply, StateName, StateData) ->
|
|||||||
%% Used by c2s blacklist plugins
|
%% Used by c2s blacklist plugins
|
||||||
is_ip_blacklisted({IP,_Port}) ->
|
is_ip_blacklisted({IP,_Port}) ->
|
||||||
ejabberd_hooks:run_fold(check_bl_c2s, false, [IP]).
|
ejabberd_hooks:run_fold(check_bl_c2s, false, [IP]).
|
||||||
|
|
||||||
|
short_jid(JID) ->
|
||||||
|
JID1 = exmpp_jid:to_ejabberd_jid(JID),
|
||||||
|
{JID1#jid.lnode, JID1#jid.ldomain, JID1#jid.lresource}.
|
||||||
|
Loading…
Reference in New Issue
Block a user