Software /
code /
prosody-modules
Comparison
mod_unified_push/mod_unified_push.lua @ 5148:bf42f1401f1c
mod_unified_push: Refactor in anticipation of other registration backends
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 13 Jan 2023 16:50:43 +0000 |
parent | 5147:658658ea9323 |
child | 5149:fa56ed2bacab |
comparison
equal
deleted
inserted
replaced
5147:658658ea9323 | 5148:bf42f1401f1c |
---|---|
2 local push_registration_ttl = module:get_option_number("unified_push_registration_ttl", 86400); | 2 local push_registration_ttl = module:get_option_number("unified_push_registration_ttl", 86400); |
3 | 3 |
4 local base64 = require "util.encodings".base64; | 4 local base64 = require "util.encodings".base64; |
5 local datetime = require "util.datetime"; | 5 local datetime = require "util.datetime"; |
6 local id = require "util.id"; | 6 local id = require "util.id"; |
7 local jid = require "util.jid"; | |
7 local jwt = require "util.jwt"; | 8 local jwt = require "util.jwt"; |
8 local st = require "util.stanza"; | 9 local st = require "util.stanza"; |
9 local urlencode = require "util.http".urlencode; | 10 local urlencode = require "util.http".urlencode; |
10 | 11 |
11 local xmlns_up = "http://gultsch.de/xmpp/drafts/unified-push"; | 12 local xmlns_up = "http://gultsch.de/xmpp/drafts/unified-push"; |
52 return nil, "token-expired"; | 53 return nil, "token-expired"; |
53 end | 54 end |
54 return ok, result; | 55 return ok, result; |
55 end | 56 end |
56 | 57 |
58 local function register_route(params) | |
59 local expiry = os.time() + push_registration_ttl; | |
60 return { | |
61 url = module:http_url("push").."/"..urlencode(jwt_sign(unified_push_secret, { | |
62 instance = params.instance; | |
63 application = params.application; | |
64 sub = params.jid; | |
65 exp = expiry; | |
66 })); | |
67 expiry = expiry; | |
68 }; | |
69 end | |
70 | |
57 -- Handle incoming registration from XMPP client | 71 -- Handle incoming registration from XMPP client |
58 function handle_register(event) | 72 function handle_register(event) |
59 local origin, stanza = event.origin, event.stanza; | 73 local origin, stanza = event.origin, event.stanza; |
60 if not is_jid_permitted(stanza.attr.from) then | 74 if not is_jid_permitted(stanza.attr.from) then |
61 return st.error_reply(stanza, "auth", "forbidden"); | 75 return st.error_reply(stanza, "auth", "forbidden"); |
66 end | 80 end |
67 local application, application_err = check_sha256(stanza.tags[1].attr.application); | 81 local application, application_err = check_sha256(stanza.tags[1].attr.application); |
68 if not application then | 82 if not application then |
69 return st.error_reply(stanza, "modify", "bad-request", "application: "..application_err); | 83 return st.error_reply(stanza, "modify", "bad-request", "application: "..application_err); |
70 end | 84 end |
71 local expiry = os.time() + push_registration_ttl; | 85 local route = register_route({ |
72 local url = module:http_url("push").."/"..urlencode(jwt_sign({ | |
73 instance = instance; | 86 instance = instance; |
74 application = application; | 87 application = application; |
75 sub = stanza.attr.from; | 88 jid = stanza.attr.from; |
76 exp = expiry; | 89 }); |
77 })); | 90 |
91 if not route then | |
92 return st.error_reply(stanza, "wait", "internal-server-error"); | |
93 end | |
94 | |
78 module:log("debug", "New push registration successful"); | 95 module:log("debug", "New push registration successful"); |
79 return origin.send(st.reply(stanza):tag("registered", { | 96 return origin.send(st.reply(stanza):tag("registered", { |
80 expiration = datetime.datetime(expiry); | 97 expiration = datetime.datetime(route.expiry); |
81 endpoint = url; | 98 endpoint = route.url; |
82 xmlns = xmlns_up; | 99 xmlns = xmlns_up; |
83 })); | 100 })); |
84 end | 101 end |
85 | 102 |
86 module:hook("iq-set/host/"..xmlns_up..":register", handle_register); | 103 module:hook("iq-set/host/"..xmlns_up..":register", handle_register); |