From 1c214f3eddf70c4b5fc5f972a15c12f1c85a1718 Mon Sep 17 00:00:00 2001
From: Maxime Bombar <bombar@crans.org>
Date: Sat, 27 Nov 2021 09:17:22 +0000
Subject: [PATCH] Porting commit c17458fc3286491b55cd479d230e0bf1591a7b3f to
 python3 version: Allows to display qrcode of the secret

---
 CHANGELOG            |  4 ++++
 cpasswords/client.py | 29 +++++++++++++++++++++++++----
 setup.py             |  2 +-
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index ce2f222..490106b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -12,6 +12,10 @@ cranspasswords possède plusieurs branches.
  * 0.1, 0.2,… : anciennes versions (si vieux serveur),
    ça n'intègre plus de nouvelles fonctionnalités, seulement d'éventuels bugfix.
 
+=== 0.3.0 ===
+
+Permet d'afficher le secret dans un qrcode.
+
 === 0.2.0 ===
 
 La configuration du client a changé de format,
diff --git a/cpasswords/client.py b/cpasswords/client.py
index 0e9e448..8fd6928 100755
--- a/cpasswords/client.py
+++ b/cpasswords/client.py
@@ -395,17 +395,20 @@ def show_file(options):
     old_clipboard = None
 
     # Essaie de planquer le mot de passe
+    secret = None
     for line in texte.split('\n'):
         catch_pass = None
         # On essaie de trouver le pass pour le cacher dans le clipboard
         # si ce n'est déjà fait et si c'est voulu
-        if not is_hidden and options.clipboard:
+        if not is_hidden and (options.clipboard or options.qrencode):
             catch_pass = pass_regexp.match(line)
         if catch_pass is not None:
             is_hidden = True
-            # On met le mdp dans le clipboard en mémorisant son ancien contenu
-            old_clipboard = saveclipboard()
-            pyperclip.copy(catch_pass.group(1))
+            secret = catch_pass.group(1)
+            if options.clipboard:
+                # On met le mdp dans le clipboard en mémorisant son ancien contenu
+                old_clipboard = saveclipboard()
+                pyperclip.copy(secret)
             # Et donc on override l'affichage
             line = "[Le mot de passe a été mis dans le presse papier]"
         filtered += line + '\n'
@@ -434,6 +437,8 @@ def show_file(options):
             pub_file.flush()
 
             subprocess.check_call(['ssh-add', '-d', pub_file.name])
+    elif options.qrencode and secret is not None:
+        showqr(secret)
     else:
         # Le binaire à utiliser
         showbin = "cat" if is_hidden else "less"
@@ -447,6 +452,15 @@ def show_file(options):
     if old_clipboard is not None:
         saveclipboard(restore=True, old_clipboard=old_clipboard)
 
+def showqr(secret):
+    qrencode = subprocess.Popen(['/usr/bin/qrencode', '-o', '-'],
+        stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+    feh = subprocess.Popen(['/usr/bin/feh', '--zoom', 'fill' '-'],
+        stdin=qrencode.stdout)
+    qrencode.stdin.write(secret.encode('utf-8'))
+    qrencode.stdin.flush()
+    qrencode.stdin.close()
+    feh.wait()
 
 @need_filename
 def show_minimal(options):
@@ -760,6 +774,13 @@ def main():
         dest='clipboard',
         help=_("do not try to store password in clipboard"),
     )
+    parser.add_argument(
+        '--qr',
+        action='store_true',
+        default=None,
+        dest='qrencode',
+        help=_("display a qrcode containing the secret"),
+    )
     parser.add_argument(
         '-f', '--force',
         action='store_true',
diff --git a/setup.py b/setup.py
index 8740212..73cbc80 100755
--- a/setup.py
+++ b/setup.py
@@ -31,7 +31,7 @@ def compile_messages():
 
 setup(
     name="cpasswords",
-    version="0.2.0",
+    version="0.3.0",
     description="Group password manager based on GPG",
     long_description=open('README.rst', encoding='utf-8').read(),
     author="CRANS",
-- 
GitLab