]> granicus.if.org Git - ejabberd/commitdiff
Purge related pep nodes at remove_user
authorChristophe Romain <christophe.romain@process-one.net>
Tue, 18 Dec 2007 14:45:26 +0000 (14:45 +0000)
committerChristophe Romain <christophe.romain@process-one.net>
Tue, 18 Dec 2007 14:45:26 +0000 (14:45 +0000)
SVN Revision: 1077

ChangeLog
src/mod_pubsub/mod_pubsub.erl
src/mod_pubsub/node_pep.erl

index 67e65b44fdbba7000223740fb181153c4fb16052..1d278be0239e0b457f841c4d20789076ef0298ad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-18  Christophe Romain <christophe.romain@process-one.net>
+
+       * src/mod_pubsub/mod_pubsub.erl: Purge related pep nodes at remove_user
+       * src/mod_pubsub/node_pep.erl: Likewise
+
 2007-12-17  Badlop  <badlop@process-one.net>
 
        * src/ejabberd_zlib/Makefile.in: Compile all erl files found in
index 621bb04b32e679db9035f881c4d1d1ed6a45f9c9..2ce785f7c14abd601d7d5280c02b138423a46533 100644 (file)
@@ -43,6 +43,7 @@
 -export([set_presence/4,
         unset_presence/4,
         incoming_presence/3,
+        remove_user/2,
         disco_local_identity/5,
         disco_local_features/5,
         disco_local_items/5,
                host,
                access,
                nodetree = ?STDTREE,
-               plugins = [?STDNODE]}).
+               plugins = [?STDNODE,?PEPNODE]}).
 
 %%====================================================================
 %% API
@@ -154,6 +155,7 @@ init([ServerHost, Opts]) ->
     ejabberd_hooks:add(incoming_presence_hook, ServerHost, ?MODULE, incoming_presence, 50),
     %%ejabberd_hooks:add(set_presence_hook, ServerHost, ?MODULE, set_presence, 50),
     %%ejabberd_hooks:add(unset_presence_hook, ServerHost, ?MODULE, unset_presence, 50),
+    ejabberd_hooks:add(remove_user, ServerHost, ?MODULE, remove_user, 50),
     IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
     lists:foreach(
       fun({NS,Mod,Fun}) ->
@@ -396,6 +398,16 @@ incoming_presence(From, #jid{lserver = Host} = To, Packet) ->
     Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
     gen_server:cast(Proc, {presence, From, To, Packet}).
 
+%% -------
+%% user remove hook handling function
+%%
+
+remove_user(User, Server) ->
+    LUser = jlib:nodeprep(User),
+    LServer = jlib:nameprep(Server),
+    Proc = gen_mod:get_module_proc(Server, ?PROCNAME),
+    gen_server:cast(Proc, {remove, LUser, LServer}).
+
 %%--------------------------------------------------------------------
 %% Function:
 %% handle_call(Request, From, State) -> {reply, Reply, State} |
@@ -517,6 +529,11 @@ handle_cast({set_presence, _User, _Server, _Resource, _Presence}, State) ->
 handle_cast({unset_presence, _User, _Server, _Resource, _Status}, State) ->
     {noreply, State};
 
+handle_cast({remove, User, Server}, State) ->
+    Owner = jlib:make_jid(User, Server, ""),
+    delete_nodes(Server, Owner, State#state.plugins),
+    {noreply, State};
+
 handle_cast(_Msg, State) ->
     {noreply, State}.
 
@@ -562,6 +579,7 @@ terminate(_Reason, #state{host = Host,
     ejabberd_hooks:delete(incoming_presence_hook, ServerHost, ?MODULE, incoming_presence, 50),
     %%ejabberd_hooks:delete(set_presence_hook, ServerHost, ?MODULE, set_presence, 50),
     %%ejabberd_hooks:delete(unset_presence_hook, ServerHost, ?MODULE, unset_presence, 50),
+    ejabberd_hooks:delete(remove_user, ServerHost, ?MODULE, remove_user, 50),
     lists:foreach(fun({NS,Mod}) ->
                          gen_iq_handler:remove_iq_handler(Mod, ServerHost, NS)
                  end, [{?NS_PUBSUB, ejabberd_local},
@@ -861,7 +879,7 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, _Lang, Access, Plugins) ->
                        [{xmlelement, "configure", _, Config}] ->
                            %% Get the type of the node
                            Type = case xml:get_attr_s("type", Attrs) of
-                                      [] -> ?STDNODE;
+                                      [] -> hd(Plugins);
                                       T -> T
                                   end,
                            %% we use Plugins list matching because we do not want to allocate
@@ -1292,6 +1310,25 @@ delete_node(Host, Node, Owner) ->
        {result, Result} ->
            {result, Result}
     end.
+delete_nodes(Host, Owner, Plugins) ->
+    %% This removes only PEP nodes when user is removed
+    OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+    lists:foreach(fun(#pubsub_node{nodeid={NodeKey, NodeName}}) ->
+       delete_node(NodeKey, NodeName, Owner)
+    end, tree_action(Host, get_nodes, [OwnerKey])).
+%   TODO: may be best to use the generic following code
+%   lists:foreach(fun(Type) ->
+%          {result, Affiliations} = node_action(Type, get_entity_affiliations, [Host, Owner]),
+%          NodeKey = case Type of
+%          ?PEPNODE -> OwnerKey;
+%          _ -> Host
+%          end,
+%          lists:foreach(
+%              fun({NodeId, owner}) -> delete_node(NodeKey, NodeId, Owner);
+%                 (_) -> ok
+%              end
+%          end, Affiliations)
+%      end, Plugins),
 
 %% @spec (Host, Node, From, JID) ->
 %%               {error, Reason::stanzaError()} |
index 45b7edf9be68e9ffd213e31d0bf7df4d9083adaf..7cd023d612c439815f6642e9ab96745d3727412c 100644 (file)
@@ -130,36 +130,31 @@ delete_item(Host, Node, JID, ItemId) ->
 purge_node(Host, Node, Owner) ->
     node_default:purge_node(Host, Node, Owner).
 
-get_entity_affiliations(Host, Owner) ->
-    %node_default:get_entity_affiliations(Host, Owner).
-    {result, []}.
+get_entity_affiliations(_Host, Owner) ->
+    OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+    node_default:get_entity_affiliations(OwnerKey, Owner).
+    %{result, []}.
 
-get_node_affiliations(Host, Node) ->
-    %node_default:get_node_affiliations(Host, Node).
+get_node_affiliations(_Host, _Node) ->
     {result, []}.
 
-get_affiliation(Host, Node, Owner) ->
-    %node_default:get_affiliation(Host, Node, Owner).
-    {result, unknown}.
+get_affiliation(_Host, Node, Owner) ->
+    OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
+    node_default:get_affiliation(OwnerKey, Node, Owner).
 
-set_affiliation(Host, Node, Owner, Affiliation) ->
-    %node_default:set_affiliation(Host, Node, Owner, Affiliation).
+set_affiliation(_Host, _Node, _Owner, _Affiliation) ->
     ok.
 
-get_entity_subscriptions(Host, Owner) ->
-    %node_default:get_entity_subscriptions(Host, Owner).
+get_entity_subscriptions(_Host, _Owner) ->
     {result, []}.
 
-get_node_subscriptions(Host, Node) ->
-    %node_default:get_node_subscriptions(Host, Node).
+get_node_subscriptions(_Host, _Node) ->
     {result, []}.
 
-get_subscription(Host, Node, Owner) ->
-    %node_default:get_subscription(Host, Node, Owner).
+get_subscription(_Host, _Node, _Owner) ->
     {result, unknown}.
 
-set_subscription(Host, Node, Owner, Subscription) ->
-    %node_default:set_subscription(Host, Node, Owner, Subscription).
+set_subscription(_Host, _Node, _Owner, _Subscription) ->
     ok.
 
 get_states(Host, Node) ->