Annotate

plugins/mod_pep.lua @ 11305:cd8516a77255

util.startup: Make installer_plugin_path relative to data directory Having it relative to current working directory is problematic since this depends on how Prosody was started and changes to the data directory during startup (but after this point).
author Kim Alvefur <zash@zash.se>
date Sun, 24 Jan 2021 16:12:53 +0100
parent 10673:1a23a58ac84e
child 11378:b790df8f9448
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
1 local pubsub = require "util.pubsub";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
2 local jid_bare = require "util.jid".bare;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
3 local jid_split = require "util.jid".split;
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
4 local jid_join = require "util.jid".join;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
5 local set_new = require "util.set".new;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
6 local st = require "util.stanza";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
7 local calculate_hash = require "util.caps".calculate_hash;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
8 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
8320
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8319
diff changeset
9 local cache = require "util.cache";
8341
910d3c3f60a6 mod_pep_plus: Use feature detection from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
10 local set = require "util.set";
9723
3c6e266391a2 mod_pep: Set an 'id' on notifications
Kim Alvefur <zash@zash.se>
parents: 9722
diff changeset
11 local new_id = require "util.id".medium;
9827
fd8aaab6669c mod_pep: Simplify configuration for node data (fixes #1320)
Kim Alvefur <zash@zash.se>
parents: 9597
diff changeset
12 local storagemanager = require "core.storagemanager";
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
13
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
14 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
15 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
16 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
17
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
18 local lib_pubsub = module:require "pubsub";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
19
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
20 local empty_set = set_new();
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
21
9113
74639d606a15 mod_pep: Add comments describing root tables used for data
Kim Alvefur <zash@zash.se>
parents: 9103
diff changeset
22 -- username -> util.pubsub service object
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
23 local services = {};
9113
74639d606a15 mod_pep: Add comments describing root tables used for data
Kim Alvefur <zash@zash.se>
parents: 9103
diff changeset
24
9142
85bc624b8685 mod_pep: Correct comment about 'recipients' table
Kim Alvefur <zash@zash.se>
parents: 9141
diff changeset
25 -- username -> recipient -> set of nodes
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
26 local recipients = {};
9143
817f666d9037 mod_pep: Add comment about 'hash_map' table
Kim Alvefur <zash@zash.se>
parents: 9142
diff changeset
27
817f666d9037 mod_pep: Add comment about 'hash_map' table
Kim Alvefur <zash@zash.se>
parents: 9142
diff changeset
28 -- caps hash -> set of nodes
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
29 local hash_map = {};
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
30
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
31 local host = module.host;
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
32
8949
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
33 local node_config = module:open_store("pep", "map");
8306
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
34 local known_nodes = module:open_store("pep");
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
35
9077
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
36 local max_max_items = module:get_option_number("pep_max_items", 256);
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
37
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
38 function module.save()
9141
c1368fb756bf mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
39 return {
c1368fb756bf mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
40 services = services;
c1368fb756bf mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
41 recipients = recipients;
c1368fb756bf mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
42 };
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
43 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
44
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
45 function module.restore(data)
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
46 services = data.services;
9141
c1368fb756bf mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents: 9140
diff changeset
47 recipients = data.recipients;
9538
07665733b332 mod_pep: Add all pubsub service objects to item API in order to behave across reloads
Kim Alvefur <zash@zash.se>
parents: 9205
diff changeset
48 for username, service in pairs(services) do
07665733b332 mod_pep: Add all pubsub service objects to item API in order to behave across reloads
Kim Alvefur <zash@zash.se>
parents: 9205
diff changeset
49 local user_bare = jid_join(username, host);
07665733b332 mod_pep: Add all pubsub service objects to item API in order to behave across reloads
Kim Alvefur <zash@zash.se>
parents: 9205
diff changeset
50 module:add_item("pep-service", { service = service, jid = user_bare });
07665733b332 mod_pep: Add all pubsub service objects to item API in order to behave across reloads
Kim Alvefur <zash@zash.se>
parents: 9205
diff changeset
51 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
52 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
53
8696
164da3186511 mod_pep_plus: Validate items here too (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
54 function is_item_stanza(item)
10672
657e61531b33 mod_pubsub, mod_pep: Ensure correct number of children of <item/> (fixes #1496)
Kim Alvefur <zash@zash.se>
parents: 10520
diff changeset
55 return st.is_stanza(item) and item.attr.xmlns == xmlns_pubsub and item.name == "item" and #item.tags == 1;
8696
164da3186511 mod_pep_plus: Validate items here too (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
56 end
164da3186511 mod_pep_plus: Validate items here too (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
57
9080
1b21f8ffaec8 mod_pep: Silence warnings about unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents: 9077
diff changeset
58 function check_node_config(node, actor, new_config) -- luacheck: ignore 212/node 212/actor
9077
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
59 if (new_config["max_items"] or 1) > max_max_items then
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
60 return false;
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
61 end
9103
d5a7d2697b19 mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
62 if new_config["access_model"] ~= "presence"
d5a7d2697b19 mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
63 and new_config["access_model"] ~= "whitelist"
d5a7d2697b19 mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
64 and new_config["access_model"] ~= "open" then
d5a7d2697b19 mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
65 return false;
d5a7d2697b19 mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents: 9099
diff changeset
66 end
9082
297a06074175 mod_pep: Return true if all node config checks passes (fixes configuration)
Kim Alvefur <zash@zash.se>
parents: 9080
diff changeset
67 return true;
9077
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
68 end
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
69
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
70 local function subscription_presence(username, recipient)
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
71 local user_bare = jid_join(username, host);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
72 local recipient_bare = jid_bare(recipient);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
73 if (recipient_bare == user_bare) then return true; end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
74 return is_contact_subscribed(username, host, recipient_bare);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
75 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
76
8949
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
77 local function nodestore(username)
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
78 -- luacheck: ignore 212/self
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
79 local store = {};
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
80 function store:get(node)
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
81 local data, err = node_config:get(username, node)
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
82 if data == true then
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
83 -- COMPAT Previously stored only a boolean representing 'persist_items'
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
84 data = {
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
85 name = node;
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
86 config = {};
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
87 subscribers = {};
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
88 affiliations = {};
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
89 };
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
90 end
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
91 return data, err;
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
92 end
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
93 function store:set(node, data)
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
94 return node_config:set(username, node, data);
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
95 end
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
96 function store:users()
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
97 return pairs(known_nodes:get(username) or {});
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
98 end
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
99 return store;
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
100 end
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
101
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
102 local function simple_itemstore(username)
9827
fd8aaab6669c mod_pep: Simplify configuration for node data (fixes #1320)
Kim Alvefur <zash@zash.se>
parents: 9597
diff changeset
103 local driver = storagemanager.get_driver(module.host, "pep_data");
8218
2c75a5ba58fc mod_pubsub: Pass 'user' to simple_itemstore
Kim Alvefur <zash@zash.se>
parents: 8215
diff changeset
104 return function (config, node)
8333
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8332
diff changeset
105 if config["persist_items"] then
8320
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8319
diff changeset
106 module:log("debug", "Creating new persistent item store for user %s, node %q", username, node);
9827
fd8aaab6669c mod_pep: Simplify configuration for node data (fixes #1320)
Kim Alvefur <zash@zash.se>
parents: 9597
diff changeset
107 local archive = driver:open("pep_"..node, "archive");
8320
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8319
diff changeset
108 return lib_pubsub.archive_itemstore(archive, config, username, node, false);
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8319
diff changeset
109 else
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8319
diff changeset
110 module:log("debug", "Creating new ephemeral item store for user %s, node %q", username, node);
8333
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8332
diff changeset
111 return cache.new(tonumber(config["max_items"]));
8320
fe5eaf4ed631 mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents: 8319
diff changeset
112 end
8218
2c75a5ba58fc mod_pubsub: Pass 'user' to simple_itemstore
Kim Alvefur <zash@zash.se>
parents: 8215
diff changeset
113 end
8215
835bb32c36b4 mod_pep_plus: Add item persistency.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8214
diff changeset
114 end
835bb32c36b4 mod_pep_plus: Add item persistency.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8214
diff changeset
115
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
116 local function get_broadcaster(username)
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
117 local user_bare = jid_join(username, host);
9189
8fadd3d6c8d3 mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents: 9179
diff changeset
118 local function simple_broadcast(kind, node, jids, item, _, node_obj)
8fadd3d6c8d3 mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents: 9179
diff changeset
119 if node_obj then
8fadd3d6c8d3 mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents: 9179
diff changeset
120 if node_obj.config["notify_"..kind] == false then
8fadd3d6c8d3 mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents: 9179
diff changeset
121 return;
8fadd3d6c8d3 mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents: 9179
diff changeset
122 end
8fadd3d6c8d3 mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents: 9179
diff changeset
123 end
9179
82fad995a149 util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents: 9160
diff changeset
124 if kind == "retract" then
82fad995a149 util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents: 9160
diff changeset
125 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: 9160
diff changeset
126 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
127 if item then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
128 item = st.clone(item);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
129 item.attr.xmlns = nil; -- Clear the pubsub namespace
9190
b88f537163da mod_pep: Respect setting for whether to include payload in notifications
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
130 if kind == "items" then
b88f537163da mod_pep: Respect setting for whether to include payload in notifications
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
131 if node_obj and node_obj.config.include_payload == false then
b88f537163da mod_pep: Respect setting for whether to include payload in notifications
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
132 item:maptags(function () return nil; end);
b88f537163da mod_pep: Respect setting for whether to include payload in notifications
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
133 end
b88f537163da mod_pep: Respect setting for whether to include payload in notifications
Kim Alvefur <zash@zash.se>
parents: 9189
diff changeset
134 end
9721
233305015373 mod_pep: Move broadcaster code around to be more like in mod_pubsub
Kim Alvefur <zash@zash.se>
parents: 9607
diff changeset
135 end
233305015373 mod_pep: Move broadcaster code around to be more like in mod_pubsub
Kim Alvefur <zash@zash.se>
parents: 9607
diff changeset
136
9723
3c6e266391a2 mod_pep: Set an 'id' on notifications
Kim Alvefur <zash@zash.se>
parents: 9722
diff changeset
137 local id = new_id();
3c6e266391a2 mod_pep: Set an 'id' on notifications
Kim Alvefur <zash@zash.se>
parents: 9722
diff changeset
138 local message = st.message({ from = user_bare, type = "headline", id = id })
9721
233305015373 mod_pep: Move broadcaster code around to be more like in mod_pubsub
Kim Alvefur <zash@zash.se>
parents: 9607
diff changeset
139 :tag("event", { xmlns = xmlns_pubsub_event })
233305015373 mod_pep: Move broadcaster code around to be more like in mod_pubsub
Kim Alvefur <zash@zash.se>
parents: 9607
diff changeset
140 :tag(kind, { node = node });
9722
695fae2e16b2 mod_pep: Add some spacing between blocks in broadcaster to improve readability
Kim Alvefur <zash@zash.se>
parents: 9721
diff changeset
141
9721
233305015373 mod_pep: Move broadcaster code around to be more like in mod_pubsub
Kim Alvefur <zash@zash.se>
parents: 9607
diff changeset
142 if item then
8895
d00ea07de9a0 mod_pep_plus: Prevent nil from being added as a child on item deletion.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8753
diff changeset
143 message:add_child(item);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
144 end
10036
045209b41b3a mod_pep: Handle presence based subscription outside of util.pubsub (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
145
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
146 for jid in pairs(jids) do
10047
177a8b92204b mod_pep: Log node name instead of payload
Kim Alvefur <zash@zash.se>
parents: 10046
diff changeset
147 module:log("debug", "Sending notification to %s from %s for node %s", jid, user_bare, node);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
148 message.attr.to = jid;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
149 module:send(message);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
150 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
151 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
152 return simple_broadcast;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
153 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
154
10520
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
155 local function get_subscriber_filter(username)
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
156 return function (jids, node)
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
157 local broadcast_to = {};
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
158 for jid, opts in pairs(jids) do
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
159 broadcast_to[jid] = opts;
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
160 end
10045
6714578cfd6e mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents: 10036
diff changeset
161
10520
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
162 local service_recipients = recipients[username];
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
163 if service_recipients then
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
164 local service = services[username];
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
165 for recipient, nodes in pairs(service_recipients) do
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
166 if nodes:contains(node) and service:may(node, recipient, "subscribe") then
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
167 broadcast_to[recipient] = true;
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
168 end
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
169 end
10045
6714578cfd6e mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents: 10036
diff changeset
170 end
10520
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
171 return broadcast_to;
10045
6714578cfd6e mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents: 10036
diff changeset
172 end
6714578cfd6e mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents: 10036
diff changeset
173 end
9542
b8bfcfbe5126 mod_pep: Add automatic subscriptions on node creation (fixes #1222)
Kim Alvefur <zash@zash.se>
parents: 9541
diff changeset
174
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
175 function get_pep_service(username)
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
176 local user_bare = jid_join(username, host);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
177 local service = services[username];
6432
388786af0dd2 mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents: 6305
diff changeset
178 if service then
388786af0dd2 mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents: 6305
diff changeset
179 return service;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
180 end
10066
216ae100c04a mod_pep: Only log when creating new pubsub services
Kim Alvefur <zash@zash.se>
parents: 10047
diff changeset
181 module:log("debug", "Creating pubsub service for user %q", username);
6432
388786af0dd2 mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents: 6305
diff changeset
182 service = pubsub.new({
9541
742977123168 mod_pep: Add PEP service owners username in configuration to ease identification
Kim Alvefur <zash@zash.se>
parents: 9540
diff changeset
183 pep_username = username;
6444
aab509a9d0ba mod_pep_plus: Default to max one item per node (Recomended for PEP)
Kim Alvefur <zash@zash.se>
parents: 6443
diff changeset
184 node_defaults = {
8333
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8332
diff changeset
185 ["max_items"] = 1;
2abbb01cd756 pubsub: Distinguish internal representation of node config from XEP-0060 form (util.pubsub should be protocol-agnostic)
Kim Alvefur <zash@zash.se>
parents: 8332
diff changeset
186 ["persist_items"] = true;
9097
ce2ba9f91c84 mod_pep: Set default access model to 'presence'
Kim Alvefur <zash@zash.se>
parents: 9082
diff changeset
187 ["access_model"] = "presence";
6444
aab509a9d0ba mod_pep_plus: Default to max one item per node (Recomended for PEP)
Kim Alvefur <zash@zash.se>
parents: 6443
diff changeset
188 };
aab509a9d0ba mod_pep_plus: Default to max one item per node (Recomended for PEP)
Kim Alvefur <zash@zash.se>
parents: 6443
diff changeset
189
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
190 autocreate_on_publish = true;
9542
b8bfcfbe5126 mod_pep: Add automatic subscriptions on node creation (fixes #1222)
Kim Alvefur <zash@zash.se>
parents: 9541
diff changeset
191 autocreate_on_subscribe = false;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
192
8949
9194431b6447 mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents: 8895
diff changeset
193 nodestore = nodestore(username);
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
194 itemstore = simple_itemstore(username);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
195 broadcaster = get_broadcaster(username);
10520
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
196 subscriber_filter = get_subscriber_filter(username);
8696
164da3186511 mod_pep_plus: Validate items here too (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 8377
diff changeset
197 itemcheck = is_item_stanza;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
198 get_affiliation = function (jid)
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
199 if jid_bare(jid) == user_bare then
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
200 return "owner";
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
201 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
202 end;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
203
9099
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
204 access_models = {
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
205 presence = function (jid)
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
206 if subscription_presence(username, jid) then
9160
e13a1a0b0107 mod_pep, util.pubsub: Rename restricted->outcast, none->member and add new 'none' affiliation to better match XEP-0060
Matthew Wild <mwild1@gmail.com>
parents: 9158
diff changeset
207 return "member";
9099
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
208 end
9160
e13a1a0b0107 mod_pep, util.pubsub: Rename restricted->outcast, none->member and add new 'none' affiliation to better match XEP-0060
Matthew Wild <mwild1@gmail.com>
parents: 9158
diff changeset
209 return "outcast";
9099
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
210 end;
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
211 };
974b25c27f24 mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents: 9097
diff changeset
212
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
213 normalize_jid = jid_bare;
9077
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
214
aefb96a52f5f mod_pep: Add 'pep_max_items' option to set an upper limit, defaults to 256 (scientifically chosen)
Matthew Wild <mwild1@gmail.com>
parents: 9074
diff changeset
215 check_node_config = check_node_config;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
216 });
8306
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
217 local nodes, err = known_nodes:get(username);
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
218 if nodes then
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
219 module:log("debug", "Restoring nodes for user %s", username);
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
220 for node in pairs(nodes) do
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
221 module:log("debug", "Restoring node %q", node);
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
222 service:create(node, true);
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
223 end
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
224 elseif err then
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
225 module:log("error", "Could not restore nodes for %s: %s", username, err);
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
226 else
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
227 module:log("debug", "No known nodes");
202b9951b037 mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents: 8305
diff changeset
228 end
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
229 services[username] = service;
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
230 module:add_item("pep-service", { service = service, jid = user_bare });
6432
388786af0dd2 mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents: 6305
diff changeset
231 return service;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
232 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
233
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
234 function handle_pubsub_iq(event)
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
235 local origin, stanza = event.origin, event.stanza;
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
236 local service_name = origin.username;
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
237 if stanza.attr.to ~= nil then
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
238 service_name = jid_split(stanza.attr.to);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
239 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
240 local service = get_pep_service(service_name);
8335
9db72349095f mod_pep_plus: Use dispatch function from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8333
diff changeset
241
9db72349095f mod_pep_plus: Use dispatch function from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8333
diff changeset
242 return lib_pubsub.handle_pubsub_iq(event, service)
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
243 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
244
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
245 module:hook("iq/bare/"..xmlns_pubsub..":pubsub", handle_pubsub_iq);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
246 module:hook("iq/bare/"..xmlns_pubsub_owner..":pubsub", handle_pubsub_iq);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
247
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
248
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
249 local function get_caps_hash_from_presence(stanza, current)
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
250 local t = stanza.attr.type;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
251 if not t then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
252 local child = stanza:get_child("c", "http://jabber.org/protocol/caps");
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
253 if child then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
254 local attr = child.attr;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
255 if attr.hash then -- new caps
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
256 if attr.hash == 'sha-1' and attr.node and attr.ver then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
257 return attr.ver, attr.node.."#"..attr.ver;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
258 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
259 else -- legacy caps
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
260 if attr.node and attr.ver then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
261 return attr.node.."#"..attr.ver.."#"..(attr.ext or ""), attr.node.."#"..attr.ver;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
262 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
263 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
264 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
265 return; -- no or bad caps
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
266 elseif t == "unavailable" or t == "error" then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
267 return;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
268 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
269 return current; -- no caps, could mean caps optimization, so return current
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
270 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
271
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
272 local function resend_last_item(jid, node, service)
8377
58cdbbe3b86a mod_pep_plus: Broadcast only the last item (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8342
diff changeset
273 local ok, id, item = service:get_last_item(node, jid);
9205
2e710b618440 mod_pep: Simplify code
Matthew Wild <mwild1@gmail.com>
parents: 9197
diff changeset
274 if not (ok and id) then return; end
8377
58cdbbe3b86a mod_pep_plus: Broadcast only the last item (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8342
diff changeset
275 service.config.broadcaster("items", node, { [jid] = true }, item);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
276 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
277
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
278 local function update_subscriptions(recipient, service_name, nodes)
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
279 nodes = nodes or empty_set;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
280
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
281 local service_recipients = recipients[service_name];
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
282 if not service_recipients then
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
283 service_recipients = {};
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
284 recipients[service_name] = service_recipients;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
285 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
286
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
287 local current = service_recipients[recipient];
9540
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
288 if not current then
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
289 current = empty_set;
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
290 end
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
291
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
292 if (current == empty_set or current:empty()) and (nodes == empty_set or nodes:empty()) then
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
293 return;
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
294 end
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
295
8753
d6373a378b73 mod_pep_plus: Skip getting PEP service instance for sessions that have not touched PEP
Kim Alvefur <zash@zash.se>
parents: 8728
diff changeset
296 local service = get_pep_service(service_name);
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
297
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
298 for node in nodes - current do
10520
225fade2ab4d mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents: 10045
diff changeset
299 if service:may(node, recipient, "subscribe") then
9140
415a6d26709e mod_pep: Only resend last item on successful subscription
Kim Alvefur <zash@zash.se>
parents: 9139
diff changeset
300 resend_last_item(recipient, node, service);
415a6d26709e mod_pep: Only resend last item on successful subscription
Kim Alvefur <zash@zash.se>
parents: 9139
diff changeset
301 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
302 end
6305
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
303
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
304 if nodes == empty_set or nodes:empty() then
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
305 nodes = nil;
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
306 end
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
307
38d82f8ead25 mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents: 6264
diff changeset
308 service_recipients[recipient] = nodes;
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
309 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
310
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
311 module:hook("presence/bare", function(event)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8696
diff changeset
312 -- inbound presence to bare JID received
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
313 local origin, stanza = event.origin, event.stanza;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
314 local t = stanza.attr.type;
8303
053cf683c2c7 mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents: 8300
diff changeset
315 local is_self = not stanza.attr.to;
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
316 local username = jid_split(stanza.attr.to);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
317 local user_bare = jid_bare(stanza.attr.to);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
318 if is_self then
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
319 username = origin.username;
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
320 user_bare = jid_join(username, host);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
321 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
322
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
323 if not t then -- available presence
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
324 if is_self or subscription_presence(username, stanza.attr.from) then
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
325 local recipient = stanza.attr.from;
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
326 local current = recipients[username] and recipients[username][recipient];
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
327 local hash, query_node = get_caps_hash_from_presence(stanza, current);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
328 if current == hash or (current and current == hash_map[hash]) then return; end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
329 if not hash then
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
330 update_subscriptions(recipient, username);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
331 else
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
332 recipients[username] = recipients[username] or {};
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
333 if hash_map[hash] then
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
334 update_subscriptions(recipient, username, hash_map[hash]);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
335 else
9540
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
336 -- COMPAT from ~= stanza.attr.to because OneTeam can't deal with missing from attribute
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
337 origin.send(
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
338 st.stanza("iq", {from=user_bare, to=stanza.attr.from, id="disco", type="get"})
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
339 :tag("query", {xmlns = "http://jabber.org/protocol/disco#info", node = query_node})
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
340 );
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
341 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
342 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
343 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
344 elseif t == "unavailable" then
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
345 update_subscriptions(stanza.attr.from, username);
8303
053cf683c2c7 mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents: 8300
diff changeset
346 elseif not is_self and t == "unsubscribe" then
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
347 local from = jid_bare(stanza.attr.from);
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
348 local subscriptions = recipients[username];
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
349 if subscriptions then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
350 for subscriber in pairs(subscriptions) do
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
351 if jid_bare(subscriber) == from then
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
352 update_subscriptions(subscriber, username);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
353 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
354 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
355 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
356 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
357 end, 10);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
358
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
359 module:hook("iq-result/bare/disco", function(event)
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
360 local origin, stanza = event.origin, event.stanza;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
361 local disco = stanza:get_child("query", "http://jabber.org/protocol/disco#info");
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
362 if not disco then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
363 return;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
364 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
365
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
366 -- Process disco response
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
367 local is_self = stanza.attr.to == nil;
8315
967f04fe7fd4 mod_pep_plus: Add missing variable
Kim Alvefur <zash@zash.se>
parents: 8307
diff changeset
368 local user_bare = jid_bare(stanza.attr.to);
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
369 local username = jid_split(stanza.attr.to);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
370 if is_self then
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
371 username = origin.username;
8315
967f04fe7fd4 mod_pep_plus: Add missing variable
Kim Alvefur <zash@zash.se>
parents: 8307
diff changeset
372 user_bare = jid_join(username, host);
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
373 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
374 local contact = stanza.attr.from;
9540
8cdd7fec6aa7 mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents: 9538
diff changeset
375 local ver = calculate_hash(disco.tags); -- calculate hash
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
376 local notify = set_new();
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
377 for _, feature in pairs(disco.tags) do
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
378 if feature.name == "feature" and feature.attr.var then
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
379 local nfeature = feature.attr.var:match("^(.*)%+notify$");
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
380 if nfeature then notify:add(nfeature); end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
381 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
382 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
383 hash_map[ver] = notify; -- update hash map
8303
053cf683c2c7 mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents: 8300
diff changeset
384 if is_self then
8307
94860b5733d3 mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents: 8306
diff changeset
385 -- Optimization: Fiddle with other local users
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
386 for jid, item in pairs(origin.roster) do -- for all interested contacts
8304
9f8476c77fa8 mod_pep_plus: Skip over roster metadata (version, pending) entry
Kim Alvefur <zash@zash.se>
parents: 8303
diff changeset
387 if jid then
8307
94860b5733d3 mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents: 8306
diff changeset
388 local contact_node, contact_host = jid_split(jid);
9061
82dd435c942c mod_pep_plus: Fix boolean logic precedence (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents: 9030
diff changeset
389 if contact_host == host and (item.subscription == "both" or item.subscription == "from") then
8307
94860b5733d3 mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents: 8306
diff changeset
390 update_subscriptions(user_bare, contact_node, notify);
8304
9f8476c77fa8 mod_pep_plus: Skip over roster metadata (version, pending) entry
Kim Alvefur <zash@zash.se>
parents: 8303
diff changeset
391 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
392 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
393 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
394 end
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
395 update_subscriptions(contact, username, notify);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
396 end);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
397
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
398 module:hook("account-disco-info-node", function(event)
8982
4a576c39bb2f mod_pep_plus: Use service discovery helpers from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8949
diff changeset
399 local stanza, origin = event.stanza, event.origin;
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
400 local service_name = origin.username;
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
401 if stanza.attr.to ~= nil then
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
402 service_name = jid_split(stanza.attr.to);
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
403 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
404 local service = get_pep_service(service_name);
8982
4a576c39bb2f mod_pep_plus: Use service discovery helpers from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8949
diff changeset
405 return lib_pubsub.handle_disco_info_node(event, service);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
406 end);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
407
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
408 module:hook("account-disco-info", function(event)
8319
57e3ad11f3f6 mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents: 8318
diff changeset
409 local origin, reply = event.origin, event.reply;
57e3ad11f3f6 mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents: 8318
diff changeset
410
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
411 reply:tag('identity', {category='pubsub', type='pep'}):up();
8319
57e3ad11f3f6 mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents: 8318
diff changeset
412
57e3ad11f3f6 mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents: 8318
diff changeset
413 local username = jid_split(reply.attr.from) or origin.username;
57e3ad11f3f6 mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents: 8318
diff changeset
414 local service = get_pep_service(username);
57e3ad11f3f6 mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents: 8318
diff changeset
415
8342
0c0990a575de mod_pep_plus: Fix a typo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8341
diff changeset
416 local supported_features = lib_pubsub.get_feature_set(service) + set.new{
8341
910d3c3f60a6 mod_pep_plus: Use feature detection from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
417 -- Features not covered by the above
8332
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
418 "auto-subscribe",
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
419 "filtered-notifications",
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
420 "last-published",
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
421 "presence-notifications",
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
422 "presence-subscribe",
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
423 };
8341
910d3c3f60a6 mod_pep_plus: Use feature detection from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8339
diff changeset
424
8342
0c0990a575de mod_pep_plus: Fix a typo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 8341
diff changeset
425 for feature in supported_features do
8332
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
426 reply:tag('feature', {var=xmlns_pubsub.."#"..feature}):up();
e89b57d0d80a mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents: 8331
diff changeset
427 end
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
428 end);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
429
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
430 module:hook("account-disco-items-node", function(event)
8982
4a576c39bb2f mod_pep_plus: Use service discovery helpers from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8949
diff changeset
431 local stanza, origin = event.stanza, event.origin;
8321
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
432 local is_self = stanza.attr.to == nil;
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
433 local username = jid_split(stanza.attr.to);
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
434 if is_self then
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
435 username = origin.username;
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
436 end
8321
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
437 local service = get_pep_service(username);
8982
4a576c39bb2f mod_pep_plus: Use service discovery helpers from pubsub.lib
Kim Alvefur <zash@zash.se>
parents: 8949
diff changeset
438 return lib_pubsub.handle_disco_items_node(event, service);
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
439 end);
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
440
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
441 module:hook("account-disco-items", function(event)
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
442 local reply, stanza, origin = event.reply, event.stanza, event.origin;
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
443
8321
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
444 local is_self = stanza.attr.to == nil;
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
445 local user_bare = jid_bare(stanza.attr.to);
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
446 local username = jid_split(stanza.attr.to);
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
447 if is_self then
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
448 username = origin.username;
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
449 user_bare = jid_join(username, host);
8305
ec605946e597 mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents: 8304
diff changeset
450 end
8321
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
451 local service = get_pep_service(username);
73ff49a42ea8 mod_pep_plus: Advertise nodes with the correct JID (missed in ec605946e597) (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 8320
diff changeset
452
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
453 local ok, ret = service:get_nodes(jid_bare(stanza.attr.from));
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
454 if not ok then return; end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
455
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
456 for node, node_obj in pairs(ret) do
9597
17d43543f9b6 pubsub: Set pubsub#title as name attribute in disco#items (fixes #1226)
Kim Alvefur <zash@zash.se>
parents: 9542
diff changeset
457 reply:tag("item", { jid = user_bare, node = node, name = node_obj.config.title }):up();
5852
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
458 end
84bdac93910f mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff changeset
459 end);