Mercurial > 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 |
| parents | 658658ea9323 |
| children | 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); |
