From 56c33e994d3d18803365aed342e4bcaa92d9a84d Mon Sep 17 00:00:00 2001 From: Badlop Date: Sat, 7 Mar 2009 08:59:26 +0000 Subject: [PATCH] * src/ejabberd_c2s.erl: Enforce privacy rules also for subscription requests (EJAB-300) * src/ejabberd_sm.erl: Likewise SVN Revision: 1976 --- ChangeLog | 4 ++++ src/ejabberd_c2s.erl | 47 ++++++++++++++++++++++++++++++++++++++++---- src/ejabberd_sm.erl | 29 ++++----------------------- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index fb795ab15..b7ce1d28b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-03-07 Badlop + * src/ejabberd_c2s.erl: Enforce privacy rules also for + subscription requests (EJAB-300) + * src/ejabberd_sm.erl: Likewise + * src/mod_privacy.erl: Temporary workaround to inconsistency * src/mod_privacy_odbc.erl: Likewise diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 6fd3254a4..d7aca754b 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1039,13 +1039,22 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> 'unavailable'), {true, Attrs1, StateData}; 'subscribe' -> - {true, Attrs, StateData}; + Reason = exmpp_presence:get_status(Packet), + SRes = check_privacy_subs(in, subscribe, From, To, + Packet, Reason, StateData), + {SRes, Attrs, StateData}; 'subscribed' -> - {true, Attrs, StateData}; + SRes = check_privacy_subs(in, subscribed, From, To, + Packet, <<>>, StateData), + {SRes, Attrs, StateData}; 'unsubscribe' -> - {true, Attrs, StateData}; + SRes = check_privacy_subs(in, unsubscribe, From, To, + Packet, <<>>, StateData), + {SRes, Attrs, StateData}; 'unsubscribed' -> - {true, Attrs, StateData}; + SRes = check_privacy_subs(in, unsubscribed, From, To, + Packet, <<>>, StateData), + {SRes, Attrs, StateData}; _ -> case ejabberd_hooks:run_fold( privacy_check_packet, StateData#state.server, @@ -1571,6 +1580,36 @@ check_privacy_route(From, StateData, FromRoute, To, Packet) -> ejabberd_router:route(FromRoute, To, Packet) end. +%% Check privacy rules for subscription requests and call the roster storage +check_privacy_subs(Dir, Type, From, To, Packet, Reason, StateData) -> + case is_privacy_allow(From, To, Dir, Packet, StateData) of + true -> + ejabberd_hooks:run_fold( + roster_in_subscription, + exmpp_jid:ldomain(To), + false, + [exmpp_jid:lnode(To), exmpp_jid:ldomain(To), From, Type, Reason]), + true; + false -> + false + end. + +%% Check if privacy rules allow this delivery, then push to roster +is_privacy_allow(From, To, Dir, Packet, StateData) -> + case ejabberd_hooks:run_fold( + privacy_check_packet, StateData#state.server, + allow, + [StateData#state.user, + StateData#state.server, + StateData#state.privacy_list, + {From, To, Packet}, + Dir]) of + deny -> + false; + allow -> + true + end. + presence_broadcast(StateData, From, JIDSet, Packet) -> lists:foreach(fun({U, S, R}) -> FJID = exmpp_jid:make_jid(U, S, R), diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index ff857fc5c..8d2dbeb33 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -422,34 +422,13 @@ do_route(From, To, Packet) -> {Pass, _Subsc} = case exmpp_presence:get_type(Packet) of 'subscribe' -> - Reason = exmpp_presence:get_status(Packet), - {ejabberd_hooks:run_fold( - roster_in_subscription, - exmpp_jid:ldomain(To), - false, - [exmpp_jid:lnode(To), exmpp_jid:ldomain(To), From, subscribe, Reason]), - true}; + {true, true}; 'subscribed' -> - {ejabberd_hooks:run_fold( - roster_in_subscription, - exmpp_jid:ldomain(To), - false, - [exmpp_jid:lnode(To), exmpp_jid:ldomain(To), From, subscribed, <<>>]), - true}; + {true, true}; 'unsubscribe' -> - {ejabberd_hooks:run_fold( - roster_in_subscription, - exmpp_jid:ldomain(To), - false, - [exmpp_jid:lnode(To), exmpp_jid:ldomain(To), From, unsubscribe, <<>>]), - true}; + {true, true}; 'unsubscribed' -> - {ejabberd_hooks:run_fold( - roster_in_subscription, - exmpp_jid:ldomain(To), - false, - [exmpp_jid:lnode(To), exmpp_jid:ldomain(To), From, unsubscribed, <<>>]), - true}; + {true, true}; _ -> {true, false} end,