draft: gestion des clés ssh
This commit is contained in:
parent
f826e0ebc6
commit
6d0d6a57a0
1 changed files with 55 additions and 17 deletions
64
client.py
64
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"
|
||||
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
|
||||
raw = u"Fichier %s:\n\n%s-----\nVisible par: %s\n" % (fname, ntexte, ','.join(passfile['roles']))
|
||||
out.write(raw.encode("utf-8"))
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue