Software /
code /
prosody
Annotate
plugins/mod_pep_plus.lua @ 8528:67311cda0625
net.server_select: Better detection of errors for outgoing connections
On connection failure, a socket is marked readable and writable. So
to detect initial connection failures (connection refused, etc.) we
now watch for sockets becoming readable during initial connection,
and also read from readable sockets before writing to writable
sockets.
This should fix 'onconnect' being called for outgoing connections
that actually failed.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 23 Feb 2018 15:30:00 +0000 |
parent | 8377:58cdbbe3b86a |
child | 8696:164da3186511 |
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"; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
11 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
12 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
|
13 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
|
14 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
|
15 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
16 local lib_pubsub = module:require "pubsub"; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
17 |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
18 local empty_set = set_new(); |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
19 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
20 local services = {}; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
21 local recipients = {}; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
22 local hash_map = {}; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
23 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
24 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
|
25 |
8306
202b9951b037
mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents:
8305
diff
changeset
|
26 local known_nodes_map = module:open_store("pep", "map"); |
202b9951b037
mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents:
8305
diff
changeset
|
27 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
|
28 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
29 function module.save() |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
30 return { services = services }; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
31 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
32 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
33 function module.restore(data) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
34 services = data.services; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
35 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
36 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
37 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
|
38 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
|
39 local recipient_bare = jid_bare(recipient); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
40 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
|
41 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
|
42 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
43 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
44 local function simple_itemstore(username) |
8218
2c75a5ba58fc
mod_pubsub: Pass 'user' to simple_itemstore
Kim Alvefur <zash@zash.se>
parents:
8215
diff
changeset
|
45 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
|
46 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
|
47 module:log("debug", "Creating new persistent item store for user %s, node %q", username, node); |
fe5eaf4ed631
mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents:
8319
diff
changeset
|
48 known_nodes_map:set(username, node, true); |
fe5eaf4ed631
mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents:
8319
diff
changeset
|
49 local archive = module:open_store("pep_"..node, "archive"); |
fe5eaf4ed631
mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents:
8319
diff
changeset
|
50 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
|
51 else |
fe5eaf4ed631
mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents:
8319
diff
changeset
|
52 module:log("debug", "Creating new ephemeral item store for user %s, node %q", username, node); |
fe5eaf4ed631
mod_pep_plus: Make node persistence configurable via pubsub#persist_items
Kim Alvefur <zash@zash.se>
parents:
8319
diff
changeset
|
53 known_nodes_map:set(username, node, nil); |
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
|
54 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
|
55 end |
8218
2c75a5ba58fc
mod_pubsub: Pass 'user' to simple_itemstore
Kim Alvefur <zash@zash.se>
parents:
8215
diff
changeset
|
56 end |
8215
835bb32c36b4
mod_pep_plus: Add item persistency.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8214
diff
changeset
|
57 end |
835bb32c36b4
mod_pep_plus: Add item persistency.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8214
diff
changeset
|
58 |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
59 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
|
60 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
|
61 local function simple_broadcast(kind, node, jids, item) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
62 if item then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
63 item = st.clone(item); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
64 item.attr.xmlns = nil; -- Clear the pubsub namespace |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
65 end |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
66 local message = st.message({ from = user_bare, type = "headline" }) |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
67 :tag("event", { xmlns = xmlns_pubsub_event }) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
68 :tag(kind, { node = node }) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
69 :add_child(item); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
70 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
|
71 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
|
72 message.attr.to = jid; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
73 module:send(message); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
74 end |
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 return simple_broadcast; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
77 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
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 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
|
80 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
|
81 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
|
82 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
|
83 if service then |
388786af0dd2
mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents:
6305
diff
changeset
|
84 return service; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
85 end |
6432
388786af0dd2
mod_pep_plus: Add pubsub service objects to an item list
Kim Alvefur <zash@zash.se>
parents:
6305
diff
changeset
|
86 service = pubsub.new({ |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
87 capabilities = { |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
88 none = { |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
89 create = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
90 publish = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
91 retract = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
92 get_nodes = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
93 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
94 subscribe = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
95 unsubscribe = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
96 get_subscription = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
97 get_subscriptions = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
98 get_items = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
99 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
100 subscribe_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
101 unsubscribe_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
102 get_subscription_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
103 get_subscriptions_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
104 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
105 be_subscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
106 be_unsubscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
107 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
108 set_affiliation = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
109 }; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
110 subscriber = { |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
111 create = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
112 publish = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
113 retract = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
114 get_nodes = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
115 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
116 subscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
117 unsubscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
118 get_subscription = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
119 get_subscriptions = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
120 get_items = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
121 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
122 subscribe_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
123 unsubscribe_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
124 get_subscription_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
125 get_subscriptions_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
126 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
127 be_subscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
128 be_unsubscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
129 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
130 set_affiliation = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
131 }; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
132 publisher = { |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
133 create = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
134 publish = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
135 retract = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
136 get_nodes = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
137 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
138 subscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
139 unsubscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
140 get_subscription = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
141 get_subscriptions = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
142 get_items = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
143 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
144 subscribe_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
145 unsubscribe_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
146 get_subscription_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
147 get_subscriptions_other = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
148 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
149 be_subscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
150 be_unsubscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
151 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
152 set_affiliation = false; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
153 }; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
154 owner = { |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
155 create = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
156 publish = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
157 retract = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
158 delete = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
159 get_nodes = true; |
6443
f4403c270ea2
mod_pep_plus: Add node config form
Kim Alvefur <zash@zash.se>
parents:
6432
diff
changeset
|
160 configure = true; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
161 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
162 subscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
163 unsubscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
164 get_subscription = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
165 get_subscriptions = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
166 get_items = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
167 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
168 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
169 subscribe_other = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
170 unsubscribe_other = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
171 get_subscription_other = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
172 get_subscriptions_other = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
173 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
174 be_subscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
175 be_unsubscribed = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
176 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
177 set_affiliation = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
178 }; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
179 }; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
180 |
6444
aab509a9d0ba
mod_pep_plus: Default to max one item per node (Recomended for PEP)
Kim Alvefur <zash@zash.se>
parents:
6443
diff
changeset
|
181 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
|
182 ["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
|
183 ["persist_items"] = true; |
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 }; |
aab509a9d0ba
mod_pep_plus: Default to max one item per node (Recomended for PEP)
Kim Alvefur <zash@zash.se>
parents:
6443
diff
changeset
|
185 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
186 autocreate_on_publish = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
187 autocreate_on_subscribe = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
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 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
|
190 broadcaster = get_broadcaster(username); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
191 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
|
192 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
|
193 return "owner"; |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
194 elseif subscription_presence(username, jid) then |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
195 return "subscriber"; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
196 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
197 end; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
198 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
199 normalize_jid = jid_bare; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
200 }); |
8306
202b9951b037
mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents:
8305
diff
changeset
|
201 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
|
202 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
|
203 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
|
204 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
|
205 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
|
206 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
|
207 end |
202b9951b037
mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents:
8305
diff
changeset
|
208 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
|
209 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
|
210 else |
202b9951b037
mod_pep_plus: Keep track of nodes, and restore them when later
Kim Alvefur <zash@zash.se>
parents:
8305
diff
changeset
|
211 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
|
212 end |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
213 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
|
214 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
|
215 return service; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
216 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
217 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
218 function handle_pubsub_iq(event) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
219 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
|
220 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
|
221 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
|
222 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
|
223 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
224 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
|
225 |
9db72349095f
mod_pep_plus: Use dispatch function from pubsub.lib
Kim Alvefur <zash@zash.se>
parents:
8333
diff
changeset
|
226 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
|
227 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
228 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
229 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
|
230 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
|
231 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
232 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
|
233 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
|
234 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
235 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
|
236 local t = stanza.attr.type; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
237 if not t then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
238 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
|
239 if child then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
240 local attr = child.attr; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
241 if attr.hash then -- new caps |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
242 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
|
243 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
|
244 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
245 else -- legacy caps |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
246 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
|
247 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
|
248 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
249 end |
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 return; -- no or bad caps |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
252 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
|
253 return; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
254 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
255 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
|
256 end |
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 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
|
259 local ok, id, item = service:get_last_item(node, jid); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
260 if not ok then return; end |
8377
58cdbbe3b86a
mod_pep_plus: Broadcast only the last item (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents:
8342
diff
changeset
|
261 if not id then return; end |
58cdbbe3b86a
mod_pep_plus: Broadcast only the last item (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents:
8342
diff
changeset
|
262 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
|
263 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
264 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
265 local function update_subscriptions(recipient, service_name, nodes) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
266 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
|
267 nodes = nodes or empty_set; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
268 |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
269 local service_recipients = recipients[service_name]; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
270 if not service_recipients then |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
271 service_recipients = {}; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
272 recipients[service_name] = service_recipients; |
5852
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 |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
275 local current = service_recipients[recipient]; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
276 if not current or type(current) ~= "table" then |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
277 current = empty_set; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
278 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
279 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
280 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
|
281 return; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
282 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
283 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
284 for node in current - nodes do |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
285 service:remove_subscription(node, recipient, recipient); |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
286 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
287 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
288 for node in nodes - current do |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
289 service:add_subscription(node, recipient, recipient); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
290 resend_last_item(recipient, node, service); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
291 end |
6305
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
292 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
293 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
|
294 nodes = nil; |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
295 end |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
296 |
38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
Kim Alvefur <zash@zash.se>
parents:
6264
diff
changeset
|
297 service_recipients[recipient] = nodes; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
298 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
299 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
300 module:hook("presence/bare", function(event) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
301 -- inbound presence to bare JID recieved |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
302 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
|
303 local t = stanza.attr.type; |
8303
053cf683c2c7
mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
8300
diff
changeset
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 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
|
310 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
311 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
312 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
|
313 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
|
314 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
|
315 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
|
316 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
|
317 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
|
318 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
|
319 update_subscriptions(recipient, username); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
320 else |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
321 recipients[username] = recipients[username] or {}; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
322 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
|
323 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
|
324 else |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
325 recipients[username][recipient] = hash; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
326 local from_bare = origin.type == "c2s" and origin.username.."@"..origin.host; |
8303
053cf683c2c7
mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
8300
diff
changeset
|
327 if is_self or origin.type ~= "c2s" or (recipients[from_bare] and recipients[from_bare][origin.full_jid]) ~= hash then |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
328 -- COMPAT from ~= stanza.attr.to because OneTeam can't deal with missing from attribute |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
329 origin.send( |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
330 st.stanza("iq", {from=user_bare, to=stanza.attr.from, id="disco", type="get"}) |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
331 :tag("query", {xmlns = "http://jabber.org/protocol/disco#info", node = query_node}) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
332 ); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
333 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
334 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
335 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
336 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
337 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
|
338 update_subscriptions(stanza.attr.from, username); |
8303
053cf683c2c7
mod_pep_plus: Rename variable for clarity
Kim Alvefur <zash@zash.se>
parents:
8300
diff
changeset
|
339 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
|
340 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
|
341 local subscriptions = recipients[username]; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
342 if subscriptions then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
343 for subscriber in pairs(subscriptions) do |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
344 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
|
345 update_subscriptions(subscriber, username); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
346 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
347 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
348 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
349 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
350 end, 10); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
351 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 if not disco then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
356 return; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
357 end |
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 -- 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
|
360 local is_self = stanza.attr.to == nil; |
8315
967f04fe7fd4
mod_pep_plus: Add missing variable
Kim Alvefur <zash@zash.se>
parents:
8307
diff
changeset
|
361 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
|
362 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
|
363 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
|
364 username = origin.username; |
8315
967f04fe7fd4
mod_pep_plus: Add missing variable
Kim Alvefur <zash@zash.se>
parents:
8307
diff
changeset
|
365 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
|
366 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
367 local contact = 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
|
368 local current = recipients[username] and recipients[username][contact]; |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
369 if type(current) ~= "string" then return; end -- check if waiting for recipient's response |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
370 local ver = current; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
371 if not string.find(current, "#") then |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
372 ver = calculate_hash(disco.tags); -- calculate hash |
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 local notify = set_new(); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
375 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
|
376 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
|
377 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
|
378 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
|
379 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
380 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
381 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
|
382 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
|
383 -- 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
|
384 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
|
385 if jid then |
8307
94860b5733d3
mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents:
8306
diff
changeset
|
386 local contact_node, contact_host = jid_split(jid); |
94860b5733d3
mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents:
8306
diff
changeset
|
387 if contact_host == host and item.subscription == "both" or item.subscription == "from" then |
94860b5733d3
mod_pep_plus: Update subscriptions for other local users only
Kim Alvefur <zash@zash.se>
parents:
8306
diff
changeset
|
388 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
|
389 end |
5852
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 end |
8305
ec605946e597
mod_pep_plus: Use local username instead of bare JID for references
Kim Alvefur <zash@zash.se>
parents:
8304
diff
changeset
|
393 update_subscriptions(contact, username, notify); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
394 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
395 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
396 module:hook("account-disco-info-node", function(event) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
397 local reply, stanza, origin = event.reply, 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
|
398 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
|
399 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
|
400 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
|
401 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
402 local service = get_pep_service(service_name); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
403 local node = event.node; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
404 local ok = service:get_items(node, jid_bare(stanza.attr.from) or true); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
405 if not ok then return; end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
406 event.exists = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
407 reply:tag('identity', {category='pubsub', type='leaf'}):up(); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
408 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
409 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
410 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
|
411 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
|
412 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
413 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
|
414 |
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 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
|
416 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
|
417 |
8342
0c0990a575de
mod_pep_plus: Fix a typo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8341
diff
changeset
|
418 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
|
419 -- 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
|
420 "access-presence", |
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 "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
|
422 "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
|
423 "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
|
424 "persistent-items", |
e89b57d0d80a
mod_pep_plus: Advertise additional features not covered by inspection of pubsub service methods
Kim Alvefur <zash@zash.se>
parents:
8331
diff
changeset
|
425 "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
|
426 "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
|
427 }; |
8341
910d3c3f60a6
mod_pep_plus: Use feature detection from pubsub.lib
Kim Alvefur <zash@zash.se>
parents:
8339
diff
changeset
|
428 |
8342
0c0990a575de
mod_pep_plus: Fix a typo.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8341
diff
changeset
|
429 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
|
430 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
|
431 end |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
432 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
433 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
434 module:hook("account-disco-items-node", function(event) |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
435 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
|
436 local node = event.node; |
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 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
|
438 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
|
439 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
|
440 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
|
441 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
|
442 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
|
443 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
|
444 local service = get_pep_service(username); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
445 local ok, ret = service:get_items(node, jid_bare(stanza.attr.from) or true); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
446 if not ok then return; end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
447 event.exists = true; |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
448 for _, id in ipairs(ret) do |
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
|
449 reply:tag("item", { jid = user_bare, name = id }):up(); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
450 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
451 end); |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
452 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
453 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
|
454 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
|
455 |
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
|
456 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
|
457 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
|
458 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
|
459 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
|
460 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
|
461 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
|
462 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
|
463 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
|
464 |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
465 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
|
466 if not ok then return; end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
467 |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
468 for node, node_obj in pairs(ret) do |
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
|
469 reply:tag("item", { jid = user_bare, node = node, name = node_obj.config.name }):up(); |
5852
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
470 end |
84bdac93910f
mod_pep_plus: An util.pubsub based PEP module
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
471 end); |