* src/ejabberd_sm.erl: Partially retract SVN r1976
authorBadlop <badlop@process-one.net>
Tue, 24 Mar 2009 16:22:33 +0000 (16:22 +0000)
committerBadlop <badlop@process-one.net>
Tue, 24 Mar 2009 16:22:33 +0000 (16:22 +0000)
EJAB-300 (EJAB-890). Check default privacy list when account, not
a specific session, receives a presence subscription
stanza (EJAB-300).
* src/ejabberd_c2s.erl: Likewise

SVN Revision: 1998

ChangeLog
src/ejabberd_c2s.erl
src/ejabberd_sm.erl

index dc6cffb7400430d686951ce965e03cc489173659..d09fb76c022f7c7a9c6ce2dc29690c761369d164 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2009-03-24  Badlop  <badlop@process-one.net>
+
+       * src/ejabberd_sm.erl: Partially retract SVN r1976
+       EJAB-300 (EJAB-890). Check default privacy list when account, not
+       a specific session, receives a presence subscription
+       stanza (EJAB-300).
+       * src/ejabberd_c2s.erl: Likewise
+
 2009-03-20  Christophe Romain <christophe.romain@process-one.net>
 
        * src/mod_pubsub/mod_pubsub.erl: implement roster acces model (thanks
index 5cedced034a1742afbc2d60709434b7e54fe71cf..05bbdd07080b34bcb0b40f2cf0803057d8d3c150 100644 (file)
@@ -1103,21 +1103,16 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
                        Attrs1 = lists:keydelete("type", 1, Attrs),
                        {true, [{"type", "unavailable"} | Attrs1], StateData};
                    "subscribe" ->
-                       Reason = xml:get_path_s(Packet,[{elem,"status"},cdata]),
-                       SRes = check_privacy_subs(in, subscribe, From, To,
-                                                 Packet, Reason, StateData),
+                       SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
                        {SRes, Attrs, StateData};
                    "subscribed" ->
-                       SRes = check_privacy_subs(in, subscribed, From, To,
-                                                 Packet, "", StateData),
+                       SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
                        {SRes, Attrs, StateData};
                    "unsubscribe" ->
-                       SRes = check_privacy_subs(in, unsubscribe, From, To,
-                                                 Packet, "", StateData),
+                       SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
                        {SRes, Attrs, StateData};
                    "unsubscribed" ->
-                       SRes = check_privacy_subs(in, unsubscribed, From, To,
-                                                 Packet, "", StateData),
+                       SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
                        {SRes, Attrs, StateData};
                    _ ->
                        case ejabberd_hooks:run_fold(
@@ -1651,35 +1646,18 @@ 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,
-             To#jid.lserver,
-             false,
-             [To#jid.user, To#jid.server, 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.
+%% Check if privacy rules allow this delivery
+is_privacy_allow(From, To, Packet, PrivacyList) ->
+    User = To#jid.user,
+    Server = To#jid.server,
+    allow == ejabberd_hooks:run_fold(
+              privacy_check_packet, Server,
+              allow,
+              [User,
+               Server,
+               PrivacyList,
+               {From, To, Packet},
+               in]).
 
 presence_broadcast(StateData, From, JIDSet, Packet) ->
     lists:foreach(fun(JID) ->
index 34b739ea2e0afbe315edfb96f5ec987c7c65cda1..883a90103fd73dcc626e71faf9ee368c5e206eff 100644 (file)
@@ -61,6 +61,7 @@
 -include("ejabberd.hrl").
 -include("jlib.hrl").
 -include("ejabberd_commands.hrl").
+-include("mod_privacy.hrl").
 
 -record(session, {sid, usr, us, priority, info}).
 -record(state, {}).
@@ -380,13 +381,40 @@ do_route(From, To, Packet) ->
                    {Pass, _Subsc} =
                        case xml:get_attr_s("type", Attrs) of
                            "subscribe" ->
-                               {true, true};
+                               Reason = xml:get_path_s(
+                                          Packet,
+                                          [{elem, "status"}, cdata]),
+                               {is_privacy_allow(From, To, Packet) andalso
+                                ejabberd_hooks:run_fold(
+                                  roster_in_subscription,
+                                  LServer,
+                                  false,
+                                  [User, Server, From, subscribe, Reason]),
+                                true};
                            "subscribed" ->
-                               {true, true};
+                               {is_privacy_allow(From, To, Packet) andalso
+                                ejabberd_hooks:run_fold(
+                                  roster_in_subscription,
+                                  LServer,
+                                  false,
+                                  [User, Server, From, subscribed, ""]),
+                                true};
                            "unsubscribe" ->
-                               {true, true};
+                               {is_privacy_allow(From, To, Packet) andalso
+                                ejabberd_hooks:run_fold(
+                                  roster_in_subscription,
+                                  LServer,
+                                  false,
+                                  [User, Server, From, unsubscribe, ""]),
+                                true};
                            "unsubscribed" ->
-                               {true, true};
+                               {is_privacy_allow(From, To, Packet) andalso
+                                ejabberd_hooks:run_fold(
+                                  roster_in_subscription,
+                                  LServer,
+                                  false,
+                                  [User, Server, From, unsubscribed, ""]),
+                                true};
                            _ ->
                                {true, false}
                        end,
@@ -445,6 +473,31 @@ do_route(From, To, Packet) ->
            end
     end.
 
+%% The default list applies to the user as a whole,
+%% and is processed if there is no active list set
+%% for the target session/resource to which a stanza is addressed,
+%% or if there are no current sessions for the user.
+is_privacy_allow(From, To, Packet) ->
+    User = To#jid.user,
+    Server = To#jid.server,
+    PrivacyList = ejabberd_hooks:run_fold(privacy_get_user_list, Server,
+                                         #userlist{}, [User, Server]),
+    is_privacy_allow(From, To, Packet, PrivacyList).
+
+%% Check if privacy rules allow this delivery
+%% Function copied from ejabberd_c2s.erl
+is_privacy_allow(From, To, Packet, PrivacyList) ->
+    User = To#jid.user,
+    Server = To#jid.server,
+    allow == ejabberd_hooks:run_fold(
+              privacy_check_packet, Server,
+              allow,
+              [User,
+               Server,
+               PrivacyList,
+               {From, To, Packet},
+               in]).
+
 route_message(From, To, Packet) ->
     LUser = To#jid.luser,
     LServer = To#jid.lserver,