mirror of
https://github.com/processone/ejabberd.git
synced 2024-06-02 21:17:12 +02:00
Fix PEP with other domains and s2s (EJAB-825)
SVN Revision: 1980
This commit is contained in:
parent
d28efabb79
commit
51faa601fa
|
@ -1,3 +1,10 @@
|
||||||
|
2009-03-10 Christophe Romain <christophe.romain@process-one.net>
|
||||||
|
|
||||||
|
* 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 <badlop@process-one.net>
|
2009-03-09 Badlop <badlop@process-one.net>
|
||||||
|
|
||||||
* src/tls/tls_drv.c: Fix to support OpenSSL older than
|
* src/tls/tls_drv.c: Fix to support OpenSSL older than
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
|
|
||||||
%% exports for hooks
|
%% exports for hooks
|
||||||
-export([presence_probe/3,
|
-export([presence_probe/3,
|
||||||
in_subscription/6,
|
out_subscription/4,
|
||||||
remove_user/2,
|
remove_user/2,
|
||||||
disco_local_identity/5,
|
disco_local_identity/5,
|
||||||
disco_local_features/5,
|
disco_local_features/5,
|
||||||
|
@ -163,7 +163,7 @@ init([ServerHost, Opts]) ->
|
||||||
ejabberd_hooks:add(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
|
ejabberd_hooks:add(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
|
||||||
ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75),
|
ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75),
|
||||||
ejabberd_hooks:add(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 50),
|
ejabberd_hooks:add(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 50),
|
||||||
ejabberd_hooks:add(roster_in_subscription, ServerHost, ?MODULE, in_subscription, 50),
|
ejabberd_hooks:add(roster_out_subscription, ServerHost, ?MODULE, out_subscription, 50),
|
||||||
ejabberd_hooks:add(remove_user, ServerHost, ?MODULE, remove_user, 50),
|
ejabberd_hooks:add(remove_user, ServerHost, ?MODULE, remove_user, 50),
|
||||||
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
|
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
|
||||||
lists:foreach(
|
lists:foreach(
|
||||||
|
@ -413,21 +413,29 @@ disco_sm_items(Acc, From, To, Node, _Lang) ->
|
||||||
%% presence hooks handling functions
|
%% presence hooks handling functions
|
||||||
%%
|
%%
|
||||||
|
|
||||||
presence_probe(#jid{lserver = Host} = JID, JID, Pid) ->
|
presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID, JID, _Pid) ->
|
||||||
|
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
|
||||||
|
gen_server:cast(Proc, {presence, JID}),
|
||||||
|
gen_server:cast(Proc, {presence, User, Server, [Resource], JID});
|
||||||
|
presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{lserver = Host} = JID, _Pid) ->
|
||||||
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
|
||||||
gen_server:cast(Proc, {presence, JID, Pid});
|
gen_server:cast(Proc, {presence, User, Server, [Resource], JID}).
|
||||||
presence_probe(_, _, _) ->
|
|
||||||
ok.
|
|
||||||
|
|
||||||
%% -------
|
%% -------
|
||||||
%% subscription hooks handling functions
|
%% subscription hooks handling functions
|
||||||
%%
|
%%
|
||||||
in_subscription(Acc, User, Server, JID, subscribed, _) ->
|
|
||||||
|
out_subscription(User, Server, JID, subscribed) ->
|
||||||
|
Owner = jlib:make_jid(User, Server, ""),
|
||||||
|
{PUser, PServer, PResource} = jlib:jid_tolower(JID),
|
||||||
|
PResources = case PResource of
|
||||||
|
[] -> user_resources(PUser, PServer);
|
||||||
|
_ -> [PResource]
|
||||||
|
end,
|
||||||
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
|
Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
|
||||||
gen_server:cast(Proc, {subscribed, User, Server, JID}),
|
gen_server:cast(Proc, {presence, PUser, PServer, PResources, Owner});
|
||||||
Acc;
|
out_subscription(_, _, _, _) ->
|
||||||
in_subscription(Acc, _, _, _, _, _) ->
|
ok.
|
||||||
Acc.
|
|
||||||
|
|
||||||
%% -------
|
%% -------
|
||||||
%% user remove hook handling function
|
%% user remove hook handling function
|
||||||
|
@ -468,11 +476,9 @@ handle_call(stop, _From, State) ->
|
||||||
%% Description: Handling cast messages
|
%% Description: Handling cast messages
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% @private
|
%% @private
|
||||||
handle_cast({presence, JID, Pid}, State) ->
|
handle_cast({presence, JID}, State) ->
|
||||||
%% A new resource is available. send last published items
|
%% A new resource is available. send last published items
|
||||||
LJID = jlib:jid_tolower(JID),
|
|
||||||
Host = State#state.host,
|
Host = State#state.host,
|
||||||
ServerHost = State#state.server_host,
|
|
||||||
%% for each node From is subscribed to
|
%% for each node From is subscribed to
|
||||||
%% and if the node is so configured, send the last published item to From
|
%% and if the node is so configured, send the last published item to From
|
||||||
lists:foreach(fun(Type) ->
|
lists:foreach(fun(Type) ->
|
||||||
|
@ -494,64 +500,28 @@ handle_cast({presence, JID, Pid}, State) ->
|
||||||
ok
|
ok
|
||||||
end, Subscriptions)
|
end, Subscriptions)
|
||||||
end, State#state.plugins),
|
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, ""},
|
|
||||||
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};
|
{noreply, State};
|
||||||
|
|
||||||
handle_cast({subscribed, User, Server, JID}, State) ->
|
handle_cast({presence, User, Server, Resources, JID}, State) ->
|
||||||
%% and send last PEP events published by JID
|
%% A new resource is available. send last published PEP items
|
||||||
Owner = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
|
Owner = jlib:jid_remove_resource(jlib:jid_tolower(JID)),
|
||||||
Host = State#state.host,
|
Host = State#state.host,
|
||||||
ServerHost = State#state.server_host,
|
ServerHost = State#state.server_host,
|
||||||
lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, options = Options}) ->
|
lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, options = Options}) ->
|
||||||
case get_option(Options, send_last_published_item) of
|
case get_option(Options, send_last_published_item) of
|
||||||
on_sub_and_presence ->
|
on_sub_and_presence ->
|
||||||
lists:foreach(fun(Resource) ->
|
lists:foreach(fun(Resource) ->
|
||||||
LJID = jlib:jid_tolower(jlib:make_jid(User, Server, Resource)),
|
LJID = {User, Server, Resource},
|
||||||
case is_caps_notify(ServerHost, Node, LJID) of
|
case is_caps_notify(ServerHost, Node, LJID) of
|
||||||
true ->
|
true ->
|
||||||
Subscribed = case get_option(Options, access_model) of
|
Subscribed = case get_option(Options, access_model) of
|
||||||
open -> true;
|
open -> true;
|
||||||
presence -> true;
|
presence -> true;
|
||||||
whitelist -> false; % subscribers are added manually
|
whitelist -> false; % subscribers are added manually
|
||||||
authorize -> false; % likewise
|
authorize -> false; % likewise
|
||||||
roster ->
|
roster ->
|
||||||
Grps = get_option(Options, roster_groups_allowed, []),
|
Grps = get_option(Options, roster_groups_allowed, []),
|
||||||
element(2, get_roster_info(User, Server, LJID, Grps))
|
element(2, get_roster_info(User, Server, LJID, Grps))
|
||||||
end,
|
end,
|
||||||
if Subscribed ->
|
if Subscribed ->
|
||||||
send_last_item(Owner, Node, LJID);
|
send_last_item(Owner, Node, LJID);
|
||||||
|
@ -561,11 +531,11 @@ handle_cast({subscribed, User, Server, JID}, State) ->
|
||||||
false ->
|
false ->
|
||||||
ok
|
ok
|
||||||
end
|
end
|
||||||
end, user_resources(User, Server));
|
end, Resources);
|
||||||
_ ->
|
_ ->
|
||||||
ok
|
ok
|
||||||
end
|
end
|
||||||
end, tree_action(Host, get_nodes, [Owner])),
|
end, tree_action(Host, get_nodes, [Owner, JID])),
|
||||||
{noreply, State};
|
{noreply, State};
|
||||||
|
|
||||||
handle_cast({remove_user, LUser, LServer}, State) ->
|
handle_cast({remove_user, LUser, LServer}, State) ->
|
||||||
|
@ -632,7 +602,7 @@ terminate(_Reason, #state{host = Host,
|
||||||
ejabberd_hooks:delete(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
|
ejabberd_hooks:delete(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75),
|
||||||
ejabberd_hooks:delete(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75),
|
ejabberd_hooks:delete(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75),
|
||||||
ejabberd_hooks:delete(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 50),
|
ejabberd_hooks:delete(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 50),
|
||||||
ejabberd_hooks:delete(roster_in_subscription, ServerHost, ?MODULE, in_subscription, 50),
|
ejabberd_hooks:delete(roster_out_subscription, ServerHost, ?MODULE, out_subscription, 50),
|
||||||
ejabberd_hooks:delete(remove_user, ServerHost, ?MODULE, remove_user, 50),
|
ejabberd_hooks:delete(remove_user, ServerHost, ?MODULE, remove_user, 50),
|
||||||
lists:foreach(fun({NS,Mod}) ->
|
lists:foreach(fun({NS,Mod}) ->
|
||||||
gen_iq_handler:remove_iq_handler(Mod, ServerHost, NS)
|
gen_iq_handler:remove_iq_handler(Mod, ServerHost, NS)
|
||||||
|
|
|
@ -305,7 +305,7 @@ subscribe_node(Host, Node, Sender, Subscriber, AccessModel,
|
||||||
(AccessModel == whitelist) and (not Whitelisted) ->
|
(AccessModel == whitelist) and (not Whitelisted) ->
|
||||||
%% Node has whitelist access model and entity lacks required affiliation
|
%% Node has whitelist access model and entity lacks required affiliation
|
||||||
{error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")};
|
{error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")};
|
||||||
(AccessModel == authorize) and (not Whitelisted) ->
|
(AccessModel == authorize) -> % TODO: to be done
|
||||||
%% Node has authorize access model
|
%% Node has authorize access model
|
||||||
{error, ?ERR_FORBIDDEN};
|
{error, ?ERR_FORBIDDEN};
|
||||||
%%MustPay ->
|
%%MustPay ->
|
||||||
|
@ -435,7 +435,7 @@ publish_item(Host, Node, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
|
||||||
{error, ?ERR_FORBIDDEN};
|
{error, ?ERR_FORBIDDEN};
|
||||||
true ->
|
true ->
|
||||||
PubId = {SubKey, now()}, %% TODO, uses {now(),PublisherKey} for sorting (EJAB-824)
|
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
|
Item = case get_item(Host, Node, ItemId) of
|
||||||
{result, OldItem} ->
|
{result, OldItem} ->
|
||||||
OldItem#pubsub_item{modification = PubId,
|
OldItem#pubsub_item{modification = PubId,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user