diff options
author | Kim Alvefur <zash@zash.se> | 2018-07-13 04:52:43 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2018-07-13 04:52:43 +0200 |
commit | 7afeb9baf491f9f3013b9356b3686bfb8192095a (patch) | |
tree | 4bfba808e2e59cba744f1987ace330815f71ee2f | |
parent | 25b8c1a92157113c3c24cf213a9de870bba7a311 (diff) | |
download | prosody-7afeb9baf491f9f3013b9356b3686bfb8192095a.tar.gz prosody-7afeb9baf491f9f3013b9356b3686bfb8192095a.zip |
mod_pubsub: Add support for modifying subscriptions
https://xmpp.org/extensions/xep-0060.html#owner-subscriptions-modify
-rw-r--r-- | plugins/mod_pubsub/pubsub.lib.lua | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/plugins/mod_pubsub/pubsub.lib.lua b/plugins/mod_pubsub/pubsub.lib.lua index f10c593f..540185a7 100644 --- a/plugins/mod_pubsub/pubsub.lib.lua +++ b/plugins/mod_pubsub/pubsub.lib.lua @@ -267,6 +267,44 @@ function handlers.owner_get_subscriptions(origin, stanza, subscriptions, service return true; end +function handlers.owner_set_subscriptions(origin, stanza, subscriptions, service) + local node = subscriptions.attr.node; + if not node then + origin.send(pubsub_error_reply(stanza, "nodeid-required")); + return true; + end + if not service:may(node, stanza.attr.from, "subscribe_other") then + origin.send(pubsub_error_reply(stanza, "forbidden")); + return true; + end + + local node_obj = service.nodes[node]; + if not node_obj then + origin.send(pubsub_error_reply(stanza, "item-not-found")); + return true; + end + + for subscription_tag in subscriptions:childtags("subscription") do + if subscription_tag.attr.subscription == 'subscribed' then + local ok, err = service:add_subscription(node, stanza.attr.from, subscription_tag.attr.jid); + if not ok then + origin.send(pubsub_error_reply(stanza, err)); + return true; + end + elseif subscription_tag.attr.subscription == 'none' then + local ok, err = service:remove_subscription(node, stanza.attr.from, subscription_tag.attr.jid); + if not ok then + origin.send(pubsub_error_reply(stanza, err)); + return true; + end + end + end + + local reply = st.reply(stanza); + origin.send(reply); + return true; +end + function handlers.set_create(origin, stanza, create, service) local node = create.attr.node; local ok, ret, reply; |