From d0fc8fe056809a16929199d0a22ac8a8c947fd0e Mon Sep 17 00:00:00 2001 From: Badlop Date: Fri, 13 Feb 2009 23:01:41 +0000 Subject: [PATCH] * 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) SVN Revision: 1874 --- ChangeLog | 5 +++++ src/mod_shared_roster.erl | 43 ++++++++++++++++++++++++++++++++++----- 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 + * 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}} ->