Parcourir la source

Workaround for prosody PEP support in group chat with OMEMO

Bob Mottram il y a 7 ans
Parent
révision
46f5c877b5
2 fichiers modifiés avec 93 ajouts et 0 suppressions
  1. 55
    0
      image_build/mod_omemo_all_access.lua
  2. 38
    0
      src/freedombone-app-xmpp

+ 55
- 0
image_build/mod_omemo_all_access.lua Voir le fichier

@@ -0,0 +1,55 @@
1
+-- OMEMO all access module
2
+-- Copyright (c) 2017 Daniel Gultsch
3
+--
4
+-- This module is MIT/X11 licensed
5
+--
6
+
7
+local jid_bare = require "util.jid".bare;
8
+local st = require "util.stanza"
9
+local white_listed_namespace = "eu.siacs.conversations.axolotl."
10
+local disco_feature_namespace = white_listed_namespace .. "whitelisted"
11
+
12
+local mod_pep = module:depends"pep";
13
+local pep_data = mod_pep.module.save().data;
14
+
15
+local function on_account_disco_info(event)
16
+	(event.reply or event.stanza):tag("feature", {var=disco_feature_namespace}):up();
17
+end
18
+
19
+local function on_pep_request(event)
20
+	local session, stanza = event.origin, event.stanza
21
+	local payload = stanza.tags[1];
22
+	if stanza.attr.type == 'get' then
23
+		local node, requested_id;
24
+		payload = payload.tags[1]
25
+		if payload and payload.name == 'items' then
26
+			node = payload.attr.node
27
+			local item = payload.tags[1];
28
+			if item and item.name == 'item' then
29
+				requested_id = item.attr.id;
30
+			end 
31
+		end
32
+		if node and string.sub(node,1,string.len(white_listed_namespace)) == white_listed_namespace then
33
+			local user = stanza.attr.to and jid_bare(stanza.attr.to) or session.username..'@'..session.host;
34
+			local user_data = pep_data[user];
35
+			if user_data and user_data[node] then
36
+				local id, item = unpack(user_data[node]);
37
+				if not requested_id or id == requested_id then
38
+					local stanza = st.reply(stanza)
39
+						:tag('pubsub', {xmlns='http://jabber.org/protocol/pubsub'})
40
+							:tag('items', {node=node})
41
+								:add_child(item)
42
+							:up()
43
+						:up();
44
+					session.send(stanza);
45
+					module:log("debug","provided access to omemo node",node)
46
+					return true;
47
+				end
48
+			end
49
+			module:log("debug","requested node was white listed", node)
50
+		end
51
+	end
52
+end
53
+
54
+module:hook("iq/bare/http://jabber.org/protocol/pubsub:pubsub", on_pep_request, 10);
55
+module:hook("account-disco-info", on_account_disco_info);

+ 38
- 0
src/freedombone-app-xmpp Voir le fichier

@@ -326,6 +326,43 @@ function update_prosody_modules {
326 326
         return
327 327
     fi
328 328
 
329
+    # This module is a workaround for OMEMO within group chat
330
+    # See https://github.com/iNPUTmice/omemo_all_access
331
+    if [ -f ~/freedombone/image_build/mod_omemo_all_access.lua ]; then
332
+        if [ ! -d /var/lib/prosody/prosody-modules ]; then
333
+            mkdir -p /var/lib/prosody/prosody-modules
334
+        fi
335
+
336
+        copy_omemo_all_access=1
337
+        if [ -f /usr/lib/prosody/modules/mod_omemo_all_access.lua ]; then
338
+            curr_hash=$(sha256sum /usr/lib/prosody/modules/mod_omemo_all_access.lua)
339
+            new_hash=$(sha256sum ~/freedombone/image_build/mod_omemo_all_access.lua)
340
+            if [[ "$curr_hash" == "$new_hash" ]]; then
341
+                copy_omemo_all_access=
342
+            fi
343
+        fi
344
+
345
+        if [ $copy_omemo_all_access ]; then
346
+            systemctl stop prosody
347
+            cp ~/freedombone/image_build/mod_omemo_all_access.lua /var/lib/prosody/prosody-modules/mod_omemo_all_access.lua
348
+            cp ~/freedombone/image_build/mod_omemo_all_access.lua /usr/lib/prosody/modules/mod_omemo_all_access.lua
349
+
350
+            if ! grep -q "omemo_all_access" /etc/prosody/prosody.cfg.lua; then
351
+                sed -i '/"pep";/a "omemo_all_access"; -- Fix for PEP with OMEMO' /etc/prosody/prosody.cfg.lua
352
+                sed -i 's|"omemo_all_access";|  "omemo_all_access";|g' /etc/prosody/prosody.cfg.lua
353
+            fi
354
+
355
+            if ! grep -q "omemo_all_access" /etc/prosody/conf.avail/xmpp.cfg.lua; then
356
+                sed -i '/"pep";/a "omemo_all_access"; -- Fix for PEP with OMEMO' /etc/prosody/conf.avail/xmpp.cfg.lua
357
+                sed -i 's|"omemo_all_access";|  "omemo_all_access";|g' /etc/prosody/conf.avail/xmpp.cfg.lua
358
+            fi
359
+
360
+            chown -R prosody:prosody /var/lib/prosody/prosody-modules
361
+            chown -R prosody:prosody /usr/lib/prosody/modules
362
+            systemctl start prosody
363
+        fi
364
+    fi
365
+
329 366
     if [ ! -f $INSTALL_DIR/$prosody_modules_filename ]; then
330 367
         # Obtain the modules
331 368
         if [ -f ~/freedombone/image_build/$prosody_modules_filename ]; then
@@ -624,6 +661,7 @@ function xmpp_modules {
624 661
     echo '  "smacks"; -- Stream management' >> $filename
625 662
     echo '  "smacks_offline"; -- Stream management' >> $filename
626 663
     echo '  "pep"; -- Personal Eventing Protocol (to support OMEMO)' >> $filename
664
+    echo '  "omemo_all_access"; -- Fix for PEP with OMEMO' >> $filename
627 665
     echo '  "vcard"; -- Personal Eventing Protocol (to support OMEMO)' >> $filename
628 666
     echo '  "e2e_policy"; -- To support OMEMO' >> $filename
629 667
     echo '  "pep_vcard_avatar"; -- Personal Eventing Protocol (to support OMEMO)' >> $filename