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