Improve ejabberd's broadcast stanzas to satisfy #xmlel type

This commit is contained in:
Badlop 2010-06-18 13:20:10 +02:00
parent 4fd7ec27f5
commit 67da88f0bd
7 changed files with 52 additions and 40 deletions

View File

@ -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,

View File

@ -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) ->

View File

@ -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'}

View File

@ -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'}

View File

@ -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 ->

View File

@ -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));

View File

@ -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,