Mercurial > prosody-modules
annotate mod_push2/mod_push2.lua @ 6167:886c985ece61
mod_lastlog2: Skip initializing internal API (and storage) in prosodyctl
Initializing storage in the global context under prosodyctl causes the
module.command to fail to execute because the storage module has already
been loaded.
Introduced in 7b722955c59b
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 08 Feb 2025 14:12:18 +0100 |
| parents | aa240145aa22 |
| children | 051974b4c900 |
| 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 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
12 local xmlns_push = "urn:xmpp:push2:0"; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
13 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
14 -- configuration |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
15 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
|
16 local extended_hibernation_timeout = module:get_option_number("push_max_hibernation_timeout", 72*3600) -- use same timeout like ejabberd |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
17 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
18 local host_sessions = prosody.hosts[module.host].sessions |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
19 local push2_registrations = module:open_store("push2_registrations", "keyval") |
|
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 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
|
22 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
|
23 end |
|
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 local function account_dico_info(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
26 (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
|
27 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
28 module:hook("account-disco-info", account_dico_info); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
29 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
30 local function parse_match(matchel) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
31 local match = { match = matchel.attr.profile } |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
32 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
|
33 if send then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
34 match.send = send.attr.xmlns |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
35 return match |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
36 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
37 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
38 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
|
39 if send then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
40 match.send = send.attr.xmlns |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 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
|
45 match.jwt_claims = {} |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
46 for claim in send:childtags("jwt-claim") do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
47 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
|
48 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
49 return match |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
50 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
51 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
52 return nil |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
53 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
54 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
55 local function push_enable(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
56 local origin, stanza = event.origin, event.stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
57 local enable = stanza.tags[1]; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
58 origin.log("debug", "Attempting to enable push notifications") |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
59 -- 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
|
60 local service_jid = enable:get_child_text("service") |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
61 -- 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
|
62 local client = enable:get_child_text("client") |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
63 if not service_jid then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
64 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
|
65 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
|
66 return true |
|
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 if not client then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
69 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
|
70 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
|
71 return true |
|
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 if service_jid == stanza.attr.from then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
74 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
|
75 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
|
76 return true |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
77 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
78 local matches = {} |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
79 for matchel in enable:childtags("match") do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
80 local match = parse_match(matchel) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
81 if match then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
82 matches[#matches + 1] = match |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
83 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
84 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
85 -- 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
|
86 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
|
87 local push_registration = { |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
88 service = service_jid; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
89 client = client; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
90 timestamp = os_time(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
91 matches = matches; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
92 }; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
93 -- TODO: can we move to keyval+ on trunk? |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
94 local registrations = push2_registrations:get(origin.username) or {} |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
95 registrations[registration_id] = push_registration |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
96 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
|
97 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
|
98 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
99 origin.push_registration_id = registration_id |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
100 origin.push_registration = push_registration |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
101 origin.first_hibernated_push = nil |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
102 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
|
103 origin.send(st.reply(stanza)) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
104 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
105 return true |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
106 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
107 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
|
108 |
|
6162
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
109 local function push_disable(event) |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
110 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
|
111 local enable = stanza.tags[1]; |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
112 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
|
113 -- 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
|
114 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
|
115 -- 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
|
116 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
|
117 registrations[registration_id] = nil |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
118 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
|
119 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
|
120 else |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
121 origin.push_registration_id = nil |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
122 origin.push_registration = nil |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
123 origin.first_hibernated_push = nil |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
124 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
|
125 origin.send(st.reply(stanza)) |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
126 end |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
127 return true |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
128 end |
|
aa240145aa22
mod_push2: support for disabling push notifications
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6158
diff
changeset
|
129 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
|
130 |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
131 -- urgent stanzas should be delivered without delay |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
132 local function is_voip(stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
133 if stanza.name == "message" then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
134 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
|
135 return true, "jingle call" |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
136 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
137 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
138 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
139 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
140 local function has_body(stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
141 -- 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
|
142 -- 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
|
143 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
144 -- 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
|
145 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
|
146 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
147 -- 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
|
148 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
|
149 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
150 -- 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
|
151 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
|
152 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
153 local body = stanza:get_child_text("body"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
154 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
155 return body ~= nil and body ~= "" |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
156 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
157 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
158 -- is this push a high priority one |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
159 local function is_important(stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
160 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
|
161 if is_voip_stanza then return true; end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
162 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
163 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
|
164 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
|
165 if st_name == "presence" then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
166 return false; -- same for presences |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
167 elseif st_name == "message" then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
168 -- unpack carbon copied message stanzas |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
169 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
|
170 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
|
171 if carbon then stanza = carbon; end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
172 local st_type = stanza.attr.type |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
173 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
174 -- headline message are always not important |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
175 if st_type == "headline" then return false; end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
176 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
177 -- carbon copied outgoing messages are not important |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
178 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
|
179 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
180 -- groupchat subjects are not important here |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
181 if st_type == "groupchat" and stanza:get_child_text("subject") then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
182 return false |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
183 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
184 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
185 -- empty bodies are not important |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
186 return has_body(stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
187 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
188 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
|
189 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
190 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
191 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
|
192 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
|
193 local stanza_clone = st.clone(stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
194 stanza_clone.attr.xmlns = "jabber:client" |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
195 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
|
196 :tag("content") |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
197 :tag("forwarded", { xmlns = "urn:xmpp:forward:0" }) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
198 :add_child(stanza_clone) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
199 :up():up():up() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
200 local envelope_bytes = tostring(envelope) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
201 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
|
202 -- If stanza is too big, remove extra elements |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
203 stanza_clone:maptags(function(el) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
204 if el.attr.xmlns == nil or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
205 el.attr.xmlns == "jabber:client" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
206 el.attr.xmlns == "jabber:x:oob" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
207 (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
|
208 el.attr.xmlns == "eu.siacs.conversations.axolotl" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
209 el.attr.xmlns == "urn:xmpp:omemo:0" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
210 el.attr.xmlns == "jabber:x:encrypted" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
211 el.attr.xmlns == "urn:xmpp:openpgp:0" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
212 el.attr.xmlns == "urn:xmpp:sce:1" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
213 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
|
214 el.attr.xmlns == "jabber:x:conference" |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
215 then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
216 return el |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
217 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
218 return nil |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
219 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
220 end) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
221 envelope_bytes = tostring(envelope) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
222 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
223 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
|
224 local body = stanza:get_child_text("body") |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
225 if string.len(body) > 50 then |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
226 stanza_clone:maptags(function(el) |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
227 if el.name == "body" then |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
228 return nil |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
229 else |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
230 return el |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
231 end |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
232 end) |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
233 |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
234 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
|
235 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
|
236 envelope_bytes = tostring(envelope) |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
237 end |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
238 end |
|
bebb10fa5787
mod_push2: Add back body truncation logic
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5659
diff
changeset
|
239 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
|
240 -- If still too big, get aggressive |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
241 stanza_clone:maptags(function(el) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
242 if el.name == "body" or |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
243 (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
|
244 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
|
245 el.attr.xmlns == "jabber:x:conference" |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
246 then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
247 return el |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
248 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
249 return nil |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
250 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
251 end) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
252 envelope_bytes = tostring(envelope) |
|
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 if string.len(envelope_bytes) < max_data_size/2 then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
255 envelope:text_tag("rpad", base64.encode(random.bytes(math.min(150, max_data_size/3 - string.len(envelope_bytes))))) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
256 envelope_bytes = tostring(envelope) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
257 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
258 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 local auth_secret = base64.decode(match.auth_secret .. "==") |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
265 local salt = random.bytes(16) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
266 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
|
267 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
|
268 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
|
269 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
|
270 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
|
271 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
|
272 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
273 push_notification_payload |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
274 :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
|
275 :text_tag("payload", base64.encode(header .. encrypted)) |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
276 :up() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
277 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
278 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
279 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
|
280 if not match.jwt_alg then return; end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
281 local key = match.jwt_key |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
282 if match.jwt_alg ~= "HS256" then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
283 -- 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
|
284 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
|
285 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
286 |
|
6005
8cb37a497e4c
mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5970
diff
changeset
|
287 local public_key = crypto.import_private_pem(key):public_raw() |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
288 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
|
289 local payload = {} |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
290 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
|
291 payload[k] = v |
|
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 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
|
294 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
|
295 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
296 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
297 local function handle_notify_request(stanza, node, user_push_services, log_push_decline) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
298 local pushes = 0; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
299 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
|
300 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
301 local notify_push_services = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
302 if is_important(stanza) then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
303 notify_push_services = user_push_services |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
304 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
305 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
|
306 for _, match in ipairs(push_info.matches) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
307 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
|
308 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
|
309 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
310 notify_push_services[identifier] = push_info; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
311 end |
|
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 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
314 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
315 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
316 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
|
317 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
|
318 if stanza then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
319 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
|
320 if stanza._push_notify2[push_registration_id] then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
321 if log_push_decline then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
322 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
|
323 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
324 send_push = false; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
325 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
326 stanza._push_notify2[push_registration_id] = true; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
327 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
328 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
329 if send_push then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
330 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
|
331 push_notification_payload:text_tag("client", push_info.client) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
332 push_notification_payload:text_tag("priority", is_voip(stanza) and "high" or (is_important(stanza) and "normal" or "low")) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
333 if is_voip(stanza) then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
334 push_notification_payload:tag("voip"):up() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
335 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
336 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
337 local sends_added = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
338 for _, match in ipairs(push_info.matches) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
339 local does_match = false; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
340 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
|
341 does_match = true |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
342 elseif match.match == "urn:xmpp:push2:match:important" then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
343 does_match = is_important(stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
344 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
|
345 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
|
346 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
|
347 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
|
348 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
349 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
350 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
|
351 sends_added[match.send] = true |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
352 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
|
353 -- Nothing more to add |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
354 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
|
355 add_sce_rfc8291(match, stanza, push_notification_payload) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
356 add_rfc8292(match, stanza, push_notification_payload) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
357 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
358 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
|
359 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
360 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
361 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
362 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
363 local push_publish = st.message({ to = push_info.service, from = module.host, id = uuid.generate() }) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
364 :add_child(push_notification_payload):up() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
365 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
366 -- TODO: watch for message error replies and count or something |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
367 module:send(push_publish) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
368 pushes = pushes + 1 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
369 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
370 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
371 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
372 return pushes |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
373 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
374 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
375 -- small helper function to extract relevant push settings |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
376 local function get_push_settings(stanza, session) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
377 local to = stanza.attr.to |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
378 local node = to and jid.split(to) or session.username |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
379 local user_push_services = push2_registrations:get(node) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
380 return node, (user_push_services or {}) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
381 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
382 |
|
5664
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
383 -- publish on offline message |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
384 module:hook("message/offline/handle", function(event) |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
385 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
|
386 module:log("debug", "Invoking handle_notify_request() for offline stanza"); |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
387 handle_notify_request(event.stanza, node, user_push_services, true); |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
388 end, 1); |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
389 |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
390 -- publish on bare groupchat |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
391 -- 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
|
392 module:hook("message/bare/groupchat", function(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
393 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
|
394 local notify_push_services = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
395 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
|
396 for _, match in ipairs(push_info.matches) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
397 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
|
398 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
|
399 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
400 notify_push_services[identifier] = push_info; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
401 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
402 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
403 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
404 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
405 handle_notify_request(event.stanza, node, notify_push_services, true); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
406 end, 1); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
407 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
408 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
|
409 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
|
410 local notified = { unimportant = false; important = false } |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
411 for i=1, #queue do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
412 local stanza = queue[i]; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
413 -- fast ignore of already pushed stanzas |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
414 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
|
415 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
|
416 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
|
417 local stanza_type = "unimportant"; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
418 if is_important(stanza) then stanza_type = "important"; end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
419 if not notified[stanza_type] then -- only notify if we didn't try to push for this stanza type already |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
420 if handle_notify_request(stanza, node, user_push_services, false) ~= 0 then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
421 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
|
422 -- if the message was important |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
423 -- 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
|
424 -- timeout based on the value of session.first_hibernated_push |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
425 if is_important(stanza) then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
426 session.first_hibernated_push = os_time(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
427 -- check for prosody 0.12 mod_smacks |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
428 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
|
429 -- 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
|
430 session.hibernating_watchdog:cancel(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
431 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
|
432 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
433 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
434 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
435 notified[stanza_type] = true |
|
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 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
|
440 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
441 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
442 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
443 -- 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
|
444 local function process_stanza(session, stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
445 if session.push_registration_id then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
446 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
|
447 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
|
448 local queue = session.push_queue; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
449 queue[#queue+1] = st.clone(stanza); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
450 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
|
451 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
|
452 process_stanza_queue(session.push_queue, session, "push"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
453 session.push_queue = {}; -- clean up queue after push |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
454 session.awaiting_push_timer = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
455 end); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
456 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
457 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
458 return stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
459 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
460 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
461 local function process_smacks_stanza(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
462 local session = event.origin; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
463 local stanza = event.stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
464 if not session.push_registration_id then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
465 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
|
466 session.push_registration_id |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
467 ); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
468 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
469 process_stanza(session, stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
470 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
471 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
472 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
473 -- smacks hibernation is started |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
474 local function hibernate_session(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
475 local session = event.origin; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
476 local queue = event.queue; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
477 session.first_hibernated_push = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
478 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
|
479 -- save old watchdog callback and timeout |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
480 session.original_smacks_callback = session.hibernating_watchdog.callback; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
481 session.original_smacks_timeout = session.hibernating_watchdog.timeout; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
482 -- 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
|
483 session.hibernating_watchdog:cancel(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
484 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
|
485 session.log("debug", "Push-extended smacks watchdog triggered"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
486 if session.original_smacks_callback then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
487 session.log("debug", "Calling original smacks watchdog handler"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
488 session.original_smacks_callback(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
489 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
490 end); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
491 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
492 -- process unacked stanzas |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
493 process_stanza_queue(queue, session, "smacks"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
494 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
495 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
496 -- smacks hibernation is ended |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
497 local function restore_session(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
498 local session = event.resumed; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
499 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
|
500 if session.awaiting_push_timer then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
501 session.awaiting_push_timer:stop(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
502 session.awaiting_push_timer = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
503 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
504 session.first_hibernated_push = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
505 -- 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
|
506 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
507 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
508 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
509 -- smacks ack is delayed |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
510 local function ack_delayed(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
511 local session = event.origin; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
512 local queue = event.queue; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
513 local stanza = event.stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
514 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
|
515 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
|
516 for i=1, #queue do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
517 local queued_stanza = queue[i]; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
518 -- 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
|
519 process_stanza(session, queued_stanza); |
|
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 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
523 -- archive message added |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
524 local function archive_message_added(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
525 -- 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
|
526 -- 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
|
527 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
|
528 -- 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
|
529 -- 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
|
530 local stanza = st.clone(event.stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
531 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
|
532 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
|
533 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
|
534 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
|
535 to_user = to_user or event.origin.username |
|
c887820cd884
Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6007
diff
changeset
|
536 to_host = to_host or module.host |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
537 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
538 -- 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
|
539 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
|
540 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
|
541 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
542 -- 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
|
543 -- 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
|
544 -- queue in case of dead connections, for example |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
545 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
|
546 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
547 local notify_push_services; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
548 if is_voip_stanza then |
|
6157
c887820cd884
Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6007
diff
changeset
|
549 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
|
550 notify_push_services = user_push_services; |
|
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 -- 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
|
553 notify_push_services = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
554 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
|
555 local identifier_found = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
556 for _, session in pairs(user_session) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
557 if session.push_registration_id == identifier then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
558 identifier_found = session; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
559 break; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
560 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
561 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
562 if identifier_found then |
|
6006
b4bf44765ce6
mod_push2: fix some log lines
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6005
diff
changeset
|
563 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
|
564 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
565 notify_push_services[identifier] = push_info |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
566 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
567 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
568 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
569 |
|
6157
c887820cd884
Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6007
diff
changeset
|
570 handle_notify_request(stanza, to_user, notify_push_services, true); |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
571 end |
|
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 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
574 module:hook("smacks-hibernation-start", hibernate_session); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
575 module:hook("smacks-hibernation-end", restore_session); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
576 module:hook("smacks-ack-delayed", ack_delayed); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
577 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
|
578 module:hook("archive-message-added", archive_message_added); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
579 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
580 module:log("info", "Module loaded"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
581 function module.unload() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
582 module:log("info", "Unloading module"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
583 -- 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
|
584 for user, _ in pairs(host_sessions) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
585 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
|
586 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
|
587 session.awaiting_push_timer = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
588 session.push_queue = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
589 session.first_hibernated_push = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
590 -- check for prosody 0.12 mod_smacks |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
591 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
|
592 -- restore old smacks watchdog |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
593 session.hibernating_watchdog:cancel(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
594 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
|
595 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
596 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
597 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
598 module:log("info", "Module unloaded"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
599 end |
