Le texte retourné quand on édite peut être vide.
* Par exemple, si le fichier n'est pas chiffré pour ma clef.
This commit is contained in:
parent
58b5bf90a2
commit
e8ea0074e9
1 changed files with 19 additions and 19 deletions
38
client.py
38
client.py
|
@ -298,7 +298,7 @@ def remote_command(options, command, arg=None, stdin_contents=None):
|
||||||
commande"""
|
commande"""
|
||||||
detail = options.verbose and not options.quiet
|
detail = options.verbose and not options.quiet
|
||||||
keep_alive = options.serverdata.get('keep-alive', False)
|
keep_alive = options.serverdata.get('keep-alive', False)
|
||||||
|
|
||||||
if keep_alive:
|
if keep_alive:
|
||||||
conn = get_keep_alive_connection(options)
|
conn = get_keep_alive_connection(options)
|
||||||
args = filter(None, [arg, stdin_contents])
|
args = filter(None, [arg, stdin_contents])
|
||||||
|
@ -396,9 +396,9 @@ def gen_password():
|
||||||
|
|
||||||
def update_keys(options):
|
def update_keys(options):
|
||||||
"""Met à jour les clés existantes"""
|
"""Met à jour les clés existantes"""
|
||||||
|
|
||||||
keys = all_keys(options)
|
keys = all_keys(options)
|
||||||
|
|
||||||
_, stdout = gpg(options, "receive-keys", [key for _, key in keys.values() if key])
|
_, stdout = gpg(options, "receive-keys", [key for _, key in keys.values() if key])
|
||||||
return stdout.read().decode("utf-8")
|
return stdout.read().decode("utf-8")
|
||||||
|
|
||||||
|
@ -427,7 +427,7 @@ def _check_encryptable(key):
|
||||||
def check_keys(options, recipients=None, quiet=False):
|
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,
|
"""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).
|
et que la clé est de confiance (et non expirée/révoquée).
|
||||||
|
|
||||||
* Si ``recipients`` est fourni, vérifie seulement ces recipients.
|
* Si ``recipients`` est fourni, vérifie seulement ces recipients.
|
||||||
Renvoie la liste de ceux qu'on n'a pas droppés.
|
Renvoie la liste de ceux qu'on n'a pas droppés.
|
||||||
* Si ``options.force=False``, demandera confirmation pour dropper un recipient dont la clé est invalide.
|
* Si ``options.force=False``, demandera confirmation pour dropper un recipient dont la clé est invalide.
|
||||||
|
@ -510,7 +510,7 @@ def get_dest_of_roles(options, roles):
|
||||||
|
|
||||||
def encrypt(options, roles, contents):
|
def encrypt(options, roles, contents):
|
||||||
"""Chiffre le contenu pour les roles donnés"""
|
"""Chiffre le contenu pour les roles donnés"""
|
||||||
|
|
||||||
allkeys = all_keys(options)
|
allkeys = all_keys(options)
|
||||||
recipients = get_recipients_of_roles(options, roles)
|
recipients = get_recipients_of_roles(options, roles)
|
||||||
recipients = check_keys(options, recipients=recipients, quiet=True)
|
recipients = check_keys(options, recipients=recipients, quiet=True)
|
||||||
|
@ -520,7 +520,7 @@ def encrypt(options, roles, contents):
|
||||||
if fpr:
|
if fpr:
|
||||||
fpr_recipients.append("-r")
|
fpr_recipients.append("-r")
|
||||||
fpr_recipients.append(fpr)
|
fpr_recipients.append(fpr)
|
||||||
|
|
||||||
stdin, stdout = gpg(options, "encrypt", fpr_recipients)
|
stdin, stdout = gpg(options, "encrypt", fpr_recipients)
|
||||||
stdin.write(contents.encode("utf-8"))
|
stdin.write(contents.encode("utf-8"))
|
||||||
stdin.close()
|
stdin.close()
|
||||||
|
@ -565,7 +565,7 @@ def editor(texte, annotations=u""):
|
||||||
""" Lance $EDITOR sur texte.
|
""" Lance $EDITOR sur texte.
|
||||||
Renvoie le nouveau texte si des modifications ont été apportées, ou None
|
Renvoie le nouveau texte si des modifications ont été apportées, ou None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Avoid syntax hilight with ".txt". Would be nice to have some colorscheme
|
# Avoid syntax hilight with ".txt". Would be nice to have some colorscheme
|
||||||
# for annotations ...
|
# for annotations ...
|
||||||
f = tempfile.NamedTemporaryFile(suffix='.txt')
|
f = tempfile.NamedTemporaryFile(suffix='.txt')
|
||||||
|
@ -573,7 +573,7 @@ def editor(texte, annotations=u""):
|
||||||
if annotations:
|
if annotations:
|
||||||
annotations = "# " + annotations.replace("\n", "\n# ")
|
annotations = "# " + annotations.replace("\n", "\n# ")
|
||||||
# Usually, there is already an ending newline in a text document
|
# Usually, there is already an ending newline in a text document
|
||||||
if texte[-1] != '\n':
|
if texte and texte[-1] != '\n':
|
||||||
annotations = '\n' + annotations
|
annotations = '\n' + annotations
|
||||||
else:
|
else:
|
||||||
annotations += '\n'
|
annotations += '\n'
|
||||||
|
@ -599,7 +599,7 @@ def show_files(options):
|
||||||
access = set(my_roles).intersection(froles) != set([])
|
access = set(my_roles).intersection(froles) != set([])
|
||||||
print((u" %s %s (%s)" % ((access and '+' or '-'), fname, ", ".join(froles))).encode("utf-8"))
|
print((u" %s %s (%s)" % ((access and '+' or '-'), fname, ", ".join(froles))).encode("utf-8"))
|
||||||
print((u"""--Mes roles: %s""" % (", ".join(my_roles),)).encode("utf-8"))
|
print((u"""--Mes roles: %s""" % (", ".join(my_roles),)).encode("utf-8"))
|
||||||
|
|
||||||
def show_roles(options):
|
def show_roles(options):
|
||||||
"""Affiche la liste des roles existants"""
|
"""Affiche la liste des roles existants"""
|
||||||
print(u"Liste des roles disponibles".encode("utf-8"))
|
print(u"Liste des roles disponibles".encode("utf-8"))
|
||||||
|
@ -746,15 +746,15 @@ Enregistrez le fichier vide pour annuler.\n"""
|
||||||
message = message % (", ".join(r[:-2] for r in my_roles if '-w' in r),)
|
message = message % (", ".join(r[:-2] for r in my_roles if '-w' in r),)
|
||||||
if not confirm(options, message):
|
if not confirm(options, message):
|
||||||
return
|
return
|
||||||
|
|
||||||
annotations += u"""Ce fichier sera chiffré pour les rôles suivants :\n%s\n
|
annotations += u"""Ce fichier sera chiffré pour les rôles suivants :\n%s\n
|
||||||
C'est-à-dire pour les utilisateurs suivants :\n%s""" % (
|
C'est-à-dire pour les utilisateurs suivants :\n%s""" % (
|
||||||
', '.join(new_roles),
|
', '.join(new_roles),
|
||||||
'\n'.join(' %s' % rec for rec in get_dest_of_roles(options, new_roles))
|
'\n'.join(' %s' % rec for rec in get_dest_of_roles(options, new_roles))
|
||||||
)
|
)
|
||||||
|
|
||||||
ntexte = editor(texte, annotations)
|
ntexte = editor(texte, annotations)
|
||||||
|
|
||||||
if ((not nfile and ntexte in [u'', texte] # pas nouveau, vidé ou pas modifié
|
if ((not nfile and ntexte in [u'', texte] # pas nouveau, vidé ou pas modifié
|
||||||
and set(new_roles) == set(passfile['roles'])) # et on n'a même pas touché à ses rôles,
|
and set(new_roles) == set(passfile['roles'])) # et on n'a même pas touché à ses rôles,
|
||||||
or (nfile and ntexte == u'')): # ou alors on a créé un fichier vide.
|
or (nfile and ntexte == u'')): # ou alors on a créé un fichier vide.
|
||||||
|
@ -809,7 +809,7 @@ def recrypt_files(options, strict=False):
|
||||||
if rechiffre_roles == None:
|
if rechiffre_roles == None:
|
||||||
# Sans précisions, on prend tous les roles qu'on peut
|
# Sans précisions, on prend tous les roles qu'on peut
|
||||||
rechiffre_roles = my_roles_w
|
rechiffre_roles = my_roles_w
|
||||||
|
|
||||||
# La liste des fichiers
|
# La liste des fichiers
|
||||||
allfiles = all_files(options)
|
allfiles = all_files(options)
|
||||||
|
|
||||||
|
@ -861,9 +861,9 @@ def parse_roles(options, cast=False):
|
||||||
vaut None, alors on considère cette valeur comme valide.
|
vaut None, alors on considère cette valeur comme valide.
|
||||||
Cependant, si ``cast`` est vraie, cette valeur est remplacée par
|
Cependant, si ``cast`` est vraie, cette valeur est remplacée par
|
||||||
tous les roles en écriture (*-w) de l'utilisateur.
|
tous les roles en écriture (*-w) de l'utilisateur.
|
||||||
|
|
||||||
Renvoie ``False`` si au moins un de ces rôles pose problème.
|
Renvoie ``False`` si au moins un de ces rôles pose problème.
|
||||||
|
|
||||||
poser problème, c'est :
|
poser problème, c'est :
|
||||||
* être un role-w (il faut utiliser le role sans le w)
|
* être un role-w (il faut utiliser le role sans le w)
|
||||||
* ne pas exister dans la config du serveur
|
* ne pas exister dans la config du serveur
|
||||||
|
@ -966,10 +966,10 @@ if __name__ == "__main__":
|
||||||
parser.add_argument('fname', nargs='?', default=None,
|
parser.add_argument('fname', nargs='?', default=None,
|
||||||
type=lambda x: x.decode('utf-8'),
|
type=lambda x: x.decode('utf-8'),
|
||||||
help="Nom du fichier à afficher")
|
help="Nom du fichier à afficher")
|
||||||
|
|
||||||
# On parse les options fournies en commandline
|
# On parse les options fournies en commandline
|
||||||
options = parser.parse_args(sys.argv[1:])
|
options = parser.parse_args(sys.argv[1:])
|
||||||
|
|
||||||
## On calcule les options qui dépendent des autres.
|
## On calcule les options qui dépendent des autres.
|
||||||
## C'est un peu un hack, peut-être que la méthode propre serait de surcharger argparse.ArgumentParser
|
## C'est un peu un hack, peut-être que la méthode propre serait de surcharger argparse.ArgumentParser
|
||||||
## et argparse.Namespace, mais j'ai pas réussi à comprendre commenr m'en sortir.
|
## et argparse.Namespace, mais j'ai pas réussi à comprendre commenr m'en sortir.
|
||||||
|
@ -991,11 +991,11 @@ if __name__ == "__main__":
|
||||||
# Il faudrait ptêtre faire ça plus proprement, en attendant, je ducktape.
|
# Il faudrait ptêtre faire ça plus proprement, en attendant, je ducktape.
|
||||||
if options.action != show_servers:
|
if options.action != show_servers:
|
||||||
options.roles = parse_roles(options)
|
options.roles = parse_roles(options)
|
||||||
|
|
||||||
# Si l'utilisateur a demandé une action qui nécessite un nom de fichier,
|
# Si l'utilisateur a demandé une action qui nécessite un nom de fichier,
|
||||||
# on vérifie qu'il a bien fourni un nom de fichier.
|
# on vérifie qu'il a bien fourni un nom de fichier.
|
||||||
if options.action in NEED_FILENAME:
|
if options.action in NEED_FILENAME:
|
||||||
insult_on_nofilename(options, parser)
|
insult_on_nofilename(options, parser)
|
||||||
|
|
||||||
# On exécute l'action demandée
|
# On exécute l'action demandée
|
||||||
options.action(options)
|
options.action(options)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue