draft: gestion des clés ssh
This commit is contained in:
parent
f826e0ebc6
commit
6d0d6a57a0
1 changed files with 55 additions and 17 deletions
72
client.py
72
client.py
|
@ -652,39 +652,77 @@ def show_file(options):
|
||||||
return
|
return
|
||||||
passfile = value
|
passfile = value
|
||||||
(sin, sout) = gpg(options, 'decrypt')
|
(sin, sout) = gpg(options, 'decrypt')
|
||||||
content = passfile['contents'] # Kludge (broken db ?)
|
content = passfile['contents']
|
||||||
|
|
||||||
|
# Kludge (broken db ?)
|
||||||
if type(content) == list:
|
if type(content) == list:
|
||||||
print("Eau dans le gaz")
|
print("Eau dans le gaz")
|
||||||
content = content[-1]
|
content = content[-1]
|
||||||
|
|
||||||
|
# Déchiffre le contenu
|
||||||
sin.write(content.encode("utf-8"))
|
sin.write(content.encode("utf-8"))
|
||||||
sin.close()
|
sin.close()
|
||||||
texte = sout.read().decode("utf-8")
|
texte = sout.read().decode("utf-8")
|
||||||
ntexte = u""
|
|
||||||
hidden = False # Est-ce que le mot de passe a été caché ?
|
# Est-ce une clé ssh ?
|
||||||
lines = texte.split('\n')
|
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
|
old_clipboard = None
|
||||||
for line in lines:
|
|
||||||
|
# Essaie de planquer le mot de passe
|
||||||
|
for line in texte.split('\n'):
|
||||||
catchPass = None
|
catchPass = None
|
||||||
# On essaie de trouver le pass pour le cacher dans le clipboard
|
# On essaie de trouver le pass pour le cacher dans le clipboard
|
||||||
# si ce n'est déjà fait et si c'est voulu
|
# 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)
|
catchPass = pass_regexp.match(line)
|
||||||
if catchPass != None:
|
if catchPass != None:
|
||||||
hidden = True
|
is_hidden = True
|
||||||
# On met le mdp dans le clipboard en mémorisant sont ancien contenu
|
# On met le mdp dans le clipboard en mémorisant son ancien contenu
|
||||||
old_clipboard = clipboard(catchPass.group(1))
|
old_clipboard = clipboard(catchPass.group(1))
|
||||||
# Et donc on override l'affichage
|
# Et donc on override l'affichage
|
||||||
line = u"[Le mot de passe a été mis dans le presse papier]"
|
line = u"[Le mot de passe a été mis dans le presse papier]"
|
||||||
ntexte += line + '\n'
|
filtered += line + '\n'
|
||||||
showbin = "cat" if hidden else "less"
|
|
||||||
proc = subprocess.Popen([showbin], stdin=subprocess.PIPE)
|
if is_key:
|
||||||
out = proc.stdin
|
filtered = u"La clé a été mise dans l'agent ssh"
|
||||||
raw = u"Fichier %s:\n\n%s-----\nVisible par: %s\n" % (fname, ntexte, ','.join(passfile['roles']))
|
shown = u"Fichier %s:\n\n%s-----\nVisible par: %s\n" % (fname, filtered, ','.join(passfile['roles']))
|
||||||
out.write(raw.encode("utf-8"))
|
|
||||||
out.close()
|
if is_key:
|
||||||
os.waitpid(proc.pid, 0)
|
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
|
# Repope ancien pass
|
||||||
if options.clipboard:
|
if old_clipboard:
|
||||||
saveclipboard(restore=True, old_clipboard=old_clipboard)
|
saveclipboard(restore=True, old_clipboard=old_clipboard)
|
||||||
|
|
||||||
@need_filename
|
@need_filename
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue