aboutsummaryrefslogtreecommitdiff
path: root/src/node_flat.erl
diff options
context:
space:
mode:
authorChristophe Romain <christophe.romain@process-one.net>2017-09-27 17:37:38 +0200
committerChristophe Romain <christophe.romain@process-one.net>2017-09-27 17:37:38 +0200
commit3c8308bb8d42eec6456e54ce536ec01c033542ff (patch)
tree2830bc336d516eeb880a3f7b5c894156bbe951f6 /src/node_flat.erl
parentmysql.sql: Use multi-column index on username/ID (diff)
PubSub: enforce controls on publish and delete
Diffstat (limited to 'src/node_flat.erl')
-rw-r--r--src/node_flat.erl35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/node_flat.erl b/src/node_flat.erl
index 160f6d27c..7347747e8 100644
--- a/src/node_flat.erl
+++ b/src/node_flat.erl
@@ -376,23 +376,26 @@ publish_item(Nidx, Publisher, PublishModel, MaxItems, ItemId, Payload,
true ->
if MaxItems > 0 ->
Now = p1_time_compat:timestamp(),
- PubId = {Now, SubKey},
- Item = case get_item(Nidx, ItemId) of
- {result, OldItem} ->
- OldItem#pubsub_item{modification = PubId,
- payload = Payload};
+ case get_item(Nidx, ItemId) of
+ {result, #pubsub_item{creation = {_, GenKey}} = OldItem} ->
+ set_item(OldItem#pubsub_item{
+ modification = {Now, SubKey},
+ payload = Payload}),
+ {result, {default, broadcast, []}};
+ {result, _} ->
+ {error, xmpp:err_forbidden()};
_ ->
- #pubsub_item{itemid = {ItemId, Nidx},
- nodeidx = Nidx,
- creation = {Now, GenKey},
- modification = PubId,
- payload = Payload}
- end,
- Items = [ItemId | GenState#pubsub_state.items -- [ItemId]],
- {result, {NI, OI}} = remove_extra_items(Nidx, MaxItems, Items),
- set_item(Item),
- set_state(GenState#pubsub_state{items = NI}),
- {result, {default, broadcast, OI}};
+ Items = [ItemId | GenState#pubsub_state.items],
+ {result, {NI, OI}} = remove_extra_items(Nidx, MaxItems, Items),
+ set_state(GenState#pubsub_state{items = NI}),
+ set_item(#pubsub_item{
+ itemid = {ItemId, Nidx},
+ nodeidx = Nidx,
+ creation = {Now, GenKey},
+ modification = {Now, SubKey},
+ payload = Payload}),
+ {result, {default, broadcast, OI}}
+ end;
true ->
{result, {default, broadcast, []}}
end