]> granicus.if.org Git - ejabberd/commitdiff
* src/mod_roster.erl: When account is deleted, cancel presence
authorBadlop <badlop@process-one.net>
Mon, 16 Feb 2009 14:49:20 +0000 (14:49 +0000)
committerBadlop <badlop@process-one.net>
Mon, 16 Feb 2009 14:49:20 +0000 (14:49 +0000)
subscription for all roster items (EJAB-790)
* src/mod_roster_odbc.erl: Likewise

SVN Revision: 1877

ChangeLog
src/mod_roster.erl
src/mod_roster_odbc.erl

index 269271f9992491e873a3f1be832a2b7cb79f9933..14ee02e9863407d147307e0f331d3c7ff0533a43 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-02-16  Badlop  <badlop@process-one.net>
+
+       * src/mod_roster.erl: When account is deleted, cancel presence
+       subscription for all roster items (EJAB-790)
+       * src/mod_roster_odbc.erl: Likewise
+
 2009-02-14  Badlop  <badlop@process-one.net>
 
        * src/web/ejabberd_http_poll.erl: Allow configuration of session
index a1639c55fc9f25cb205340741ab90aa40228c8fd..9cb23c2a4bc1614298bebbe15027a03e1ac173ba 100644 (file)
@@ -233,34 +233,7 @@ process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) ->
                    push_item(User, LServer, To, Item),
                    case Item#roster.subscription of
                        remove ->
-                           IsTo = case OldItem#roster.subscription of
-                                      both -> true;
-                                      to -> true;
-                                      _ -> false
-                                  end,
-                           IsFrom = case OldItem#roster.subscription of
-                                        both -> true;
-                                        from -> true;
-                                        _ -> false
-                                    end,
-                           if IsTo ->
-                                   ejabberd_router:route(
-                                     jlib:jid_remove_resource(From),
-                                     jlib:make_jid(OldItem#roster.jid),
-                                     {xmlelement, "presence",
-                                      [{"type", "unsubscribe"}],
-                                      []});
-                              true -> ok
-                           end,
-                           if IsFrom ->
-                                   ejabberd_router:route(
-                                     jlib:jid_remove_resource(From),
-                                     jlib:make_jid(OldItem#roster.jid),
-                                     {xmlelement, "presence",
-                                      [{"type", "unsubscribed"}],
-                                      []});
-                              true -> ok
-                           end,
+                           send_unsubscribing_presence(From, OldItem),
                            ok;
                        _ ->
                            ok
@@ -570,6 +543,7 @@ remove_user(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
     US = {LUser, LServer},
+    send_unsubscription_to_rosteritems(LUser, LServer),
     F = fun() ->
                lists:foreach(fun(R) ->
                                      mnesia:delete_object(R)
@@ -578,6 +552,51 @@ remove_user(User, Server) ->
         end,
     mnesia:transaction(F).
 
+%% For each contact with Subscription:
+%% Both or From, send a "unsubscribed" presence stanza;
+%% Both or To, send a "unsubscribe" presence stanza.
+send_unsubscription_to_rosteritems(LUser, LServer) ->
+    RosterItems = get_user_roster([], {LUser, LServer}),
+    From = jlib:make_jid({LUser, LServer, ""}),
+    lists:foreach(fun(RosterItem) ->
+                         send_unsubscribing_presence(From, RosterItem)
+                 end,
+                 RosterItems).
+
+%% @spec (From::jid(), Item::roster()) -> ok
+send_unsubscribing_presence(From, Item) ->
+    IsTo = case Item#roster.subscription of
+              both -> true;
+              to -> true;
+              _ -> false
+          end,
+    IsFrom = case Item#roster.subscription of
+                both -> true;
+                from -> true;
+                _ -> false
+            end,
+    if IsTo ->
+           send_presence_type(
+             jlib:jid_remove_resource(From),
+             jlib:make_jid(Item#roster.jid), "unsubscribe");
+       true -> ok
+    end,
+    if IsFrom ->
+           send_presence_type(
+             jlib:jid_remove_resource(From),
+             jlib:make_jid(Item#roster.jid), "unsubscribed");
+       true -> ok
+    end,
+    ok.
+
+send_presence_type(From, To, Type) ->
+    ejabberd_router:route(
+      From, To,
+      {xmlelement, "presence",
+       [{"type", Type}],
+       []}).
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 set_items(User, Server, SubEl) ->
index ee4e326a70dee1c5594d636df94a5b290f94f03a..0a091a532bddf8db12769d151e0f5004e1428d6a 100644 (file)
@@ -274,34 +274,7 @@ process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) ->
                    push_item(User, LServer, To, Item),
                    case Item#roster.subscription of
                        remove ->
-                           IsTo = case OldItem#roster.subscription of
-                                      both -> true;
-                                      to -> true;
-                                      _ -> false
-                                  end,
-                           IsFrom = case OldItem#roster.subscription of
-                                        both -> true;
-                                        from -> true;
-                                        _ -> false
-                                    end,
-                           if IsTo ->
-                                   ejabberd_router:route(
-                                     jlib:jid_remove_resource(From),
-                                     jlib:make_jid(OldItem#roster.jid),
-                                     {xmlelement, "presence",
-                                      [{"type", "unsubscribe"}],
-                                      []});
-                              true -> ok
-                           end,
-                           if IsFrom ->
-                                   ejabberd_router:route(
-                                     jlib:jid_remove_resource(From),
-                                     jlib:make_jid(OldItem#roster.jid),
-                                     {xmlelement, "presence",
-                                      [{"type", "unsubscribed"}],
-                                      []});
-                              true -> ok
-                           end,
+                           send_unsubscribing_presence(From, OldItem),
                            ok;
                        _ ->
                            ok
@@ -631,9 +604,55 @@ remove_user(User, Server) ->
     LUser = jlib:nodeprep(User),
     LServer = jlib:nameprep(Server),
     Username = ejabberd_odbc:escape(LUser),
+    send_unsubscription_to_rosteritems(LUser, LServer),
     odbc_queries:del_user_roster_t(LServer, Username),
     ok.
 
+%% For each contact with Subscription:
+%% Both or From, send a "unsubscribed" presence stanza;
+%% Both or To, send a "unsubscribe" presence stanza.
+send_unsubscription_to_rosteritems(LUser, LServer) ->
+    RosterItems = get_user_roster([], {LUser, LServer}),
+    From = jlib:make_jid({LUser, LServer, ""}),
+    lists:foreach(fun(RosterItem) ->
+                         send_unsubscribing_presence(From, RosterItem)
+                 end,
+                 RosterItems).
+
+%% @spec (From::jid(), Item::roster()) -> ok
+send_unsubscribing_presence(From, Item) ->
+    IsTo = case Item#roster.subscription of
+              both -> true;
+              to -> true;
+              _ -> false
+          end,
+    IsFrom = case Item#roster.subscription of
+                both -> true;
+                from -> true;
+                _ -> false
+            end,
+    if IsTo ->
+           send_presence_type(
+             jlib:jid_remove_resource(From),
+             jlib:make_jid(Item#roster.jid), "unsubscribe");
+       true -> ok
+    end,
+    if IsFrom ->
+           send_presence_type(
+             jlib:jid_remove_resource(From),
+             jlib:make_jid(Item#roster.jid), "unsubscribed");
+       true -> ok
+    end,
+    ok.
+
+send_presence_type(From, To, Type) ->
+    ejabberd_router:route(
+      From, To,
+      {xmlelement, "presence",
+       [{"type", Type}],
+       []}).
+
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 set_items(User, Server, SubEl) ->