Software /
code /
prosody
Annotate
plugins/mod_pep.lua @ 12089:76b4e3f12b53 0.11 0.11.11
mod_pep: Wipe pubsub service on user deletion
Data is already wiped from storage, but this ensures everything is
properly unsubscribed, possibly with notifications etc.
Clears recipient cache as well, since it is no longer relevant.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 04 Nov 2021 01:00:06 +0100 |
parent | 12088:e5028f6eb599 |
child | 12091:7a48ccb084dd |
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"; |
9827
fd8aaab6669c
mod_pep: Simplify configuration for node data (fixes #1320)
Kim Alvefur <zash@zash.se>
parents:
9597
diff
changeset
|
11 local storagemanager = require "core.storagemanager"; |
12088
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
12 local usermanager = require "core.usermanager"; |
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 |
12086
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
22 -- username -> object passed to module:add_items() |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
23 local pep_service_items = {}; |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
24 |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
25 -- size of caches with full pubsub service objects |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
26 local service_cache_size = module:get_option_number("pep_service_cache_size", 1000); |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
27 |
9113
74639d606a15
mod_pep: Add comments describing root tables used for data
Kim Alvefur <zash@zash.se>
parents:
9103
diff
changeset
|
28 -- username -> util.pubsub service object |
12086
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
29 local services = cache.new(service_cache_size, function (username, _) |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
30 local item = pep_service_items[username]; |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
31 pep_service_items[username] = nil; |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
32 if item then |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
33 module:remove_item("pep-service", item); |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
34 end |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
35 end):table(); |
9113
74639d606a15
mod_pep: Add comments describing root tables used for data
Kim Alvefur <zash@zash.se>
parents:
9103
diff
changeset
|
36 |
12087
19f67d44ec37
mod_pep: Limit possible growth of node subscription info
Kim Alvefur <zash@zash.se>
parents:
12086
diff
changeset
|
37 -- size of caches with smaller objects |
19f67d44ec37
mod_pep: Limit possible growth of node subscription info
Kim Alvefur <zash@zash.se>
parents:
12086
diff
changeset
|
38 local info_cache_size = module:get_option_number("pep_info_cache_size", 10000); |
19f67d44ec37
mod_pep: Limit possible growth of node subscription info
Kim Alvefur <zash@zash.se>
parents:
12086
diff
changeset
|
39 |
9142
85bc624b8685
mod_pep: Correct comment about 'recipients' table
Kim Alvefur <zash@zash.se>
parents:
9141
diff
changeset
|
40 -- username -> recipient -> set of nodes |
12087
19f67d44ec37
mod_pep: Limit possible growth of node subscription info
Kim Alvefur <zash@zash.se>
parents:
12086
diff
changeset
|
41 local recipients = cache.new(info_cache_size):table(); |
9143
817f666d9037
mod_pep: Add comment about 'hash_map' table
Kim Alvefur <zash@zash.se>
parents:
9142
diff
changeset
|
42 |
817f666d9037
mod_pep: Add comment about 'hash_map' table
Kim Alvefur <zash@zash.se>
parents:
9142
diff
changeset
|
43 -- caps hash -> set of nodes |
12087
19f67d44ec37
mod_pep: Limit possible growth of node subscription info
Kim Alvefur <zash@zash.se>
parents:
12086
diff
changeset
|
44 local hash_map = cache.new(info_cache_size):table(); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
45 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
46 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
|
47 |
8949
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
48 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
|
49 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
|
50 |
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
|
51 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
|
52 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
53 function module.save() |
9141
c1368fb756bf
mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents:
9140
diff
changeset
|
54 return { |
c1368fb756bf
mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents:
9140
diff
changeset
|
55 recipients = recipients; |
c1368fb756bf
mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents:
9140
diff
changeset
|
56 }; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
57 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
58 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
59 function module.restore(data) |
9141
c1368fb756bf
mod_pep: Pass 'recipients' table across module reloads
Kim Alvefur <zash@zash.se>
parents:
9140
diff
changeset
|
60 recipients = data.recipients; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
61 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
62 |
8696
164da3186511
mod_pep_plus: Validate items here too (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents:
8377
diff
changeset
|
63 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
|
64 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
|
65 end |
164da3186511
mod_pep_plus: Validate items here too (thanks Link Mauve)
Kim Alvefur <zash@zash.se>
parents:
8377
diff
changeset
|
66 |
9080
1b21f8ffaec8
mod_pep: Silence warnings about unused arguments [luacheck]
Kim Alvefur <zash@zash.se>
parents:
9077
diff
changeset
|
67 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
|
68 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
|
69 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
|
70 end |
9103
d5a7d2697b19
mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents:
9099
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 return false; |
d5a7d2697b19
mod_pep: Restrict access models to 'presence', 'whitelist' and 'open'
Kim Alvefur <zash@zash.se>
parents:
9099
diff
changeset
|
75 end |
9082
297a06074175
mod_pep: Return true if all node config checks passes (fixes configuration)
Kim Alvefur <zash@zash.se>
parents:
9080
diff
changeset
|
76 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
|
77 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
|
78 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
79 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
|
80 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
|
81 local recipient_bare = jid_bare(recipient); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
82 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
|
83 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
|
84 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
85 |
8949
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
86 local function nodestore(username) |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
87 -- luacheck: ignore 212/self |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
88 local store = {}; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
89 function store:get(node) |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
90 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
|
91 if data == true then |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
92 -- 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
|
93 data = { |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
94 name = node; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
95 config = {}; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
96 subscribers = {}; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
97 affiliations = {}; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
98 }; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
99 end |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
100 return data, err; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
101 end |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
102 function store:set(node, data) |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
103 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
|
104 end |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
105 function store:users() |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
106 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
|
107 end |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
108 return store; |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
109 end |
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
110 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
111 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
|
112 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
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 else |
fe5eaf4ed631
mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents:
8319
diff
changeset
|
119 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
|
120 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
|
121 end |
8218
2c75a5ba58fc
mod_pubsub: Pass 'user' to simple_itemstore
Kim Alvefur <zash@zash.se>
parents:
8215
diff
changeset
|
122 end |
8215
835bb32c36b4
mod_pep_plus: Add item persistency.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8214
diff
changeset
|
123 end |
835bb32c36b4
mod_pep_plus: Add item persistency.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8214
diff
changeset
|
124 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
125 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
|
126 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
|
127 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
|
128 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
|
129 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
|
130 return; |
8fadd3d6c8d3
mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents:
9179
diff
changeset
|
131 end |
8fadd3d6c8d3
mod_pep: Respect settings for which kinds of notifications to send
Kim Alvefur <zash@zash.se>
parents:
9179
diff
changeset
|
132 end |
9179
82fad995a149
util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents:
9160
diff
changeset
|
133 if kind == "retract" then |
82fad995a149
util.pubsub: Pass "retract" as the type of such broadcasts
Kim Alvefur <zash@zash.se>
parents:
9160
diff
changeset
|
134 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
|
135 end |
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
|
136 local message = st.message({ from = user_bare, type = "headline" }) |
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
|
137 :tag("event", { xmlns = xmlns_pubsub_event }) |
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
|
138 :tag(kind, { node = node }); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
139 if item then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
140 item = st.clone(item); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
141 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
|
142 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
|
143 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
|
144 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
|
145 end |
b88f537163da
mod_pep: Respect setting for whether to include payload in notifications
Kim Alvefur <zash@zash.se>
parents:
9189
diff
changeset
|
146 end |
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
|
147 message:add_child(item); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
148 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
149 for jid in pairs(jids) do |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
150 module:log("debug", "Sending notification to %s from %s: %s", jid, user_bare, tostring(item)); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
151 message.attr.to = jid; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
152 module:send(message); |
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 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
155 return simple_broadcast; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
156 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
157 |
10520
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
158 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
|
159 return function (jids, node) |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
160 local broadcast_to = {}; |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
161 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
|
162 broadcast_to[jid] = opts; |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
163 end |
10045
6714578cfd6e
mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents:
10036
diff
changeset
|
164 |
10520
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
165 local service_recipients = recipients[username]; |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
166 if service_recipients then |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
167 local service = services[username]; |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
168 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
|
169 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
|
170 broadcast_to[recipient] = true; |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
171 end |
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
172 end |
10045
6714578cfd6e
mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents:
10036
diff
changeset
|
173 end |
10520
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
174 return broadcast_to; |
10045
6714578cfd6e
mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents:
10036
diff
changeset
|
175 end |
6714578cfd6e
mod_pep: Revert 045209b41b3a, caused a regression
Kim Alvefur <zash@zash.se>
parents:
10036
diff
changeset
|
176 end |
9542
b8bfcfbe5126
mod_pep: Add automatic subscriptions on node creation (fixes #1222)
Kim Alvefur <zash@zash.se>
parents:
9541
diff
changeset
|
177 |
12088
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
178 local nobody_service = pubsub.new({ |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
179 service = pubsub.new({ |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
180 node_defaults = { |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
181 ["max_items"] = 1; |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
182 ["persist_items"] = false; |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
183 ["access_model"] = "presence"; |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
184 ["send_last_published_item"] = "on_sub_and_presence"; |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
185 }; |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
186 }); |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
187 }); |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
188 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
189 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
|
190 module:log("debug", "get_pep_service(%q)", username); |
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
191 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
|
192 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
|
193 if service then |
388786af0dd2
mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents:
6305
diff
changeset
|
194 return service; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
195 end |
12088
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
196 if not usermanager.user_exists(username, host) then |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
197 return nobody_service; |
e5028f6eb599
mod_pep: Prevent creation of services for non-existent users
Kim Alvefur <zash@zash.se>
parents:
12087
diff
changeset
|
198 end |
6432
388786af0dd2
mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents:
6305
diff
changeset
|
199 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
|
200 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
|
201 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
|
202 ["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
|
203 ["persist_items"] = true; |
9097
ce2ba9f91c84
mod_pep: Set default access model to 'presence'
Kim Alvefur <zash@zash.se>
parents:
9082
diff
changeset
|
204 ["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
|
205 }; |
aab509a9d0ba
mod_pep_plus: Default to max one item per node (Recomended for PEP)
Kim Alvefur <zash@zash.se>
parents:
6443
diff
changeset
|
206 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
207 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
|
208 autocreate_on_subscribe = false; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
209 |
8949
9194431b6447
mod_pep_plus: Support persistence of node configuration
Kim Alvefur <zash@zash.se>
parents:
8895
diff
changeset
|
210 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
|
211 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
|
212 broadcaster = get_broadcaster(username); |
10520
225fade2ab4d
mod_pep: Handle presence subscriptions in filter (fixes #1372)
Kim Alvefur <zash@zash.se>
parents:
10045
diff
changeset
|
213 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
|
214 itemcheck = is_item_stanza; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
215 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
|
216 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
|
217 return "owner"; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
218 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
219 end; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
220 |
9099
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
221 access_models = { |
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
222 presence = function (jid) |
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
223 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
|
224 return "member"; |
9099
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
225 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
|
226 return "outcast"; |
9099
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
227 end; |
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
228 }; |
974b25c27f24
mod_pep: Move subscriber check into 'presence' access model callback
Kim Alvefur <zash@zash.se>
parents:
9097
diff
changeset
|
229 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
230 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
|
231 |
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
|
232 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
|
233 }); |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
234 services[username] = service; |
12086
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
235 local item = { service = service, jid = user_bare } |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
236 pep_service_items[username] = item; |
1dc00ca6ee9d
mod_pep: Limit possible growth of number of pubsub services
Kim Alvefur <zash@zash.se>
parents:
12085
diff
changeset
|
237 module:add_item("pep-service", item); |
6432
388786af0dd2
mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents:
6305
diff
changeset
|
238 return service; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
239 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
240 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
241 function handle_pubsub_iq(event) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
242 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
|
243 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
|
244 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
|
245 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
|
246 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
247 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
|
248 |
9db72349095f
mod_pep_plus: Use dispatch function from pubsub.lib
Kim Alvefur <zash@zash.se>
parents:
8333
diff
changeset
|
249 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
|
250 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
251 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
252 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
|
253 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
|
254 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
255 module:add_identity("pubsub", "pep", module:get_option_string("name", "Prosody")); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
256 module:add_feature("http://jabber.org/protocol/pubsub#publish"); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
257 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
258 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
|
259 local t = stanza.attr.type; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
260 if not t then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
261 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
|
262 if child then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
263 local attr = child.attr; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
264 if attr.hash then -- new caps |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
265 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
|
266 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
|
267 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
268 else -- legacy caps |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
269 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
|
270 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
|
271 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
272 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
273 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
274 return; -- no or bad caps |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
275 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
|
276 return; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
277 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
278 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
|
279 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
280 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
281 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
|
282 local ok, id, item = service:get_last_item(node, jid); |
9205 | 283 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
|
284 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
|
285 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
286 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
287 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
|
288 nodes = nodes or empty_set; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
289 |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
290 local service_recipients = recipients[service_name]; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
291 if not service_recipients then |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
292 service_recipients = {}; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
293 recipients[service_name] = service_recipients; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
294 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
295 |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
296 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
|
297 if not current then |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
298 current = empty_set; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
299 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
300 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
301 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
|
302 return; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
303 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
304 |
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
|
305 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
|
306 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
311 end |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
312 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
313 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
|
314 nodes = nil; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
315 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
316 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
317 service_recipients[recipient] = nodes; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
318 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
319 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
320 module:hook("presence/bare", function(event) |
8728
41c959c5c84b
Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents:
8696
diff
changeset
|
321 -- 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
|
322 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
|
323 local t = stanza.attr.type; |
8303
053cf683c2c7
mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
8300
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
331 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 update_subscriptions(recipient, username); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
340 else |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
341 recipients[username] = recipients[username] or {}; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
342 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
|
343 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
|
344 else |
9540
8cdd7fec6aa7
mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents:
9538
diff
changeset
|
345 -- 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
|
346 origin.send( |
8cdd7fec6aa7
mod_pep: Remove use of recipients table for signaling pending disco#items
Kim Alvefur <zash@zash.se>
parents:
9538
diff
changeset
|
347 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
|
348 :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
|
349 ); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
350 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
351 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
352 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
353 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
|
354 update_subscriptions(stanza.attr.from, username); |
8303
053cf683c2c7
mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
8300
diff
changeset
|
355 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
|
356 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
|
357 local subscriptions = recipients[username]; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
358 if subscriptions then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
359 for subscriber in pairs(subscriptions) do |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
360 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
|
361 update_subscriptions(subscriber, username); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
362 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
363 end |
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 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
366 end, 10); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
367 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
368 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
|
369 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
|
370 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
|
371 if not disco then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
372 return; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
373 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
374 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
375 -- 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
|
376 local is_self = stanza.attr.to == nil; |
8315
967f04fe7fd4
mod_pep_plus: Add missing variable
Kim Alvefur <zash@zash.se>
parents:
8307
diff
changeset
|
377 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
|
378 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
|
379 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
|
380 username = origin.username; |
8315
967f04fe7fd4
mod_pep_plus: Add missing variable
Kim Alvefur <zash@zash.se>
parents:
8307
diff
changeset
|
381 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
|
382 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
383 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
|
384 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
|
385 local notify = set_new(); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
386 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
|
387 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
|
388 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
|
389 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
|
390 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
391 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
392 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
|
393 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
|
394 -- 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
|
395 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
|
396 if jid then |
8307
94860b5733d3
mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents:
8306
diff
changeset
|
397 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
|
398 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
|
399 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
|
400 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
401 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
402 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
403 end |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
404 update_subscriptions(contact, username, notify); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
405 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
406 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
407 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
|
408 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
|
409 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
|
410 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
|
411 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
|
412 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
413 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
|
414 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
|
415 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
416 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
417 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
|
418 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
|
419 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
420 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
|
421 |
57e3ad11f3f6
mod_pep_plus: Advertise pubsub features in disco#info (code adapted from mod_pubsub)
Kim Alvefur <zash@zash.se>
parents:
8318
diff
changeset
|
422 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
|
423 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
|
424 |
8342
0c0990a575de
mod_pep_plus: Fix a typo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8341
diff
changeset
|
425 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
|
426 -- 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
|
427 "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
|
428 "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
|
429 "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
|
430 "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
|
431 "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
|
432 }; |
8341
910d3c3f60a6
mod_pep_plus: Use feature detection from pubsub.lib
Kim Alvefur <zash@zash.se>
parents:
8339
diff
changeset
|
433 |
11376
774811e2c6ab
mod_pep: Advertise base pubsub feature (fixes #1632)
Kim Alvefur <zash@zash.se>
parents:
10672
diff
changeset
|
434 reply:tag('feature', {var=xmlns_pubsub}):up(); |
8342
0c0990a575de
mod_pep_plus: Fix a typo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8341
diff
changeset
|
435 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
|
436 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
|
437 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
438 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
439 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
440 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
|
441 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
|
442 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
|
443 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
|
444 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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
450 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
451 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
|
452 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
|
453 |
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
|
454 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
|
455 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
|
456 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
|
457 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
|
458 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
|
459 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
|
460 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
|
461 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
|
462 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
463 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
|
464 if not ok then return; end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
465 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
466 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
|
467 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
|
468 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
469 end); |
12089
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
470 |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
471 module:hook_global("user-deleted", function(event) |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
472 if event.host ~= host then return end |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
473 local username = event.username; |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
474 local service = services[username]; |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
475 if not service then return end |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
476 for node in pairs(service.nodes) do service:delete(node, true); end |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
477 |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
478 local item = pep_service_items[username]; |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
479 pep_service_items[username] = nil; |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
480 if item then module:remove_item("pep-service", item); end |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
481 |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
482 recipients[username] = nil; |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
483 end); |
76b4e3f12b53
mod_pep: Wipe pubsub service on user deletion
Kim Alvefur <zash@zash.se>
parents:
12088
diff
changeset
|
484 |