Software / code / prosody-modules
Comparison
mod_cloud_notify_encrypted/mod_cloud_notify_encrypted.lua @ 4456:8ed1989e99f9
mod_cloud_notify_encrypted: Update to latest spec, fixes unreliable call notifications
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 22 Feb 2021 13:11:35 +0000 |
| parent | 4373:41ac0941b217 |
| child | 4457:091d06c7d724 |
comparison
equal
deleted
inserted
replaced
| 4455:89e54247ade6 | 4456:8ed1989e99f9 |
|---|---|
| 1 local array = require "util.array"; | |
| 1 local base64 = require "util.encodings".base64; | 2 local base64 = require "util.encodings".base64; |
| 2 local ciphers = require "openssl.cipher"; | 3 local ciphers = require "openssl.cipher"; |
| 3 local jid = require "util.jid"; | 4 local jid = require "util.jid"; |
| 4 local json = require "util.json"; | 5 local json = require "util.json"; |
| 5 local random = require "util.random"; | 6 local random = require "util.random"; |
| 7 local set = require "util.set"; | |
| 6 local st = require "util.stanza"; | 8 local st = require "util.stanza"; |
| 7 | 9 |
| 8 local xmlns_jmi = "urn:xmpp:jingle-message:0"; | 10 local xmlns_jmi = "urn:xmpp:jingle-message:0"; |
| 9 local xmlns_push = "urn:xmpp:push:0"; | 11 local xmlns_push = "urn:xmpp:push:0"; |
| 10 local xmlns_push_encrypt = "tigase:push:encrypt:0"; | 12 local xmlns_push_encrypt = "tigase:push:encrypt:0"; |
| 74 elseif original_stanza.attr.type ~= "error" then | 76 elseif original_stanza.attr.type ~= "error" then |
| 75 local jmi_propose = original_stanza:get_child("propose", xmlns_jmi); | 77 local jmi_propose = original_stanza:get_child("propose", xmlns_jmi); |
| 76 if jmi_propose then | 78 if jmi_propose then |
| 77 push_payload.type = "call"; | 79 push_payload.type = "call"; |
| 78 push_payload.sid = jmi_propose.attr.id; | 80 push_payload.sid = jmi_propose.attr.id; |
| 81 local media_types = set.new(); | |
| 82 for description in jmi_propose:childtags("description") do | |
| 83 local media_type = description.attr.media; | |
| 84 if media_type then | |
| 85 media_types:add(media_type); | |
| 86 end | |
| 87 end | |
| 88 push_payload.media = array.collect(media_types:items()); | |
| 79 else | 89 else |
| 80 push_payload.type = "chat"; | 90 push_payload.type = "chat"; |
| 81 end | 91 end |
| 82 end | 92 end |
| 83 elseif original_stanza.name == "presence" | 93 elseif original_stanza.name == "presence" |
| 92 -- FIXME: luaossl does not expose the EVP_CTRL_GCM_GET_TAG API, so we append 16 NUL bytes | 102 -- FIXME: luaossl does not expose the EVP_CTRL_GCM_GET_TAG API, so we append 16 NUL bytes |
| 93 -- Siskin does not validate the tag anyway. | 103 -- Siskin does not validate the tag anyway. |
| 94 local encrypted_payload = base64.encode(ciphers.new("AES-128-GCM"):encrypt(key_binary, iv):final(push_json)..string.rep("\0", 16)); | 104 local encrypted_payload = base64.encode(ciphers.new("AES-128-GCM"):encrypt(key_binary, iv):final(push_json)..string.rep("\0", 16)); |
| 95 local encrypted_element = st.stanza("encrypted", { xmlns = xmlns_push_encrypt, iv = base64.encode(iv) }) | 105 local encrypted_element = st.stanza("encrypted", { xmlns = xmlns_push_encrypt, iv = base64.encode(iv) }) |
| 96 :text(encrypted_payload); | 106 :text(encrypted_payload); |
| 107 if push_payload.type == "call" then | |
| 108 encrypted_payload.attr.type = "voip"; | |
| 109 event.important = true; | |
| 110 end | |
| 97 -- Replace the unencrypted notification data with the encrypted one | 111 -- Replace the unencrypted notification data with the encrypted one |
| 98 event.notification_payload | 112 event.notification_payload |
| 99 :remove_children("x", "jabber:x:data") | 113 :remove_children("x", "jabber:x:data") |
| 100 :add_child(encrypted_element); | 114 :add_child(encrypted_element); |
| 101 end | 115 end |
| 102 | 116 |
| 103 module:hook("cloud_notify/registration", handle_register); | 117 module:hook("cloud_notify/registration", handle_register); |
| 104 module:hook("cloud_notify/push", handle_push); | 118 module:hook("cloud_notify/push", handle_push, 1); |