diff --git a/cranspasswords.py b/cranspasswords.py index 827fffb76ed18d2916ca2f9eb7046ba70dd4fd0c..663e3a00828985b901acd3e23c8225bfb9f074c0 100755 --- a/cranspasswords.py +++ b/cranspasswords.py @@ -55,7 +55,7 @@ GPG_TRUSTLEVELS = { VERB = False #: Par défaut, place-t-on le mdp dans le presse-papier ? CLIPBOARD = bool(os.getenv('DISPLAY')) and os.path.exists('/usr/bin/xclip') -#: Mode «ne pas demander confirmation» +#: Mode «ne pas demaner confirmation» FORCED = False #: Droits à définir sur le fichier en édition NROLES = None @@ -264,10 +264,8 @@ def put_password(name, roles, contents): def get_password(name): """Récupère le mot de passe donné par name""" - gotit, remotefile = get_file(name) - if gotit: - remotefile = decrypt(remotefile['contents']) - return [gotit, remotefile] + remotefile = get_file(name) + return decrypt(remotefile['contents']) ###### ## Interface @@ -291,7 +289,9 @@ def editor(texte, annotations=u""): ntexte = f.read().decode("utf-8") f.close() ntexte = u'\n'.join(filter(lambda l: not l.startswith('#'), ntexte.split('\n'))) - return ntexte + if texte != ntexte: + return ntexte + return None def show_files(): """Affiche la liste des fichiers disponibles sur le serveur distant""" @@ -309,9 +309,9 @@ def show_files(): def show_roles(): """Affiche la liste des roles existants""" print u"Liste des roles disponibles".encode("utf-8") - for (role, usernames) in all_roles().iteritems(): + for role in all_roles().keys(): if not role.endswith('-w'): - print (u" * %s : %s" % (role, ", ".join(usernames))).encode("utf-8") + print (u" * " + role ).encode("utf-8") def show_servers(): """Affiche la liste des serveurs disponibles""" @@ -348,9 +348,9 @@ def clipboard(texte): def show_file(fname): """Affiche le contenu d'un fichier""" - gotit, value = get_file(fname) - if not gotit: - print value.encode("utf-8") # value contient le message d'erreur + value = get_file(fname) + if value == False: + print u"Fichier introuvable".encode("utf-8") return (sin, sout) = gpg('decrypt') sin.write(value['contents'].encode("utf-8")) @@ -376,13 +376,13 @@ def show_file(fname): def edit_file(fname): """Modifie/Crée un fichier""" - gotit, value = get_file(fname) + value = get_file(fname) nfile = False annotations = u"" - if not gotit and not "pas les droits" in value: + if value == False: nfile = True print u"Fichier introuvable".encode("utf-8") - if not confirm(u"Créer fichier ?"): + if not confirm("Créer fichier ?"): return annotations += u"""Ceci est un fichier initial contenant un mot de passe aléatoire, pensez à rajouter une ligne "login: ${login}" @@ -396,16 +396,13 @@ Enregistrez le fichier vide pour annuler.\n""" print u"Vous ne possédez aucun rôle en écriture ! Abandon.".encode("utf-8") return value = {'roles' : roles} - elif not gotit: - print value.encode("utf-8") # value contient le message d'erreur - return else: (sin, sout) = gpg('decrypt') sin.write(value['contents'].encode("utf-8")) sin.close() texte = sout.read().decode("utf-8") value['roles'] = NROLES or value['roles'] - + annotations += u"""Ce fichier sera chiffré pour les rôles suivants :\n%s\n C'est-à -dire pour les utilisateurs suivants :\n%s""" % ( ', '.join(value['roles']), @@ -413,20 +410,21 @@ C'est-à -dire pour les utilisateurs suivants :\n%s""" % ( ) ntexte = editor(texte, annotations) - - if ((not nfile and ntexte in [u'', texte] and NROLES == None) or # Fichier existant vidé ou inchangé - (nfile and ntexte == u'')): # Nouveau fichier créé vide - print u"Pas de modification effectuée".encode("utf-8") + + if ntexte == None and not nfile and NROLES == None: + print u"Pas de modifications effectuées".encode("utf-8") else: ntexte = texte if ntexte == None else ntexte - success, message = put_password(fname, value['roles'], ntexte) - print message.encode("utf-8") + if put_password(fname, value['roles'], ntexte): + print u"Modifications enregistrées".encode("utf-8") + else: + print u"Erreur lors de l'enregistrement (avez-vous les droits suffisants ?)".encode("utf-8") def confirm(text): """Demande confirmation, sauf si on est mode ``FORCED``""" if FORCED: return True while True: - out = raw_input((text + u' (O/N)').encode("utf-8")).lower() + out = raw_input((text + ' (O/N)').encode("utf-8")).lower() if out == 'o': return True elif out == 'n': @@ -434,10 +432,12 @@ def confirm(text): def remove_file(fname): """Supprime un fichier""" - if not confirm(u'Êtes-vous sûr de vouloir supprimer %s ?' % fname): + if not confirm((u'Êtes-vous sûr de vouloir supprimer %s ?' % fname).encode("utf-8")): return - message = rm_file(fname) - print message.encode("utf-8") + if rm_file(fname): + print u"Suppression effectuée".encode("utf-8") + else: + print u"Erreur de suppression (avez-vous les droits ?)".encode("utf-8") def my_check_keys(): @@ -462,8 +462,7 @@ def recrypt_files(): if set(roles).intersection(froles) == set([]): continue print (u"Rechiffrement de %s" % fname).encode("utf-8") - _, password = get_password(fname) - put_password(fname, froles, password) + put_password(fname, froles, get_password(fname)) def parse_roles(strroles): """Interprête une liste de rôles fournie par l'utilisateur""" diff --git a/server.py b/server.py index 829e337daa3ad26423bc057b60456939e0e89b41..5316d1c559a8a3b8839e8fe5b0b916cbe2fc82b2 100755 --- a/server.py +++ b/server.py @@ -66,10 +66,10 @@ def getfile(filename): try: obj = json.loads(open(filepath).read()) if not validate(obj['roles']): - return [False, u"Vous n'avez pas les droits de lecture sur le fichier %s." % filename] - return [True, obj] + return False + return obj except IOError: - return [False, u"Le fichier %s n'existe pas." % filename] + return False def putfile(filename): @@ -81,38 +81,41 @@ def putfile(filename): roles = parsed_stdin['roles'] contents = parsed_stdin['contents'] except KeyError: - return [False, u"Entrée invalide"] + return False - gotit, old = getfile(filename) - if not gotit: + try: + old = getfile(filename) + oldroles = old['roles'] + except TypeError: old = u"[Création du fichier]" pass else: - oldroles = old['roles'] - if not validate(oldroles, 'w'): - 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) - backup(corps, filename, old) - notification(u"Modification de %s" % filename, corps, filename, old) + if not validate(oldroles,'w'): + return False + + corps = u"Le fichier %s a été modifié par %s." % (filename, MYUID) + backup(corps, filename, old) + notification(u"Modification de %s" % filename, corps, filename, old) writefile(filepath, json.dumps({'roles': roles, 'contents': contents})) - return [True, u"Modification effectuée."] + return True def rmfile(filename): """Supprime le fichier filename après avoir vérifié les droits sur le fichier""" - gotit, old = getfile(filename) - if not gotit: - return old # contient le message d'erreur - roles = old['roles'] - if validate(roles, 'w'): - corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID) - backup(corps, filename, old) - notification(u"Suppression de %s" % filename, corps, filename, old) - os.remove(getpath(filename)) + try: + old = getfile(filename) + roles = old['roles'] + except TypeError: + return True else: - return u"Vous n'avez pas les droits d'écriture sur le fichier %s." % filename - return u"Suppression effectuée" + if validate(roles,'w'): + corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID) + backup(corps, filename, old) + notification(u"Suppression de %s" % filename, corps, filename, old) + os.remove(getpath(filename)) + else: + return False + return True def backup(corps, fname, old): """Backupe l'ancienne version du fichier""" diff --git a/serverconfig.example.py b/serverconfig.example.py index 769db06efb5ab8fb78ee2f309a66c4f7b0903ccb..cfc703f36319149e4a1aebbbc7517d8ab904a9ab 100755 --- a/serverconfig.example.py +++ b/serverconfig.example.py @@ -67,12 +67,12 @@ KEYS = { #: Les variables suivantes sont utilisées pour définir le dictionnaire des #: rôles. -RTC = [ - "samir" +RTC=[ + "iffrig" ] #: Liste des usernames des nounous -NOUNOUS = RTC + [ +NOUNOUS=RTC+[ "blockelet", "becue", "dstan", @@ -85,33 +85,14 @@ NOUNOUS = RTC + [ "parret-freaud", "cauderlier", "maioli", - "iffrig", + "samir", "boilard", "legallic", ] # Autogen: #: Liste des usernames des apprentis -APPRENTIS = [ - 'grande', - 'bonaque', - 'moisy-mabille', - 'baste', - 'duplouy', - 'besson', - 'pvincent', - 'quelennec', - 'pommeret', - 'guiraud', - 'serrano', - 'kherouf', - 'randazzo', - 'tilquin', - 'lasseri', - 'epalle', - 'soret', - 'gstalter', - 'kviard'] +APPRENTIS=['grande', 'bonaque', 'moisy-mabille', 'baste', 'duplouy', 'besson', 'pvincent', 'quelennec', 'pommeret', 'guiraud', 'serrano', 'kherouf', 'randazzo', 'tilquin', 'lasseri', 'epalle', 'soret', 'gstalter', 'kviard'] #: Liste des usernames des membres du CA CA = [