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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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);