Mercurial > prosody-modules
annotate mod_pubsub_serverinfo/mod_pubsub_serverinfo.lua @ 5818:d3b69859553a
mod_password_policy: Change error type from 'cancel' to 'modify'
This makes more sense, as the problem relates to the data that has been
entered, and therefore the request could be retried with different data.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 08 Jan 2024 17:28:39 +0000 |
parents | 7905766d01f6 |
children | 79ae71f52c81 |
rev | line source |
---|---|
5817
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
1 local http = require "net.http"; |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
2 local json = require "util.json"; |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
3 local st = require "util.stanza"; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
4 local new_id = require"util.id".medium; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
5 local dataform = require "util.dataforms".new; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
6 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
7 local local_domain = module:get_host(); |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
8 local service = module:get_option(module.name .. "_service") or "pubsub." .. local_domain; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
9 local node = module:get_option(module.name .. "_node") or "serverinfo"; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
10 local actor = module.host .. "/modules/" .. module.name; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
11 local publication_interval = module:get_option(module.name .. "_publication_interval") or 300; |
5805
55b99f593c3a
mod_pubsub_serverinfo: Disco/info cache TTL should be configurable
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5804
diff
changeset
|
12 local cache_ttl = module:get_option(module.name .. "_cache_ttl") or 3600; |
5817
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
13 local public_providers_url = module:get_option_string(module.name.."_public_providers_url", "https://data.xmpp.net/providers/v2/providers-Ds.json"); |
5816
45d0802d0787
mod_pubsub_serverinfo: Allow configuration of node persistence/deletion
Matthew Wild <mwild1@gmail.com>
parents:
5815
diff
changeset
|
14 local delete_node_on_unload = module:get_option_boolean(module.name.."_delete_node_on_unload", false); |
45d0802d0787
mod_pubsub_serverinfo: Allow configuration of node persistence/deletion
Matthew Wild <mwild1@gmail.com>
parents:
5815
diff
changeset
|
15 local persist_items = module:get_option_boolean(module.name.."_persist_items", true); |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
16 |
5815
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
17 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
18 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
19 function module.load() |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
20 discover_node():next( |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
21 function(exists) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
22 if not exists then create_node() end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
23 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
24 ):catch( |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
25 function(error) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
26 module:log("warn", "Error prevented discovery or creation of pub/sub node at %s: %s", service, error) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
27 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
28 ) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
29 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
30 module:add_feature("urn:xmpp:serverinfo:0"); |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
31 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
32 module:add_extension(dataform { |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
33 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/network/serverinfo" }, |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
34 { name = "serverinfo-pubsub-node", type = "text-single" }, |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
35 }:form({ ["serverinfo-pubsub-node"] = ("xmpp:%s?;node=%s"):format(service, node) }, "result")); |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
36 |
5813
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
37 if cache_ttl < publication_interval then |
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
38 module:log("warn", "It is recommended to have a cache interval higher than the publication interval"); |
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
39 end |
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
40 |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
41 cache_warm_up() |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
42 module:add_timer(10, publish_serverinfo); |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
43 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
44 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
45 function module.unload() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
46 -- This removes all subscribers, which may or may not be desirable, depending on the reason for the unload. |
5816
45d0802d0787
mod_pubsub_serverinfo: Allow configuration of node persistence/deletion
Matthew Wild <mwild1@gmail.com>
parents:
5815
diff
changeset
|
47 if delete_node_on_unload then |
45d0802d0787
mod_pubsub_serverinfo: Allow configuration of node persistence/deletion
Matthew Wild <mwild1@gmail.com>
parents:
5815
diff
changeset
|
48 delete_node(); |
45d0802d0787
mod_pubsub_serverinfo: Allow configuration of node persistence/deletion
Matthew Wild <mwild1@gmail.com>
parents:
5815
diff
changeset
|
49 end |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
50 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
51 |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
52 -- Returns a promise of a boolean |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
53 function discover_node() |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
54 local request = st.iq({ type = "get", to = service, from = actor, id = new_id() }) |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
55 :tag("query", { xmlns = "http://jabber.org/protocol/disco#items" }) |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
56 |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
57 module:log("debug", "Sending request to discover existence of pub/sub node '%s' at %s", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
58 return module:send_iq(request):next( |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
59 function(response) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
60 if response.stanza == nil or response.stanza.attr.type ~= "result" then |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
61 module:log("warn", "Unexpected response to service discovery items request at %s: %s", service, response.stanza) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
62 return false |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
63 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
64 |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
65 local query = response.stanza:get_child("query", "http://jabber.org/protocol/disco#items") |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
66 if query ~= nil then |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
67 for item in query:childtags("item") do |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
68 if item.attr.jid == service and item.attr.node == node then |
5813
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
69 module:log("debug", "pub/sub node '%s' at %s does exist.", node, service) |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
70 return true |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
71 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
72 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
73 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
74 module:log("debug", "pub/sub node '%s' at %s does not exist.", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
75 return false; |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
76 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
77 ); |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
78 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
79 |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
80 -- Returns a promise of a boolean |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
81 function create_node() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
82 local request = st.iq({ type = "set", to = service, from = actor, id = new_id() }) |
5815
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
83 :tag("pubsub", { xmlns = xmlns_pubsub }) |
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
84 :tag("create", { node = node, xmlns = xmlns_pubsub }):up() |
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
85 :tag("configure", { xmlns = xmlns_pubsub }) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
86 :tag("x", { xmlns = "jabber:x:data", type = "submit" }) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
87 :tag("field", { var = "FORM_TYPE", type = "hidden"}) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
88 :text_tag("value", "http://jabber.org/protocol/pubsub#node_config") |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
89 :up() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
90 :tag("field", { var = "pubsub#max_items" }) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
91 :text_tag("value", "1") |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
92 :up() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
93 :tag("field", { var = "pubsub#persist_items" }) |
5816
45d0802d0787
mod_pubsub_serverinfo: Allow configuration of node persistence/deletion
Matthew Wild <mwild1@gmail.com>
parents:
5815
diff
changeset
|
94 :text_tag("value", persist_items and "1" or "0") |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
95 |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
96 module:log("debug", "Sending request to create pub/sub node '%s' at %s", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
97 return module:send_iq(request):next( |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
98 function(response) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
99 if response.stanza == nil or response.stanza.attr.type ~= "result" then |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
100 module:log("warn", "Unexpected response to pub/sub node '%s' creation request at %s: %s", node, service, response.stanza) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
101 return false |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
102 else |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
103 module:log("debug", "Successfully created pub/sub node '%s' at %s", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
104 return true |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
105 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
106 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
107 ) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
108 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
109 |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
110 -- Returns a promise of a boolean |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
111 function delete_node() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
112 local request = st.iq({ type = "set", to = service, from = actor, id = new_id() }) |
5815
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
113 :tag("pubsub", { xmlns = xmlns_pubsub }) |
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
114 :tag("delete", { node = node, xmlns = xmlns_pubsub }); |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
115 |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
116 module:log("debug", "Sending request to delete pub/sub node '%s' at %s", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
117 return module:send_iq(request):next( |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
118 function(response) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
119 if response.stanza == nil or response.stanza.attr.type ~= "result" then |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
120 module:log("warn", "Unexpected response to pub/sub node '%s' deletion request at %s: %s", node, service, response.stanza) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
121 return false |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
122 else |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
123 module:log("debug", "Successfully deleted pub/sub node '%s' at %s", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
124 return true |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
125 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
126 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
127 ) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
128 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
129 |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
130 function get_remote_domain_names() |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
131 -- Iterate over s2s sessions, adding them to a multimap, where the key is the local domain name, |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
132 -- mapped to a collection of remote domain names. De-duplicate all remote domain names by using |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
133 -- them as an index in a table. |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
134 local domains_by_host = {} |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
135 for session, _ in pairs(prosody.incoming_s2s) do |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
136 if session ~= nil and session.from_host ~= nil and local_domain == session.to_host then |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
137 module:log("debug", "Local host '%s' has remote '%s' (inbound)", session.to_host, session.from_host); |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
138 local sessions = domains_by_host[session.to_host] |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
139 if sessions == nil then sessions = {} end; -- instantiate a new entry if none existed |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
140 sessions[session.from_host] = true |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
141 domains_by_host[session.to_host] = sessions |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
142 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
143 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
144 |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
145 -- At an earlier stage, the code iterated over all prosody.hosts, trying to generate one pubsub item for all local hosts. That turned out to be |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
146 -- to noisy. Instead, this code now creates an item that includes the local vhost only. It is assumed that this module will also be loaded for |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
147 -- other vhosts. Their data should then be published to distinct pub/sub services and nodes. |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
148 |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
149 -- for host, data in pairs(prosody.hosts) do |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
150 local host = local_domain |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
151 local data = prosody.hosts[host] |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
152 if data ~= nil then |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
153 local sessions = domains_by_host[host] |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
154 if sessions == nil then sessions = {} end; -- instantiate a new entry if none existed |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
155 if data.s2sout ~= nil then |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
156 for _, session in pairs(data.s2sout) do |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
157 if session.to_host ~= nil then |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
158 module:log("debug", "Local host '%s' has remote '%s' (outbound)", host, session.to_host); |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
159 sessions[session.to_host] = true |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
160 domains_by_host[host] = sessions |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
161 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
162 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
163 end |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
164 |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
165 -- When the instance of Prosody hosts more than one host, the other hosts can be thought of as having a 'permanent' s2s connection. |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
166 for host_name, host_info in pairs(prosody.hosts) do |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
167 if host ~= host_name and host_info.type ~= "component" then |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
168 module:log("debug", "Local host '%s' has remote '%s' (vhost)", host, host_name); |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
169 sessions[host_name] = true; |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
170 domains_by_host[host] = sessions |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
171 end |
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
172 end |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
173 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
174 |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
175 return domains_by_host |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
176 end |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
177 |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
178 function publish_serverinfo() |
5813
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
179 module:log("debug", "Publishing server info..."); |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
180 local domains_by_host = get_remote_domain_names() |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
181 |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
182 -- Build the publication stanza. |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
183 local request = st.iq({ type = "set", to = service, from = actor, id = new_id() }) |
5815
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
184 :tag("pubsub", { xmlns = xmlns_pubsub }) |
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
185 :tag("publish", { node = node, xmlns = xmlns_pubsub }) |
77c5709bd57a
mod_pubsub_serverinfo: Add explicit xmlns to all pubsub tags
Matthew Wild <mwild1@gmail.com>
parents:
5814
diff
changeset
|
186 :tag("item", { id = "current", xmlns = xmlns_pubsub }) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
187 :tag("serverinfo", { xmlns = "urn:xmpp:serverinfo:0" }) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
188 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
189 request:tag("domain", { name = local_domain }) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
190 :tag("federation") |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
191 |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
192 local remotes = domains_by_host[local_domain] |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
193 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
194 if remotes ~= nil then |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
195 for remote, _ in pairs(remotes) do |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
196 -- include a domain name for remote domains, but only if they advertise support. |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
197 if does_opt_in(remote) then |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
198 request:tag("remote-domain", { name = remote }):up() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
199 else |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
200 request:tag("remote-domain"):up() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
201 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
202 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
203 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
204 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
205 request:up():up() |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
206 |
5804
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
207 module:send_iq(request):next( |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
208 function(response) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
209 if response.stanza == nil or response.stanza.attr.type ~= "result" then |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
210 module:log("warn", "Unexpected response to item publication at pub/sub node '%s' on %s: %s", node, service, response.stanza) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
211 return false |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
212 else |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
213 module:log("debug", "Successfully published item on pub/sub node '%s' at %s", node, service) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
214 return true |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
215 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
216 end, |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
217 function(error) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
218 module:log("warn", "Error prevented publication of item on pub/sub node at %s: %s", service, error) |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
219 end |
c3eeeb968403
mod_pubsub_serverinfo: Detect existence of pub/sub node
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5803
diff
changeset
|
220 ) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
221 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
222 return publication_interval; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
223 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
224 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
225 local opt_in_cache = {} |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
226 |
5817
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
227 -- Public providers are already public, so we fetch the list of providers |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
228 -- registered on providers.xmpp.net so we don't have to disco them individually |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
229 local function update_public_providers() |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
230 return http.request(public_providers_url) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
231 :next(function (response) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
232 assert( |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
233 response.headers["content-type"] == "application/json", |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
234 "invalid mimetype: "..tostring(response.headers["content-type"]) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
235 ); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
236 return json.decode(response.body); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
237 end) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
238 :next(function (public_server_domains) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
239 module:log("debug", "Retrieved list of %d public providers", #public_server_domains); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
240 for _, domain in ipairs(public_server_domains) do |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
241 opt_in_cache[domain] = { |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
242 opt_in = true; |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
243 expires = os.time() + (86400 * 1.5); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
244 }; |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
245 end |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
246 end, function (err) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
247 module:log("warn", "Failed to fetch/decode provider list: %s", err); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
248 end); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
249 end |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
250 |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
251 module:daily("update public provider list", update_public_providers); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
252 |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
253 function cache_warm_up() |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
254 module:log("debug", "Warming up opt-in cache") |
5817
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
255 |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
256 update_public_providers():finally(function () |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
257 module:log("debug", "Querying known domains for opt-in cache..."); |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
258 local domains_by_host = get_remote_domain_names() |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
259 local remotes = domains_by_host[local_domain] |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
260 if remotes ~= nil then |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
261 for remote in pairs(remotes) do |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
262 does_opt_in(remote) |
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
263 end |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
264 end |
5817
7905766d01f6
mod_pubsub_serverinfo: Treat public providers as public
Matthew Wild <mwild1@gmail.com>
parents:
5816
diff
changeset
|
265 end); |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
266 end |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
267 |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
268 function does_opt_in(remoteDomain) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
269 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
270 -- try to read answer from cache. |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
271 local cached_value = opt_in_cache[remoteDomain] |
5812
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
272 local ttl = cached_value and os.difftime(cached_value.expires, os.time()); |
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
273 if cached_value and ttl > (publication_interval + 60) then |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
274 module:log("debug", "Opt-in status (from cache) for '%s': %s", remoteDomain, cached_value.opt_in) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
275 return cached_value.opt_in; |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
276 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
277 |
5812
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
278 -- We don't have a cached value, or it is nearing expiration - refresh it now |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
279 -- TODO worry about not having multiple requests in flight to the same domain.cached_value |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
280 |
5813
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
281 module:log("debug", "%s: performing disco/info to determine opt-in", remoteDomain) |
5810
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
282 local discoRequest = st.iq({ type = "get", to = remoteDomain, from = actor, id = new_id() }) |
76b57bcfe1b2
mod_pubsub_serverinfo: Warm-up opt-in cache
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5809
diff
changeset
|
283 :tag("query", { xmlns = "http://jabber.org/protocol/disco#info" }) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
284 |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
285 module:send_iq(discoRequest):next( |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
286 function(response) |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
287 if response.stanza ~= nil and response.stanza.attr.type == "result" then |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
288 local query = response.stanza:get_child("query", "http://jabber.org/protocol/disco#info") |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
289 if query ~= nil then |
5809
a8cae8322b7c
mod_pubsub_serverinfo: Fix namespace parsing issue with disco/info
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5808
diff
changeset
|
290 for feature in query:childtags("feature") do |
5813
d38772479891
mod_pubsub_serverinfo: Some logging improvements
Matthew Wild <mwild1@gmail.com>
parents:
5812
diff
changeset
|
291 --module:log("debug", "Disco/info feature for '%s': %s", remoteDomain, feature) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
292 if feature.attr.var == 'urn:xmpp:serverinfo:0' then |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
293 module:log("debug", "Disco/info response included opt-in for '%s'", remoteDomain) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
294 opt_in_cache[remoteDomain] = { |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
295 opt_in = true; |
5805
55b99f593c3a
mod_pubsub_serverinfo: Disco/info cache TTL should be configurable
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5804
diff
changeset
|
296 expires = os.time() + cache_ttl; |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
297 } |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
298 return; -- prevent 'false' to be cached, down below. |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
299 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
300 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
301 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
302 end |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
303 module:log("debug", "Disco/info response did not include opt-in for '%s'", remoteDomain) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
304 opt_in_cache[remoteDomain] = { |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
305 opt_in = false; |
5805
55b99f593c3a
mod_pubsub_serverinfo: Disco/info cache TTL should be configurable
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5804
diff
changeset
|
306 expires = os.time() + cache_ttl; |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
307 } |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
308 end, |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
309 function(response) |
5808
2465d5191ae9
mod_pubsub_serverinfo: Consider sibling vhosts 'connected'
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5805
diff
changeset
|
310 module:log("debug", "An error occurred while performing a disco/info request to determine opt-in for '%s'", remoteDomain, response) |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
311 opt_in_cache[remoteDomain] = { |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
312 opt_in = false; |
5805
55b99f593c3a
mod_pubsub_serverinfo: Disco/info cache TTL should be configurable
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5804
diff
changeset
|
313 expires = os.time() + cache_ttl; |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
314 } |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
315 end |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
316 ); |
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
317 |
5812
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
318 if ttl and ttl <= 0 then |
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
319 -- Cache entry expired, remove it and assume not opted in |
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
320 opt_in_cache[remoteDomain] = nil; |
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
321 return false; |
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
322 end |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
323 |
5812
cf5f77491323
mod_pubsub_serverinfo: Refresh cache entries if they will expire before next run
Matthew Wild <mwild1@gmail.com>
parents:
5810
diff
changeset
|
324 return cached_value and cached_value.opt_in; |
5803
f55e65315ba0
mod_pubsub_serverinfo: implemented all basic features
Guus der Kinderen <guus.der.kinderen@gmail.com>
parents:
5801
diff
changeset
|
325 end |