diff 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
parents 2a5164162708
children 2e355540f8c8
line wrap: on
line diff
--- a/mod_cloud_notify_encrypted/mod_cloud_notify_encrypted.lua	Wed Jan 13 14:15:38 2021 +0000
+++ b/mod_cloud_notify_encrypted/mod_cloud_notify_encrypted.lua	Wed Jan 13 14:18:24 2021 +0000
@@ -58,8 +58,9 @@
 	local original_stanza = event.original_stanza;
 
 	local push_payload = {
-		unread = push_summary["message-count"];
-		sender = push_summary["last-message-sender"];
+		unread = tonumber(push_summary["message-count"]) or 1;
+		sender = jid.bare(original_stanza.attr.from);
+		message = body;
 	};
 
 	if original_stanza.name == "message" then
@@ -84,7 +85,9 @@
 	local key_binary = base64.decode(encryption.key_base64);
 	local push_json = json.encode(push_payload);
 
-	local encrypted_payload = ciphers.new("AES-128-GCM"):encrypt(key_binary, iv):final(push_json);
+	-- FIXME: luaossl does not expose the EVP_CTRL_GCM_GET_TAG API, so we append 16 NUL bytes
+	-- Siskin does not validate the tag anyway.
+	local encrypted_payload = base64.encode(ciphers.new("AES-128-GCM"):encrypt(key_binary, iv):final(push_json)..string.rep("\0", 16));
 	local encrypted_element = st.stanza("encrypted", { xmlns = xmlns_push_encrypt, iv = base64.encode(iv) })
 		:text(encrypted_payload);
 	-- Replace the unencrypted notification with the encrypted one
@@ -93,7 +96,9 @@
 		:get_child("publish")
 		:get_child("item")
 		:remove_children("notification", xmlns_push)
-		:add_child(encrypted_element);
+		:tag("notification", { xmlns = xmlns_push })
+			:add_child(encrypted_element)
+			:up();
 end
 
 module:hook("cloud_notify/registration", handle_register);