From 7afeb9baf491f9f3013b9356b3686bfb8192095a Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
Date: Fri, 13 Jul 2018 04:52:43 +0200
Subject: mod_pubsub: Add support for modifying subscriptions

https://xmpp.org/extensions/xep-0060.html#owner-subscriptions-modify
---
 plugins/mod_pubsub/pubsub.lib.lua | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

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;
-- 
cgit v1.2.3