+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
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
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)
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) ->
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
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) ->