aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--src/mod_shared_roster.erl43
2 files changed, 43 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 764f3ffda..f2dc68eb2 100644
--- 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
diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl
index 1a15119b5..d71c55ebc 100644
--- a/src/mod_shared_roster.erl
+++ b/src/mod_shared_roster.erl
@@ -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}} ->