Gestion de message d'erreurs.

En quelque sorte un revert de 555b6c4c0a
qui revertait bbc6cb73f6.
Maintenant, ça marche.
This commit is contained in:
Vincent Le Gallic 2013-07-29 00:15:52 +02:00
parent c3c1115b39
commit 0bdf20357f
2 changed files with 69 additions and 68 deletions

View file

@ -65,7 +65,7 @@ GPG_TRUSTLEVELS = {
VERB = False VERB = False
#: Par défaut, place-t-on le mdp dans le presse-papier ? #: Par défaut, place-t-on le mdp dans le presse-papier ?
CLIPBOARD = bool(os.getenv('DISPLAY')) and os.path.exists('/usr/bin/xclip') CLIPBOARD = bool(os.getenv('DISPLAY')) and os.path.exists('/usr/bin/xclip')
#: Mode «ne pas demaner confirmation» #: Mode «ne pas demander confirmation»
FORCED = False FORCED = False
#: Droits à définir sur le fichier en édition #: Droits à définir sur le fichier en édition
NROLES = None NROLES = None
@ -255,11 +255,9 @@ def encrypt(roles, contents):
stdin.close() stdin.close()
out = stdout.read().decode("utf-8") out = stdout.read().decode("utf-8")
if out == '': if out == '':
if not QUIET: return [False, u"Échec de chiffrement"]
print(u"Échec de chiffrement".encode("utf-8"))
return None
else: else:
return out return [True, out]
def decrypt(contents): def decrypt(contents):
"""Déchiffre le contenu""" """Déchiffre le contenu"""
@ -271,20 +269,24 @@ def decrypt(contents):
def put_password(name, roles, contents): def put_password(name, roles, contents):
"""Dépose le mot de passe après l'avoir chiffré pour les """Dépose le mot de passe après l'avoir chiffré pour les
destinataires donnés""" destinataires donnés"""
enc_pwd = encrypt(roles, contents) success, enc_pwd_or_error = encrypt(roles, contents)
if NROLES != None: if NROLES != None:
roles = NROLES roles = NROLES
if VERB: if VERB:
print(u"Pas de nouveaux rôles".encode("utf-8")) print(u"Pas de nouveaux rôles".encode("utf-8"))
if enc_pwd <> None: if success:
enc_pwd = enc_pwd_or_error
return put_file(name, roles, enc_pwd) return put_file(name, roles, enc_pwd)
else: else:
return False error = enc_pwd_or_error
return [False, error]
def get_password(name): def get_password(name):
"""Récupère le mot de passe donné par name""" """Récupère le mot de passe donné par name"""
remotefile = get_file(name) gotit, remotefile = get_file(name)
return decrypt(remotefile['contents']) if gotit:
remotefile = decrypt(remotefile['contents'])
return [gotit, remotefile]
###### ######
## Interface ## Interface
@ -308,9 +310,7 @@ def editor(texte, annotations=u""):
ntexte = f.read().decode("utf-8") ntexte = f.read().decode("utf-8")
f.close() f.close()
ntexte = u'\n'.join(filter(lambda l: not l.startswith('#'), ntexte.split('\n'))) ntexte = u'\n'.join(filter(lambda l: not l.startswith('#'), ntexte.split('\n')))
if texte != ntexte:
return ntexte return ntexte
return None
def show_files(): def show_files():
"""Affiche la liste des fichiers disponibles sur le serveur distant""" """Affiche la liste des fichiers disponibles sur le serveur distant"""
@ -328,9 +328,9 @@ def show_files():
def show_roles(): def show_roles():
"""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"))
for role in all_roles().keys(): for (role, usernames) in all_roles().iteritems():
if not role.endswith('-w'): if not role.endswith('-w'):
print((u" * " + role ).encode("utf-8")) print((u" * %s : %s" % (role, ", ".join(usernames))).encode("utf-8"))
def show_servers(): def show_servers():
"""Affiche la liste des serveurs disponibles""" """Affiche la liste des serveurs disponibles"""
@ -367,9 +367,9 @@ def clipboard(texte):
def show_file(fname): def show_file(fname):
"""Affiche le contenu d'un fichier""" """Affiche le contenu d'un fichier"""
value = get_file(fname) gotit, value = get_file(fname)
if value == False: if not gotit:
print(u"Fichier introuvable".encode("utf-8")) print(value.encode("utf-8")) # value contient le message d'erreur
return return
(sin, sout) = gpg('decrypt') (sin, sout) = gpg('decrypt')
sin.write(value['contents'].encode("utf-8")) sin.write(value['contents'].encode("utf-8"))
@ -395,10 +395,10 @@ def show_file(fname):
def edit_file(fname): def edit_file(fname):
"""Modifie/Crée un fichier""" """Modifie/Crée un fichier"""
value = get_file(fname) gotit, value = get_file(fname)
nfile = False nfile = False
annotations = u"" annotations = u""
if value == False: if not gotit and not "pas les droits" in value:
nfile = True nfile = True
print(u"Fichier introuvable".encode("utf-8")) print(u"Fichier introuvable".encode("utf-8"))
if not confirm(u"Créer fichier ?"): if not confirm(u"Créer fichier ?"):
@ -415,6 +415,9 @@ Enregistrez le fichier vide pour annuler.\n"""
print(u"Vous ne possédez aucun rôle en écriture ! Abandon.".encode("utf-8")) print(u"Vous ne possédez aucun rôle en écriture ! Abandon.".encode("utf-8"))
return return
value = {'roles' : roles} value = {'roles' : roles}
elif not gotit:
print(value.encode("utf-8")) # value contient le message d'erreur
return
else: else:
(sin, sout) = gpg('decrypt') (sin, sout) = gpg('decrypt')
sin.write(value['contents'].encode("utf-8")) sin.write(value['contents'].encode("utf-8"))
@ -430,14 +433,13 @@ C'est-à-dire pour les utilisateurs suivants :\n%s""" % (
ntexte = editor(texte, annotations) ntexte = editor(texte, annotations)
if ntexte == None and not nfile and NROLES == None: if ((not nfile and ntexte in [u'', texte] and NROLES == None) or # Fichier existant vidé ou inchangé
print(u"Pas de modifications effectuées".encode("utf-8")) (nfile and ntexte == u'')): # Nouveau fichier créé vide
print(u"Pas de modification effectuée".encode("utf-8"))
else: else:
ntexte = texte if ntexte == None else ntexte ntexte = texte if ntexte == None else ntexte
if put_password(fname, value['roles'], ntexte): success, message = put_password(fname, value['roles'], ntexte)
print(u"Modifications enregistrées".encode("utf-8")) print(message.encode("utf-8"))
else:
print(u"Erreur lors de l'enregistrement (avez-vous les droits suffisants ?)".encode("utf-8"))
def confirm(text): def confirm(text):
"""Demande confirmation, sauf si on est mode ``FORCED``""" """Demande confirmation, sauf si on est mode ``FORCED``"""
@ -451,12 +453,10 @@ def confirm(text):
def remove_file(fname): def remove_file(fname):
"""Supprime un fichier""" """Supprime un fichier"""
if not confirm((u'Êtes-vous sûr de vouloir supprimer %s ?' % fname).encode("utf-8")): if not confirm(u'Êtes-vous sûr de vouloir supprimer %s ?' % fname):
return return
if rm_file(fname): message = rm_file(fname)
print(u"Suppression effectuée".encode("utf-8")) print(message.encode("utf-8"))
else:
print(u"Erreur de suppression (avez-vous les droits ?)".encode("utf-8"))
def my_check_keys(): def my_check_keys():
@ -482,7 +482,8 @@ def recrypt_files():
if set(roles).intersection(froles) == set([]): if set(roles).intersection(froles) == set([]):
continue continue
print((u"Rechiffrement de %s" % fname).encode("utf-8")) print((u"Rechiffrement de %s" % fname).encode("utf-8"))
put_password(fname, froles, get_password(fname)) _, password = get_password(fname)
put_password(fname, froles, password)
def parse_roles(strroles): def parse_roles(strroles):
"""Interprête une liste de rôles fournie par l'utilisateur""" """Interprête une liste de rôles fournie par l'utilisateur"""

View file

@ -72,10 +72,10 @@ def getfile(filename):
try: try:
obj = json.loads(open(filepath).read()) obj = json.loads(open(filepath).read())
if not validate(obj['roles']): if not validate(obj['roles']):
return False return [False, u"Vous n'avez pas les droits de lecture sur le fichier %s." % filename]
return obj return [True, obj]
except IOError: except IOError:
return False return [False, u"Le fichier %s n'existe pas." % filename]
def putfile(filename): def putfile(filename):
@ -87,41 +87,38 @@ def putfile(filename):
roles = parsed_stdin['roles'] roles = parsed_stdin['roles']
contents = parsed_stdin['contents'] contents = parsed_stdin['contents']
except KeyError: except KeyError:
return False return [False, u"Entrée invalide"]
try: gotit, old = getfile(filename)
old = getfile(filename) if not gotit:
oldroles = old['roles']
except TypeError:
old = u"[Création du fichier]" old = u"[Création du fichier]"
pass pass
else: else:
oldroles = old['roles']
if not validate(oldroles, 'w'): if not validate(oldroles, 'w'):
return False return [False, u"Vous n'avez pas le droit d'écriture sur %s." % filename]
corps = u"Le fichier %s a été modifié par %s." % (filename, MYUID) corps = u"Le fichier %s a été modifié par %s." % (filename, MYUID)
backup(corps, filename, old) backup(corps, filename, old)
notification(u"Modification de %s" % filename, corps, filename, old) notification(u"Modification de %s" % filename, corps, filename, old)
writefile(filepath, json.dumps({'roles': roles, 'contents': contents})) writefile(filepath, json.dumps({'roles': roles, 'contents': contents}))
return True return [True, u"Modification effectuée."]
def rmfile(filename): def rmfile(filename):
"""Supprime le fichier filename après avoir vérifié les droits sur le fichier""" """Supprime le fichier filename après avoir vérifié les droits sur le fichier"""
try: gotit, old = getfile(filename)
old = getfile(filename) if not gotit:
return old # contient le message d'erreur
roles = old['roles'] roles = old['roles']
except TypeError:
return True
else:
if validate(roles, 'w'): if validate(roles, 'w'):
corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID) corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID)
backup(corps, filename, old) backup(corps, filename, old)
notification(u"Suppression de %s" % filename, corps, filename, old) notification(u"Suppression de %s" % filename, corps, filename, old)
os.remove(getpath(filename)) os.remove(getpath(filename))
else: else:
return False return u"Vous n'avez pas les droits d'écriture sur le fichier %s." % filename
return True return u"Suppression effectuée"
def backup(corps, fname, old): def backup(corps, fname, old):
"""Backupe l'ancienne version du fichier""" """Backupe l'ancienne version du fichier"""
@ -164,20 +161,23 @@ if __name__ == "__main__":
except IndexError: except IndexError:
pass pass
answer = None
if command == "listroles": if command == "listroles":
print(json.dumps(listroles())) answer = listroles()
elif command == "listkeys": elif command == "listkeys":
print(json.dumps(listkeys())) answer = listkeys()
elif command == "listfiles": elif command == "listfiles":
print(json.dumps(listfiles())) answer = listfiles()
else: else:
if not filename: if not filename:
sys.exit(1) sys.exit(1)
if command == "getfile": if command == "getfile":
print(json.dumps(getfile(filename))) answer = getfile(filename)
elif command == "putfile": elif command == "putfile":
print(json.dumps(putfile(filename))) answer = putfile(filename)
elif command == "rmfile": elif command == "rmfile":
print(json.dumps(rmfile(filename))) answer = rmfile(filename)
else: else:
sys.exit(1) sys.exit(1)
if not answer is None:
print(json.dumps(answer))