]> granicus.if.org Git - ejabberd/commitdiff
* src/mod_privacy.erl: Privacy List: deny presence-out all + send
authorBadlop <badlop@process-one.net>
Mon, 16 Feb 2009 16:24:08 +0000 (16:24 +0000)
committerBadlop <badlop@process-one.net>
Mon, 16 Feb 2009 16:24:08 +0000 (16:24 +0000)
presence to: presence is sent (EJAB-255)
* src/ejabberd_c2s.erl: Likewise

SVN Revision: 1881

ChangeLog
src/ejabberd_c2s.erl
src/mod_privacy.erl

index b054ec9b2b2598117813a310ebe9735500cb5b8b..945545cceea0ae444be201b6291102b99b8aad0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2009-02-16  Badlop  <badlop@process-one.net>
 
+       * src/mod_privacy.erl: Privacy List: deny presence-out all + send
+       presence to: presence is sent (EJAB-255)
+       * src/ejabberd_c2s.erl: Likewise
+
        * src/mod_muc/mod_muc_room.erl: Owner of a password protected room
        must provide the password, like other participants (EJAB-867)
 
index 117bbc9b36ce47fb75fe3ad7025c5a8a0fae2a74..6d68d249b96638c4889f1167dc585be150984751 100644 (file)
@@ -973,7 +973,8 @@ session_established2(El, StateData) ->
                        ejabberd_hooks:run(user_send_packet,
                                           Server,
                                           [FromJID, ToJID, NewEl]),
-                       ejabberd_router:route(FromJID, ToJID, NewEl),
+                       check_privacy_route(FromJID, StateData, FromJID,
+                                           ToJID, NewEl),
                        StateData;
                    _ ->
                        StateData
@@ -1571,13 +1572,13 @@ presence_track(From, To, Packet, StateData) ->
     Server = StateData#state.server,
     case xml:get_attr_s("type", Attrs) of
        "unavailable" ->
-           ejabberd_router:route(From, To, Packet),
+           check_privacy_route(From, StateData, From, To, Packet),
            I = remove_element(LTo, StateData#state.pres_i),
            A = remove_element(LTo, StateData#state.pres_a),
            StateData#state{pres_i = I,
                            pres_a = A};
        "invisible" ->
-           ejabberd_router:route(From, To, Packet),
+           check_privacy_route(From, StateData, From, To, Packet),
            I = ?SETS:add_element(LTo, StateData#state.pres_i),
            A = remove_element(LTo, StateData#state.pres_a),
            StateData#state{pres_i = I,
@@ -1586,52 +1587,59 @@ presence_track(From, To, Packet, StateData) ->
            ejabberd_hooks:run(roster_out_subscription,
                               Server,
                               [User, Server, To, subscribe]),
-           ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+           check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+                               To, Packet),
            StateData;
        "subscribed" ->
            ejabberd_hooks:run(roster_out_subscription,
                               Server,
                               [User, Server, To, subscribed]),
-           ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+           check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+                               To, Packet),
            StateData;
        "unsubscribe" ->
            ejabberd_hooks:run(roster_out_subscription,
                               Server,
                               [User, Server, To, unsubscribe]),
-           ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+           check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+                               To, Packet),
            StateData;
        "unsubscribed" ->
            ejabberd_hooks:run(roster_out_subscription,
                               Server,
                               [User, Server, To, unsubscribed]),
-           ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+           check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+                               To, Packet),
            StateData;
        "error" ->
-           ejabberd_router:route(From, To, Packet),
+           check_privacy_route(From, StateData, From, To, Packet),
            StateData;
        "probe" ->
-           ejabberd_router:route(From, To, Packet),
+           check_privacy_route(From, StateData, From, To, 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},
-                   out]) of
-               deny ->
-                   ok;
-               allow ->
-                   ejabberd_router:route(From, To, Packet)
-           end,
+           check_privacy_route(From, StateData, From, To, Packet),
            I = remove_element(LTo, StateData#state.pres_i),
            A = ?SETS:add_element(LTo, StateData#state.pres_a),
            StateData#state{pres_i = I,
                            pres_a = A}
     end.
 
+check_privacy_route(From, StateData, FromRoute, To, Packet) ->
+    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},
+           out]) of
+       deny ->
+           ok;
+       allow ->
+           ejabberd_router:route(FromRoute, To, Packet)
+    end.
+
 presence_broadcast(StateData, From, JIDSet, Packet) ->
     lists:foreach(fun(JID) ->
                          FJID = jlib:make_jid(JID),
index 1fa1bbeaa6ebe3a335fcceaa301cd3f309b62078..623763bad545c5bfe89380b8310b3a0d3c1f262e 100644 (file)
@@ -555,9 +555,12 @@ get_user_list(_, User, Server) ->
     end.
 
 
+%% From is the sender, To is the destination.
+%% If Dir = out, User@Server is the sender account (From).
+%% If Dir = in, User@Server is the destination account (To).
 check_packet(_, User, Server,
             #userlist{list = List, needdb = NeedDb},
-            {From, To, {xmlelement, PName, _, _}},
+            {From, To, {xmlelement, PName, Attrs, _}},
             Dir) ->
     case List of
        [] ->
@@ -566,50 +569,39 @@ check_packet(_, User, Server,
            PType = case PName of
                        "message" -> message;
                        "iq" -> iq;
-                       "presence" -> presence
+                       "presence" ->
+                           case xml:get_attr_s("type", Attrs) of
+                               %% notification
+                               "" -> presence;
+                               "unavailable" -> presence;
+                               %% subscribe, subscribed, unsubscribe,
+                               %% unsubscribed, error, probe, or other
+                               _ -> other
+                           end
                    end,
-           case {PType, Dir} of
-               {message, in} ->
-                   LJID = jlib:jid_tolower(From),
-                   {Subscription, Groups} =
-                       case NeedDb of
-                           true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
-                           false -> {[], []}
-                       end,
-                   check_packet_aux(List, message,
-                                    LJID, Subscription, Groups);
-               {iq, in} ->
-                   LJID = jlib:jid_tolower(From),
-                   {Subscription, Groups} =
-                       case NeedDb of
-                           true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
-                           false -> {[], []}
-                       end,
-                   check_packet_aux(List, iq,
-                                    LJID, Subscription, Groups);
-               {presence, in} ->
-                   LJID = jlib:jid_tolower(From),
-                   {Subscription, Groups} =
-                       case NeedDb of
-                           true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
-                           false -> {[], []}
-                       end,
-                   check_packet_aux(List, presence_in,
-                                    LJID, Subscription, Groups);
-               {presence, out} ->
-                   LJID = jlib:jid_tolower(To),
-                   {Subscription, Groups} =
-                       case NeedDb of
-                           true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
-                           false -> {[], []}
-                       end,
-                   check_packet_aux(List, presence_out,
-                                    LJID, Subscription, Groups);
-               _ ->
-                   allow
-           end
+           PType2 = case {PType, Dir} of
+                        {message, in} -> message;
+                        {iq, in} -> iq;
+                        {presence, in} -> presence_in;
+                        {presence, out} -> presence_out;
+                        {_, _} -> other
+                    end,
+           LJID = case Dir of
+                      in -> jlib:jid_tolower(From);
+                      out -> jlib:jid_tolower(To)
+                  end,
+           {Subscription, Groups} =
+               case NeedDb of
+                   true -> ejabberd_hooks:run_fold(roster_get_jid_info,
+                                                   jlib:nameprep(Server),
+                                                   {none, []},
+                                                   [User, Server, LJID]);
+                   false -> {[], []}
+               end,
+           check_packet_aux(List, PType2, LJID, Subscription, Groups)
     end.
 
+%% Ptype = mesage | iq | presence_in | presence_out | other
 check_packet_aux([], _PType, _JID, _Subscription, _Groups) ->
     allow;
 check_packet_aux([Item | List], PType, JID, Subscription, Groups) ->
@@ -647,7 +639,9 @@ is_ptype_match(Item, PType) ->
                presence_in ->
                    Item#listitem.match_presence_in;
                presence_out ->
-                   Item#listitem.match_presence_out
+                   Item#listitem.match_presence_out;
+               other ->
+                   false
            end
     end.