470
470
{xmlelement, "iq", Attrs, _Els} = Packet},
472
472
Lang = xml:get_attr_s("xml:lang", Attrs),
473
StanzaId = xml:get_attr_s("id", Attrs),
473
474
case {(StateData#state.config)#config.allow_query_users,
474
is_user_online(From, StateData)} of
475
is_user_online_iq(StanzaId, From, StateData)} of
476
{true, {true, NewId, FromFull}} ->
476
477
case find_jid_by_nick(ToNick, StateData) of
478
479
case jlib:iq_query_info(Packet) of
969
971
LJID = jlib:jid_tolower(JID),
970
972
?DICT:is_key(LJID, StateData#state.users).
976
%%% Handle IQ queries of vCard
978
is_user_online_iq(StanzaId, JID, StateData) when JID#jid.lresource /= "" ->
979
{is_user_online(JID, StateData), StanzaId, JID};
980
is_user_online_iq(StanzaId, JID, StateData) when JID#jid.lresource == "" ->
981
try stanzaid_unpack(StanzaId) of
982
{OriginalId, Resource} ->
983
JIDWithResource = jlib:jid_replace_resource(JID, Resource),
984
{is_user_online(JIDWithResource, StateData),
985
OriginalId, JIDWithResource}
988
{is_user_online(JID, StateData), StanzaId, JID}
991
handle_iq_vcard(FromFull, ToJID, StanzaId, NewId, Packet) ->
992
ToBareJID = jlib:jid_remove_resource(ToJID),
993
IQ = jlib:iq_query_info(Packet),
994
handle_iq_vcard2(FromFull, ToJID, ToBareJID, StanzaId, NewId, IQ, Packet).
995
handle_iq_vcard2(_FromFull, ToJID, ToBareJID, StanzaId, _NewId,
996
#iq{type = get, xmlns = ?NS_VCARD}, Packet)
997
when ToBareJID /= ToJID ->
998
{ToBareJID, change_stanzaid(StanzaId, ToJID, Packet)};
999
handle_iq_vcard2(_FromFull, ToJID, _ToBareJID, _StanzaId, NewId, _IQ, Packet) ->
1000
{ToJID, change_stanzaid(NewId, Packet)}.
1002
stanzaid_pack(OriginalId, Resource) ->
1003
"berd"++base64:encode_to_string("ejab\0" ++ OriginalId ++ "\0" ++ Resource).
1004
stanzaid_unpack("berd"++StanzaIdBase64) ->
1005
StanzaId = base64:decode_to_string(StanzaIdBase64),
1006
["ejab", OriginalId, Resource] = string:tokens(StanzaId, "\0"),
1007
{OriginalId, Resource}.
1009
change_stanzaid(NewId, Packet) ->
1010
{xmlelement, Name, Attrs, Els} = jlib:remove_attr("id", Packet),
1011
{xmlelement, Name, [{"id", NewId} | Attrs], Els}.
1012
change_stanzaid(PreviousId, ToJID, Packet) ->
1013
NewId = stanzaid_pack(PreviousId, ToJID#jid.lresource),
1014
change_stanzaid(NewId, Packet).
972
1018
role_to_list(Role) ->
974
1020
moderator -> "moderator";