Software / code / prosody-modules
Comparison
mod_cloud_notify_encrypted/mod_cloud_notify_encrypted.lua @ 4330:e655581173be
mod_cloud_notify_encrypted: Fixes to the push notification syntax and payload
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 13 Jan 2021 14:18:24 +0000 |
| parent | 4329:2a5164162708 |
| child | 4331:2e355540f8c8 |
comparison
equal
deleted
inserted
replaced
| 4329:2a5164162708 | 4330:e655581173be |
|---|---|
| 56 local push_summary = event.push_summary; | 56 local push_summary = event.push_summary; |
| 57 | 57 |
| 58 local original_stanza = event.original_stanza; | 58 local original_stanza = event.original_stanza; |
| 59 | 59 |
| 60 local push_payload = { | 60 local push_payload = { |
| 61 unread = push_summary["message-count"]; | 61 unread = tonumber(push_summary["message-count"]) or 1; |
| 62 sender = push_summary["last-message-sender"]; | 62 sender = jid.bare(original_stanza.attr.from); |
| 63 message = body; | |
| 63 }; | 64 }; |
| 64 | 65 |
| 65 if original_stanza.name == "message" then | 66 if original_stanza.name == "message" then |
| 66 if original_stanza.attr.type == "groupchat" then | 67 if original_stanza.attr.type == "groupchat" then |
| 67 push_payload.type = "groupchat"; | 68 push_payload.type = "groupchat"; |
| 82 | 83 |
| 83 local iv = random.bytes(12); | 84 local iv = random.bytes(12); |
| 84 local key_binary = base64.decode(encryption.key_base64); | 85 local key_binary = base64.decode(encryption.key_base64); |
| 85 local push_json = json.encode(push_payload); | 86 local push_json = json.encode(push_payload); |
| 86 | 87 |
| 87 local encrypted_payload = ciphers.new("AES-128-GCM"):encrypt(key_binary, iv):final(push_json); | 88 -- FIXME: luaossl does not expose the EVP_CTRL_GCM_GET_TAG API, so we append 16 NUL bytes |
| 89 -- Siskin does not validate the tag anyway. | |
| 90 local encrypted_payload = base64.encode(ciphers.new("AES-128-GCM"):encrypt(key_binary, iv):final(push_json)..string.rep("\0", 16)); | |
| 88 local encrypted_element = st.stanza("encrypted", { xmlns = xmlns_push_encrypt, iv = base64.encode(iv) }) | 91 local encrypted_element = st.stanza("encrypted", { xmlns = xmlns_push_encrypt, iv = base64.encode(iv) }) |
| 89 :text(encrypted_payload); | 92 :text(encrypted_payload); |
| 90 -- Replace the unencrypted notification with the encrypted one | 93 -- Replace the unencrypted notification with the encrypted one |
| 91 event.notification_stanza | 94 event.notification_stanza |
| 92 :get_child("pubsub", "http://jabber.org/protocol/pubsub") | 95 :get_child("pubsub", "http://jabber.org/protocol/pubsub") |
| 93 :get_child("publish") | 96 :get_child("publish") |
| 94 :get_child("item") | 97 :get_child("item") |
| 95 :remove_children("notification", xmlns_push) | 98 :remove_children("notification", xmlns_push) |
| 96 :add_child(encrypted_element); | 99 :tag("notification", { xmlns = xmlns_push }) |
| 100 :add_child(encrypted_element) | |
| 101 :up(); | |
| 97 end | 102 end |
| 98 | 103 |
| 99 module:hook("cloud_notify/registration", handle_register); | 104 module:hook("cloud_notify/registration", handle_register); |
| 100 module:hook("cloud_notify/push", handle_push); | 105 module:hook("cloud_notify/push", handle_push); |