From 6d0d6a57a0600333ab18c0ad98082066233f00f3 Mon Sep 17 00:00:00 2001 From: Daniel STAN Date: Tue, 10 Nov 2015 00:27:32 +0100 Subject: [PATCH] =?UTF-8?q?draft:=20gestion=20des=20cl=C3=A9s=20ssh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client.py | 72 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/client.py b/client.py index 5da07a8..ec8d29a 100755 --- a/client.py +++ b/client.py @@ -652,39 +652,77 @@ def show_file(options): return passfile = value (sin, sout) = gpg(options, 'decrypt') - content = passfile['contents'] # Kludge (broken db ?) + content = passfile['contents'] + + # Kludge (broken db ?) if type(content) == list: print("Eau dans le gaz") content = content[-1] + + # Déchiffre le contenu sin.write(content.encode("utf-8")) sin.close() texte = sout.read().decode("utf-8") - ntexte = u"" - hidden = False # Est-ce que le mot de passe a été caché ? - lines = texte.split('\n') + + # Est-ce une clé ssh ? + is_key = texte.startswith('-----BEGIN RSA PRIVATE KEY-----') + # Est-ce que le mot de passe a été caché ? (si non, on utilisera less) + is_hidden = is_key + # Texte avec mdp caché + filtered = u"" + # Ancien contenu du press papier old_clipboard = None - for line in lines: + + # Essaie de planquer le mot de passe + for line in texte.split('\n'): catchPass = 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 hidden and options.clipboard: + if not is_hidden and options.clipboard: catchPass = pass_regexp.match(line) if catchPass != None: - hidden = True - # On met le mdp dans le clipboard en mémorisant sont ancien contenu + is_hidden = True + # On met le mdp dans le clipboard en mémorisant son ancien contenu old_clipboard = clipboard(catchPass.group(1)) # Et donc on override l'affichage line = u"[Le mot de passe a été mis dans le presse papier]" - ntexte += line + '\n' - showbin = "cat" if hidden else "less" - proc = subprocess.Popen([showbin], stdin=subprocess.PIPE) - out = proc.stdin - raw = u"Fichier %s:\n\n%s-----\nVisible par: %s\n" % (fname, ntexte, ','.join(passfile['roles'])) - out.write(raw.encode("utf-8")) - out.close() - os.waitpid(proc.pid, 0) + filtered += line + '\n' + + if is_key: + filtered = u"La clé a été mise dans l'agent ssh" + shown = u"Fichier %s:\n\n%s-----\nVisible par: %s\n" % (fname, filtered, ','.join(passfile['roles'])) + + if is_key: + with tempfile.NamedTemporaryFile(suffix='') as key_file: + # Génère la clé publique correspondante + key_file.write(texte.encode('utf-8')) + key_file.flush() + pub = subprocess.check_output(['ssh-keygen', '-y', '-f', key_file.name]) + + # Charge en mémoire + subprocess.check_call(['ssh-add', key_file.name]) + + # On attend + print(shown.encode('utf-8')) + raw_input() + + # On met la clé publique en fichier puis on supprime + key_file.seek(0) + key_file.write(pub) + key_file.flush() + + subprocess.check_call(['ssh-add', '-d', key_file.name]) + else: + # Le binaire à utiliser + showbin = "cat" if is_hidden else "less" + proc = subprocess.Popen([showbin], stdin=subprocess.PIPE) + out = proc.stdin + out.write(shown.encode("utf-8")) + out.close() + os.waitpid(proc.pid, 0) + # Repope ancien pass - if options.clipboard: + if old_clipboard: saveclipboard(restore=True, old_clipboard=old_clipboard) @need_filename