Mercurial > prosody-modules
annotate mod_push2/mod_push2.lua @ 6403:13c61a068c71
mod_pubsub_serverinfo: Include hostname in default pubsub node name
This change ensures that every host publishes to a unique node by default,
which is important when publishing info about multiple hosts.
The old default node name was "serverinfo"
The new default node name is in the format "serverinfo/example.com" where
example.com is automatically replaced by the publishing host's name.
This affects existing deployments in the following ways:
- If you already configured pubsub_serverinfo_node explicitly in your config,
then nothing will change, your current configuration will still be used.
- If you did not specify it in your config (i.e. used the default) then the
module will switch to publishing to the new node. If your configuration is
correct this shouldn't be noticed, because the new node will automatically
be created and configured by the module. If you want, you can clean up the
old 'serverinfo' node using:
prosodyctl shell pubsub delete_node pubsub.example.com serverinfo
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 11 Feb 2026 09:40:30 +0000 |
| parents | 0570f1e2edf4 |
| children | c9836434a9d5 |
| 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 |
|
6005
8cb37a497e4c
mod_push2: Switch from patched luaossl to prosody-trunk methods
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5970
diff
changeset
|
322 local public_key = crypto.import_private_pem(key):public_raw() |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
323 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
|
324 local payload = {} |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
325 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
|
326 payload[k] = v |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
327 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
328 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
|
329 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
|
330 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
331 |
|
6181
811bd0872682
mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6180
diff
changeset
|
332 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
|
333 local pushes = 0; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
334 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
|
335 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
336 local notify_push_services = {}; |
|
6181
811bd0872682
mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6180
diff
changeset
|
337 if is_important(stanza, session) then |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
338 notify_push_services = user_push_services |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
339 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
340 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
|
341 for _, match in ipairs(push_info.matches) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
342 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
|
343 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
|
344 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
345 notify_push_services[identifier] = push_info; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
346 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
347 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
348 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
349 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
350 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
351 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
|
352 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
|
353 if stanza then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
354 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
|
355 if stanza._push_notify2[push_registration_id] then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
356 if log_push_decline then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
357 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
|
358 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
359 send_push = false; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
360 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
361 stanza._push_notify2[push_registration_id] = true; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
362 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
363 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
364 if send_push then |
|
6229
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
365 local any_match = false; |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
366 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
|
367 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
|
368 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
|
369 if is_voip(stanza) then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
370 push_notification_payload:tag("voip"):up() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
371 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
372 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
373 local sends_added = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
374 for _, match in ipairs(push_info.matches) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
375 local does_match = false; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
376 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
|
377 does_match = true |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
378 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
|
379 does_match = is_important(stanza, session) |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
380 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
|
381 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
|
382 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
|
383 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
|
384 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
385 |
|
6184
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
386 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
|
387 to_user = to_user or session.username |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
388 to_host = to_host or module.host |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
389 |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
390 -- 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
|
391 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
|
392 local now = os_time() |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
393 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
|
394 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
|
395 does_match = false |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
396 end |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
397 end |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
398 end |
|
2f2539ce8f3b
mod_push2: implement grace period
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6183
diff
changeset
|
399 |
|
6183
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
400 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
|
401 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
|
402 does_match = false |
|
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
403 |
|
6186
277db84b0c95
mod_push2: guard against no rooms tracked on this session
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6185
diff
changeset
|
404 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
|
405 |
|
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
406 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
|
407 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
|
408 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
|
409 does_match = true |
|
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
410 end |
|
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
411 end |
|
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.reply then |
|
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
413 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
|
414 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
|
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 end |
|
e53f0967520c
mod_push: Allow filtering pushes for particular chats
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6182
diff
changeset
|
419 |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
420 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
|
421 sends_added[match.send] = true |
|
6229
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
422 any_match = true |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
423 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
|
424 -- Nothing more to add |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
425 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
|
426 add_sce_rfc8291(match, stanza, push_notification_payload) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
427 add_rfc8292(match, stanza, push_notification_payload) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
428 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
429 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
|
430 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
431 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
432 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
433 |
|
6229
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
434 if any_match then |
|
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
435 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
|
436 :add_child(push_notification_payload):up() |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
437 |
|
6229
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
438 -- 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
|
439 module:send(push_publish) |
|
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
440 pushes = pushes + 1 |
|
6164849469f1
mod2_push2: suppress send if none match
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6200
diff
changeset
|
441 end |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
442 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
443 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
444 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
445 return pushes |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
446 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
447 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
448 -- small helper function to extract relevant push settings |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
449 local function get_push_settings(stanza, session) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
450 local to = stanza.attr.to |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
451 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
|
452 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
|
453 if not user_push_services then |
|
0570f1e2edf4
mod_push2: Implement cache for user push registrations
Matthew Wild <mwild1@gmail.com>
parents:
6267
diff
changeset
|
454 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
|
455 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
|
456 end |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
457 return node, (user_push_services or {}) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
458 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
459 |
|
5664
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
460 -- publish on offline message |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
461 module:hook("message/offline/handle", function(event) |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
462 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
|
463 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
|
464 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
|
465 end, 1); |
|
4b052598e435
mod_push2: restore offline message hook
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
5663
diff
changeset
|
466 |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
467 -- publish on bare groupchat |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
468 -- 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
|
469 module:hook("message/bare/groupchat", function(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
470 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
|
471 local notify_push_services = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
472 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
|
473 for _, match in ipairs(push_info.matches) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
474 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
|
475 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
|
476 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
477 notify_push_services[identifier] = push_info; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
478 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
479 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
480 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
481 |
|
6181
811bd0872682
mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6180
diff
changeset
|
482 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
|
483 end, 1); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
484 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
485 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
|
486 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
|
487 local notified = { unimportant = false; important = false } |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
488 for i=1, #queue do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
489 local stanza = queue[i]; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
490 -- fast ignore of already pushed stanzas |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
491 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
|
492 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
|
493 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
|
494 local stanza_type = "unimportant"; |
|
6181
811bd0872682
mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6180
diff
changeset
|
495 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
|
496 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
|
497 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
|
498 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
|
499 -- if the message was important |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
500 -- 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
|
501 -- 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
|
502 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
|
503 session.first_hibernated_push = os_time(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
504 -- check for prosody 0.12 mod_smacks |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
505 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
|
506 -- 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
|
507 session.hibernating_watchdog:cancel(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
508 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
|
509 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
510 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
511 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
512 notified[stanza_type] = true |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
513 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
514 end |
|
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 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
|
517 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
518 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
519 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
520 -- 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
|
521 local function process_stanza(session, stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
522 if session.push_registration_id then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
523 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
|
524 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
|
525 local queue = session.push_queue; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
526 queue[#queue+1] = st.clone(stanza); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
527 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
|
528 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
|
529 process_stanza_queue(session.push_queue, session, "push"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
530 session.push_queue = {}; -- clean up queue after push |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
531 session.awaiting_push_timer = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
532 end); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
533 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
534 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
535 return stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
536 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
537 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
538 local function process_smacks_stanza(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
539 local session = event.origin; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
540 local stanza = event.stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
541 if not session.push_registration_id then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
542 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
|
543 session.push_registration_id |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
544 ); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
545 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
546 process_stanza(session, stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
547 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
548 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
549 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
550 -- smacks hibernation is started |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
551 local function hibernate_session(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
552 local session = event.origin; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
553 local queue = event.queue; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
554 session.first_hibernated_push = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
555 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
|
556 -- save old watchdog callback and timeout |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
557 session.original_smacks_callback = session.hibernating_watchdog.callback; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
558 session.original_smacks_timeout = session.hibernating_watchdog.timeout; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
559 -- 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
|
560 session.hibernating_watchdog:cancel(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
561 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
|
562 session.log("debug", "Push-extended smacks watchdog triggered"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
563 if session.original_smacks_callback then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
564 session.log("debug", "Calling original smacks watchdog handler"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
565 session.original_smacks_callback(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
566 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
567 end); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
568 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
569 -- process unacked stanzas |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
570 process_stanza_queue(queue, session, "smacks"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
571 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
572 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
573 -- smacks hibernation is ended |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
574 local function restore_session(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
575 local session = event.resumed; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
576 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
|
577 if session.awaiting_push_timer then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
578 session.awaiting_push_timer:stop(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
579 session.awaiting_push_timer = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
580 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
581 session.first_hibernated_push = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
582 -- 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
|
583 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
584 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
585 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
586 -- smacks ack is delayed |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
587 local function ack_delayed(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
588 local session = event.origin; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
589 local queue = event.queue; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
590 local stanza = event.stanza; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
591 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
|
592 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
|
593 for i=1, #queue do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
594 local queued_stanza = queue[i]; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
595 -- 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
|
596 process_stanza(session, queued_stanza); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
597 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
598 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
599 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
600 -- archive message added |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
601 local function archive_message_added(event) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
602 -- 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
|
603 -- 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
|
604 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
|
605 -- 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
|
606 -- 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
|
607 local stanza = st.clone(event.stanza) |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
608 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
|
609 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
|
610 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
|
611 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
|
612 to_user = to_user or event.origin.username |
|
c887820cd884
Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6007
diff
changeset
|
613 to_host = to_host or module.host |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
614 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
615 -- 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
|
616 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
|
617 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
|
618 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
619 -- 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
|
620 -- 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
|
621 -- queue in case of dead connections, for example |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
622 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
|
623 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
624 local notify_push_services; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
625 if is_voip_stanza then |
|
6157
c887820cd884
Check both localpart and host
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6007
diff
changeset
|
626 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
|
627 notify_push_services = user_push_services; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
628 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
629 -- 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
|
630 notify_push_services = {}; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
631 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
|
632 local identifier_found = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
633 for _, session in pairs(user_session) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
634 if session.push_registration_id == identifier then |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
635 identifier_found = session; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
636 break; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
637 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
638 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
639 if identifier_found then |
|
6006
b4bf44765ce6
mod_push2: fix some log lines
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6005
diff
changeset
|
640 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
|
641 else |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
642 notify_push_services[identifier] = push_info |
|
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 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
646 |
|
6181
811bd0872682
mod_push2: Do not push MUC reflections
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6180
diff
changeset
|
647 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
|
648 end |
|
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 |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
651 module:hook("smacks-hibernation-start", hibernate_session); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
652 module:hook("smacks-hibernation-end", restore_session); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
653 module:hook("smacks-ack-delayed", ack_delayed); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
654 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
|
655 module:hook("archive-message-added", archive_message_added); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
656 |
|
6187
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
657 local function track_activity(event) |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
658 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
|
659 event.origin.last_activity = os_time() |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
660 end |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
661 end |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
662 |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
663 module:hook("pre-message/bare", track_activity) |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
664 module:hook("pre-message/full", track_activity) |
|
06621ab30be0
mod_push2: Improve session activity tracking
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
6186
diff
changeset
|
665 |
|
5659
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
666 module:log("info", "Module loaded"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
667 function module.unload() |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
668 module:log("info", "Unloading module"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
669 -- 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
|
670 for user, _ in pairs(host_sessions) do |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
671 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
|
672 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
|
673 session.awaiting_push_timer = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
674 session.push_queue = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
675 session.first_hibernated_push = nil; |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
676 -- check for prosody 0.12 mod_smacks |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
677 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
|
678 -- restore old smacks watchdog |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
679 session.hibernating_watchdog:cancel(); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
680 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
|
681 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
682 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
683 end |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
684 module:log("info", "Module unloaded"); |
|
4d1a3de56c3d
Initial work on Push 2.0
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff
changeset
|
685 end |
