From 4b05d0f2402475fea608fd3e48a96364bc6da4f2 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Tue, 19 Oct 2021 18:11:50 +0200 Subject: mod_pubsub,mod_pep: Implement 'send_last_published_item' option #1436 Default left as 'never' in mod_pubsub to preserve the previous behavior. Unclear if this is desirable, but can always be changed later. In mod_pep this allows turning off the automatic resending of most recent item. --- plugins/mod_pep.lua | 3 + plugins/mod_pubsub/pubsub.lib.lua | 16 ++++ spec/scansion/pubsub_config.scs | 15 ++++ spec/scansion/pubsub_max_items.scs | 12 +++ spec/scansion/pubsub_multi_items.scs | 12 +++ spec/scansion/pubsub_preconditions.scs | 15 ++++ spec/scansion/pubsub_resend_on_sub.scs | 152 +++++++++++++++++++++++++++++++++ util/pubsub.lua | 1 + 8 files changed, 226 insertions(+) create mode 100644 spec/scansion/pubsub_resend_on_sub.scs diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index 2489655d..93342e09 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -187,6 +187,7 @@ function get_pep_service(username) ["max_items"] = 1; ["persist_items"] = true; ["access_model"] = "presence"; + ["send_last_published_item"] = "on_sub_and_presence"; }; autocreate_on_publish = true; @@ -260,6 +261,8 @@ local function get_caps_hash_from_presence(stanza, current) end local function resend_last_item(jid, node, service) + local ok, config = service:get_node_config(node, true); + if ok and config.send_last_published_item ~= "on_sub_and_presence" then return end local ok, id, item = service:get_last_item(node, jid); if not (ok and id) then return; end service.config.broadcaster("items", node, { [jid] = true }, item); diff --git a/plugins/mod_pubsub/pubsub.lib.lua b/plugins/mod_pubsub/pubsub.lib.lua index 87144173..c5097a33 100644 --- a/plugins/mod_pubsub/pubsub.lib.lua +++ b/plugins/mod_pubsub/pubsub.lib.lua @@ -119,6 +119,12 @@ local node_config_form = dataform { "open"; }; }; + { + type = "list-single"; + var = "pubsub#send_last_published_item"; + name = "send_last_published_item"; + options = { "never"; "on_sub"; "on_sub_and_presence" }; + }; { type = "boolean"; value = true; @@ -253,6 +259,10 @@ function _M.get_feature_set(service) supported_features:add("access-"..service.node_defaults.access_model); end + if service.node_defaults.send_last_published_item ~= "never" then + supported_features:add("last-published"); + end + if rawget(service.config, "itemstore") and rawget(service.config, "nodestore") then supported_features:add("persistent-items"); end @@ -530,6 +540,12 @@ function handlers.set_subscribe(origin, stanza, subscribe, service) reply = pubsub_error_reply(stanza, ret); end origin.send(reply); + local ok, config = service:get_node_config(node, true); + if ok and config.send_last_published_item ~= "never" then + local ok, id, item = service:get_last_item(node, jid); + if not (ok and id) then return; end + service.config.broadcaster("items", node, { [jid] = true }, item); + end end function handlers.set_unsubscribe(origin, stanza, unsubscribe, service) diff --git a/spec/scansion/pubsub_config.scs b/spec/scansion/pubsub_config.scs index 2cad9115..28505f28 100644 --- a/spec/scansion/pubsub_config.scs +++ b/spec/scansion/pubsub_config.scs @@ -84,6 +84,18 @@ Romeo receives: publishers + + + + + on_sub_and_presence + 1 @@ -160,6 +172,9 @@ Romeo sends: publishers + + never + 1 diff --git a/spec/scansion/pubsub_max_items.scs b/spec/scansion/pubsub_max_items.scs index 7f0b531d..dafeb317 100644 --- a/spec/scansion/pubsub_max_items.scs +++ b/spec/scansion/pubsub_max_items.scs @@ -79,6 +79,18 @@ Alice receives: publishers + + + + + never + 1 diff --git a/spec/scansion/pubsub_multi_items.scs b/spec/scansion/pubsub_multi_items.scs index 331093ca..d4f2e01b 100644 --- a/spec/scansion/pubsub_multi_items.scs +++ b/spec/scansion/pubsub_multi_items.scs @@ -79,6 +79,18 @@ Alice receives: publishers + + + + + never + 1 diff --git a/spec/scansion/pubsub_preconditions.scs b/spec/scansion/pubsub_preconditions.scs index 7e4e593b..744070db 100644 --- a/spec/scansion/pubsub_preconditions.scs +++ b/spec/scansion/pubsub_preconditions.scs @@ -83,6 +83,18 @@ Romeo receives: publishers + + + + + on_sub_and_presence + 1 @@ -159,6 +171,9 @@ Romeo sends: publishers + + never + 1 diff --git a/spec/scansion/pubsub_resend_on_sub.scs b/spec/scansion/pubsub_resend_on_sub.scs new file mode 100644 index 00000000..cfce8934 --- /dev/null +++ b/spec/scansion/pubsub_resend_on_sub.scs @@ -0,0 +1,152 @@ +# Pubsub: Send last item on subscribe #1436 + +[Client] Romeo + jid: admin@localhost + password: password + +// admin@localhost is assumed to have node creation privileges + +[Client] Juliet + jid: juliet@localhost + password: password + +--------- + +Romeo connects + +Romeo sends: + + + + + + +Romeo receives: + + +Romeo sends: + + + + + + http://jabber.org/protocol/pubsub#node_config + + + never + + + + + + +Romeo receives: + + +Romeo sends: + + + + + + Soliloquy + Lorem ipsum dolor sit amet + + + + + + +Romeo receives: + + +Juliet connects + +Juliet sends: + + + + + + +Juliet receives: + + +Juliet sends: + + + + + + +Juliet receives: + + +Romeo sends: + + + + + + http://jabber.org/protocol/pubsub#node_config + + + on_sub + + + + + + +Romeo receives: + + +Juliet sends: + + + + + + +Juliet receives: + + +Juliet receives: + + + + + + Soliloquy + Lorem ipsum dolor sit amet + + + + + + +Juliet sends: + + + + + + +Juliet receives: + + +Juliet disconnects + +Romeo sends: + + + + + + +Romeo receives: + + +Romeo disconnects + +// vim: syntax=xml: diff --git a/util/pubsub.lua b/util/pubsub.lua index e23818b8..75620a42 100644 --- a/util/pubsub.lua +++ b/util/pubsub.lua @@ -136,6 +136,7 @@ local default_node_config = { ["max_items"] = 20; ["access_model"] = "open"; ["publish_model"] = "publishers"; + ["send_last_published_item"] = "never"; }; local default_node_config_mt = { __index = default_node_config }; -- cgit v1.2.3