plugins/mod_pubsub/pubsub.lib.lua
author Kim Alvefur <zash@zash.se>
Sat, 18 Aug 2018 14:38:49 +0200
changeset 9202 596d0d82a113
parent 9201 2ce27be5fdd1
child 9203 249d90ff992e
permissions -rw-r--r--
mod_pubsub: Advertise support for subscription-options Initial support was added in d614003a82c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7361
diff changeset
     1
local t_unpack = table.unpack or unpack; -- luacheck: ignore 113
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
     2
local time_now = os.time;
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7361
diff changeset
     3
8943
365b16109d95 mod_pubsub: Apply normalization to JIDs retrieved from attributes
Kim Alvefur <zash@zash.se>
parents: 8942
diff changeset
     4
local jid_prep = require "util.jid".prep;
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
     5
local set = require "util.set";
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     6
local st = require "util.stanza";
8328
9a845e9e9cbf mod_pubsub: Fix typo in import
Kim Alvefur <zash@zash.se>
parents: 8327
diff changeset
     7
local it = require "util.iterators";
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     8
local uuid_generate = require "util.uuid".generate;
6449
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
     9
local dataform = require"util.dataforms".new;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    10
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    11
local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    12
local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors";
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
    13
local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    14
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    15
local _M = {};
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    16
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    17
local handlers = {};
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    18
_M.handlers = handlers;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    19
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    20
local pubsub_errors = {
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    21
	["conflict"] = { "cancel", "conflict" };
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    22
	["invalid-jid"] = { "modify", "bad-request", nil, "invalid-jid" };
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    23
	["jid-required"] = { "modify", "bad-request", nil, "jid-required" };
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    24
	["nodeid-required"] = { "modify", "bad-request", nil, "nodeid-required" };
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    25
	["item-not-found"] = { "cancel", "item-not-found" };
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    26
	["not-subscribed"] = { "modify", "unexpected-request", nil, "not-subscribed" };
9044
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
    27
	["invalid-options"] = { "modify", "bad-request", nil, "invalid-options" };
6476
7c8f58d2b331 Merge 0.9->0.10
Matthew Wild <mwild1@gmail.com>
parents: 6451
diff changeset
    28
	["forbidden"] = { "auth", "forbidden" };
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
    29
	["not-allowed"] = { "cancel", "not-allowed" };
9079
00d89430d77e pubsub.lib: Support for not-acceptable error
Matthew Wild <mwild1@gmail.com>
parents: 9075
diff changeset
    30
	["not-acceptable"] = { "modify", "not-acceptable" };
8956
19cbe80df9c8 mod_pubsub: Make pubsub.lib aware of internal-server-error condition
Kim Alvefur <zash@zash.se>
parents: 8943
diff changeset
    31
	["internal-server-error"] = { "wait", "internal-server-error" };
9113
3dbecb399dfb pubsub.lib: Add support for precondition-not-met error
Matthew Wild <mwild1@gmail.com>
parents: 9112
diff changeset
    32
	["precondition-not-met"] = { "cancel", "conflict", nil, "precondition-not-met" };
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    33
};
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    34
local function pubsub_error_reply(stanza, error)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    35
	local e = pubsub_errors[error];
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7361
diff changeset
    36
	local reply = st.error_reply(stanza, t_unpack(e, 1, 3));
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    37
	if e[4] then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    38
		reply:tag(e[4], { xmlns = xmlns_pubsub_errors }):up();
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    39
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    40
	return reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    41
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    42
_M.pubsub_error_reply = pubsub_error_reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    43
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
    44
-- Note: If any config options are added that are of complex types,
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
    45
-- (not simply strings/numbers) then the publish-options code will
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
    46
-- need to be revisited
7361
d0390bc9c5d1 mod_pubsub: Don’t require util.dataforms twice
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 6844
diff changeset
    47
local node_config_form = dataform {
6449
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    48
	{
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    49
		type = "hidden";
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    50
		name = "FORM_TYPE";
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    51
		value = "http://jabber.org/protocol/pubsub#node_config";
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    52
	};
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    53
	{
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    54
		type = "text-single";
8982
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    55
		name = "pubsub#title";
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    56
		label = "Title";
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    57
	};
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    58
	{
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    59
		type = "text-single";
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    60
		name = "pubsub#description";
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    61
		label = "Description";
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    62
	};
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    63
	{
6897b2e18bdf mod_pubsub: Support configurable title and description fields
Kim Alvefur <zash@zash.se>
parents: 8981
diff changeset
    64
		type = "text-single";
9183
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
    65
		name = "pubsub#type";
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
    66
		label = "The type of node data, usually specified by the namespace of the payload (if any)";
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
    67
	};
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
    68
	{
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
    69
		type = "text-single";
6449
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    70
		name = "pubsub#max_items";
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    71
		label = "Max # of items to persist";
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
    72
	};
8323
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8321
diff changeset
    73
	{
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8321
diff changeset
    74
		type = "boolean";
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8321
diff changeset
    75
		name = "pubsub#persist_items";
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8321
diff changeset
    76
		label = "Persist items to storage";
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8321
diff changeset
    77
	};
8817
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
    78
	{
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
    79
		type = "list-single";
9099
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    80
		name = "pubsub#access_model";
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    81
		label = "Specify the subscriber model";
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    82
		options = {
9138
c68d62ae9cb7 pubsub.lib: correctly emit data form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9127
diff changeset
    83
			"authorize",
c68d62ae9cb7 pubsub.lib: correctly emit data form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9127
diff changeset
    84
			"open",
c68d62ae9cb7 pubsub.lib: correctly emit data form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9127
diff changeset
    85
			"presence",
c68d62ae9cb7 pubsub.lib: correctly emit data form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9127
diff changeset
    86
			"roster",
c68d62ae9cb7 pubsub.lib: correctly emit data form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9127
diff changeset
    87
			"whitelist",
9099
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    88
		};
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    89
	};
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    90
	{
7de4eec02ece mod_pubsub: Add access model to configuration form
Kim Alvefur <zash@zash.se>
parents: 9079
diff changeset
    91
		type = "list-single";
9133
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
    92
		name = "pubsub#publish_model";
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
    93
		label = "Specify the publisher model";
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
    94
		options = {
9140
4803d2feeecb pubsub.lib: fix more form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9139
diff changeset
    95
			"publishers";
4803d2feeecb pubsub.lib: fix more form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9139
diff changeset
    96
			"subscribers";
4803d2feeecb pubsub.lib: fix more form fields
Jonas Wielicki <jonas@wielicki.name>
parents: 9139
diff changeset
    97
			"open";
9133
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
    98
		};
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
    99
	};
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
   100
	{
9185
ec48c02ded0c mod_pubsub: Add support for "quiet nodes" (disabling notifications)
Kim Alvefur <zash@zash.se>
parents: 9183
diff changeset
   101
		type = "boolean";
9189
9f33a13eb011 mod_pubsub: Use the correct form field
Kim Alvefur <zash@zash.se>
parents: 9188
diff changeset
   102
		value = "true";
9f33a13eb011 mod_pubsub: Use the correct form field
Kim Alvefur <zash@zash.se>
parents: 9188
diff changeset
   103
		label = "Whether to deliver event notifications";
9f33a13eb011 mod_pubsub: Use the correct form field
Kim Alvefur <zash@zash.se>
parents: 9188
diff changeset
   104
		name = "pubsub#deliver_notifications";
9185
ec48c02ded0c mod_pubsub: Add support for "quiet nodes" (disabling notifications)
Kim Alvefur <zash@zash.se>
parents: 9183
diff changeset
   105
	};
ec48c02ded0c mod_pubsub: Add support for "quiet nodes" (disabling notifications)
Kim Alvefur <zash@zash.se>
parents: 9183
diff changeset
   106
	{
9191
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   107
		type = "boolean";
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   108
		label = "Whether to deliver payloads with event notifications";
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   109
		name = "pubsub#deliver_payloads";
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   110
	};
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   111
	{
9133
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
   112
		type = "list-single";
8817
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
   113
		name = "pubsub#notification_type";
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
   114
		label = "Specify the delivery style for notifications";
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
   115
		options = {
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
   116
			{ label = "Messages of type normal", value = "normal" },
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
   117
			{ label = "Messages of type headline", value = "headline", default = true },
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8403
diff changeset
   118
		};
8825
4afa77e0d2b0 mod_pubsub: Fix syntax error
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
   119
	};
9186
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   120
	{
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   121
		type = "boolean";
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   122
		label = "Whether to notify subscribers when the node is deleted";
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   123
		name = "pubsub#notify_delete";
9188
60f163e7a7a7 mod_pubsub: Specify defaults for notification settings
Kim Alvefur <zash@zash.se>
parents: 9187
diff changeset
   124
		value = true;
9186
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   125
	};
9187
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   126
	{
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   127
		type = "boolean";
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   128
		label = "Whether to notify subscribers when items are removed from the node";
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   129
		name = "pubsub#notify_retract";
9188
60f163e7a7a7 mod_pubsub: Specify defaults for notification settings
Kim Alvefur <zash@zash.se>
parents: 9187
diff changeset
   130
		value = true;
9187
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   131
	};
6449
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
   132
};
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
   133
9119
9f36f5c14545 mod_pubsub: Rename variable subscription options form to improve readability
Kim Alvefur <zash@zash.se>
parents: 9118
diff changeset
   134
local subscribe_options_form = dataform {
8829
d614003a82c1 mod_pubsub: Add support for parsing subscription options form (no options supported yet)
Kim Alvefur <zash@zash.se>
parents: 8828
diff changeset
   135
	{
d614003a82c1 mod_pubsub: Add support for parsing subscription options form (no options supported yet)
Kim Alvefur <zash@zash.se>
parents: 8828
diff changeset
   136
		type = "hidden";
d614003a82c1 mod_pubsub: Add support for parsing subscription options form (no options supported yet)
Kim Alvefur <zash@zash.se>
parents: 8828
diff changeset
   137
		name = "FORM_TYPE";
d614003a82c1 mod_pubsub: Add support for parsing subscription options form (no options supported yet)
Kim Alvefur <zash@zash.se>
parents: 8828
diff changeset
   138
		value = "http://jabber.org/protocol/pubsub#subscribe_options";
9042
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 9041
diff changeset
   139
	};
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 9041
diff changeset
   140
	{
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 9041
diff changeset
   141
		type = "boolean";
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 9041
diff changeset
   142
		name = "pubsub#include_body";
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 9041
diff changeset
   143
		label = "Receive message body in addition to payload?";
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 9041
diff changeset
   144
	};
8829
d614003a82c1 mod_pubsub: Add support for parsing subscription options form (no options supported yet)
Kim Alvefur <zash@zash.se>
parents: 8828
diff changeset
   145
};
d614003a82c1 mod_pubsub: Add support for parsing subscription options form (no options supported yet)
Kim Alvefur <zash@zash.se>
parents: 8828
diff changeset
   146
8984
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   147
local node_metadata_form = dataform {
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   148
	{
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   149
		type = "hidden";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   150
		name = "FORM_TYPE";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   151
		value = "http://jabber.org/protocol/pubsub#meta-data";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   152
	};
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   153
	{
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   154
		type = "text-single";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   155
		name = "pubsub#title";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   156
	};
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   157
	{
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   158
		type = "text-single";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   159
		name = "pubsub#description";
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   160
	};
9183
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   161
	{
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   162
		type = "text-single";
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   163
		name = "pubsub#type";
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   164
	};
8984
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   165
};
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   166
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   167
local config_field_map = {
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   168
	title = "pubsub#title";
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   169
	description = "pubsub#description";
9183
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   170
	payload_type = "pubsub#type";
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   171
	max_items = "pubsub#max_items";
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   172
	persist_items = "pubsub#persist_items";
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   173
	notification_type = "pubsub#notification_type";
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   174
	access_model = "pubsub#access_model";
9133
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
   175
	publish_model = "pubsub#publish_model";
9185
ec48c02ded0c mod_pubsub: Add support for "quiet nodes" (disabling notifications)
Kim Alvefur <zash@zash.se>
parents: 9183
diff changeset
   176
	notify_items = "pubsub#deliver_notifications";
9186
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   177
	notify_delete = "pubsub#notify_delete";
9187
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   178
	notify_retract = "pubsub#notify_retract";
9191
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   179
	include_payload = "pubsub#deliver_payloads";
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   180
};
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   181
local reverse_config_field_map = {};
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   182
for k, v in pairs(config_field_map) do reverse_config_field_map[v] = k; end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   183
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   184
-- util.pubsub is meant to be agnostic to XEP-0060
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   185
local function config_to_xep0060(node_config)
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   186
	return {
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   187
		["pubsub#title"] = node_config["title"];
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   188
		["pubsub#description"] = node_config["description"];
9183
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   189
		["pubsub#type"] = node_config["payload_type"];
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   190
		["pubsub#max_items"] = tostring(node_config["max_items"]);
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   191
		["pubsub#persist_items"] = node_config["persist_items"];
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   192
		["pubsub#notification_type"] = node_config["notification_type"];
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   193
		["pubsub#access_model"] = node_config["access_model"];
9133
74525b8104d5 pubsub.lib: Add support for pubsub#publish_model
Matthew Wild <mwild1@gmail.com>
parents: 9131
diff changeset
   194
		["pubsub#publish_model"] = node_config["publish_model"];
9185
ec48c02ded0c mod_pubsub: Add support for "quiet nodes" (disabling notifications)
Kim Alvefur <zash@zash.se>
parents: 9183
diff changeset
   195
		["pubsub#deliver_notifications"] = node_config["notify_items"];
9186
8239f24e38df mod_pubsub: Make notification of node deletion configurable
Kim Alvefur <zash@zash.se>
parents: 9185
diff changeset
   196
		["pubsub#notify_delete"] = node_config["notify_delete"];
9187
9fbddb80803b mod_pubsub: Make notification of item retraction configurable
Kim Alvefur <zash@zash.se>
parents: 9186
diff changeset
   197
		["pubsub#notify_retract"] = node_config["notify_retract"];
9191
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
   198
		["pubsub#deliver_payloads"] =  node_config["include_payload"]
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   199
	}
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   200
end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   201
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   202
local function config_from_xep0060(config, strict)
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   203
	local ret = {};
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   204
	for config_field, config_value in pairs(config) do
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   205
		local mapped_name = reverse_config_field_map[config_field];
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   206
		if mapped_name then
9130
decad04ec184 pubsub.lib: Add comment about tonumber hack
Matthew Wild <mwild1@gmail.com>
parents: 9129
diff changeset
   207
			-- FIXME: The intention is to add "subtype" support to
decad04ec184 pubsub.lib: Add comment about tonumber hack
Matthew Wild <mwild1@gmail.com>
parents: 9129
diff changeset
   208
			-- util.dataforms, which will remove the need for this
decad04ec184 pubsub.lib: Add comment about tonumber hack
Matthew Wild <mwild1@gmail.com>
parents: 9129
diff changeset
   209
			-- ugly hack
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   210
			if mapped_name == "max_items" then
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   211
				config_value = tonumber(config_value);
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   212
			end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   213
			ret[mapped_name] = config_value;
9126
5d5aa1c4fe34 pubsub.lib: ignore FORM_TYPE field in config_from_xep0060
Jonas Wielicki <jonas@wielicki.name>
parents: 9119
diff changeset
   214
		elseif strict and config_field ~= "FORM_TYPE" then
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   215
			return nil, "unknown-field", config_field;
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   216
		end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   217
	end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   218
	return ret;
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   219
end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   220
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   221
-- Used to check that the config of a node is as expected (i.e. 'publish-options')
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   222
local function check_preconditions(node_config, required_config)
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   223
	if not (node_config and required_config) then
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   224
		return false;
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   225
	end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   226
	for config_field, value in pairs(required_config) do
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   227
		if node_config[config_field] ~= value then
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   228
			return false;
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   229
		end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   230
	end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   231
	return true;
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   232
end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   233
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   234
local service_method_feature_map = {
9202
596d0d82a113 mod_pubsub: Advertise support for subscription-options
Kim Alvefur <zash@zash.se>
parents: 9201
diff changeset
   235
	add_subscription = { "subscribe", "subscription-options" };
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   236
	create = { "create-nodes", "instant-nodes", "item-ids", "create-and-configure" };
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   237
	delete = { "delete-nodes" };
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   238
	get_items = { "retrieve-items" };
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   239
	get_subscriptions = { "retrieve-subscriptions" };
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   240
	node_defaults = { "retrieve-default" };
9134
d0d676b86013 pubsub.lib: Enable publish-options unconditionally
Matthew Wild <mwild1@gmail.com>
parents: 9133
diff changeset
   241
	publish = { "publish", "multi-items", "publish-options" };
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   242
	purge = { "purge-nodes" };
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   243
	retract = { "delete-items", "retract-items" };
9201
2ce27be5fdd1 mod_pubsub: Advertise support for node meta-data
Kim Alvefur <zash@zash.se>
parents: 9191
diff changeset
   244
	set_node_config = { "config-node", "meta-data" };
8941
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   245
	set_affiliation = { "modify-affiliations" };
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   246
};
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   247
local service_config_feature_map = {
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   248
	autocreate_on_publish = { "auto-create" };
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   249
};
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   250
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   251
function _M.get_feature_set(service)
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   252
	local supported_features = set.new();
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   253
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   254
	for method, features in pairs(service_method_feature_map) do
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   255
		if service[method] then
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   256
			for _, feature in ipairs(features) do
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   257
				if feature then
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   258
					supported_features:add(feature);
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   259
				end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   260
			end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   261
		end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   262
	end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   263
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   264
	for option, features in pairs(service_config_feature_map) do
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   265
		if service.config[option] then
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   266
			for _, feature in ipairs(features) do
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   267
				if feature then
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   268
					supported_features:add(feature);
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   269
				end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   270
			end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   271
		end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   272
	end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   273
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   274
	for affiliation in pairs(service.config.capabilities) do
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   275
		if affiliation ~= "none" and affiliation ~= "owner" then
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   276
			supported_features:add(affiliation.."-affiliation");
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   277
		end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   278
	end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   279
9105
f3a1ecc46f20 mod_pubsub: Advertise default access model in disco
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
   280
	if service.node_defaults.access_model then
f3a1ecc46f20 mod_pubsub: Advertise default access model in disco
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
   281
		supported_features:add("access-"..service.node_defaults.access_model);
f3a1ecc46f20 mod_pubsub: Advertise default access model in disco
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
   282
	end
f3a1ecc46f20 mod_pubsub: Advertise default access model in disco
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
   283
9112
31bf4b3abc7f pubsub.lib: Advertise peristent-items feature when nodes and items are persisted
Matthew Wild <mwild1@gmail.com>
parents: 9105
diff changeset
   284
	if rawget(service.config, "itemstore") and rawget(service.config, "nodestore") then
31bf4b3abc7f pubsub.lib: Advertise peristent-items feature when nodes and items are persisted
Matthew Wild <mwild1@gmail.com>
parents: 9105
diff changeset
   285
		supported_features:add("persistent-items");
31bf4b3abc7f pubsub.lib: Advertise peristent-items feature when nodes and items are persisted
Matthew Wild <mwild1@gmail.com>
parents: 9105
diff changeset
   286
	end
31bf4b3abc7f pubsub.lib: Advertise peristent-items feature when nodes and items are persisted
Matthew Wild <mwild1@gmail.com>
parents: 9105
diff changeset
   287
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   288
	return supported_features;
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   289
end
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8341
diff changeset
   290
8983
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   291
function _M.handle_disco_info_node(event, service)
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   292
	local stanza, reply, node = event.stanza, event.reply, event.node;
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   293
	local ok, ret = service:get_nodes(stanza.attr.from);
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   294
	local node_obj = ret[node];
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   295
	if not ok or not node_obj then
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   296
		return;
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   297
	end
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   298
	event.exists = true;
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   299
	reply:tag("identity", { category = "pubsub", type = "leaf" }):up();
8984
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   300
	if node_obj.config then
9041
fd053fcaf9bc mod_pubsub: Revert disco#info part from previous commit
Kim Alvefur <zash@zash.se>
parents: 9040
diff changeset
   301
		reply:add_child(node_metadata_form:form({
fd053fcaf9bc mod_pubsub: Revert disco#info part from previous commit
Kim Alvefur <zash@zash.se>
parents: 9040
diff changeset
   302
			["pubsub#title"] = node_obj.config.title;
fd053fcaf9bc mod_pubsub: Revert disco#info part from previous commit
Kim Alvefur <zash@zash.se>
parents: 9040
diff changeset
   303
			["pubsub#description"] = node_obj.config.description;
9183
cc68cb03f85e mod_pubsub: Add payload type metadata field
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
   304
			["pubsub#type"] = node_obj.config.payload_type;
9041
fd053fcaf9bc mod_pubsub: Revert disco#info part from previous commit
Kim Alvefur <zash@zash.se>
parents: 9040
diff changeset
   305
		}, "result"));
8984
b6cb0a8f75b1 mod_pubsub: Advertise title and description in disco#info
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
   306
	end
8983
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   307
end
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   308
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   309
function _M.handle_disco_items_node(event, service)
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   310
	local stanza, reply, node = event.stanza, event.reply, event.node;
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   311
	local ok, ret = service:get_items(node, stanza.attr.from);
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   312
	if not ok then
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   313
		return;
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   314
	end
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   315
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   316
	for _, id in ipairs(ret) do
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   317
		reply:tag("item", { jid = module.host, name = id }):up();
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   318
	end
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   319
	event.exists = true;
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   320
end
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8982
diff changeset
   321
8337
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   322
function _M.handle_pubsub_iq(event, service)
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   323
	local origin, stanza = event.origin, event.stanza;
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   324
	local pubsub_tag = stanza.tags[1];
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   325
	local action = pubsub_tag.tags[1];
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   326
	if not action then
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   327
		return origin.send(st.error_reply(stanza, "cancel", "bad-request"));
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   328
	end
8339
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   329
	local prefix = "";
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   330
	if pubsub_tag.attr.xmlns == xmlns_pubsub_owner then
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   331
		prefix = "owner_";
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   332
	end
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   333
	local handler = handlers[prefix..stanza.attr.type.."_"..action.name];
8337
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   334
	if handler then
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   335
		handler(origin, stanza, action, service);
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   336
		return true;
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   337
	end
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   338
end
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8336
diff changeset
   339
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   340
function handlers.get_items(origin, stanza, items, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   341
	local node = items.attr.node;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   342
	local item = items:get_child("item");
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7361
diff changeset
   343
	local item_id = item and item.attr.id;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   344
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   345
	if not node then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   346
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   347
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   348
	end
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7361
diff changeset
   349
	local ok, results = service:get_items(node, stanza.attr.from, item_id);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   350
	if not ok then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   351
		origin.send(pubsub_error_reply(stanza, results));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   352
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   353
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   354
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   355
	local data = st.stanza("items", { node = node });
5851
cdcfd93e2f43 mod_pubsub, util.pubsub: Keep track of the order of items
Kim Alvefur <zash@zash.se>
parents: 5626
diff changeset
   356
	for _, id in ipairs(results) do
cdcfd93e2f43 mod_pubsub, util.pubsub: Keep track of the order of items
Kim Alvefur <zash@zash.se>
parents: 5626
diff changeset
   357
		data:add_child(results[id]);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   358
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   359
	local reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   360
	if data then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   361
		reply = st.reply(stanza)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   362
			:tag("pubsub", { xmlns = xmlns_pubsub })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   363
				:add_child(data);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   364
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   365
		reply = pubsub_error_reply(stanza, "item-not-found");
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   366
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   367
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   368
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   369
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   370
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   371
function handlers.get_subscriptions(origin, stanza, subscriptions, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   372
	local node = subscriptions.attr.node;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   373
	local ok, ret = service:get_subscriptions(node, stanza.attr.from, stanza.attr.from);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   374
	if not ok then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   375
		origin.send(pubsub_error_reply(stanza, ret));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   376
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   377
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   378
	local reply = st.reply(stanza)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   379
		:tag("pubsub", { xmlns = xmlns_pubsub })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   380
			:tag("subscriptions");
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   381
	for _, sub in ipairs(ret) do
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   382
		reply:tag("subscription", { node = sub.node, jid = sub.jid, subscription = 'subscribed' }):up();
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   383
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   384
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   385
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   386
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   387
9035
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   388
function handlers.owner_get_subscriptions(origin, stanza, subscriptions, service)
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   389
	local node = subscriptions.attr.node;
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   390
	local ok, ret = service:get_subscriptions(node, stanza.attr.from);
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   391
	if not ok then
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   392
		origin.send(pubsub_error_reply(stanza, ret));
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   393
		return true;
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   394
	end
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   395
	local reply = st.reply(stanza)
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   396
		:tag("pubsub", { xmlns = xmlns_pubsub_owner })
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   397
			:tag("subscriptions");
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   398
	for _, sub in ipairs(ret) do
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   399
		reply:tag("subscription", { node = sub.node, jid = sub.jid, subscription = 'subscribed' }):up();
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   400
	end
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   401
	origin.send(reply);
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   402
	return true;
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   403
end
029e1e18d65c mod_pubsub: Add support for owner subscription retrieval
Kim Alvefur <zash@zash.se>
parents: 9009
diff changeset
   404
9036
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   405
function handlers.owner_set_subscriptions(origin, stanza, subscriptions, service)
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   406
	local node = subscriptions.attr.node;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   407
	if not node then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   408
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   409
		return true;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   410
	end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   411
	if not service:may(node, stanza.attr.from, "subscribe_other") then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   412
		origin.send(pubsub_error_reply(stanza, "forbidden"));
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   413
		return true;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   414
	end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   415
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   416
	local node_obj = service.nodes[node];
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   417
	if not node_obj then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   418
		origin.send(pubsub_error_reply(stanza, "item-not-found"));
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   419
		return true;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   420
	end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   421
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   422
	for subscription_tag in subscriptions:childtags("subscription") do
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   423
		if subscription_tag.attr.subscription == 'subscribed' then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   424
			local ok, err = service:add_subscription(node, stanza.attr.from, subscription_tag.attr.jid);
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   425
			if not ok then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   426
				origin.send(pubsub_error_reply(stanza, err));
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   427
				return true;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   428
			end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   429
		elseif subscription_tag.attr.subscription == 'none' then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   430
			local ok, err = service:remove_subscription(node, stanza.attr.from, subscription_tag.attr.jid);
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   431
			if not ok then
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   432
				origin.send(pubsub_error_reply(stanza, err));
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   433
				return true;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   434
			end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   435
		end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   436
	end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   437
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   438
	local reply = st.reply(stanza);
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   439
	origin.send(reply);
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   440
	return true;
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   441
end
f1b6efd5b379 mod_pubsub: Add support for modifying subscriptions
Kim Alvefur <zash@zash.se>
parents: 9035
diff changeset
   442
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   443
function handlers.set_create(origin, stanza, create, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   444
	local node = create.attr.node;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   445
	local ok, ret, reply;
8340
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   446
	local config;
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   447
	local configure = stanza.tags[1]:get_child("configure");
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   448
	if configure then
8341
30d8157391e9 mod_pubsub: Use correct variable name [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8340
diff changeset
   449
		local config_form = configure:get_child("x", "jabber:x:data");
8340
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   450
		if not config_form then
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   451
			origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing dataform"));
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   452
			return true;
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   453
		end
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   454
		local form_data, err = node_config_form:data(config_form);
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   455
		if not form_data then
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   456
			origin.send(st.error_reply(stanza, "modify", "bad-request", err));
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   457
			return true;
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   458
		end
9040
e3c8274427d3 mod_pubsub: Refactor translation to/from XEP-0060-specific node configuration format
Kim Alvefur <zash@zash.se>
parents: 9036
diff changeset
   459
		config = config_from_xep0060(form_data);
8340
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   460
	end
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   461
	if node then
8340
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   462
		ok, ret = service:create(node, stanza.attr.from, config);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   463
		if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   464
			reply = st.reply(stanza);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   465
		else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   466
			reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   467
		end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   468
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   469
		repeat
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   470
			node = uuid_generate();
8340
dc4ea43ac463 mod_pubsub: Add support for Create and Configure
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
   471
			ok, ret = service:create(node, stanza.attr.from, config);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   472
		until ok or ret ~= "conflict";
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   473
		if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   474
			reply = st.reply(stanza)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   475
				:tag("pubsub", { xmlns = xmlns_pubsub })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   476
					:tag("create", { node = node });
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   477
		else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   478
			reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   479
		end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   480
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   481
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   482
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   483
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   484
8339
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   485
function handlers.owner_set_delete(origin, stanza, delete, service)
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   486
	local node = delete.attr.node;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   487
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7361
diff changeset
   488
	local reply;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   489
	if not node then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   490
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   491
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   492
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   493
	local ok, ret = service:delete(node, stanza.attr.from);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   494
	if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   495
		reply = st.reply(stanza);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   496
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   497
		reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   498
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   499
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   500
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   501
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   502
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   503
function handlers.set_subscribe(origin, stanza, subscribe, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   504
	local node, jid = subscribe.attr.node, subscribe.attr.jid;
8943
365b16109d95 mod_pubsub: Apply normalization to JIDs retrieved from attributes
Kim Alvefur <zash@zash.se>
parents: 8942
diff changeset
   505
	jid = jid_prep(jid);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   506
	if not (node and jid) then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   507
		origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   508
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   509
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   510
	local options_tag, options = stanza.tags[1]:get_child("options"), nil;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   511
	if options_tag then
9119
9f36f5c14545 mod_pubsub: Rename variable subscription options form to improve readability
Kim Alvefur <zash@zash.se>
parents: 9118
diff changeset
   512
		options = subscribe_options_form:data(options_tag.tags[1]);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   513
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   514
	local ok, ret = service:add_subscription(node, stanza.attr.from, jid, options);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   515
	local reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   516
	if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   517
		reply = st.reply(stanza)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   518
			:tag("pubsub", { xmlns = xmlns_pubsub })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   519
				:tag("subscription", {
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   520
					node = node,
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   521
					jid = jid,
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   522
					subscription = "subscribed"
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   523
				}):up();
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   524
		if options_tag then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   525
			reply:add_child(options_tag);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   526
		end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   527
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   528
		reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   529
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   530
	origin.send(reply);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   531
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   532
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   533
function handlers.set_unsubscribe(origin, stanza, unsubscribe, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   534
	local node, jid = unsubscribe.attr.node, unsubscribe.attr.jid;
8943
365b16109d95 mod_pubsub: Apply normalization to JIDs retrieved from attributes
Kim Alvefur <zash@zash.se>
parents: 8942
diff changeset
   535
	jid = jid_prep(jid);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   536
	if not (node and jid) then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   537
		origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   538
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   539
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   540
	local ok, ret = service:remove_subscription(node, stanza.attr.from, jid);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   541
	local reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   542
	if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   543
		reply = st.reply(stanza);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   544
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   545
		reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   546
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   547
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   548
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   549
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   550
9043
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   551
function handlers.get_options(origin, stanza, options, service)
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   552
	local node, jid = options.attr.node, options.attr.jid;
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   553
	jid = jid_prep(jid);
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   554
	if not (node and jid) then
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   555
		origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   556
		return true;
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   557
	end
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   558
	local ok, ret = service:get_subscription(node, stanza.attr.from, jid);
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   559
	if not ok then
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   560
		origin.send(pubsub_error_reply(stanza, "not-subscribed"));
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   561
		return true;
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   562
	end
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   563
	if ret == true then ret = {} end
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   564
	origin.send(st.reply(stanza)
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   565
		:tag("pubsub", { xmlns = xmlns_pubsub })
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   566
			:tag("options", { node = node, jid = jid })
9119
9f36f5c14545 mod_pubsub: Rename variable subscription options form to improve readability
Kim Alvefur <zash@zash.se>
parents: 9118
diff changeset
   567
				:add_child(subscribe_options_form:form(ret)));
9043
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   568
	return true;
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   569
end
e993fad0cc62 mod_pubsub: Add support for retrieving subscription options
Kim Alvefur <zash@zash.se>
parents: 9042
diff changeset
   570
9044
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   571
function handlers.set_options(origin, stanza, options, service)
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   572
	local node, jid = options.attr.node, options.attr.jid;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   573
	jid = jid_prep(jid);
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   574
	if not (node and jid) then
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   575
		origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   576
		return true;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   577
	end
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   578
	local ok, ret = service:get_subscription(node, stanza.attr.from, jid);
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   579
	if not ok then
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   580
		origin.send(pubsub_error_reply(stanza, ret));
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   581
		return true;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   582
	elseif not ret then
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   583
		origin.send(pubsub_error_reply(stanza, "not-subscribed"));
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   584
		return true;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   585
	end
9119
9f36f5c14545 mod_pubsub: Rename variable subscription options form to improve readability
Kim Alvefur <zash@zash.se>
parents: 9118
diff changeset
   586
	local new_subopts, err = subscribe_options_form:data(options.tags[1]);
9044
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   587
	if not new_subopts then
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   588
		origin.send(pubsub_error_reply(stanza, ret));
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   589
		return true;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   590
	end
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   591
	local ok, err = service:add_subscription(node, stanza.attr.from, jid, new_subopts);
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   592
	if not ok then
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   593
		origin.send(pubsub_error_reply(stanza, err));
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   594
		return true;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   595
	end
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   596
	origin.send(st.reply(stanza));
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   597
	return true;
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   598
end
b3bc742ee188 mod_pubsub: Add support for changing subscription options
Kim Alvefur <zash@zash.se>
parents: 9043
diff changeset
   599
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   600
function handlers.set_publish(origin, stanza, publish, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   601
	local node = publish.attr.node;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   602
	if not node then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   603
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   604
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   605
	end
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   606
	local publish_options = stanza.tags[1]:get_child("publish-options");
9134
d0d676b86013 pubsub.lib: Enable publish-options unconditionally
Matthew Wild <mwild1@gmail.com>
parents: 9133
diff changeset
   607
	if publish_options then
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   608
		-- Ensure that the node configuration matches the values in publish-options
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   609
		local publish_options_form = publish_options:get_child("x", "jabber:x:data");
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   610
		local required_config = config_from_xep0060(node_config_form:data(publish_options_form), true);
9127
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   611
		local node_accessible, node_config = service:get_node_config(node, stanza.attr.from);
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   612
		if node_accessible == false and service.config.autocreate_on_publish then
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   613
			module:log("debug", "creating node %s with publish-options", node)
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   614
			-- we need to create the node here so that it is configured
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   615
			-- correctly
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   616
			local created, err = service:create(node, stanza.attr.from, required_config)
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   617
			if not created then
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   618
				local reply = pubsub_error_reply(stanza, err);
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   619
				origin.send(reply);
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   620
				return true;
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   621
			end
dcc490f0044d pubsub.lib: auto-create node with publish-options if autocreation is enabled
Jonas Wielicki <jonas@wielicki.name>
parents: 9126
diff changeset
   622
		elseif not check_preconditions(node_config, required_config) then
9118
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   623
			local reply = pubsub_error_reply(stanza, "precondition-not-met");
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   624
			origin.send(reply);
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   625
			return true;
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   626
		end
fddebfaae7d9 pubsub.lib: Support for publish-options behind a feature flag, 'enable_publish_options'
Matthew Wild <mwild1@gmail.com>
parents: 9113
diff changeset
   627
	end
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   628
	local item = publish:get_child("item");
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   629
	local id = (item and item.attr.id);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   630
	if not id then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   631
		id = uuid_generate();
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   632
		if item then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   633
			item.attr.id = id;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   634
		end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   635
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   636
	local ok, ret = service:publish(node, stanza.attr.from, id, item);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   637
	local reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   638
	if ok then
8403
518b56d806bd mod_pubsub: Allow itemstore to override item ids
Kim Alvefur <zash@zash.se>
parents: 8402
diff changeset
   639
		if type(ok) == "string" then
518b56d806bd mod_pubsub: Allow itemstore to override item ids
Kim Alvefur <zash@zash.se>
parents: 8402
diff changeset
   640
			id = ok;
518b56d806bd mod_pubsub: Allow itemstore to override item ids
Kim Alvefur <zash@zash.se>
parents: 8402
diff changeset
   641
		end
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   642
		reply = st.reply(stanza)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   643
			:tag("pubsub", { xmlns = xmlns_pubsub })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   644
				:tag("publish", { node = node })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   645
					:tag("item", { id = id });
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   646
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   647
		reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   648
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   649
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   650
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   651
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   652
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   653
function handlers.set_retract(origin, stanza, retract, service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   654
	local node, notify = retract.attr.node, retract.attr.notify;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   655
	notify = (notify == "1") or (notify == "true");
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   656
	local item = retract:get_child("item");
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   657
	local id = item and item.attr.id
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   658
	if not (node and id) then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   659
		origin.send(pubsub_error_reply(stanza, node and "item-not-found" or "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   660
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   661
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   662
	local reply, notifier;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   663
	if notify then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   664
		notifier = st.stanza("retract", { id = id });
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   665
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   666
	local ok, ret = service:retract(node, stanza.attr.from, id, notifier);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   667
	if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   668
		reply = st.reply(stanza);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   669
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   670
		reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   671
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   672
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   673
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   674
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   675
8339
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   676
function handlers.owner_set_purge(origin, stanza, purge, service)
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   677
	local node, notify = purge.attr.node, purge.attr.notify;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   678
	notify = (notify == "1") or (notify == "true");
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   679
	local reply;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   680
	if not node then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   681
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   682
		return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   683
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   684
	local ok, ret = service:purge(node, stanza.attr.from, notify);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   685
	if ok then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   686
		reply = st.reply(stanza);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   687
	else
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   688
		reply = pubsub_error_reply(stanza, ret);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   689
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   690
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   691
	return true;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   692
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   693
8339
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   694
function handlers.owner_get_configure(origin, stanza, config, service)
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   695
	local node = config.attr.node;
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   696
	if not node then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   697
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   698
		return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   699
	end
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   700
9123
01fc8ba0a7fa mod_pubsub: Use util.pubsub API for retrieving node config instead
Kim Alvefur <zash@zash.se>
parents: 9119
diff changeset
   701
	local ok, node_config = service:get_node_config(node, stanza.attr.from);
01fc8ba0a7fa mod_pubsub: Use util.pubsub API for retrieving node config instead
Kim Alvefur <zash@zash.se>
parents: 9119
diff changeset
   702
	if not ok then
01fc8ba0a7fa mod_pubsub: Use util.pubsub API for retrieving node config instead
Kim Alvefur <zash@zash.se>
parents: 9119
diff changeset
   703
		origin.send(pubsub_error_reply(stanza, node_config));
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   704
		return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   705
	end
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   706
9040
e3c8274427d3 mod_pubsub: Refactor translation to/from XEP-0060-specific node configuration format
Kim Alvefur <zash@zash.se>
parents: 9036
diff changeset
   707
	local pubsub_form_data = config_to_xep0060(node_config);
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   708
	local reply = st.reply(stanza)
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   709
		:tag("pubsub", { xmlns = xmlns_pubsub_owner })
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   710
			:tag("configure", { node = node })
8336
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8330
diff changeset
   711
				:add_child(node_config_form:form(pubsub_form_data));
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   712
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   713
	return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   714
end
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   715
8339
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   716
function handlers.owner_set_configure(origin, stanza, config, service)
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   717
	local node = config.attr.node;
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   718
	if not node then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   719
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   720
		return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   721
	end
6449
011ca9b88179 mod_pubsub: Move node config form into pubsub.lib (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents: 6448
diff changeset
   722
	if not service:may(node, stanza.attr.from, "configure") then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   723
		origin.send(pubsub_error_reply(stanza, "forbidden"));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   724
		return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   725
	end
8320
ff57b3cc5a8e mod_pubsub: Make sure that a dataform is given to configure
Kim Alvefur <zash@zash.se>
parents: 8311
diff changeset
   726
	local config_form = config:get_child("x", "jabber:x:data");
ff57b3cc5a8e mod_pubsub: Make sure that a dataform is given to configure
Kim Alvefur <zash@zash.se>
parents: 8311
diff changeset
   727
	if not config_form then
ff57b3cc5a8e mod_pubsub: Make sure that a dataform is given to configure
Kim Alvefur <zash@zash.se>
parents: 8311
diff changeset
   728
		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing dataform"));
ff57b3cc5a8e mod_pubsub: Make sure that a dataform is given to configure
Kim Alvefur <zash@zash.se>
parents: 8311
diff changeset
   729
		return true;
ff57b3cc5a8e mod_pubsub: Make sure that a dataform is given to configure
Kim Alvefur <zash@zash.se>
parents: 8311
diff changeset
   730
	end
9125
a69dc9c729ec mod_pubsub: Pass the current values to dataforms
Kim Alvefur <zash@zash.se>
parents: 9123
diff changeset
   731
	local ok, old_config = service:get_node_config(node, stanza.attr.from);
a69dc9c729ec mod_pubsub: Pass the current values to dataforms
Kim Alvefur <zash@zash.se>
parents: 9123
diff changeset
   732
	if not ok then
a69dc9c729ec mod_pubsub: Pass the current values to dataforms
Kim Alvefur <zash@zash.se>
parents: 9123
diff changeset
   733
		origin.send(pubsub_error_reply(stanza, old_config));
a69dc9c729ec mod_pubsub: Pass the current values to dataforms
Kim Alvefur <zash@zash.se>
parents: 9123
diff changeset
   734
		return true;
a69dc9c729ec mod_pubsub: Pass the current values to dataforms
Kim Alvefur <zash@zash.se>
parents: 9123
diff changeset
   735
	end
a69dc9c729ec mod_pubsub: Pass the current values to dataforms
Kim Alvefur <zash@zash.se>
parents: 9123
diff changeset
   736
	local form_data, err = node_config_form:data(config_form, old_config);
8336
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8330
diff changeset
   737
	if not form_data then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   738
		origin.send(st.error_reply(stanza, "modify", "bad-request", err));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   739
		return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   740
	end
9040
e3c8274427d3 mod_pubsub: Refactor translation to/from XEP-0060-specific node configuration format
Kim Alvefur <zash@zash.se>
parents: 9036
diff changeset
   741
	local new_config = config_from_xep0060(form_data);
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   742
	local ok, err = service:set_node_config(node, stanza.attr.from, new_config);
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   743
	if not ok then
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   744
		origin.send(pubsub_error_reply(stanza, err));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   745
		return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   746
	end
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   747
	origin.send(st.reply(stanza));
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   748
	return true;
6441
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   749
end
b1c40054b59d mod_pubsub: Add support for node configuration
Kim Alvefur <zash@zash.se>
parents: 5851
diff changeset
   750
8339
587305c0ff85 mod_pubsub: Fix namespace conflict with the pubsub#owner namespace
Kim Alvefur <zash@zash.se>
parents: 8337
diff changeset
   751
function handlers.owner_get_default(origin, stanza, default, service) -- luacheck: ignore 212/default
9040
e3c8274427d3 mod_pubsub: Refactor translation to/from XEP-0060-specific node configuration format
Kim Alvefur <zash@zash.se>
parents: 9036
diff changeset
   752
	local pubsub_form_data = config_to_xep0060(service.node_defaults);
6444
bcb1ea9047d3 mod_pubsub: Add support for requesting default node configuration
Kim Alvefur <zash@zash.se>
parents: 6441
diff changeset
   753
	local reply = st.reply(stanza)
bcb1ea9047d3 mod_pubsub: Add support for requesting default node configuration
Kim Alvefur <zash@zash.se>
parents: 6441
diff changeset
   754
		:tag("pubsub", { xmlns = xmlns_pubsub_owner })
6450
8c2dc2ac5a40 mod_pubsub: Fix retreival of node config defaults
Kim Alvefur <zash@zash.se>
parents: 6449
diff changeset
   755
			:tag("default")
8336
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8330
diff changeset
   756
				:add_child(node_config_form:form(pubsub_form_data));
6844
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   757
	origin.send(reply);
be87ab2d611c plugins: Explicitly return to halt event propagation (session.send sometimes does not return true)
Kim Alvefur <zash@zash.se>
parents: 6476
diff changeset
   758
	return true;
6444
bcb1ea9047d3 mod_pubsub: Add support for requesting default node configuration
Kim Alvefur <zash@zash.se>
parents: 6441
diff changeset
   759
end
bcb1ea9047d3 mod_pubsub: Add support for requesting default node configuration
Kim Alvefur <zash@zash.se>
parents: 6441
diff changeset
   760
8935
12a9731aef0b mod_pubsub: Add stubs for affiliation handling
Kim Alvefur <zash@zash.se>
parents: 8829
diff changeset
   761
function handlers.owner_get_affiliations(origin, stanza, affiliations, service)
8936
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   762
	local node = affiliations.attr.node;
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   763
	if not node then
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   764
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   765
		return true;
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   766
	end
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   767
	if not service:may(node, stanza.attr.from, "set_affiliation") then
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   768
		origin.send(pubsub_error_reply(stanza, "forbidden"));
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   769
		return true;
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   770
	end
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   771
8937
365bcf899093 mod_pubsub: Retrieve the node object
Kim Alvefur <zash@zash.se>
parents: 8936
diff changeset
   772
	local node_obj = service.nodes[node];
365bcf899093 mod_pubsub: Retrieve the node object
Kim Alvefur <zash@zash.se>
parents: 8936
diff changeset
   773
	if not node_obj then
365bcf899093 mod_pubsub: Retrieve the node object
Kim Alvefur <zash@zash.se>
parents: 8936
diff changeset
   774
		origin.send(pubsub_error_reply(stanza, "item-not-found"));
365bcf899093 mod_pubsub: Retrieve the node object
Kim Alvefur <zash@zash.se>
parents: 8936
diff changeset
   775
		return true;
365bcf899093 mod_pubsub: Retrieve the node object
Kim Alvefur <zash@zash.se>
parents: 8936
diff changeset
   776
	end
365bcf899093 mod_pubsub: Retrieve the node object
Kim Alvefur <zash@zash.se>
parents: 8936
diff changeset
   777
8936
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   778
	local reply = st.reply(stanza)
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   779
		:tag("pubsub", { xmlns = xmlns_pubsub_owner })
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   780
			:tag("affiliations", { node = node });
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   781
8938
a825ef6de45a mod_pubsub: Add the list of affiliations to reply
Kim Alvefur <zash@zash.se>
parents: 8937
diff changeset
   782
	for jid, affiliation in pairs(node_obj.affiliations) do
a825ef6de45a mod_pubsub: Add the list of affiliations to reply
Kim Alvefur <zash@zash.se>
parents: 8937
diff changeset
   783
		reply:tag("affiliation", { jid = jid, affiliation = affiliation }):up();
a825ef6de45a mod_pubsub: Add the list of affiliations to reply
Kim Alvefur <zash@zash.se>
parents: 8937
diff changeset
   784
	end
a825ef6de45a mod_pubsub: Add the list of affiliations to reply
Kim Alvefur <zash@zash.se>
parents: 8937
diff changeset
   785
8936
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   786
	origin.send(reply);
6d3ecf9e8277 mod_pubsub: Boilerplate checks for affiliation retrieval
Kim Alvefur <zash@zash.se>
parents: 8935
diff changeset
   787
	return true;
8935
12a9731aef0b mod_pubsub: Add stubs for affiliation handling
Kim Alvefur <zash@zash.se>
parents: 8829
diff changeset
   788
end
12a9731aef0b mod_pubsub: Add stubs for affiliation handling
Kim Alvefur <zash@zash.se>
parents: 8829
diff changeset
   789
12a9731aef0b mod_pubsub: Add stubs for affiliation handling
Kim Alvefur <zash@zash.se>
parents: 8829
diff changeset
   790
function handlers.owner_set_affiliations(origin, stanza, affiliations, service)
8940
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   791
	local node = affiliations.attr.node;
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   792
	if not node then
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   793
		origin.send(pubsub_error_reply(stanza, "nodeid-required"));
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   794
		return true;
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   795
	end
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   796
	if not service:may(node, stanza.attr.from, "set_affiliation") then
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   797
		origin.send(pubsub_error_reply(stanza, "forbidden"));
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   798
		return true;
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   799
	end
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   800
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   801
	local node_obj = service.nodes[node];
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   802
	if not node_obj then
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   803
		origin.send(pubsub_error_reply(stanza, "item-not-found"));
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   804
		return true;
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   805
	end
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   806
8941
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   807
	for affiliation_tag in affiliations:childtags("affiliation") do
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   808
		local jid = affiliation_tag.attr.jid;
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   809
		local affiliation = affiliation_tag.attr.affiliation;
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   810
8943
365b16109d95 mod_pubsub: Apply normalization to JIDs retrieved from attributes
Kim Alvefur <zash@zash.se>
parents: 8942
diff changeset
   811
		jid = jid_prep(jid);
8941
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   812
		if affiliation == "none" then affiliation = nil; end
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   813
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   814
		local ok, err = service:set_affiliation(node, stanza.attr.from, jid, affiliation);
8942
849c4683eaa0 mod_pubsub: Handle :set_affiliation errors (not completely in line with the XEP)
Kim Alvefur <zash@zash.se>
parents: 8941
diff changeset
   815
		if not ok then
849c4683eaa0 mod_pubsub: Handle :set_affiliation errors (not completely in line with the XEP)
Kim Alvefur <zash@zash.se>
parents: 8941
diff changeset
   816
			-- FIXME Incomplete error handling,
849c4683eaa0 mod_pubsub: Handle :set_affiliation errors (not completely in line with the XEP)
Kim Alvefur <zash@zash.se>
parents: 8941
diff changeset
   817
			-- see XEP 60 8.9.2.4 Multiple Simultaneous Modifications
849c4683eaa0 mod_pubsub: Handle :set_affiliation errors (not completely in line with the XEP)
Kim Alvefur <zash@zash.se>
parents: 8941
diff changeset
   818
			origin.send(pubsub_error_reply(stanza, err));
849c4683eaa0 mod_pubsub: Handle :set_affiliation errors (not completely in line with the XEP)
Kim Alvefur <zash@zash.se>
parents: 8941
diff changeset
   819
			return true;
849c4683eaa0 mod_pubsub: Handle :set_affiliation errors (not completely in line with the XEP)
Kim Alvefur <zash@zash.se>
parents: 8941
diff changeset
   820
		end
8941
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   821
	end
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   822
384ef9732b81 mod_pubsub: Support for setting affiliations (#622)
Kim Alvefur <zash@zash.se>
parents: 8940
diff changeset
   823
	local reply = st.reply(stanza);
8940
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   824
	origin.send(reply);
0ae46e6ea647 mod_pubsub: Add boilerplate for changing affiliations
Kim Alvefur <zash@zash.se>
parents: 8938
diff changeset
   825
	return true;
8935
12a9731aef0b mod_pubsub: Add stubs for affiliation handling
Kim Alvefur <zash@zash.se>
parents: 8829
diff changeset
   826
end
12a9731aef0b mod_pubsub: Add stubs for affiliation handling
Kim Alvefur <zash@zash.se>
parents: 8829
diff changeset
   827
8330
0b561f8bc790 mod_pubsub: Remove expose_publisher argument since it is handled in broadcaster
Kim Alvefur <zash@zash.se>
parents: 8328
diff changeset
   828
local function create_encapsulating_item(id, payload)
8219
d80233ca006d mod_pubsub: Pass xmlns correctly
Kim Alvefur <zash@zash.se>
parents: 8216
diff changeset
   829
	local item = st.stanza("item", { id = id, xmlns = xmlns_pubsub });
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   830
	item:add_child(payload);
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   831
	return item;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   832
end
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   833
8330
0b561f8bc790 mod_pubsub: Remove expose_publisher argument since it is handled in broadcaster
Kim Alvefur <zash@zash.se>
parents: 8328
diff changeset
   834
local function archive_itemstore(archive, config, user, node)
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   835
	module:log("debug", "Creation of itemstore for node %s with config %s", node, config);
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   836
	local get_set = {};
9008
7203a1b65d1b mod_pubsub: Cache only max_items to avoid holding reference to possibly outdated config
Kim Alvefur <zash@zash.se>
parents: 8984
diff changeset
   837
	local max_items = config["max_items"];
8311
ab189d3f55d1 mod_pubsub: Remove use of non-existent fields
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
   838
	function get_set:items() -- luacheck: ignore 212/self
8327
58d228da618f mod_pubsub: Limit number of items to fetch from archive storage to pubsub#max_items to prevent unbounded query (thanks Martin and lovetox)
Kim Alvefur <zash@zash.se>
parents: 8326
diff changeset
   839
		local data, err = archive:find(user, {
9008
7203a1b65d1b mod_pubsub: Cache only max_items to avoid holding reference to possibly outdated config
Kim Alvefur <zash@zash.se>
parents: 8984
diff changeset
   840
			limit = tonumber(max_items);
8327
58d228da618f mod_pubsub: Limit number of items to fetch from archive storage to pubsub#max_items to prevent unbounded query (thanks Martin and lovetox)
Kim Alvefur <zash@zash.se>
parents: 8326
diff changeset
   841
			reverse = true;
58d228da618f mod_pubsub: Limit number of items to fetch from archive storage to pubsub#max_items to prevent unbounded query (thanks Martin and lovetox)
Kim Alvefur <zash@zash.se>
parents: 8326
diff changeset
   842
		});
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   843
		if not data then
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   844
			module:log("error", "Unable to get items: %s", err);
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   845
			return true;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   846
		end
8311
ab189d3f55d1 mod_pubsub: Remove use of non-existent fields
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
   847
		module:log("debug", "Listed items %s", data);
8327
58d228da618f mod_pubsub: Limit number of items to fetch from archive storage to pubsub#max_items to prevent unbounded query (thanks Martin and lovetox)
Kim Alvefur <zash@zash.se>
parents: 8326
diff changeset
   848
		return it.reverse(function()
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   849
			local id, payload, when, publisher = data();
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   850
			if id == nil then
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   851
				return;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   852
			end
8330
0b561f8bc790 mod_pubsub: Remove expose_publisher argument since it is handled in broadcaster
Kim Alvefur <zash@zash.se>
parents: 8328
diff changeset
   853
			local item = create_encapsulating_item(id, payload, publisher);
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   854
			return id, item;
8327
58d228da618f mod_pubsub: Limit number of items to fetch from archive storage to pubsub#max_items to prevent unbounded query (thanks Martin and lovetox)
Kim Alvefur <zash@zash.se>
parents: 8326
diff changeset
   855
		end);
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   856
	end
8311
ab189d3f55d1 mod_pubsub: Remove use of non-existent fields
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
   857
	function get_set:get(key) -- luacheck: ignore 212/self
8222
2e68ae095645 mod_pubsub: Store data in users store, node in 'with' metadata field
Kim Alvefur <zash@zash.se>
parents: 8221
diff changeset
   858
		local data, err = archive:find(user, {
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   859
			key = key;
8305
4852def7dc49 mod_pubsub: Workaround some storage modules without archive key deduplication
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
   860
			-- Get the last item with that key, if the archive doesn't deduplicate
4852def7dc49 mod_pubsub: Workaround some storage modules without archive key deduplication
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
   861
			reverse = true,
4852def7dc49 mod_pubsub: Workaround some storage modules without archive key deduplication
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
   862
			limit = 1;
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   863
		});
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   864
		if not data then
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   865
			module:log("error", "Unable to get item: %s", err);
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   866
			return nil, err;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   867
		end
8299
e23328adca25 mod_pubsub: Remove workaround for SQL issue (fixed in becb593ed86d)
Kim Alvefur <zash@zash.se>
parents: 8298
diff changeset
   868
		local id, payload, when, publisher = data();
8311
ab189d3f55d1 mod_pubsub: Remove use of non-existent fields
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
   869
		module:log("debug", "Get item %s (published at %s by %s)", id, when, publisher);
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   870
		if id == nil then
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   871
			return nil;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   872
		end
8330
0b561f8bc790 mod_pubsub: Remove expose_publisher argument since it is handled in broadcaster
Kim Alvefur <zash@zash.se>
parents: 8328
diff changeset
   873
		return create_encapsulating_item(id, payload, publisher);
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   874
	end
8311
ab189d3f55d1 mod_pubsub: Remove use of non-existent fields
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
   875
	function get_set:set(key, value) -- luacheck: ignore 212/self
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   876
		local data, err;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   877
		if value ~= nil then
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   878
			local publisher = value.attr.publisher;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   879
			local payload = value.tags[1];
8303
7759eb130938 mod_pep_plus, mod_pubsub: Store node content in separate archive stores
Kim Alvefur <zash@zash.se>
parents: 8301
diff changeset
   880
			data, err = archive:append(user, key, payload, time_now(), publisher);
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   881
		else
8303
7759eb130938 mod_pep_plus, mod_pubsub: Store node content in separate archive stores
Kim Alvefur <zash@zash.se>
parents: 8301
diff changeset
   882
			data, err = archive:delete(user, { key = key; });
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   883
		end
9075
9603a6a1ec85 mod_pubsub: Enforce max_items on insertion
Kim Alvefur <zash@zash.se>
parents: 9044
diff changeset
   884
		-- TODO archive support for maintaining maximum items
9603a6a1ec85 mod_pubsub: Enforce max_items on insertion
Kim Alvefur <zash@zash.se>
parents: 9044
diff changeset
   885
		archive:delete(user, {
9603a6a1ec85 mod_pubsub: Enforce max_items on insertion
Kim Alvefur <zash@zash.se>
parents: 9044
diff changeset
   886
			truncate = max_items;
9603a6a1ec85 mod_pubsub: Enforce max_items on insertion
Kim Alvefur <zash@zash.se>
parents: 9044
diff changeset
   887
		});
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   888
		if not data then
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   889
			module:log("error", "Unable to set item: %s", err);
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   890
			return nil, err;
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   891
		end
8220
5f4e0d67b82a util.pubsub: Catch overriden id from storage
Kim Alvefur <zash@zash.se>
parents: 8219
diff changeset
   892
		return data;
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   893
	end
8304
e2ab440a3437 mod_pubsub: Ignore unused 'self' since the data used is an upvalue [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8303
diff changeset
   894
	function get_set:clear() -- luacheck: ignore 212/self
8303
7759eb130938 mod_pep_plus, mod_pubsub: Store node content in separate archive stores
Kim Alvefur <zash@zash.se>
parents: 8301
diff changeset
   895
		return archive:delete(user);
8301
dd9fa511494a mod_pubsub: Add method to clear data from a simple_itemstore
Kim Alvefur <zash@zash.se>
parents: 8299
diff changeset
   896
	end
8828
7270258fec77 mod_pubsup: Ignore unused 'self' argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8825
diff changeset
   897
	function get_set:resize(size) -- luacheck: ignore 212/self
9009
935e5ca43792 mod_pubsub: Update max_items on resize (fixes #1082)
Kim Alvefur <zash@zash.se>
parents: 9008
diff changeset
   898
		max_items = size;
8402
07443fe9df5b mod_pubsub/archive_itemstore: Support resize operation
Kim Alvefur <zash@zash.se>
parents: 8378
diff changeset
   899
		return archive:delete(user, {
07443fe9df5b mod_pubsub/archive_itemstore: Support resize operation
Kim Alvefur <zash@zash.se>
parents: 8378
diff changeset
   900
			truncate = size;
07443fe9df5b mod_pubsub/archive_itemstore: Support resize operation
Kim Alvefur <zash@zash.se>
parents: 8378
diff changeset
   901
		});
07443fe9df5b mod_pubsub/archive_itemstore: Support resize operation
Kim Alvefur <zash@zash.se>
parents: 8378
diff changeset
   902
	end
8378
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   903
	function get_set:tail()
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   904
		-- This should conveniently return the last item
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   905
		local item = self:get(nil);
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   906
		if item then
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   907
			return item.attr.id, item;
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   908
		end
e2037634cdd9 mod_pubsub: Add a tail method (like util.cache) to archive_itemstore
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
   909
	end
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   910
	return setmetatable(get_set, archive);
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   911
end
8321
d0a7fc7614de mod_pubsub, mod_pep_plus: Rename simple_itemstore to reflect that it's based on archive storage
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
   912
_M.archive_itemstore = archive_itemstore;
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
   913
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   914
return _M;