From 20c27ea9d9058c00b6075b1bf73a5dbf973f3050 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Fri, 11 Jan 2008 01:39:10 +0000 Subject: [PATCH] EJAB-491 fix SVN Revision: 1145 --- src/ejabberd_c2s.erl | 7 +- src/mod_pubsub/mod_pubsub.erl | 121 ++++++++++++++++++---------------- 2 files changed, 65 insertions(+), 63 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index c491b5717..cceadb052 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1403,11 +1403,8 @@ process_presence_probe(From, To, StateData) -> deny -> ok; allow -> - Caps = case ?DICT:find(jlib:jid_tolower(To), StateData#state.pres_available) of - {ok, Value} -> Value; - _ -> mod_caps:read_caps(element(4, Packet)) % This is From=To case, so we can read Caps from Packet - end, - ejabberd_hooks:run(presence_probe_hook, StateData#state.server, [From, To, Caps]), + Pid=element(2, StateData#state.sid), + ejabberd_hooks:run(presence_probe_hook, StateData#state.server, [From, To, Pid]), ejabberd_router:route(To, From, Packet) end; Cond2 -> diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index e5567dc96..31a831cb6 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -396,9 +396,11 @@ disco_sm_items(Acc, _From, To, Node, _Lang) -> %% presence hooks handling functions %% -presence_probe(#jid{lserver = Host} = From, To, Caps) -> +presence_probe(#jid{lserver = Host} = JID, JID, Pid) -> Proc = gen_mod:get_module_proc(Host, ?PROCNAME), - gen_server:cast(Proc, {presence, From, To, Caps}). + gen_server:cast(Proc, {presence, JID, Pid}); +presence_probe(_, _, _) -> + ok. %% ------- %% user remove hook handling function @@ -437,66 +439,72 @@ handle_call(stop, _From, State) -> %% Description: Handling cast messages %%-------------------------------------------------------------------- %% @private -handle_cast({presence, From, To, Caps}, State) -> +handle_cast({presence, JID, Pid}, State) -> %% A new resource is available. send last published items - LFrom = jlib:jid_tolower(From), + LJID = jlib:jid_tolower(JID), Host = State#state.host, ServerHost = State#state.server_host, - if From == To -> - %% for each node From is subscribed to - %% and if the node is so configured, send the last published item to From - lists:foreach(fun(Type) -> - {result, Subscriptions} = node_action(Type, get_entity_subscriptions, [Host, From]), - lists:foreach( - fun({Node, subscribed}) -> - case tree_action(Host, get_node, [Host, Node]) of - #pubsub_node{options = Options} -> - case get_option(Options, send_last_published_item) of - on_sub_and_presence -> - send_last_item(Host, Node, LFrom); - _ -> - ok - end; - _ -> - ok - end; - (_) -> - ok - end, Subscriptions) - end, State#state.plugins); - true -> - ok - end, - %% and send to From last PEP events published by To - ?DEBUG("got presence probe from ~s to ~s",[jlib:jid_to_string(From),jlib:jid_to_string(To)]), - PepKey = jlib:jid_tolower(jlib:jid_remove_resource(To)), - lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, options = Options}) -> - case get_option(Options, send_last_published_item) of - on_sub_and_presence -> - case is_caps_notify(ServerHost, Node, Caps) of - true -> - Subscribed = case get_option(Options, access_model) of - open -> true; - presence -> true; - whitelist -> false; % subscribers are added manually - authorize -> false; % likewise - roster -> - Grps = get_option(Options, roster_groups_allowed), - element(2, get_roster_info(To#jid.luser, To#jid.lserver, LFrom, Grps)) - end, - if Subscribed -> - ?DEBUG("send ~s's ~s event to ~s",[jlib:jid_to_string(PepKey),Node,jlib:jid_to_string(From)]), - send_last_item(PepKey, Node, LFrom); - true -> - ok + %% for each node From is subscribed to + %% and if the node is so configured, send the last published item to From + lists:foreach(fun(Type) -> + {result, Subscriptions} = node_action(Type, get_entity_subscriptions, [Host, JID]), + lists:foreach( + fun({Node, subscribed}) -> + case tree_action(Host, get_node, [Host, Node]) of + #pubsub_node{options = Options} -> + case get_option(Options, send_last_published_item) of + on_sub_and_presence -> + send_last_item(Host, Node, LJID); + _ -> + ok end; - false -> + _ -> ok end; - _ -> + (_) -> ok - end - end, tree_action(Host, get_nodes, [PepKey])), + end, Subscriptions) + end, State#state.plugins), + %% and send to From last PEP events published by its contacts + case catch ejabberd_c2s:get_subscribed_and_online(Pid) of + ContactsWithCaps when is_list(ContactsWithCaps) -> + Caps = proplists:get_value(LJID, ContactsWithCaps), + ContactsUsers = lists:usort(lists:map( + fun({{User, Server, _}, _}) -> {User, Server} end, ContactsWithCaps)), + lists:foreach( + fun({User, Server}) -> + PepKey = {User, Server, ""}, + lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, options = Options}) -> + case get_option(Options, send_last_published_item) of + on_sub_and_presence -> + case is_caps_notify(ServerHost, Node, Caps) of + true -> + Subscribed = case get_option(Options, access_model) of + open -> true; + presence -> true; + whitelist -> false; % subscribers are added manually + authorize -> false; % likewise + roster -> + Grps = get_option(Options, roster_groups_allowed), + element(2, get_roster_info(User, Server, LJID, Grps)) + end, + if Subscribed -> + ?DEBUG("send ~s's ~s event to ~s",[jlib:jid_to_string(PepKey),Node,jlib:jid_to_string(LJID)]), + send_last_item(PepKey, Node, LJID); + true -> + ok + end; + false -> + ok + end; + _ -> + ok + end + end, tree_action(Host, get_nodes, [PepKey])) + end, ContactsUsers); + _ -> + ok + end, {noreply, State}; handle_cast({remove, User, Server}, State) -> @@ -641,9 +649,6 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) -> _ -> ok end; - "presence" -> - presence_probe(From, To, Packet), - ok; "message" -> case xml:get_attr_s("type", Attrs) of "error" ->