annotate mod_push2/mod_push2.lua @ 6556:7477e97a9045

mod_firewall: Apply pre-reload state before re-reading config This change makes load/reload a bit more robust. module.load() runs before module.restore() and it reads from the config and updates the state (if needed). However, after this, module.restore() could run and apply the old state again.
author Matthew Wild <mwild1@gmail.com>
date Sun, 24 May 2026 20:03:20 +0100
parents c9836434a9d5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
1 local os_time = os.time;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
2 local st = require"util.stanza";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
3 local jid = require"util.jid";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
4 local hashes = require"util.hashes";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
5 local random = require"util.random";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
6 local watchdog = require "util.watchdog";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
7 local uuid = require "util.uuid";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
8 local base64 = require "util.encodings".base64;
6005
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
9 local crypto = require "util.crypto";
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
10 local jwt = require "util.jwt";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
11
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
12 pcall(function() module:depends("track_muc_joins") end)
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
13
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
14 local xmlns_push = "urn:xmpp:push2:0";
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
15
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
16 -- configuration
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
17 local contact_uri = module:get_option_string("contact_uri", "xmpp:" .. module.host)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
18 local extended_hibernation_timeout = module:get_option_number("push_max_hibernation_timeout", 72*3600) -- use same timeout like ejabberd
6182
fe9f2c618e8a mod_push2: option to keep hibernating after first push
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6181
diff changeset
19 local hibernate_past_first_push = module:get_option_boolean("hibernate_past_first_push", true)
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
20
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
21 local host_sessions = prosody.hosts[module.host].sessions
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
22 local push2_registrations = module:open_store("push2_registrations", "keyval")
6337
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
23 local push2_registrations_cache = require "prosody.util.cache".new(10);
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
24
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
25 if _VERSION:match("5%.1") or _VERSION:match("5%.2") then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
26 module:log("warn", "This module may behave incorrectly on Lua before 5.3. It is recommended to upgrade to a newer Lua version.")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
27 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
28
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
29 local function account_dico_info(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
30 (event.reply or event.stanza):tag("feature", {var=xmlns_push}):up()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
31 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
32 module:hook("account-disco-info", account_dico_info);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
33
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
34 local function parse_match(matchel)
6183
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
35 local match = { match = matchel.attr.profile, chats = {} }
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
36
6200
1c16bb49f6f6 mod_push2: rename chat to filter
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6187
diff changeset
37 for chatel in matchel:childtags("filter") do
6183
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
38 local chat = {}
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
39 if chatel:get_child("mention") then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
40 chat.mention = true
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
41 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
42 if chatel:get_child("reply") then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
43 chat.reply = true
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
44 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
45 match.chats[chatel.attr.jid] = chat
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
46 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
47
6184
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
48 match.grace = matchel:get_child_text("grace")
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
49 if match.grace then match.grace = tonumber(match.grace) end
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
50
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
51 local send = matchel:get_child("send", "urn:xmpp:push2:send:notify-only:0")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
52 if send then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
53 match.send = send.attr.xmlns
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
54 return match
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
55 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
56
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
57 send = matchel:get_child("send", "urn:xmpp:push2:send:sce+rfc8291+rfc8292:0")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
58 if send then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
59 match.send = send.attr.xmlns
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
60 match.ua_public = send:get_child_text("ua-public")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
61 match.auth_secret = send:get_child_text("auth-secret")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
62 match.jwt_alg = send:get_child_text("jwt-alg")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
63 match.jwt_key = send:get_child_text("jwt-key")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
64 match.jwt_claims = {}
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
65 for claim in send:childtags("jwt-claim") do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
66 match.jwt_claims[claim.attr.name] = claim:get_text()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
67 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
68 return match
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
69 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
70
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
71 return nil
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
72 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
73
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
74 local function push_enable(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
75 local origin, stanza = event.origin, event.stanza;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
76 local enable = stanza.tags[1];
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
77 origin.log("debug", "Attempting to enable push notifications")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
78 -- MUST contain a jid of the push service being enabled
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
79 local service_jid = enable:get_child_text("service")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
80 -- MUST contain a string to identify the client fo the push service
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
81 local client = enable:get_child_text("client")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
82 if not service_jid then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
83 origin.log("debug", "Push notification enable request missing service")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
84 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing service"))
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
85 return true
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
86 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
87 if not client then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
88 origin.log("debug", "Push notification enable request missing client")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
89 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing client"))
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
90 return true
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
91 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
92 if service_jid == stanza.attr.from then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
93 origin.log("debug", "Push notification enable request service JID identical to our own")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
94 origin.send(st.error_reply(stanza, "modify", "bad-request", "JID must be different from ours"))
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
95 return true
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
96 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
97 local matches = {}
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
98 for matchel in enable:childtags("match") do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
99 local match = parse_match(matchel)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
100 if match then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
101 matches[#matches + 1] = match
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
102 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
103 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
104 -- Tie registration to client, via client_id with sasl2 or else fallback to resource
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
105 local registration_id = origin.client_id or origin.resource
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
106 local push_registration = {
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
107 service = service_jid;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
108 client = client;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
109 timestamp = os_time();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
110 matches = matches;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
111 };
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
112 -- TODO: can we move to keyval+ on trunk?
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
113 local registrations = push2_registrations:get(origin.username) or {}
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
114 registrations[registration_id] = push_registration
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
115 if not push2_registrations:set(origin.username, registrations) then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
116 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
117 else
6337
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
118 push2_registrations_cache:set(origin.username, registrations);
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
119 origin.push_registration_id = registration_id
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
120 origin.push_registration = push_registration
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
121 origin.first_hibernated_push = nil
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
122 origin.log("info", "Push notifications enabled for %s (%s)", tostring(stanza.attr.from), tostring(service_jid))
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
123 origin.send(st.reply(stanza))
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
124 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
125 return true
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
126 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
127 module:hook("iq-set/self/"..xmlns_push..":enable", push_enable)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
128
6162
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
129 local function push_disable(event)
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
130 local origin, stanza = event.origin, event.stanza;
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
131 local enable = stanza.tags[1];
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
132 origin.log("debug", "Attempting to disable push notifications")
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
133 -- Tie registration to client, via client_id with sasl2 or else fallback to resource
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
134 local registration_id = origin.client_id or origin.resource
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
135 -- TODO: can we move to keyval+ on trunk?
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
136 local registrations = push2_registrations:get(origin.username) or {}
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
137 registrations[registration_id] = nil
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
138 if not push2_registrations:set(origin.username, registrations) then
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
139 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
140 else
6337
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
141 push2_registrations_cache:set(origin.username, nil);
6162
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
142 origin.push_registration_id = nil
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
143 origin.push_registration = nil
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
144 origin.first_hibernated_push = nil
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
145 origin.log("info", "Push notifications disabled for %s (%s)", tostring(stanza.attr.from), registration_id)
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
146 origin.send(st.reply(stanza))
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
147 end
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
148 return true
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
149 end
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
150 module:hook("iq-set/self/"..xmlns_push..":disable", push_disable)
aa240145aa22 mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6158
diff changeset
151
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
152 -- urgent stanzas should be delivered without delay
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
153 local function is_voip(stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
154 if stanza.name == "message" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
155 if stanza:get_child("propose", "urn:xmpp:jingle-message:0") then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
156 return true, "jingle call"
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
157 end
6267
2488254c1bc2 mod_push2: Also push call retractions
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6266
diff changeset
158
2488254c1bc2 mod_push2: Also push call retractions
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6266
diff changeset
159 if stanza:get_child("retract", "urn:xmpp:jingle-message:0") then
2488254c1bc2 mod_push2: Also push call retractions
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6266
diff changeset
160 return true, "jingle call retract"
2488254c1bc2 mod_push2: Also push call retractions
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6266
diff changeset
161 end
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
162 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
163 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
164
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
165 local function has_body(stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
166 -- We can't check for body contents in encrypted messages, so let's treat them as important
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
167 -- Some clients don't even set a body or an empty body for encrypted messages
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
168
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
169 -- check omemo https://xmpp.org/extensions/inbox/omemo.html
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
170 if stanza:get_child("encrypted", "eu.siacs.conversations.axolotl") or stanza:get_child("encrypted", "urn:xmpp:omemo:0") then return true; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
171
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
172 -- check xep27 pgp https://xmpp.org/extensions/xep-0027.html
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
173 if stanza:get_child("x", "jabber:x:encrypted") then return true; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
174
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
175 -- check xep373 pgp (OX) https://xmpp.org/extensions/xep-0373.html
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
176 if stanza:get_child("openpgp", "urn:xmpp:openpgp:0") then return true; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
177
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
178 local body = stanza:get_child_text("body");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
179
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
180 return body ~= nil and body ~= ""
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
181 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
182
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
183 -- is this push a high priority one
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
184 local function is_important(stanza, session)
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
185 local is_voip_stanza, urgent_reason = is_voip(stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
186 if is_voip_stanza then return true; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
187
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
188 local st_name = stanza and stanza.name or nil
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
189 if not st_name then return false; end -- nonzas are never important here
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
190 if st_name == "presence" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
191 return false; -- same for presences
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
192 elseif st_name == "message" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
193 -- unpack carbon copied message stanzas
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
194 local carbon = stanza:find("{urn:xmpp:carbons:2}/{urn:xmpp:forward:0}/{jabber:client}message")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
195 local stanza_direction = carbon and stanza:child_with_name("sent") and "out" or "in"
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
196 if carbon then stanza = carbon; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
197 local st_type = stanza.attr.type
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
198
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
199 -- headline message are always not important
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
200 if st_type == "headline" then return false; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
201
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
202 -- carbon copied outgoing messages are not important
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
203 if carbon and stanza_direction == "out" then return false; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
204
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
205 -- groupchat reflections are not important here
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
206 if st_type == "groupchat" and session and session.rooms_joined then
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
207 local muc = jid.bare(stanza.attr.from)
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
208 local from_nick = jid.resource(stanza.attr.from)
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
209 if from_nick == session.rooms_joined[muc] then
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
210 return false
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
211 end
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
212 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
213
6185
8ecd53452af8 mod_push2: LMC stanzas are not important
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6184
diff changeset
214 -- edits are not imporatnt
8ecd53452af8 mod_push2: LMC stanzas are not important
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6184
diff changeset
215 if stanza:get_child("replace", "urn:xmpp:message-correct:0") then
8ecd53452af8 mod_push2: LMC stanzas are not important
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6184
diff changeset
216 return false
8ecd53452af8 mod_push2: LMC stanzas are not important
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6184
diff changeset
217 end
8ecd53452af8 mod_push2: LMC stanzas are not important
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6184
diff changeset
218
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
219 -- empty bodies are not important
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
220 return has_body(stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
221 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
222 return false; -- this stanza wasn't one of the above cases --> it is not important, too
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
223 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
224
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
225 local function add_sce_rfc8291(match, stanza, push_notification_payload)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
226 local max_data_size = 2847 -- https://github.com/web-push-libs/web-push-php/issues/108
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
227 local stanza_clone = st.clone(stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
228 stanza_clone.attr.xmlns = "jabber:client"
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
229 local envelope = st.stanza("envelope", { xmlns = "urn:xmpp:sce:1" })
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
230 :tag("content")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
231 :tag("forwarded", { xmlns = "urn:xmpp:forward:0" })
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
232 :add_child(stanza_clone)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
233 :up():up():up()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
234 local envelope_bytes = tostring(envelope)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
235 if string.len(envelope_bytes) > max_data_size then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
236 -- If stanza is too big, remove extra elements
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
237 stanza_clone:maptags(function(el)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
238 if el.attr.xmlns == nil or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
239 el.attr.xmlns == "jabber:client" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
240 el.attr.xmlns == "jabber:x:oob" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
241 (el.attr.xmlns == "urn:xmpp:sid:0" and el.name == "stanza-id") or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
242 el.attr.xmlns == "eu.siacs.conversations.axolotl" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
243 el.attr.xmlns == "urn:xmpp:omemo:0" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
244 el.attr.xmlns == "jabber:x:encrypted" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
245 el.attr.xmlns == "urn:xmpp:openpgp:0" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
246 el.attr.xmlns == "urn:xmpp:sce:1" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
247 el.attr.xmlns == "urn:xmpp:jingle-message:0" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
248 el.attr.xmlns == "jabber:x:conference"
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
249 then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
250 return el
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
251 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
252 return nil
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
253 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
254 end)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
255 envelope_bytes = tostring(envelope)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
256 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
257 if string.len(envelope_bytes) > max_data_size then
5660
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
258 local body = stanza:get_child_text("body")
6180
051974b4c900 mod_push2: Fix counting bugs
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6162
diff changeset
259 if body and string.len(body) > 50 then
5660
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
260 stanza_clone:maptags(function(el)
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
261 if el.name == "body" then
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
262 return nil
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
263 else
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
264 return el
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
265 end
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
266 end)
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
267
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
268 body = string.gsub(string.gsub("\n" .. body, "\n>[^\n]*", ""), "^%s", "")
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
269 stanza_clone:body(body:sub(1, utf8.offset(body, 50)) .. "…")
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
270 envelope_bytes = tostring(envelope)
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
271 end
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
272 end
bebb10fa5787 mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5659
diff changeset
273 if string.len(envelope_bytes) > max_data_size then
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
274 -- If still too big, get aggressive
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
275 stanza_clone:maptags(function(el)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
276 if el.name == "body" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
277 (el.attr.xmlns == "urn:xmpp:sid:0" and el.name == "stanza-id") or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
278 el.attr.xmlns == "urn:xmpp:jingle-message:0" or
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
279 el.attr.xmlns == "jabber:x:conference"
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
280 then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
281 return el
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
282 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
283 return nil
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
284 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
285 end)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
286 envelope_bytes = tostring(envelope)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
287 end
6180
051974b4c900 mod_push2: Fix counting bugs
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6162
diff changeset
288 local padding_size = math.min(150, max_data_size/3 - string.len(envelope_bytes))
051974b4c900 mod_push2: Fix counting bugs
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6162
diff changeset
289 if padding_size > 0 then
051974b4c900 mod_push2: Fix counting bugs
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6162
diff changeset
290 envelope:text_tag("rpad", base64.encode(random.bytes(padding_size)))
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
291 envelope_bytes = tostring(envelope)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
292 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
293
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
294 local p256dh_raw = base64.decode(match.ua_public .. "==")
6005
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
295 local p256dh = crypto.import_public_ec_raw(p256dh_raw, "prime256v1")
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
296 local one_time_key = crypto.generate_p256_keypair()
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
297 local one_time_key_public = one_time_key:public_raw()
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
298 local info = "WebPush: info\0" .. p256dh_raw .. one_time_key_public
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
299 local auth_secret = base64.decode(match.auth_secret .. "==")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
300 local salt = random.bytes(16)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
301 local shared_secret = one_time_key:derive(p256dh)
6005
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
302 local ikm = hashes.hkdf_hmac_sha256(32, shared_secret, auth_secret, info)
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
303 local key = hashes.hkdf_hmac_sha256(16, ikm, salt, "Content-Encoding: aes128gcm\0")
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
304 local nonce = hashes.hkdf_hmac_sha256(12, ikm, salt, "Content-Encoding: nonce\0")
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
305 local header = salt .. "\0\0\16\0" .. string.char(string.len(one_time_key_public)) .. one_time_key_public
6005
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
306 local encrypted = crypto.aes_128_gcm_encrypt(key, nonce, envelope_bytes .. "\2")
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
307
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
308 push_notification_payload
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
309 :tag("encrypted", { xmlns = "urn:xmpp:sce:rfc8291:0" })
6005
8cb37a497e4c mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5970
diff changeset
310 :text_tag("payload", base64.encode(header .. encrypted))
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
311 :up()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
312 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
313
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
314 local function add_rfc8292(match, stanza, push_notification_payload)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
315 if not match.jwt_alg then return; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
316 local key = match.jwt_key
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
317 if match.jwt_alg ~= "HS256" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
318 -- keypairs are in PKCS#8 PEM format without header/footer
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
319 key = "-----BEGIN PRIVATE KEY-----\n"..key.."\n-----END PRIVATE KEY-----"
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
320 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
321
6523
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
322 local private_key = crypto.import_private_pem(key)
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
323 if not private_key then
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
324 module:log("warn", "Bad key for %q", match)
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
325 return
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
326 end
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
327
c9836434a9d5 mod_push2: warn instead of crash on bad/empty key
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6337
diff changeset
328 local public_key = private_key:public_raw()
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
329 local signer = jwt.new_signer(match.jwt_alg, key)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
330 local payload = {}
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
331 for k, v in pairs(match.jwt_claims or {}) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
332 payload[k] = v
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
333 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
334 payload.sub = contact_uri
5663
a1d22d6efb3d mod_push2: Need to include the public key with the JWT
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5660
diff changeset
335 push_notification_payload:text_tag("jwt", signer(payload), { key = base64.encode(public_key) })
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
336 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
337
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
338 local function handle_notify_request(stanza, node, user_push_services, session, log_push_decline)
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
339 local pushes = 0;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
340 if not #user_push_services then return pushes end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
341
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
342 local notify_push_services = {};
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
343 if is_important(stanza, session) then
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
344 notify_push_services = user_push_services
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
345 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
346 for identifier, push_info in pairs(user_push_services) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
347 for _, match in ipairs(push_info.matches) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
348 if match.match == "urn:xmpp:push2:match:important" then
6006
b4bf44765ce6 mod_push2: fix some log lines
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6005
diff changeset
349 module:log("debug", "Not pushing because not important")
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
350 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
351 notify_push_services[identifier] = push_info;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
352 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
353 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
354 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
355 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
356
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
357 for push_registration_id, push_info in pairs(notify_push_services) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
358 local send_push = true; -- only send push to this node when not already done for this stanza or if no stanza is given at all
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
359 if stanza then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
360 if not stanza._push_notify2 then stanza._push_notify2 = {}; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
361 if stanza._push_notify2[push_registration_id] then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
362 if log_push_decline then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
363 module:log("debug", "Already sent push notification for %s@%s to %s (%s)", node, module.host, push_info.jid, tostring(push_info.node));
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
364 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
365 send_push = false;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
366 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
367 stanza._push_notify2[push_registration_id] = true;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
368 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
369
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
370 if send_push then
6229
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
371 local any_match = false;
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
372 local push_notification_payload = st.stanza("notification", { xmlns = xmlns_push })
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
373 push_notification_payload:text_tag("client", push_info.client)
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
374 push_notification_payload:text_tag("priority", is_voip(stanza) and "high" or (is_important(stanza, session) and "normal" or "low"))
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
375 if is_voip(stanza) then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
376 push_notification_payload:tag("voip"):up()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
377 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
378
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
379 local sends_added = {};
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
380 for _, match in ipairs(push_info.matches) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
381 local does_match = false;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
382 if match.match == "urn:xmpp:push2:match:all" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
383 does_match = true
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
384 elseif match.match == "urn:xmpp:push2:match:important" then
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
385 does_match = is_important(stanza, session)
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
386 elseif match.match == "urn:xmpp:push2:match:archived" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
387 does_match = stanza:get_child("stana-id", "urn:xmpp:sid:0")
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
388 elseif match.match == "urn:xmpp:push2:match:archived-with-body" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
389 does_match = stanza:get_child("stana-id", "urn:xmpp:sid:0") and has_body(stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
390 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
391
6184
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
392 local to_user, to_host = jid.split(stanza.attr.to)
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
393 to_user = to_user or session.username
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
394 to_host = to_host or module.host
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
395
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
396 -- If another session has recent activity within configured grace period, don't send push
6266
27bb0bc3f4b5 mod_push2: always push voip notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6230
diff changeset
397 if does_match and match.grace and not is_voip(stanza) and to_host == module.host and host_sessions[to_user] then
6184
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
398 local now = os_time()
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
399 for _, session in pairs(host_sessions[to_user].sessions) do
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
400 if session.last_activity and session.push_registration_id ~= push_registration_id and (now - session.last_activity) < match.grace then
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
401 does_match = false
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
402 end
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
403 end
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
404 end
2f2539ce8f3b mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6183
diff changeset
405
6183
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
406 local chat = match.chats and (match.chats[stanza.attr.from] or match.chats[jid.bare(stanza.attr.from)] or match.chats[jid.host(stanza.attr.from)])
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
407 if does_match and chat then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
408 does_match = false
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
409
6186
277db84b0c95 mod_push2: guard against no rooms tracked on this session
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6185
diff changeset
410 local nick = (session.rooms_joined and session.rooms_joined[jid.bare(stanza.attr.from)]) or to_user
6183
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
411
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
412 if not does_match and chat.mention then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
413 local body = stanza:get_child_text("body")
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
414 if body and body:find(nick, 1, true) then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
415 does_match = true
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
416 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
417 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
418 if not does_match and chat.reply then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
419 local reply = stanza:get_child("reply", "urn:xmpp:reply:0")
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
420 if reply and (reply.attr.to == to_user.."@"..to_host or (jid.bare(reply.attr.to) == jid.bare(stanza.attr.from) and jid.resource(reply.attr.to) == nick)) then
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
421 does_match = true
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
422 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
423 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
424 end
e53f0967520c mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6182
diff changeset
425
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
426 if does_match and not sends_added[match.send] then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
427 sends_added[match.send] = true
6229
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
428 any_match = true
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
429 if match.send == "urn:xmpp:push2:send:notify-only" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
430 -- Nothing more to add
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
431 elseif match.send == "urn:xmpp:push2:send:sce+rfc8291+rfc8292:0" then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
432 add_sce_rfc8291(match, stanza, push_notification_payload)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
433 add_rfc8292(match, stanza, push_notification_payload)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
434 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
435 module:log("debug", "Unkonwn send profile: " .. push_info.send)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
436 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
437 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
438 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
439
6229
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
440 if any_match then
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
441 local push_publish = st.message({ to = push_info.service, from = module.host, id = uuid.generate() })
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
442 :add_child(push_notification_payload):up()
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
443
6229
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
444 -- TODO: watch for message error replies and count or something
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
445 module:send(push_publish)
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
446 pushes = pushes + 1
6164849469f1 mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6200
diff changeset
447 end
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
448 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
449 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
450
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
451 return pushes
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
452 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
453
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
454 -- small helper function to extract relevant push settings
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
455 local function get_push_settings(stanza, session)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
456 local to = stanza.attr.to
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
457 local node = to and jid.split(to) or session.username
6337
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
458 local user_push_services = push2_registrations_cache:get(node);
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
459 if not user_push_services then
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
460 user_push_services = push2_registrations:get(node);
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
461 push2_registrations_cache:set(node, user_push_services);
0570f1e2edf4 mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents: 6267
diff changeset
462 end
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
463 return node, (user_push_services or {})
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
464 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
465
5664
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
466 -- publish on offline message
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
467 module:hook("message/offline/handle", function(event)
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
468 local node, user_push_services = get_push_settings(event.stanza, event.origin);
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
469 module:log("debug", "Invoking handle_notify_request() for offline stanza");
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
470 handle_notify_request(event.stanza, node, user_push_services, event.origin, true);
5664
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
471 end, 1);
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
472
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
473 -- publish on bare groupchat
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
474 -- this picks up MUC messages when there are no devices connected
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
475 module:hook("message/bare/groupchat", function(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
476 local node, user_push_services = get_push_settings(event.stanza, event.origin);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
477 local notify_push_services = {};
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
478 for identifier, push_info in pairs(user_push_services) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
479 for _, match in ipairs(push_info.matches) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
480 if match.match == "urn:xmpp:push2:match:archived-with-body" or match.match == "urn:xmpp:push2:match:archived" then
5970
fd1927e51791 mod_push2: fix broken log statement
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5845
diff changeset
481 module:log("debug", "Not pushing because we are not archiving this stanza")
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
482 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
483 notify_push_services[identifier] = push_info;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
484 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
485 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
486 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
487
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
488 handle_notify_request(event.stanza, node, notify_push_services, event.origin, true);
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
489 end, 1);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
490
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
491 local function process_stanza_queue(queue, session, queue_type)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
492 if not session.push_registration_id then return; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
493 local notified = { unimportant = false; important = false }
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
494 for i=1, #queue do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
495 local stanza = queue[i];
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
496 -- fast ignore of already pushed stanzas
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
497 if stanza and not (stanza._push_notify2 and stanza._push_notify2[session.push_registration_id]) then
6007
9b50ee822638 mod_push2: fix push during smacks hibernate
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6006
diff changeset
498 local node, all_push_services = get_push_settings(stanza, session)
9b50ee822638 mod_push2: fix push during smacks hibernate
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6006
diff changeset
499 local user_push_services = {[session.push_registration_id] = all_push_services[session.push_registration_id]}
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
500 local stanza_type = "unimportant";
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
501 if is_important(stanza, session) then stanza_type = "important"; end
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
502 if not notified[stanza_type] then -- only notify if we didn't try to push for this stanza type already
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
503 if handle_notify_request(stanza, node, user_push_services, session, false) ~= 0 then
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
504 if session.hibernating and not session.first_hibernated_push then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
505 -- if the message was important
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
506 -- then record the time of first push in the session for the smack module which will extend its hibernation
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
507 -- timeout based on the value of session.first_hibernated_push
6182
fe9f2c618e8a mod_push2: option to keep hibernating after first push
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6181
diff changeset
508 if is_important(stanza, session) and not hibernate_past_first_push then
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
509 session.first_hibernated_push = os_time();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
510 -- check for prosody 0.12 mod_smacks
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
511 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
512 -- restore old smacks watchdog (--> the start of our original timeout will be delayed until first push)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
513 session.hibernating_watchdog:cancel();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
514 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
515 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
516 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
517 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
518 notified[stanza_type] = true
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
519 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
520 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
521 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
522 if notified.unimportant and notified.important then break; end -- stop processing the queue if all push types are exhausted
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
523 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
524 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
525
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
526 -- publish on unacked smacks message (use timer to send out push for all stanzas submitted in a row only once)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
527 local function process_stanza(session, stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
528 if session.push_registration_id then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
529 session.log("debug", "adding new stanza to push_queue");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
530 if not session.push_queue then session.push_queue = {}; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
531 local queue = session.push_queue;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
532 queue[#queue+1] = st.clone(stanza);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
533 if not session.awaiting_push_timer then -- timer not already running --> start new timer
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
534 session.awaiting_push_timer = module:add_timer(1.0, function ()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
535 process_stanza_queue(session.push_queue, session, "push");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
536 session.push_queue = {}; -- clean up queue after push
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
537 session.awaiting_push_timer = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
538 end);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
539 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
540 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
541 return stanza;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
542 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
543
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
544 local function process_smacks_stanza(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
545 local session = event.origin;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
546 local stanza = event.stanza;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
547 if not session.push_registration_id then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
548 session.log("debug", "NOT invoking handle_notify_request() for newly smacks queued stanza (session.push_registration_id is not set: %s)",
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
549 session.push_registration_id
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
550 );
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
551 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
552 process_stanza(session, stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
553 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
554 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
555
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
556 -- smacks hibernation is started
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
557 local function hibernate_session(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
558 local session = event.origin;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
559 local queue = event.queue;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
560 session.first_hibernated_push = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
561 if session.push_registration_id and session.hibernating_watchdog then -- check for prosody 0.12 mod_smacks
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
562 -- save old watchdog callback and timeout
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
563 session.original_smacks_callback = session.hibernating_watchdog.callback;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
564 session.original_smacks_timeout = session.hibernating_watchdog.timeout;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
565 -- cancel old watchdog and create a new watchdog with extended timeout
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
566 session.hibernating_watchdog:cancel();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
567 session.hibernating_watchdog = watchdog.new(extended_hibernation_timeout, function()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
568 session.log("debug", "Push-extended smacks watchdog triggered");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
569 if session.original_smacks_callback then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
570 session.log("debug", "Calling original smacks watchdog handler");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
571 session.original_smacks_callback();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
572 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
573 end);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
574 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
575 -- process unacked stanzas
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
576 process_stanza_queue(queue, session, "smacks");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
577 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
578
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
579 -- smacks hibernation is ended
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
580 local function restore_session(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
581 local session = event.resumed;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
582 if session then -- older smacks module versions send only the "intermediate" session in event.session and no session.resumed one
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
583 if session.awaiting_push_timer then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
584 session.awaiting_push_timer:stop();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
585 session.awaiting_push_timer = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
586 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
587 session.first_hibernated_push = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
588 -- the extended smacks watchdog will be canceled by the smacks module, no need to anything here
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
589 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
590 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
591
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
592 -- smacks ack is delayed
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
593 local function ack_delayed(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
594 local session = event.origin;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
595 local queue = event.queue;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
596 local stanza = event.stanza;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
597 if not session.push_registration_id then return; end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
598 if stanza then process_stanza(session, stanza); return; end -- don't iterate through smacks queue if we know which stanza triggered this
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
599 for i=1, #queue do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
600 local queued_stanza = queue[i];
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
601 -- process unacked stanzas (handle_notify_request() will only send push requests for new stanzas)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
602 process_stanza(session, queued_stanza);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
603 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
604 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
605
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
606 -- archive message added
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
607 local function archive_message_added(event)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
608 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id }
5664
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
609 -- only notify for new mam messages when at least one device is online
4b052598e435 mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 5663
diff changeset
610 if not event.for_user or not host_sessions[event.for_user] then return; end
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
611 -- Note that the stanza in the event is a clone not the same as other hooks, so dedupe doesn't work
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
612 -- This is a problem if you wan to to also hook offline message storage for example
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
613 local stanza = st.clone(event.stanza)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
614 stanza:tag("stanza-id", { xmlns = "urn:xmpp:sid:0", by = event.for_user.."@"..module.host, id = event.id }):up()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
615 local user_session = host_sessions[event.for_user] and host_sessions[event.for_user].sessions or {}
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
616 local to = stanza.attr.to
6158
1cf563a94620 mod_push2: this expression was throwing away the second value
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6157
diff changeset
617 local to_user, to_host = jid.split(to)
6157
c887820cd884 Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6007
diff changeset
618 to_user = to_user or event.origin.username
c887820cd884 Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6007
diff changeset
619 to_host = to_host or module.host
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
620
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
621 -- only notify if the stanza destination is the mam user we store it for
6157
c887820cd884 Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6007
diff changeset
622 if event.for_user == to_user and to_host == module.host then
c887820cd884 Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6007
diff changeset
623 local user_push_services = push2_registrations:get(to_user) or {}
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
624
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
625 -- Urgent stanzas are time-sensitive (e.g. calls) and should
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
626 -- be pushed immediately to avoid getting stuck in the smacks
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
627 -- queue in case of dead connections, for example
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
628 local is_voip_stanza, urgent_reason = is_voip(stanza);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
629
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
630 local notify_push_services;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
631 if is_voip_stanza then
6157
c887820cd884 Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6007
diff changeset
632 module:log("debug", "Urgent push for %s@%s (%s)", to_user, to_host, urgent_reason);
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
633 notify_push_services = user_push_services;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
634 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
635 -- only notify nodes with no active sessions (smacks is counted as active and handled separate)
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
636 notify_push_services = {};
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
637 for identifier, push_info in pairs(user_push_services) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
638 local identifier_found = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
639 for _, session in pairs(user_session) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
640 if session.push_registration_id == identifier then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
641 identifier_found = session;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
642 break;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
643 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
644 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
645 if identifier_found then
6006
b4bf44765ce6 mod_push2: fix some log lines
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6005
diff changeset
646 module:log("debug", "Not pushing '%s' of new MAM stanza (session still alive)", identifier)
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
647 else
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
648 notify_push_services[identifier] = push_info
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
649 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
650 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
651 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
652
6181
811bd0872682 mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6180
diff changeset
653 handle_notify_request(stanza, to_user, notify_push_services, event.origin, true);
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
654 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
655 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
656
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
657 module:hook("smacks-hibernation-start", hibernate_session);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
658 module:hook("smacks-hibernation-end", restore_session);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
659 module:hook("smacks-ack-delayed", ack_delayed);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
660 module:hook("smacks-hibernation-stanza-queued", process_smacks_stanza);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
661 module:hook("archive-message-added", archive_message_added);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
662
6187
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
663 local function track_activity(event)
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
664 if has_body(event.stanza) or event.stanza:child_with_ns("http://jabber.org/protocol/chatstates") then
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
665 event.origin.last_activity = os_time()
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
666 end
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
667 end
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
668
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
669 module:hook("pre-message/bare", track_activity)
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
670 module:hook("pre-message/full", track_activity)
06621ab30be0 mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 6186
diff changeset
671
5659
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
672 module:log("info", "Module loaded");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
673 function module.unload()
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
674 module:log("info", "Unloading module");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
675 -- cleanup some settings, reloading this module can cause process_smacks_stanza() to stop working otherwise
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
676 for user, _ in pairs(host_sessions) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
677 for _, session in pairs(host_sessions[user].sessions) do
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
678 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
679 session.awaiting_push_timer = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
680 session.push_queue = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
681 session.first_hibernated_push = nil;
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
682 -- check for prosody 0.12 mod_smacks
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
683 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
684 -- restore old smacks watchdog
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
685 session.hibernating_watchdog:cancel();
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
686 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
687 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
688 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
689 end
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
690 module:log("info", "Module unloaded");
4d1a3de56c3d Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
691 end