diff options
author | Badlop <badlop@process-one.net> | 2009-03-07 11:59:26 +0300 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2009-03-07 11:59:26 +0300 |
commit | 56c33e994d3d18803365aed342e4bcaa92d9a84d (patch) | |
tree | 6e54e88b99ef92614b39df8aa7be5df0d1c5d99d /src/ejabberd_c2s.erl | |
parent | d6820f2c2dd1132c53530cf8402b05a63446a8a0 (diff) |
* src/ejabberd_c2s.erl: Enforce privacy rules also for
subscription requests (EJAB-300)
* src/ejabberd_sm.erl: Likewise
SVN Revision: 1976
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r-- | src/ejabberd_c2s.erl | 47 |
1 files changed, 43 insertions, 4 deletions
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), |