From 5ed381fc58d5ee6e94f66ce947d118d26d4d4c86 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Tue, 10 Mar 2009 11:13:46 +0000 Subject: [PATCH] Fix PEP with other domains and s2s (EJAB-825) SVN Revision: 1982 --- ChangeLog | 7 +++ src/mod_pubsub/mod_pubsub.erl | 89 ++++++++++++--------------------- src/mod_pubsub/node_default.erl | 4 +- 3 files changed, 40 insertions(+), 60 deletions(-) diff --git a/ChangeLog b/ChangeLog index af9a88f5c..b2a67f1c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-03-10 Christophe Romain + + * src/mod_pubsub/mod_pubsub.erl: Fix PEP with other domains and s2s + (EJAB-825). Also fixes send last published items in subscription. + + * src/mod_pubsub/node_default.erl: minor typo fix + 2009-03-09 Badlop * src/tls/tls_drv.c: Fix to support OpenSSL older than diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index d56a8b810..ee09e6a84 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -55,7 +55,7 @@ %% exports for hooks -export([presence_probe/3, - in_subscription/6, + out_subscription/4, remove_user/2, disco_local_identity/5, disco_local_features/5, @@ -165,7 +165,7 @@ init([ServerHost, Opts]) -> ejabberd_hooks:add(disco_sm_features, ServerHostB, ?MODULE, disco_sm_features, 75), ejabberd_hooks:add(disco_sm_items, ServerHostB, ?MODULE, disco_sm_items, 75), ejabberd_hooks:add(presence_probe_hook, ServerHostB, ?MODULE, presence_probe, 50), - ejabberd_hooks:add(roster_in_subscription, ServerHostB, ?MODULE, in_subscription, 50), + ejabberd_hooks:add(roster_out_subscription, ServerHostB, ?MODULE, out_subscription, 50), ejabberd_hooks:add(remove_user, ServerHostB, ?MODULE, remove_user, 50), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), lists:foreach( @@ -414,21 +414,33 @@ disco_sm_items(Acc, From, To, NodeB, _Lang) -> %% presence hooks handling functions %% -presence_probe(JID, JID, Pid) -> - Proc = gen_mod:get_module_proc(exmpp_jid:ldomain_as_list(JID), ?PROCNAME), - gen_server:cast(Proc, {presence, JID, Pid}); -presence_probe(_, _, _) -> - ok. +presence_probe(JID, JID, _Pid) -> + {U, S, R} = jlib:short_prepd_jid(JID), + Host = S, % exmpp_jid:ldomain_as_list(JID), + Proc = gen_mod:get_module_proc(Host, ?PROCNAME), + gen_server:cast(Proc, {presence, JID}), + gen_server:cast(Proc, {presence, U, S, [R], JID}); +presence_probe(Peer, JID, _Pid) -> + {U, S, R} = jlib:short_prepd_jid(Peer), + Host = exmpp_jid:ldomain_as_list(JID), + Proc = gen_mod:get_module_proc(Host, ?PROCNAME), + gen_server:cast(Proc, {presence, U, S, [R], JID}). %% ------- %% subscription hooks handling functions %% -in_subscription(Acc, User, Server, JID, subscribed, _) -> + +out_subscription(User, Server, JID, subscribed) -> + Owner = exmpp_jid:make_jid(User, Server, ""), + {U, S, R} = jlib:short_prepd_jid(JID), + Rs = case R of + [] -> user_resources(U, S); + _ -> [R] + end, Proc = gen_mod:get_module_proc(Server, ?PROCNAME), - gen_server:cast(Proc, {subscribed, User, Server, JID}), - Acc; -in_subscription(Acc, _, _, _, _, _) -> - Acc. + gen_server:cast(Proc, {presence, U, S, Rs, Owner}); +out_subscription(_, _, _, _) -> + ok. %% ------- %% user remove hook handling function @@ -469,11 +481,9 @@ handle_call(stop, _From, State) -> %% Description: Handling cast messages %%-------------------------------------------------------------------- %% @private -handle_cast({presence, JID, Pid}, State) -> +handle_cast({presence, JID}, State) -> %% A new resource is available. send last published items - LJID = jlib:short_prepd_jid(JID), Host = State#state.host, - ServerHost = State#state.server_host, %% 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) -> @@ -495,54 +505,17 @@ handle_cast({presence, JID, Pid}, State) -> ok end, Subscriptions) end, State#state.plugins), - %% and send to From last PEP events published by its contacts - case catch ejabberd_c2s:get_subscribed(Pid) of - Contacts when is_list(Contacts) -> - lists:foreach( - fun({User, Server, _}) -> - Owner = {User, Server, undefined}, - 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, LJID) 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 -> - send_last_item(Owner, Node, LJID); - true -> - ok - end; - false -> - ok - end; - _ -> - ok - end - end, tree_action(Host, get_nodes, [Owner, JID])) - end, Contacts); - _ -> - ok - end, {noreply, State}; -handle_cast({subscribed, User, Server, JID}, State) -> - %% and send last PEP events published by JID +handle_cast({presence, User, Server, Resources, JID}, State) -> + %% A new resource is available. send last published PEP items Owner = jlib:short_prepd_bare_jid(JID), - Host = State#state.host, ServerHost = State#state.server_host, lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, options = Options}) -> case get_option(Options, send_last_published_item) of on_sub_and_presence -> lists:foreach(fun(Resource) -> - LJID = jlib:short_prepd_jid(exmpp_jid:make_jid(User, Server, Resource)), + LJID = {User, Server, Resource}, case is_caps_notify(ServerHost, Node, LJID) of true -> Subscribed = case get_option(Options, access_model) of @@ -562,11 +535,11 @@ handle_cast({subscribed, User, Server, JID}, State) -> false -> ok end - end, user_resources(User, Server)); + end, Resources); _ -> ok end - end, tree_action(Host, get_nodes, [Owner])), + end, tree_action(Host, get_nodes, [Owner, JID])) {noreply, State}; handle_cast({remove_user, LUser, LServer}, State) -> @@ -634,7 +607,7 @@ terminate(_Reason, #state{host = Host, ejabberd_hooks:delete(disco_sm_features, ServerHostB, ?MODULE, disco_sm_features, 75), ejabberd_hooks:delete(disco_sm_items, ServerHostB, ?MODULE, disco_sm_items, 75), ejabberd_hooks:delete(presence_probe_hook, ServerHostB, ?MODULE, presence_probe, 50), - ejabberd_hooks:delete(roster_in_subscription, ServerHostB, ?MODULE, in_subscription, 50), + ejabberd_hooks:delete(roster_out_subscription, ServerHostB, ?MODULE, out_subscription, 50), ejabberd_hooks:delete(remove_user, ServerHostB, ?MODULE, remove_user, 50), lists:foreach(fun({NS,Mod}) -> gen_iq_handler:remove_iq_handler(Mod, ServerHostB, NS) diff --git a/src/mod_pubsub/node_default.erl b/src/mod_pubsub/node_default.erl index 116160658..ae0707fcb 100644 --- a/src/mod_pubsub/node_default.erl +++ b/src/mod_pubsub/node_default.erl @@ -307,7 +307,7 @@ subscribe_node(Host, Node, Sender, Subscriber, AccessModel, (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED('not-allowed', "closed-node")}; - (AccessModel == authorize) and (not Whitelisted) -> + (AccessModel == authorize) -> % TODO: to be done %% Node has authorize access model {error, 'forbidden'}; %%MustPay -> @@ -437,7 +437,7 @@ publish_item(Host, Node, Publisher, PublishModel, MaxItems, ItemId, Payload) -> {error, 'forbidden'}; true -> PubId = {SubKey, now()}, %% TODO, uses {now(),PublisherKey} for sorting (EJAB-824) - %% TODO: check creation, presence, roster (EJAB-663) + %% TODO: check creation, presence, roster Item = case get_item(Host, Node, ItemId) of {result, OldItem} -> OldItem#pubsub_item{modification = PubId,