]> granicus.if.org Git - ejabberd/commitdiff
* src/mod_shared_roster.erl: Fix bug: a pending subscription
authorBadlop <badlop@process-one.net>
Fri, 13 Feb 2009 23:01:41 +0000 (23:01 +0000)
committerBadlop <badlop@process-one.net>
Fri, 13 Feb 2009 23:01:41 +0000 (23:01 +0000)
request, and later the requester added to the roster due to a
shared roster group, that request could neither be accepted or
rejected (thanks to Brian Cully)(EJAB-869)

SVN Revision: 1874

ChangeLog
src/mod_shared_roster.erl

index 764f3ffda510a05bb4ba9267355312b8ba68c6a0..f2dc68eb2246f3ba07745ea9a520ec97c121ad94 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2009-02-13  Badlop  <badlop@process-one.net>
 
+       * src/mod_shared_roster.erl: Fix bug: a pending subscription
+       request, and later the requester added to the roster due to a
+       shared roster group, that request could neither be accepted or
+       rejected (thanks to Brian Cully)(EJAB-869)
+
        * src/web/ejabberd_web_admin.erl: Show big integers with comma
        separators for easy reading
 
index 1a15119b5caeeecb993895943467384330d222f7..d71c55ebc119e87d8ea19eb75893f0c0e6c8c533 100644 (file)
@@ -187,7 +187,24 @@ process_item(RosterItem, Host) ->
            %% Check if the list of groups of the new roster item
            %% include at least a new one
            case lists:subtract(RosterItem#roster.groups, CommonGroups) of
+                %% If it doesn't, then remove this user from any
+                %% existing roster groups.
                [] ->
+                    %% Remove pending subscription by setting it
+                    %% unsubscribed.
+                    Mod = get_roster_mod(ServerFrom),
+
+                    %% Remove pending out subscription
+                    Mod:out_subscription(UserTo, ServerTo,
+                                         jlib:make_jid(UserFrom, ServerFrom, ""),
+                                         unsubscribe),
+
+                    %% Remove pending in subscription
+                    Mod:in_subscription(aaaa, UserFrom, ServerFrom,
+                                        jlib:make_jid(UserTo, ServerTo, ""),
+                                        unsubscribe, ""),
+
+                    %% But we're still subscribed, so respond as such.
                    RosterItem#roster{subscription = both, ask = none};
                %% If so, it means the user wants to add that contact
                %% to his personal roster
@@ -212,11 +229,7 @@ build_roster_record(User1, Server1, User2, Server2, Name2, Groups) ->
 
 set_new_rosteritems(UserFrom, ServerFrom,
                    UserTo, ServerTo, ResourceTo, NameTo, GroupsFrom) ->
-    Mod = case lists:member(mod_roster_odbc,
-                           gen_mod:loaded_modules(ServerFrom)) of
-             true -> mod_roster_odbc;
-             false -> mod_roster
-         end,
+    Mod = get_roster_mod(ServerFrom),
 
     RIFrom = build_roster_record(UserFrom, ServerFrom,
                                 UserTo, ServerTo, NameTo, GroupsFrom),
@@ -302,6 +315,18 @@ get_jid_info({Subscription, Groups}, User, Server, JID) ->
 in_subscription(Acc, User, Server, JID, Type, _Reason) ->
     process_subscription(in, User, Server, JID, Type, Acc).
 
+out_subscription(UserFrom, ServerFrom, JIDTo, unsubscribed) ->
+    Mod = get_roster_mod(ServerFrom),
+
+    %% Remove pending out subscription
+    #jid{luser = UserTo, lserver = ServerTo} = JIDTo,
+    JIDFrom = jlib:make_jid(UserFrom, UserTo, ""),
+    Mod:out_subscription(UserTo, ServerTo, JIDFrom, unsubscribe),
+
+    %% Remove pending in subscription
+    Mod:in_subscription(aaaa, UserFrom, ServerFrom, JIDTo, unsubscribe, ""),
+
+    process_subscription(out, UserFrom, ServerFrom, JIDTo, unsubscribed, false);
 out_subscription(User, Server, JID, Type) ->
     process_subscription(out, User, Server, JID, Type, false).
 
@@ -911,6 +936,14 @@ shared_roster_group_parse_query(Host, Group, Query) ->
            nothing
     end.
 
+%% Get the roster module for Server.
+get_roster_mod(Server) ->
+    case lists:member(mod_roster_odbc,
+                      gen_mod:loaded_modules(Server)) of
+        true -> mod_roster_odbc;
+        false -> mod_roster
+    end.
+
 get_opt(Opts, Opt, Default) ->
     case lists:keysearch(Opt, 1, Opts) of
        {value, {_, Val}} ->