aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/mod_pep.lua3
-rw-r--r--plugins/mod_pubsub/pubsub.lib.lua16
-rw-r--r--spec/scansion/pubsub_config.scs15
-rw-r--r--spec/scansion/pubsub_max_items.scs12
-rw-r--r--spec/scansion/pubsub_multi_items.scs12
-rw-r--r--spec/scansion/pubsub_preconditions.scs15
-rw-r--r--spec/scansion/pubsub_resend_on_sub.scs152
-rw-r--r--util/pubsub.lua1
8 files changed, 226 insertions, 0 deletions
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
@@ -120,6 +120,12 @@ local node_config_form = dataform {
};
};
{
+ 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;
label = "Whether to deliver event notifications";
@@ -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:
</option>
<value>publishers</value>
</field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <option label='never'>
+ <value>never</value>
+ </option>
+ <option label='on_sub'>
+ <value>on_sub</value>
+ </option>
+ <option label='on_sub_and_presence'>
+ <value>on_sub_and_presence</value>
+ </option>
+ <value>on_sub_and_presence</value>
+ </field>
<field var="pubsub#deliver_notifications" label="Whether to deliver event notifications" type="boolean">
<value>1</value>
</field>
@@ -160,6 +172,9 @@ Romeo sends:
</option>
<value>publishers</value>
</field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <value>never</value>
+ </field>
<field var="pubsub#deliver_notifications" type="boolean" label="Whether to deliver event notifications">
<value>1</value>
</field>
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:
</option>
<value>publishers</value>
</field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <option label='never'>
+ <value>never</value>
+ </option>
+ <option label='on_sub'>
+ <value>on_sub</value>
+ </option>
+ <option label='on_sub_and_presence'>
+ <value>on_sub_and_presence</value>
+ </option>
+ <value>never</value>
+ </field>
<field var="pubsub#deliver_notifications" label="Whether to deliver event notifications" type="boolean">
<value>1</value>
</field>
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:
</option>
<value>publishers</value>
</field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <option label='never'>
+ <value>never</value>
+ </option>
+ <option label='on_sub'>
+ <value>on_sub</value>
+ </option>
+ <option label='on_sub_and_presence'>
+ <value>on_sub_and_presence</value>
+ </option>
+ <value>never</value>
+ </field>
<field var="pubsub#deliver_notifications" label="Whether to deliver event notifications" type="boolean">
<value>1</value>
</field>
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:
</option>
<value>publishers</value>
</field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <option label='never'>
+ <value>never</value>
+ </option>
+ <option label='on_sub'>
+ <value>on_sub</value>
+ </option>
+ <option label='on_sub_and_presence'>
+ <value>on_sub_and_presence</value>
+ </option>
+ <value>on_sub_and_presence</value>
+ </field>
<field var="pubsub#deliver_notifications" label="Whether to deliver event notifications" type="boolean">
<value>1</value>
</field>
@@ -159,6 +171,9 @@ Romeo sends:
</option>
<value>publishers</value>
</field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <value>never</value>
+ </field>
<field var="pubsub#deliver_notifications" type="boolean" label="Whether to deliver event notifications">
<value>1</value>
</field>
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:
+ <iq type="set" to="pubsub.localhost" id='create1'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <create node="princely_musings"/>
+ </pubsub>
+ </iq>
+
+Romeo receives:
+ <iq type="result" id='create1'/>
+
+Romeo sends:
+ <iq to="pubsub.localhost" id="config-never" type="set">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <configure node="princely_musings">
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="FORM_TYPE" type="hidden">
+ <value>http://jabber.org/protocol/pubsub#node_config</value>
+ </field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <value>never</value>
+ </field>
+ </x>
+ </configure>
+ </pubsub>
+ </iq>
+
+Romeo receives:
+ <iq from="pubsub.localhost" id="config-never" type="result"/>
+
+Romeo sends:
+ <iq type="set" to="pubsub.localhost" id='pub1'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <publish node="princely_musings">
+ <item id="current">
+ <entry xmlns="http://www.w3.org/2005/Atom">
+ <title>Soliloquy</title>
+ <summary>Lorem ipsum dolor sit amet</summary>
+ </entry>
+ </item>
+ </publish>
+ </pubsub>
+ </iq>
+
+Romeo receives:
+ <iq type="result" id='pub1'/>
+
+Juliet connects
+
+Juliet sends:
+ <iq type="set" to="pubsub.localhost" id='sub1'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="princely_musings" jid="${Juliet's full JID}"/>
+ </pubsub>
+ </iq>
+
+Juliet receives:
+ <iq type="result" id='sub1'/>
+
+Juliet sends:
+ <iq type="set" to="pubsub.localhost" id='unsub1'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="princely_musings" jid="${Juliet's full JID}"/>
+ </pubsub>
+ </iq>
+
+Juliet receives:
+ <iq type="result" id='unsub1'/>
+
+Romeo sends:
+ <iq to="pubsub.localhost" id="config-on_sub" type="set">
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <configure node="princely_musings">
+ <x xmlns="jabber:x:data" type="submit">
+ <field var="FORM_TYPE" type="hidden">
+ <value>http://jabber.org/protocol/pubsub#node_config</value>
+ </field>
+ <field type='list-single' var='pubsub#send_last_published_item'>
+ <value>on_sub</value>
+ </field>
+ </x>
+ </configure>
+ </pubsub>
+ </iq>
+
+Romeo receives:
+ <iq from="pubsub.localhost" id="config-on_sub" type="result"/>
+
+Juliet sends:
+ <iq type="set" to="pubsub.localhost" id='sub2'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <subscribe node="princely_musings" jid="${Juliet's full JID}"/>
+ </pubsub>
+ </iq>
+
+Juliet receives:
+ <iq type="result" id='sub2'/>
+
+Juliet receives:
+ <message type="headline" from="pubsub.localhost">
+ <event xmlns="http://jabber.org/protocol/pubsub#event">
+ <items node="princely_musings">
+ <item id="current" publisher="${Romeo's JID}">
+ <entry xmlns="http://www.w3.org/2005/Atom">
+ <title>Soliloquy</title>
+ <summary>Lorem ipsum dolor sit amet</summary>
+ </entry>
+ </item>
+ </items>
+ </event>
+ </message>
+
+Juliet sends:
+ <iq type="set" to="pubsub.localhost" id='unsub2'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub">
+ <unsubscribe node="princely_musings" jid="${Juliet's full JID}"/>
+ </pubsub>
+ </iq>
+
+Juliet receives:
+ <iq type="result" id='unsub2'/>
+
+Juliet disconnects
+
+Romeo sends:
+ <iq type="set" to="pubsub.localhost" id='del1'>
+ <pubsub xmlns="http://jabber.org/protocol/pubsub#owner">
+ <delete node="princely_musings"/>
+ </pubsub>
+ </iq>
+
+Romeo receives:
+ <iq type="result" id='del1'/>
+
+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 };