From c79528f64647ca1b701c8ab87c1266a3d9075f64 Mon Sep 17 00:00:00 2001
From: Yann Leboulanger <asterix@lagaule.org>
Date: Sat, 26 Mar 2011 22:35:13 +0100
Subject: [PATCH] [kepi] ability to use subkeys. Fixes #6051

---
 src/common/gnupg.py   |  7 ++++++-
 src/common/helpers.py | 13 +++++++++++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/common/gnupg.py b/src/common/gnupg.py
index e319a3d4b4..3ac4316279 100644
--- a/src/common/gnupg.py
+++ b/src/common/gnupg.py
@@ -488,7 +488,7 @@ class GPG(object):
         result = ListKeys()
         self._collect_output(p, result, stdin=p.stdin)
         lines = result.data.decode(self.encoding).splitlines()
-        valid_keywords = 'pub uid sec fpr'.split()
+        valid_keywords = 'pub uid sec fpr sub'.split()
         for line in lines:
             if self.verbose:
                 print(line)
@@ -830,6 +830,7 @@ class ListKeys(list):
         if self.curkey['uid']:
             self.curkey['uids'].append(self.curkey['uid'])
         del self.curkey['uid']
+        self.curkey['subkeys'] = []
         self.append(self.curkey)
 
     pub = sec = key
@@ -842,6 +843,10 @@ class ListKeys(list):
         self.curkey['uids'].append(args[9])
         self.uids.append(args[9])
 
+    def sub(self, args):
+        subkey = [args[4],args[11]]
+        self.curkey['subkeys'].append(subkey)
+
     def handle_status(self, key, value):
         pass
 
diff --git a/src/common/helpers.py b/src/common/helpers.py
index 518e1d3c4f..8699544730 100644
--- a/src/common/helpers.py
+++ b/src/common/helpers.py
@@ -1261,8 +1261,17 @@ def prepare_and_validate_gpg_keyID(account, jid, keyID):
         if jid in attached_keys and keyID:
             attachedkeyID = attached_keys[attached_keys.index(jid) + 1]
             if attachedkeyID != keyID:
-                # Mismatch! Another gpg key was expected
-                keyID += 'MISMATCH'
+                # Get signing subkeys for the attached key
+                subkeys = []
+                for key in gajim.connections[account].gpg.list_keys():
+                    if key['keyid'][8:] == attachedkeyID:
+                        subkeys = [subkey[0][8:] for subkey in key['subkeys'] \
+                            if subkey[1] == 's']
+                        break
+
+                if keyID not in subkeys:
+                    # Mismatch! Another gpg key was expected
+                    keyID += 'MISMATCH'
         elif jid in attached_keys:
             # An unsigned presence, just use the assigned key
             keyID = attached_keys[attached_keys.index(jid) + 1]
-- 
GitLab