plugins/mod_pubsub/mod_pubsub.lua
author Kim Alvefur <zash@zash.se>
Tue, 30 Oct 2018 18:20:54 +0100
branch0.11
changeset 9601 17d43543f9b6
parent 9237 d00e8ec7ece2
child 9724 e7ddf70ae417
child 9832 8e68136cde08
permissions -rw-r--r--
pubsub: Set pubsub#title as name attribute in disco#items (fixes #1226)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     1
local pubsub = require "util.pubsub";
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     2
local st = require "util.stanza";
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     3
local jid_bare = require "util.jid".bare;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     4
local usermanager = require "core.usermanager";
8814
f2d35eee69c9 mod_pubsub: Set an id attribute on outgoing event messages
Kim Alvefur <zash@zash.se>
parents: 8811
diff changeset
     5
local new_id = require "util.id".medium;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     6
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     7
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
     8
local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
     9
local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
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 autocreate_on_publish = module:get_option_boolean("autocreate_on_publish", false);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    12
local autocreate_on_subscribe = module:get_option_boolean("autocreate_on_subscribe", false);
7986
879be73c0a58 mod_pubsub: Fix syntax error introduced in 241f02bd66ce
Matthew Wild <mwild1@gmail.com>
parents: 7983
diff changeset
    13
local pubsub_disco_name = module:get_option_string("name", "Prosody PubSub Service");
6518
c9a72c64c3e2 mod_pubsub: Add support for including the publisher in item broadcasts
Philipp Hancke <fippo@goodadvice.pages.de>
parents: 6449
diff changeset
    14
local expose_publisher = module:get_option_boolean("expose_publisher", false)
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    15
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    16
local service;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    17
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    18
local lib_pubsub = module:require "pubsub";
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    19
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
    20
module:depends("disco");
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
    21
module:add_identity("pubsub", "service", pubsub_disco_name);
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
    22
module:add_feature("http://jabber.org/protocol/pubsub");
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
    23
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    24
function handle_pubsub_iq(event)
8337
036e46d12b78 mod_pubsub: Move dispatch function into pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
    25
	return lib_pubsub.handle_pubsub_iq(event, service);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    26
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    27
9111
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    28
-- An itemstore supports the following methods:
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    29
--   items(): iterator over (id, item)
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    30
--   get(id): return item with id
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    31
--   set(id, item): set id to item
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    32
--   clear(): clear all items
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    33
--   resize(n): set new limit and trim oldest items
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    34
--   tail(): return the latest item
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    35
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    36
-- A nodestore supports the following methods:
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    37
--   set(node_name, node_data)
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    38
--   get(node_name)
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    39
--   users(): iterator over (node_name)
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    40
86f31a2174b3 mod_pubsub: Add comment to document nodestore/itemstore methods
Matthew Wild <mwild1@gmail.com>
parents: 9104
diff changeset
    41
8507
80b8355c8b8b mod_pubsub: Add nodestore to service configuration
Matthew Wild <mwild1@gmail.com>
parents: 8506
diff changeset
    42
local node_store = module:open_store(module.name.."_nodes");
80b8355c8b8b mod_pubsub: Add nodestore to service configuration
Matthew Wild <mwild1@gmail.com>
parents: 8506
diff changeset
    43
8506
3b86134c56ea mod_pubsub: Some variable renames for clarity
Matthew Wild <mwild1@gmail.com>
parents: 8343
diff changeset
    44
local function create_simple_itemstore(node_config, node_name)
3b86134c56ea mod_pubsub: Some variable renames for clarity
Matthew Wild <mwild1@gmail.com>
parents: 8343
diff changeset
    45
	local archive = module:open_store("pubsub_"..node_name, "archive");
3b86134c56ea mod_pubsub: Some variable renames for clarity
Matthew Wild <mwild1@gmail.com>
parents: 8343
diff changeset
    46
	return lib_pubsub.archive_itemstore(archive, node_config, nil, node_name);
8216
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
    47
end
e1272aeef31c mod_pubsub: Add item persistence using mod_storage_*’s archive store.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8213
diff changeset
    48
8817
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8814
diff changeset
    49
function simple_broadcast(kind, node, jids, item, actor, node_obj)
9184
79cf1f74738f mod_pubsub: Prepare to support turning notifications off for each kind of broadcast
Kim Alvefur <zash@zash.se>
parents: 9182
diff changeset
    50
	if node_obj then
79cf1f74738f mod_pubsub: Prepare to support turning notifications off for each kind of broadcast
Kim Alvefur <zash@zash.se>
parents: 9182
diff changeset
    51
		if node_obj.config["notify_"..kind] == false then
79cf1f74738f mod_pubsub: Prepare to support turning notifications off for each kind of broadcast
Kim Alvefur <zash@zash.se>
parents: 9182
diff changeset
    52
			return;
79cf1f74738f mod_pubsub: Prepare to support turning notifications off for each kind of broadcast
Kim Alvefur <zash@zash.se>
parents: 9182
diff changeset
    53
		end
79cf1f74738f mod_pubsub: Prepare to support turning notifications off for each kind of broadcast
Kim Alvefur <zash@zash.se>
parents: 9182
diff changeset
    54
	end
9182
82fad995a149 util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents: 9161
diff changeset
    55
	if kind == "retract" then
82fad995a149 util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents: 9161
diff changeset
    56
		kind = "items"; -- XEP-0060 signals retraction in an <items> container
82fad995a149 util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents: 9161
diff changeset
    57
	end
82fad995a149 util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents: 9161
diff changeset
    58
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    59
	if item then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    60
		item = st.clone(item);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    61
		item.attr.xmlns = nil; -- Clear the pubsub namespace
9190
bd452e4f5a13 mod_pubsub: Only attach publisher on normal "item" broadcasts
Kim Alvefur <zash@zash.se>
parents: 9184
diff changeset
    62
		if kind == "items" then
9191
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9190
diff changeset
    63
			if node_obj and node_obj.config.include_payload == false then
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9190
diff changeset
    64
				item:maptags(function () return nil; end);
ef2616ade453 mod_pubsub: Add support for thin notifications (without the full payload)
Kim Alvefur <zash@zash.se>
parents: 9190
diff changeset
    65
			end
9190
bd452e4f5a13 mod_pubsub: Only attach publisher on normal "item" broadcasts
Kim Alvefur <zash@zash.se>
parents: 9184
diff changeset
    66
			if expose_publisher and actor then
bd452e4f5a13 mod_pubsub: Only attach publisher on normal "item" broadcasts
Kim Alvefur <zash@zash.se>
parents: 9184
diff changeset
    67
				item.attr.publisher = actor
bd452e4f5a13 mod_pubsub: Only attach publisher on normal "item" broadcasts
Kim Alvefur <zash@zash.se>
parents: 9184
diff changeset
    68
			end
6518
c9a72c64c3e2 mod_pubsub: Add support for including the publisher in item broadcasts
Philipp Hancke <fippo@goodadvice.pages.de>
parents: 6449
diff changeset
    69
		end
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    70
	end
8814
f2d35eee69c9 mod_pubsub: Set an id attribute on outgoing event messages
Kim Alvefur <zash@zash.se>
parents: 8811
diff changeset
    71
f2d35eee69c9 mod_pubsub: Set an id attribute on outgoing event messages
Kim Alvefur <zash@zash.se>
parents: 8811
diff changeset
    72
	local id = new_id();
8817
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8814
diff changeset
    73
	local msg_type = node_obj and node_obj.config.message_type or "headline";
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8814
diff changeset
    74
	local message = st.message({ from = module.host, type = msg_type, id = id })
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    75
		:tag("event", { xmlns = xmlns_pubsub_event })
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    76
			:tag(kind, { node = node })
8949
3a095233e178 mod_pubsub: Handle optional item (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
    77
3a095233e178 mod_pubsub: Handle optional item (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
    78
	if item then
3a095233e178 mod_pubsub: Handle optional item (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
    79
		message:add_child(item);
3a095233e178 mod_pubsub: Handle optional item (thanks jonasw)
Kim Alvefur <zash@zash.se>
parents: 8818
diff changeset
    80
	end
8817
07197f29e2b8 mod_pubsub: Make the 'type' attribute on broadcast messages configurable
Kim Alvefur <zash@zash.se>
parents: 8814
diff changeset
    81
9042
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    82
	local summary;
8818
5974c9da1391 mod_pubsub: Add support for generation of a plain text <body> from Atom payloads
Kim Alvefur <zash@zash.se>
parents: 8817
diff changeset
    83
	-- Compose a sensible textual representation of at least Atom payloads
9042
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    84
	if item and item.tags[1] then
8818
5974c9da1391 mod_pubsub: Add support for generation of a plain text <body> from Atom payloads
Kim Alvefur <zash@zash.se>
parents: 8817
diff changeset
    85
		local payload = item.tags[1];
9048
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
    86
		summary = module:fire_event("pubsub-summary/"..payload.attr.xmlns, {
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
    87
			kind = kind, node = node, jids = jids, actor = actor, item = item, payload = payload,
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
    88
		});
8818
5974c9da1391 mod_pubsub: Add support for generation of a plain text <body> from Atom payloads
Kim Alvefur <zash@zash.se>
parents: 8817
diff changeset
    89
	end
5974c9da1391 mod_pubsub: Add support for generation of a plain text <body> from Atom payloads
Kim Alvefur <zash@zash.se>
parents: 8817
diff changeset
    90
9042
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    91
	for jid, options in pairs(jids) do
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    92
		local new_stanza = st.clone(message);
9047
18cd5102253c mod_pubsub: Skip checks for adding body if no body generated
Kim Alvefur <zash@zash.se>
parents: 9046
diff changeset
    93
		if summary and type(options) == "table" and options["pubsub#include_body"] then
9042
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    94
			new_stanza:body(summary);
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    95
		end
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    96
		new_stanza.attr.to = jid;
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    97
		module:send(new_stanza);
0124e5ec1556 mod_pubsub: Move include_body option into subscription options
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
    98
	end
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
    99
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   100
9103
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   101
local max_max_items = module:get_option_number("pubsub_max_items", 256);
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   102
function check_node_config(node, actor, new_config) -- luacheck: ignore 212/actor 212/node
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   103
	if (new_config["max_items"] or 1) > max_max_items then
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   104
		return false;
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   105
	end
9104
1ff694534e98 mod_pubsub: Restrict access model to 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9103
diff changeset
   106
	if new_config["access_model"] ~= "whitelist" and new_config["access_model"] ~= "open" then
1ff694534e98 mod_pubsub: Restrict access model to 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9103
diff changeset
   107
		return false;
1ff694534e98 mod_pubsub: Restrict access model to 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9103
diff changeset
   108
	end
9103
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   109
	return true;
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   110
end
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   111
8698
09e7fd8b16cd mod_pubsub: Reject publishing of non-items
Kim Alvefur <zash@zash.se>
parents: 8508
diff changeset
   112
function is_item_stanza(item)
09e7fd8b16cd mod_pubsub: Reject publishing of non-items
Kim Alvefur <zash@zash.se>
parents: 8508
diff changeset
   113
	return st.is_stanza(item) and item.attr.xmlns == xmlns_pubsub and item.name == "item";
09e7fd8b16cd mod_pubsub: Reject publishing of non-items
Kim Alvefur <zash@zash.se>
parents: 8508
diff changeset
   114
end
09e7fd8b16cd mod_pubsub: Reject publishing of non-items
Kim Alvefur <zash@zash.se>
parents: 8508
diff changeset
   115
9048
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   116
module:hook("pubsub-summary/http://www.w3.org/2005/Atom", function (event)
9237
d00e8ec7ece2 mod_pubsub: Fix summary generation for Atom entries to use the correct field
Kim Alvefur <zash@zash.se>
parents: 9191
diff changeset
   117
	local payload = event.payload;
9048
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   118
	local title = payload:get_child_text("title");
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   119
	local summary = payload:get_child_text("summary");
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   120
	if not summary and title then
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   121
		local author = payload:find("author/name#");
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   122
		summary = title;
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   123
		if author then
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   124
			summary = author .. " posted " .. summary;
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   125
		end
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   126
	end
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   127
	return summary;
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   128
end);
4336a2b97aba mod_pubsub: Make generation of notification body into an event to allow extensibility
Kim Alvefur <zash@zash.se>
parents: 9047
diff changeset
   129
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   130
module:hook("iq/host/"..xmlns_pubsub..":pubsub", handle_pubsub_iq);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   131
module:hook("iq/host/"..xmlns_pubsub_owner..":pubsub", handle_pubsub_iq);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   132
8508
c9bdb4dfed96 mod_pubsub: Ignore unused parameter [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 8507
diff changeset
   133
local function add_disco_features_from_service(service) --luacheck: ignore 431/service
8343
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8342
diff changeset
   134
	for feature in lib_pubsub.get_feature_set(service) do
7c1fb8c042dc mod_pubsub: Move service feature dection to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8342
diff changeset
   135
		module:add_feature(xmlns_pubsub.."#"..feature);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   136
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   137
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   138
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   139
module:hook("host-disco-info-node", function (event)
8983
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8960
diff changeset
   140
	return lib_pubsub.handle_disco_info_node(event, service);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   141
end);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   142
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   143
module:hook("host-disco-items-node", function (event)
8983
4d2738b99b07 mod_pubsub: Move service discovery to pubsub.lib to allow reuse
Kim Alvefur <zash@zash.se>
parents: 8960
diff changeset
   144
	return lib_pubsub.handle_disco_items_node(event, service);
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   145
end);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   146
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   147
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   148
module:hook("host-disco-items", function (event)
8213
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7987
diff changeset
   149
	local stanza, reply = event.stanza, event.reply;
352d605b1178 mod_pubsub: Fix a few warnings [luacheck]
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 7987
diff changeset
   150
	local ok, ret = service:get_nodes(stanza.attr.from);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   151
	if not ok then
5970
6a2c3293d4d7 mod_pubsub: Don't sent error replies from service disco events, let mod_disco handle that
Kim Alvefur <zash@zash.se>
parents: 5690
diff changeset
   152
		return;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   153
	end
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   154
	for node, node_obj in pairs(ret) do
9601
17d43543f9b6 pubsub: Set pubsub#title as name attribute in disco#items (fixes #1226)
Kim Alvefur <zash@zash.se>
parents: 9237
diff changeset
   155
		reply:tag("item", { jid = module.host, node = node, name = node_obj.config.title }):up();
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   156
	end
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   157
end);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   158
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   159
local admin_aff = module:get_option_string("default_admin_affiliation", "owner");
7711
c420a38db5ef Backed out changeset f1af4edd5722, doesn't work as intended (node is the name of the node and always present)
Kim Alvefur <zash@zash.se>
parents: 6844
diff changeset
   160
local function get_affiliation(jid)
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   161
	local bare_jid = jid_bare(jid);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   162
	if bare_jid == module.host or usermanager.is_admin(bare_jid, module.host) then
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   163
		return admin_aff;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   164
	end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   165
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   166
9121
70f34c663fb3 mod_pubsub: Add a public method for retrieving the service object
Kim Alvefur <zash@zash.se>
parents: 9111
diff changeset
   167
function get_service()
70f34c663fb3 mod_pubsub: Add a public method for retrieving the service object
Kim Alvefur <zash@zash.se>
parents: 9111
diff changeset
   168
	return service;
70f34c663fb3 mod_pubsub: Add a public method for retrieving the service object
Kim Alvefur <zash@zash.se>
parents: 9111
diff changeset
   169
end
70f34c663fb3 mod_pubsub: Add a public method for retrieving the service object
Kim Alvefur <zash@zash.se>
parents: 9111
diff changeset
   170
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   171
function set_service(new_service)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   172
	service = new_service;
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   173
	module.environment.service = service;
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   174
	add_disco_features_from_service(service);
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   175
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   176
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   177
function module.save()
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   178
	return { service = service };
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   179
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   180
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   181
function module.restore(data)
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   182
	set_service(data.service);
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   183
end
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   184
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   185
function module.load()
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   186
	if module.reloading then return; end
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   187
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   188
	set_service(pubsub.new({
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   189
		autocreate_on_publish = autocreate_on_publish;
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   190
		autocreate_on_subscribe = autocreate_on_subscribe;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   191
8507
80b8355c8b8b mod_pubsub: Add nodestore to service configuration
Matthew Wild <mwild1@gmail.com>
parents: 8506
diff changeset
   192
		nodestore = node_store;
8506
3b86134c56ea mod_pubsub: Some variable renames for clarity
Matthew Wild <mwild1@gmail.com>
parents: 8343
diff changeset
   193
		itemstore = create_simple_itemstore;
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   194
		broadcaster = simple_broadcast;
8698
09e7fd8b16cd mod_pubsub: Reject publishing of non-items
Kim Alvefur <zash@zash.se>
parents: 8508
diff changeset
   195
		itemcheck = is_item_stanza;
9103
e01c7d0cbbf4 mod_pubsub: Add configurable maximum on number of items
Kim Alvefur <zash@zash.se>
parents: 9048
diff changeset
   196
		check_node_config = check_node_config;
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   197
		get_affiliation = get_affiliation;
5626
8416d4619d80 mod_pubsub: Split out handlers into a module library
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
   198
5690
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   199
		normalize_jid = jid_bare;
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   200
	}));
630e7224a65f mod_pubsub: Utilize mod_disco, instead of reimplementing disco handling
Florian Zeitz <florob@babelmonkeys.de>
parents: 5626
diff changeset
   201
end