From 1dce8eb8c864ba6b48001e3b7fa02ba10458f828 Mon Sep 17 00:00:00 2001
From: Vincent Le Gallic <legallic@crans.org>
Date: Tue, 30 Jul 2013 05:55:17 +0200
Subject: [PATCH] =?UTF-8?q?On=20checke=20enfin=20les=20expiration/confianc?=
 =?UTF-8?q?e=20sur=20les=20sous-cl=C3=A9s.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 client.py | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/client.py b/client.py
index b89a477..930205c 100755
--- a/client.py
+++ b/client.py
@@ -322,6 +322,28 @@ def update_keys(options):
     _, stdout = gpg(options, "receive-keys", [key for _, key in keys.values() if key])
     return stdout.read().decode("utf-8")
 
+def _check_encryptable(key):
+    """Vérifie qu'on peut chiffrer un message pour ``key``.
+       C'est-à-dire, que la clé est de confiance (et non expirée).
+       Puis qu'on peut chiffrer avec, ou qu'au moins une de ses subkeys est de chiffrement (capability e)
+       et est de confiance et n'est pas expirée"""
+    # Il faut avoir confiance la clé…
+    meaning, trustvalue = GPG_TRUSTLEVELS[key[u"trustletter"]]
+    if not trustvalue:
+        return u"La confiance en la clé est : %s" % (meaning,)
+    # …et pouvoir chiffrer avec…
+    if u"e" in key[u"capabilities"]:
+        # …soit directement…
+        return u""
+    # …soit avec une de ses subkeys
+    esubkeys = [sub for sub in key[u"subkeys"] if u"e" in sub[u"capabilities"]]
+    if len(esubkeys) == 0:
+        return u"La clé principale de permet pas de chiffrer et auncune sous-clé de chiffrement."
+    if any([GPG_TRUSTLEVELS[sub[u"trustletter"]][1] for sub in esubkeys]):
+        return u""
+    else:
+        return u"Aucune sous clé de chiffrement n'est de confiance et non expirée."
+
 def check_keys(options, recipients=None, quiet=False):
     """Vérifie les clés, c'est-à-dire, si le mail est présent dans les identités du fingerprint,
        et que la clé est de confiance (et non expirée/révoquée).
@@ -355,11 +377,9 @@ def check_keys(options, recipients=None, quiet=False):
                 if any([u"<%s>" % (mail,) in u["uid"] for u in key["uids"]]):
                     if speak:
                         print("M ", end="")
-                    meaning, trustvalue = GPG_TRUSTLEVELS[key["trustletter"]]
-                    # … et qu'on lui fait confiance
-                    if not trustvalue:
-                        failed = u"La confiance en la clé est : %s" % (meaning,)
-                    elif speak:
+                    # … et qu'on peut raisonnablement chiffrer pour lui
+                    failed = _check_encryptable(key)
+                    if not failed and speak:
                         print("C ", end="")
                 else:
                     failed = u"!! Le fingerprint et le mail ne correspondent pas !"
-- 
GitLab