From 67da88f0bdd0221d72afbd1b2416fc0ffb61e8b6 Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 18 Jun 2010 13:20:10 +0200 Subject: [PATCH] Improve ejabberd's broadcast stanzas to satisfy #xmlel type --- src/ejabberd_c2s.erl | 26 ++++++++++++++++---------- src/ejabberd_sm.erl | 4 ++-- src/mod_privacy.erl | 16 ++++++++-------- src/mod_privacy_odbc.erl | 16 ++++++++-------- src/mod_roster.erl | 10 ++++++---- src/mod_roster_odbc.erl | 10 ++++++---- src/mod_shared_roster.erl | 10 ++++++---- 7 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 2ad933368..90d85e845 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1198,19 +1198,25 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> {false, Attrs, StateData} end end; - #xmlel{name = 'broadcast', attrs = Attrs} -> + #xmlel{name = broadcast, attrs = Attrs} -> ?DEBUG("broadcast~n~p~n", [Packet#xmlel.children]), - case Packet#xmlel.children of - [{item, {U, S, R} = _IJIDShort, ISubscription}] -> - IJID = exmpp_jid:make(U, - S, - R), + case Packet#xmlel.ns of + roster_item -> + IJID = exmpp_jid:make(exmpp_xml:get_attribute(Packet, u, <<"">>), + exmpp_xml:get_attribute(Packet, s, <<"">>), + exmpp_xml:get_attribute(Packet, r, <<"">>)), + ISubscription = exmpp_xml:get_attribute(Packet, subs, <<"none">>), {false, Attrs, - roster_change(IJID, ISubscription, - StateData)}; - [{exit, Reason}] -> + roster_change(IJID, ISubscription, StateData)}; + exit -> + Reason = exmpp_xml:get_attribute_as_list(Packet, reason, "Unknown reason"), {exit, Attrs, Reason}; - [{privacy_list, PrivList, PrivListName}] -> + privacy_list -> + PrivListName = exmpp_xml:get_attribute_as_list(Packet, list_name, "Unknown list name"), + CDataString = exmpp_xml:get_cdata_as_list(Packet), + {ok, A2, _} = erl_scan:string(CDataString), + {_, W} = erl_parse:parse_exprs(A2), + {value, PrivList, []} = erl_eval:exprs(W, []), case ejabberd_hooks:run_fold( privacy_updated_list, StateData#state.server, false, diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index d85d474fd..ea722ae17 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -155,8 +155,8 @@ disconnect_removed_user(User, Server) -> ejabberd_sm:route(exmpp_jid:make(), exmpp_jid:make(User, Server), - #xmlel{name = 'broadcast', - children = [{exit, "User removed"}]}). + #xmlel{name = 'broadcast', ns = exit, + attrs = [exmpp_xml:attribute(reason, "User removed")]}). get_user_resources(User, Server) when is_binary(User), is_binary(Server) -> diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index cffa523fc..ba5eee332 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -362,13 +362,13 @@ process_list_set(LUser, LServer, Name, Els) -> {atomic, {error, _} = Error} -> Error; {atomic, {result, _} = Res} -> + ListString = lists:flatten(io_lib:format("~p.", [#userlist{name = Name, list = []}])), ejabberd_router:route( exmpp_jid:make(LUser, LServer), exmpp_jid:make(LUser, LServer), - #xmlel{name = 'broadcast', - children=[{privacy_list, - #userlist{name = Name, list = []}, - Name}]}), + #xmlel{name = 'broadcast', ns = privacy_list, + attrs = [exmpp_xml:attribute(list_name, Name)], + children = [exmpp_xml:cdata(ListString)]}), Res; _ -> {error, 'internal-server-error'} @@ -393,13 +393,13 @@ process_list_set(LUser, LServer, Name, Els) -> {atomic, {error, _} = Error} -> Error; {atomic, {result, _} = Res} -> + ListString = lists:flatten(io_lib:format("~p.", [#userlist{name = Name, list = List}])), ejabberd_router:route( exmpp_jid:make(LUser, LServer), exmpp_jid:make(LUser, LServer), - #xmlel{name = 'broadcast', - children=[{privacy_list, - #userlist{name = Name, list = List}, - Name}]}), + #xmlel{name = 'broadcast', ns = privacy_list, + attrs = [exmpp_xml:attribute(list_name, Name)], + children = [exmpp_xml:cdata(ListString)]}), Res; _ -> {error, 'internal_server_error'} diff --git a/src/mod_privacy_odbc.erl b/src/mod_privacy_odbc.erl index b0323a877..9b0200d43 100644 --- a/src/mod_privacy_odbc.erl +++ b/src/mod_privacy_odbc.erl @@ -362,13 +362,13 @@ process_list_set(LUser, LServer, Name, Els) -> {atomic, {error, _} = Error} -> Error; {atomic, {result, _} = Res} -> + ListString = lists:flatten(io_lib:format("~p.", [#userlist{name = Name, list = []}])), ejabberd_router:route( exmpp_jid:make(LUser, LServer), exmpp_jid:make(LUser, LServer), - #xmlel{name = 'broadcast', - children=[{privacy_list, - #userlist{name = Name, list = []}, - Name}]}), + #xmlel{name = 'broadcast', ns = privacy_list, + attrs = [exmpp_xml:attribute(list_name, Name)], + children = [exmpp_xml:cdata(ListString)]}), Res; _ -> {error, 'internal-server-error'} @@ -394,13 +394,13 @@ process_list_set(LUser, LServer, Name, Els) -> {atomic, {error, _} = Error} -> Error; {atomic, {result, _} = Res} -> + ListString = lists:flatten(io_lib:format("~p.", [#userlist{name = Name, list = List}])), ejabberd_router:route( exmpp_jid:make(LUser, LServer), exmpp_jid:make(LUser, LServer), - #xmlel{name = 'broadcast', - children=[{privacy_list, - #userlist{name = Name, list = List}, - Name}]}), + #xmlel{name = 'broadcast', ns = privacy_list, + attrs = [exmpp_xml:attribute(list_name, Name)], + children = [exmpp_xml:cdata(ListString)]}), Res; _ -> {error, 'internal_server_error'} diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 5d20c1ae6..bd62ec115 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -490,12 +490,14 @@ process_item_els(Item, []) -> push_item(User, Server, From, Item) when is_binary(User), is_binary(Server), ?IS_JID(From) -> + {U, S, R} = Item#roster.jid, ejabberd_sm:route(exmpp_jid:make(), exmpp_jid:make(User, Server), - #xmlel{name = 'broadcast', children = - [{item, - Item#roster.jid, - Item#roster.subscription}]}), + #xmlel{name = 'broadcast', ns = roster_item, attrs = + [exmpp_xml:attribute(u, U), + exmpp_xml:attribute(s, S), + exmpp_xml:attribute(r, R), + exmpp_xml:attribute(subs, Item#roster.subscription)]}), case roster_versioning_enabled(Server) of true -> diff --git a/src/mod_roster_odbc.erl b/src/mod_roster_odbc.erl index 5ad8e1f77..7deb89749 100644 --- a/src/mod_roster_odbc.erl +++ b/src/mod_roster_odbc.erl @@ -450,12 +450,14 @@ process_item_els(Item, []) -> push_item(User, Server, From, Item) when is_binary(User), is_binary(Server) -> + {U, S, R} = Item#roster.jid, ejabberd_sm:route(exmpp_jid:make(), exmpp_jid:make(User, Server), - #xmlel{name = 'broadcast', children = - [{item, - Item#roster.jid, - Item#roster.subscription}]}), + #xmlel{name = 'broadcast', ns = roster_item, attrs = + [exmpp_xml:attribute(u, U), + exmpp_xml:attribute(s, S), + exmpp_xml:attribute(r, R), + exmpp_xml:attribute(subs, Item#roster.subscription)]}), case roster_versioning_enabled(Server) of true -> push_item_version(Server, User, From, Item, roster_version(Server, User)); diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index b6222fcfa..82297d3fc 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -735,11 +735,13 @@ push_item(User, Server, From, Item) -> %% ejabberd_sm:route(jlib:make_jid("", "", ""), %% jlib:make_jid(User, Server, "") %% why? + {U, S, R} = Item#roster.jid, ejabberd_sm:route(From, exmpp_jid:make(User, Server), - #xmlel{name = 'broadcast', children = - [{item, - Item#roster.jid, - Item#roster.subscription}]}), + #xmlel{name = 'broadcast', ns = roster_item, attrs = + [exmpp_xml:attribute(u, U), + exmpp_xml:attribute(s, S), + exmpp_xml:attribute(r, R), + exmpp_xml:attribute(subs, Item#roster.subscription)]}), Request = #xmlel{ns = ?NS_ROSTER, name = 'query', children = [item_to_xml(Item)]}, Stanza = exmpp_iq:set(?NS_JABBER_CLIENT, Request,