Software / code / prosody-modules
Annotate
mod_pubsub_subscription/mod_pubsub_subscription.lua @ 6325:6ea80b73d8f2
mod_http_oauth2: Only require redirect URIs when using grant types that need it
In the Device flow, no redirect URI is used because the client instead
receives responses by polling. It is therefore unnecessary to enforce a
requirement that these include redirect URI(s).
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 03 Jul 2025 15:42:42 +0200 |
| parent | 6119:6dca425eea15 |
| rev | line source |
|---|---|
|
6114
dc2cce03554d
mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents:
5674
diff
changeset
|
1 local id = require "util.id"; |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 local st = require "util.stanza"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 local uuid = require "util.uuid"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 local mt = require "util.multitable"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local cache = require "util.cache"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 -- TODO persist |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 -- TODO query known pubsub nodes to sync current subscriptions |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 -- TODO subscription ids per 'item' would be handy |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 local pending_subscription = cache.new(256); -- uuid → node |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 local pending_unsubscription = cache.new(256); -- uuid → node |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
16 local active_subscriptions = mt.new() -- service | node | subscriber | uuid | { item } |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 function module.save() |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 return { active_subscriptions = active_subscriptions.data } |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 function module.restore(data) |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 if data and data.active_subscriptions then |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 active_subscriptions.data = data.active_subscriptions |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 local valid_events = {"subscribed"; "unsubscribed"; "error"; "item"; "retract"; "purge"; "delete"} |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 local function subscription_added(item_event) |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 local item = item_event.item; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 assert(item.service, "pubsub subscription item MUST have a 'service' field."); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 assert(item.node, "pubsub subscription item MUST have a 'node' field."); |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
32 item.from = item.from or module.host; |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 local already_subscibed = false; |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
35 for _ in active_subscriptions:iter(item.service, item.node, item.from, nil) do -- luacheck: ignore 512 |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 already_subscibed = true; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 break |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 item._id = uuid.generate(); |
|
6114
dc2cce03554d
mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents:
5674
diff
changeset
|
41 local iq_id = "pubsub-sub-"..id.short(); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 pending_subscription:set(iq_id, item._id); |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
43 active_subscriptions:set(item.service, item.node, item.from, item._id, item); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 if not already_subscibed then |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
46 module:send(st.iq({ type = "set", id = iq_id, from = item.from, to = item.service }) |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 :tag("pubsub", { xmlns = xmlns_pubsub }) |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
48 :tag("subscribe", { jid = item.from, node = item.node })); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 for _, event_name in ipairs(valid_events) do |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 module:hook("pubsub-event/host/"..event_name, function (event) |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
54 for _, _, _, _, _, cb in active_subscriptions:iter(event.service, event.node, event.stanza.attr.to, nil, "on_"..event_name) do |
|
6119
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
55 event.handled = true; |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
56 pcall(cb, event); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
57 end |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
58 end); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
59 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
60 module:hook("pubsub-event/bare/"..event_name, function (event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
61 for _, _, _, _, _, cb in active_subscriptions:iter(event.service, event.node, event.stanza.attr.to, nil, "on_"..event_name) do |
|
6119
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
62 event.handled = true; |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 pcall(cb, event); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 end); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
68 function handle_iq(context, event) |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 local stanza = event.stanza; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 local service = stanza.attr.from; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 if not stanza.attr.id then return end -- shouldn't be possible |
|
6114
dc2cce03554d
mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents:
5674
diff
changeset
|
73 if not stanza.attr.id:match("^pubsub%-sub%-") then return end |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 local subscribed_node = pending_subscription:get(stanza.attr.id); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 pending_subscription:set(stanza.attr.id, nil); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 local unsubscribed_node = pending_unsubscription:get(stanza.attr.id); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 pending_unsubscription:set(stanza.attr.id, nil); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 if stanza.attr.type == "result" then |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 local pubsub_wrapper = stanza:get_child("pubsub", xmlns_pubsub); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 local subscription = pubsub_wrapper and pubsub_wrapper:get_child("subscription"); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 if not subscription then return end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 local node = subscription.attr.node; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 local what; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 if subscription.attr.subscription == "subscribed" then |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 what = "on_subscribed"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 elseif subscription.attr.subscription == "none" then |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 what = "on_unsubscribed"; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 if not what then return end -- there are other states but we don't handle them |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
93 for _, _, _, _, _, cb in active_subscriptions:iter(service, node, stanza.attr.to, nil, what) do |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 cb(event); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 return true; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 elseif stanza.attr.type == "error" then |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 local node = subscribed_node or unsubscribed_node; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 local error_type, error_condition, reason, pubsub_error = stanza:get_error(); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 local err = { type = error_type, condition = error_condition, text = reason, extra = pubsub_error }; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 if active_subscriptions:get(service) then |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
103 for _, _, _, _, _, cb in active_subscriptions:iter(service, node, stanza.attr.to, nil, "on_error") do |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 cb(err); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 return true; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 end |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
109 end |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
110 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
111 module:hook("iq/host", function (event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
112 handle_iq("host", event); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
113 end, 1); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
114 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
115 module:hook("iq/bare", function (event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
116 handle_iq("bare", event); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 end, 1); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 local function subscription_removed(item_event) |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 local item = item_event.item; |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
121 active_subscriptions:set(item.service, item.node, item.from, item._id, nil); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
122 local node_subs = active_subscriptions:get(item.service, item.node, item.from); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 if node_subs and next(node_subs) then return end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
124 |
|
6114
dc2cce03554d
mod_pubsub_subscription: Match stanzas with fixed prefix only
Matthew Wild <mwild1@gmail.com>
parents:
5674
diff
changeset
|
125 local iq_id = "pubsub-sub-"..id.short(); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 pending_unsubscription:set(iq_id, item._id); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
128 module:send(st.iq({ type = "set", id = iq_id, from = item.from, to = item.service }) |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 :tag("pubsub", { xmlns = xmlns_pubsub }) |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
130 :tag("unsubscribe", { jid = item.from, node = item.node })) |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 module:handle_items("pubsub-subscription", subscription_added, subscription_removed, true); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
135 function handle_message(context, event) |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 local origin, stanza = event.origin, event.stanza; |
|
6119
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
137 local handled = nil; |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 local service = stanza.attr.from; |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
139 module:log("debug", "Got message/%s: %s", context, stanza:top_tag()); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 for event_container in stanza:childtags("event", xmlns_pubsub_event) do |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 for pubsub_event in event_container:childtags() do |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 module:log("debug", "Got pubsub event %s", pubsub_event:top_tag()); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 local node = pubsub_event.attr.node; |
|
6119
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
144 local event_data = { |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
145 stanza = stanza; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
146 origin = origin; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
147 event = pubsub_event; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
148 service = service; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
149 node = node; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
150 handled = false; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
151 }; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
152 module:fire_event("pubsub-event/" .. context .. "/"..pubsub_event.name, event_data); |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
153 if not handled and event_data.handled then |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
154 handled = true; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
155 end |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 end |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 end |
|
6119
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
158 -- If not addressed to the host, let it fall through to normal handling |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
159 -- (it may be on its way to a local client), otherwise, we'll mark the |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
160 -- event as handled to suppress an error response if we handled it. |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
161 if context == "host" and handled then |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
162 return true; |
|
6dca425eea15
mod_pubsub_subscription: Don't block pubsub unhandled or bare JID notifications
Matthew Wild <mwild1@gmail.com>
parents:
6114
diff
changeset
|
163 end |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
164 end |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
165 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
166 module:hook("message/host", function(event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
167 return handle_message("host", event); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 end); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
170 module:hook("message/bare", function(event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
171 return handle_message("bare", event); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
172 end); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
173 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
174 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
175 function handle_items(context, event) |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 for item in event.event:childtags() do |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
177 module:log("debug", "Got pubsub item event %s", item:top_tag()); |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 event.item = item; |
|
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 event.payload = item.tags[1]; |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
180 module:fire_event("pubsub-event/" .. context .. "/"..item.name, event); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 end |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
182 end |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
183 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
184 module:hook("pubsub-event/host/items", function (event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
185 handle_items("host", event); |
|
4511
97fac0ba0469
mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 end); |
|
5674
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
187 |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
188 module:hook("pubsub-event/bare/items", function (event) |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
189 handle_items("bare", event); |
|
b40750891bee
mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
4511
diff
changeset
|
190 end); |