]> granicus.if.org Git - ejabberd/commitdiff
Fix delete item from unregistered user (#2067)
authorChristophe Romain <christophe.romain@process-one.net>
Wed, 25 Oct 2017 09:16:54 +0000 (11:16 +0200)
committerChristophe Romain <christophe.romain@process-one.net>
Wed, 25 Oct 2017 09:16:54 +0000 (11:16 +0200)
src/node_flat.erl

index d63f589ec703cc2ec35190bcea07b71bb40161cb..18d4f4745bebe98d48e931fbc99d15afedf1ede8 100644 (file)
@@ -445,21 +445,30 @@ delete_item(Nidx, Publisher, PublishModel, ItemId) ->
                    case Affiliation of
                        owner ->
                            {result, States} = get_states(Nidx),
+                           Records = States ++ mnesia:read({pubsub_orphan, Nidx}),
                            lists:foldl(fun
-                                   (#pubsub_state{items = PI} = S, Res) ->
-                                       case lists:member(ItemId, PI) of
+                                   (#pubsub_state{items = RI} = S, Res) ->
+                                       case lists:member(ItemId, RI) of
                                            true ->
-                                               Nitems = lists:delete(ItemId, PI),
+                                               NI = lists:delete(ItemId, RI),
                                                del_item(Nidx, ItemId),
-                                               set_state(S#pubsub_state{items = Nitems}),
+                                               mnesia:write(S#pubsub_state{items = NI}),
                                                {result, {default, broadcast}};
                                            false ->
                                                Res
                                        end;
-                                   (_, Res) ->
-                                       Res
+                                   (#pubsub_orphan{items = RI} = S, Res) ->
+                                       case lists:member(ItemId, RI) of
+                                           true ->
+                                               NI = lists:delete(ItemId, RI),
+                                               del_item(Nidx, ItemId),
+                                               mnesia:write(S#pubsub_orphan{items = NI}),
+                                               {result, {default, broadcast}};
+                                           false ->
+                                               Res
+                                       end
                                end,
-                               {error, xmpp:err_item_not_found()}, States);
+                               {error, xmpp:err_item_not_found()}, Records);
                        _ ->
                            {error, xmpp:err_forbidden()}
                    end