Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2009-03-07 11:59:26 +0300
committerBadlop <badlop@process-one.net>2009-03-07 11:59:26 +0300
commit56c33e994d3d18803365aed342e4bcaa92d9a84d (patch)
tree6e54e88b99ef92614b39df8aa7be5df0d1c5d99d /src/ejabberd_c2s.erl
parentd6820f2c2dd1132c53530cf8402b05a63446a8a0 (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.erl47
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),