diff options
author | Christophe Romain <christophe.romain@process-one.net> | 2017-09-27 17:37:38 +0200 |
---|---|---|
committer | Christophe Romain <christophe.romain@process-one.net> | 2017-09-27 17:37:38 +0200 |
commit | 3c8308bb8d42eec6456e54ce536ec01c033542ff (patch) | |
tree | 2830bc336d516eeb880a3f7b5c894156bbe951f6 /src/node_flat.erl | |
parent | mysql.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.erl | 35 |
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 |