diff --git a/client.py b/client.py index 99cdb36..855fcd9 100755 --- a/client.py +++ b/client.py @@ -298,7 +298,7 @@ def remote_command(options, command, arg=None, stdin_contents=None): commande""" detail = options.verbose and not options.quiet keep_alive = options.serverdata.get('keep-alive', False) - + if keep_alive: conn = get_keep_alive_connection(options) args = filter(None, [arg, stdin_contents]) @@ -396,9 +396,9 @@ def gen_password(): def update_keys(options): """Met à jour les clés existantes""" - + keys = all_keys(options) - + _, stdout = gpg(options, "receive-keys", [key for _, key in keys.values() if key]) return stdout.read().decode("utf-8") @@ -427,7 +427,7 @@ def _check_encryptable(key): 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, et que la clé est de confiance (et non expirée/révoquée). - + * Si ``recipients`` est fourni, vérifie seulement ces recipients. 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. @@ -510,7 +510,7 @@ def get_dest_of_roles(options, roles): def encrypt(options, roles, contents): """Chiffre le contenu pour les roles donnés""" - + allkeys = all_keys(options) recipients = get_recipients_of_roles(options, roles) recipients = check_keys(options, recipients=recipients, quiet=True) @@ -520,7 +520,7 @@ def encrypt(options, roles, contents): if fpr: fpr_recipients.append("-r") fpr_recipients.append(fpr) - + stdin, stdout = gpg(options, "encrypt", fpr_recipients) stdin.write(contents.encode("utf-8")) stdin.close() @@ -565,7 +565,7 @@ def editor(texte, annotations=u""): """ Lance $EDITOR sur texte. 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 # for annotations ... f = tempfile.NamedTemporaryFile(suffix='.txt') @@ -573,7 +573,7 @@ def editor(texte, annotations=u""): if annotations: annotations = "# " + annotations.replace("\n", "\n# ") # Usually, there is already an ending newline in a text document - if texte[-1] != '\n': + if texte and texte[-1] != '\n': annotations = '\n' + annotations else: annotations += '\n' @@ -599,7 +599,7 @@ def show_files(options): access = set(my_roles).intersection(froles) != set([]) 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")) - + def show_roles(options): """Affiche la liste des roles existants""" 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),) if not confirm(options, message): return - + annotations += u"""Ce fichier sera chiffré pour les rôles suivants :\n%s\n C'est-à-dire pour les utilisateurs suivants :\n%s""" % ( ', '.join(new_roles), '\n'.join(' %s' % rec for rec in get_dest_of_roles(options, new_roles)) ) - + ntexte = editor(texte, annotations) - + 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, 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: # Sans précisions, on prend tous les roles qu'on peut rechiffre_roles = my_roles_w - + # La liste des fichiers allfiles = all_files(options) @@ -861,9 +861,9 @@ def parse_roles(options, cast=False): vaut None, alors on considère cette valeur comme valide. Cependant, si ``cast`` est vraie, cette valeur est remplacée par tous les roles en écriture (*-w) de l'utilisateur. - + Renvoie ``False`` si au moins un de ces rôles pose problème. - + poser problème, c'est : * être un role-w (il faut utiliser le role sans le w) * ne pas exister dans la config du serveur @@ -966,10 +966,10 @@ if __name__ == "__main__": parser.add_argument('fname', nargs='?', default=None, type=lambda x: x.decode('utf-8'), help="Nom du fichier à afficher") - + # On parse les options fournies en commandline options = parser.parse_args(sys.argv[1:]) - + ## 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 ## 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. if options.action != show_servers: options.roles = parse_roles(options) - + # 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. if options.action in NEED_FILENAME: insult_on_nofilename(options, parser) - + # On exécute l'action demandée options.action(options)