mod_pubsub,mod_pep: Support "max" as 'pubsub#max_items'
authorKim Alvefur <zash@zash.se>
Wed, 09 Jun 2021 15:58:49 +0200
changeset 11635 6641ca266d94
parent 11634 855b065d5fd6
child 11636 21a1b9fb08a1
mod_pubsub,mod_pep: Support "max" as 'pubsub#max_items' Fixes #1643 API change: The argument to archive_itemstore() changes type to integer
doc/doap.xml
plugins/mod_pep.lua
plugins/mod_pubsub/mod_pubsub.lua
plugins/mod_pubsub/pubsub.lib.lua
spec/scansion/pep_pubsub_max.scs
spec/scansion/pubsub_config.scs
spec/scansion/pubsub_multi_items.scs
spec/scansion/pubsub_preconditions.scs
--- a/doc/doap.xml	Fri Sep 18 12:18:51 2020 +0200
+++ b/doc/doap.xml	Wed Jun 09 15:58:49 2021 +0200
@@ -158,7 +158,7 @@
     <implements>
       <xmpp:SupportedXep>
         <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0060.html"/>
-        <xmpp:version>1.15.8</xmpp:version>
+        <xmpp:version>1.20.0</xmpp:version>
         <xmpp:since>0.9.0</xmpp:since>
         <xmpp:status>partial</xmpp:status>
       </xmpp:SupportedXep>
--- a/plugins/mod_pep.lua	Fri Sep 18 12:18:51 2020 +0200
+++ b/plugins/mod_pep.lua	Wed Jun 09 15:58:49 2021 +0200
@@ -35,6 +35,13 @@
 
 local max_max_items = module:get_option_number("pep_max_items", 256);
 
+local function tonumber_max_items(n)
+	if n == "max" then
+		return max_max_items;
+	end
+	return tonumber(n);
+end
+
 function module.save()
 	return {
 		services = services;
@@ -56,7 +63,7 @@
 end
 
 function check_node_config(node, actor, new_config) -- luacheck: ignore 212/node 212/actor
-	if (new_config["max_items"] or 1) > max_max_items then
+	if (tonumber_max_items(new_config["max_items"]) or 1) > max_max_items then
 		return false;
 	end
 	if new_config["access_model"] ~= "presence"
@@ -102,13 +109,14 @@
 local function simple_itemstore(username)
 	local driver = storagemanager.get_driver(module.host, "pep_data");
 	return function (config, node)
+		local max_items = tonumber_max_items(config["max_items"]);
 		if config["persist_items"] then
 			module:log("debug", "Creating new persistent item store for user %s, node %q", username, node);
 			local archive = driver:open("pep_"..node, "archive");
-			return lib_pubsub.archive_itemstore(archive, config, username, node, false);
+			return lib_pubsub.archive_itemstore(archive, max_items, username, node, false);
 		else
 			module:log("debug", "Creating new ephemeral item store for user %s, node %q", username, node);
-			return cache.new(tonumber(config["max_items"]));
+			return cache.new(max_items);
 		end
 	end
 end
--- a/plugins/mod_pubsub/mod_pubsub.lua	Fri Sep 18 12:18:51 2020 +0200
+++ b/plugins/mod_pubsub/mod_pubsub.lua	Wed Jun 09 15:58:49 2021 +0200
@@ -39,13 +39,22 @@
 --   get(node_name)
 --   users(): iterator over (node_name)
 
+local max_max_items = module:get_option_number("pubsub_max_items", 256);
+
+local function tonumber_max_items(n)
+	if n == "max" then
+		return max_max_items;
+	end
+	return tonumber(n);
+end
 
 local node_store = module:open_store(module.name.."_nodes");
 
 local function create_simple_itemstore(node_config, node_name) --> util.cache like object
 	local driver = storagemanager.get_driver(module.host, "pubsub_data");
 	local archive = driver:open("pubsub_"..node_name, "archive");
-	return lib_pubsub.archive_itemstore(archive, node_config, nil, node_name);
+	local max_items = tonumber_max_items(node_config["max_items"]);
+	return lib_pubsub.archive_itemstore(archive, max_items, nil, node_name);
 end
 
 function simple_broadcast(kind, node, jids, item, actor, node_obj)
@@ -99,9 +108,8 @@
 	end
 end
 
-local max_max_items = module:get_option_number("pubsub_max_items", 256);
 function check_node_config(node, actor, new_config) -- luacheck: ignore 212/node 212/actor
-	if (new_config["max_items"] or 1) > max_max_items then
+	if (tonumber_max_items(new_config["max_items"]) or 1) > max_max_items then
 		return false;
 	end
 	if new_config["access_model"] ~= "whitelist"
--- a/plugins/mod_pubsub/pubsub.lib.lua	Fri Sep 18 12:18:51 2020 +0200
+++ b/plugins/mod_pubsub/pubsub.lib.lua	Wed Jun 09 15:58:49 2021 +0200
@@ -83,7 +83,7 @@
 	};
 	{
 		type = "text-single";
-		datatype = "xs:integer";
+		datatype = "pubsub:integer-or-max";
 		name = "max_items";
 		var = "pubsub#max_items";
 		label = "Max # of items to persist";
@@ -801,10 +801,9 @@
 	return item;
 end
 
-local function archive_itemstore(archive, config, user, node)
-	module:log("debug", "Creation of archive itemstore for node %s with config %q", node, config);
+local function archive_itemstore(archive, max_items, user, node)
+	module:log("debug", "Creation of archive itemstore for node %s with limit %d", node, max_items);
 	local get_set = {};
-	local max_items = config["max_items"];
 	function get_set:items() -- luacheck: ignore 212/self
 		local data, err = archive:find(user, {
 			limit = tonumber(max_items);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spec/scansion/pep_pubsub_max.scs	Wed Jun 09 15:58:49 2021 +0200
@@ -0,0 +1,47 @@
+# PEP max_items=max
+
+[Client] Romeo
+	jid: pep-test-maxitems@localhost
+	password: password
+
+-----
+
+Romeo connects
+
+Romeo sends:
+	<iq type="set" id="pub">
+		<pubsub xmlns="http://jabber.org/protocol/pubsub">
+			<publish node="urn:xmpp:microblog:0">
+				<item>
+					<entry xmlns='http://www.w3.org/2005/Atom'>
+						<title>Hello</title>
+					</entry>
+				</item>
+			</publish>
+			<publish-options>
+				<x xmlns="jabber:x:data" type="submit">
+					<field type="hidden" var="FORM_TYPE">
+						<value>http://jabber.org/protocol/pubsub#publish-options</value>
+					</field>
+					<field var="pubsub#persist_items">
+						<value>true</value>
+					</field>
+					<field var="pubsub#access_model">
+						<value>open</value>
+					</field>
+					<field var="pubsub#max_items">
+						<value>max</value>
+					</field>
+				</x>
+			</publish-options>
+		</pubsub>
+	</iq>
+
+Romeo receives:
+	<iq type="result" id="pub">
+		<pubsub xmlns="http://jabber.org/protocol/pubsub">
+			<publish node="urn:xmpp:microblog:0">
+				<item id="{scansion:any}"/>
+			</publish>
+		</pubsub>
+	</iq>
--- a/spec/scansion/pubsub_config.scs	Fri Sep 18 12:18:51 2020 +0200
+++ b/spec/scansion/pubsub_config.scs	Wed Jun 09 15:58:49 2021 +0200
@@ -48,7 +48,7 @@
 					<field var="pubsub#description" label="Description" type="text-single"/>
 					<field var="pubsub#type" label="The type of node data, usually specified by the namespace of the payload (if any)" type="text-single"/>
 					<field var="pubsub#max_items" label="Max # of items to persist" type="text-single">
-						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="xs:integer"/>
+						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="pubsub:integer-or-max"/>
 						<value>1</value>
 					</field>
 					<field var="pubsub#persist_items" label="Persist items to storage" type="boolean">
@@ -124,7 +124,7 @@
 					<field var="pubsub#description" type="text-single" label="Description"/>
 					<field var="pubsub#type" type="text-single" label="The type of node data, usually specified by the namespace of the payload (if any)"/>
 					<field var="pubsub#max_items" type="text-single" label="Max # of items to persist">
-						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="xs:integer"/>
+						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="pubsub:integer-or-max"/>
 						<value>1</value>
 					</field>
 					<field var="pubsub#persist_items" type="boolean" label="Persist items to storage">
--- a/spec/scansion/pubsub_multi_items.scs	Fri Sep 18 12:18:51 2020 +0200
+++ b/spec/scansion/pubsub_multi_items.scs	Wed Jun 09 15:58:49 2021 +0200
@@ -43,7 +43,7 @@
 		<field var="pubsub#description" label="Description" type="text-single"/>
 		<field var="pubsub#type" label="The type of node data, usually specified by the namespace of the payload (if any)" type="text-single"/>
 		<field var="pubsub#max_items" label="Max # of items to persist" type="text-single">
-		  <validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="xs:integer"/>
+		  <validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="pubsub:integer-or-max"/>
 		  <value>20</value>
 		</field>
 		<field var="pubsub#persist_items" label="Persist items to storage" type="boolean">
--- a/spec/scansion/pubsub_preconditions.scs	Fri Sep 18 12:18:51 2020 +0200
+++ b/spec/scansion/pubsub_preconditions.scs	Wed Jun 09 15:58:49 2021 +0200
@@ -47,7 +47,7 @@
 					<field var="pubsub#description" label="Description" type="text-single"/>
 					<field var="pubsub#type" label="The type of node data, usually specified by the namespace of the payload (if any)" type="text-single"/>
 					<field var="pubsub#max_items" label="Max # of items to persist" type="text-single">
-						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="xs:integer"/>
+						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="pubsub:integer-or-max"/>
 						<value>1</value>
 					</field>
 					<field var="pubsub#persist_items" label="Persist items to storage" type="boolean">
@@ -123,7 +123,7 @@
 					<field var="pubsub#description" type="text-single" label="Description"/>
 					<field var="pubsub#type" type="text-single" label="The type of node data, usually specified by the namespace of the payload (if any)"/>
 					<field var="pubsub#max_items" type="text-single" label="Max # of items to persist">
-						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="xs:integer"/>
+						<validate xmlns="http://jabber.org/protocol/xdata-validate" datatype="pubsub:integer-or-max"/>
 						<value>1</value>
 					</field>
 					<field var="pubsub#persist_items" type="boolean" label="Persist items to storage">