]> granicus.if.org Git - ejabberd/commitdiff
Don't let privacy list prevent local roster update
authorHolger Weiss <holger@zedat.fu-berlin.de>
Sat, 23 Dec 2017 21:45:01 +0000 (22:45 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Sat, 23 Dec 2017 21:45:01 +0000 (22:45 +0100)
src/ejabberd_c2s.erl

index a49987feb611b5ff9d8ae2fc717cb3a0a849dd5b..6794ef163f8e3fed7cd366e46518a39cdd2931e3 100644 (file)
@@ -646,35 +646,39 @@ route_probe_reply(_, _) ->
 process_presence_out(#{user := User, server := Server, lserver := LServer,
                       jid := JID, lang := Lang, pres_a := PresA} = State,
                     #presence{from = From, to = To, type = Type} = Pres) ->
-    LTo = jid:tolower(To),
-    case privacy_check_packet(State, Pres, out) of
-       deny ->
-            ErrText = <<"Your active privacy list has denied "
-                       "the routing of this stanza.">>,
-           Err = xmpp:err_not_acceptable(ErrText, Lang),
-           send_error(State, Pres, Err);
-       allow when Type == subscribe; Type == subscribed;
-                  Type == unsubscribe; Type == unsubscribed ->
+    if Type == subscribe; Type == subscribed;
+       Type == unsubscribe; Type == unsubscribed ->
            Access = gen_mod:get_module_opt(LServer, mod_roster, access, all),
            MyBareJID = jid:remove_resource(JID),
            case acl:match_rule(LServer, Access, MyBareJID) of
                deny ->
-                   ErrText = <<"Access denied by service policy">>,
-                   Err = xmpp:err_forbidden(ErrText, Lang),
-                   send_error(State, Pres, Err);
+                   AccessErrTxt = <<"Access denied by service policy">>,
+                   AccessErr = xmpp:err_forbidden(AccessErrTxt, Lang),
+                   send_error(State, Pres, AccessErr);
                allow ->
                    ejabberd_hooks:run(roster_out_subscription,
                                       LServer,
-                                      [User, Server, To, Type]),
-                   BareFrom = jid:remove_resource(From),
-                   ejabberd_router:route(xmpp:set_from_to(Pres, BareFrom, To)),
-                   State
+                                      [User, Server, To, Type])
            end;
+       true -> ok
+    end,
+    case privacy_check_packet(State, Pres, out) of
+       deny ->
+           PrivErrTxt = <<"Your active privacy list has denied "
+                          "the routing of this stanza.">>,
+           PrivErr = xmpp:err_not_acceptable(PrivErrTxt, Lang),
+           send_error(State, Pres, PrivErr);
+       allow when Type == subscribe; Type == subscribed;
+                  Type == unsubscribe; Type == unsubscribed ->
+           BareFrom = jid:remove_resource(From),
+           ejabberd_router:route(xmpp:set_from_to(Pres, BareFrom, To)),
+           State;
        allow when Type == error; Type == probe ->
            ejabberd_router:route(Pres),
            State;
        allow ->
            ejabberd_router:route(Pres),
+           LTo = jid:tolower(To),
            LBareTo = jid:remove_resource(LTo),
            LBareFrom = jid:remove_resource(jid:tolower(From)),
            if LBareTo /= LBareFrom ->