Revert "Unicodification : fix; gestion de messages d'erreur; ajout du CA"

This reverts commit bbc6cb73f6.

Conflicts:
	serverconfig.example.py
This commit is contained in:
Vincent Le Gallic 2013-07-28 01:58:07 +02:00
parent 37db7b58c6
commit 555b6c4c0a
3 changed files with 62 additions and 79 deletions

View file

@ -55,7 +55,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 demander confirmation» #: Mode «ne pas demaner 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
@ -264,10 +264,8 @@ def put_password(name, roles, contents):
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"""
gotit, remotefile = get_file(name) remotefile = get_file(name)
if gotit: return decrypt(remotefile['contents'])
remotefile = decrypt(remotefile['contents'])
return [gotit, remotefile]
###### ######
## Interface ## Interface
@ -291,7 +289,9 @@ 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')))
return ntexte if texte != 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"""
@ -309,9 +309,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, usernames) in all_roles().iteritems(): for role in all_roles().keys():
if not role.endswith('-w'): if not role.endswith('-w'):
print (u" * %s : %s" % (role, ", ".join(usernames))).encode("utf-8") print (u" * " + role ).encode("utf-8")
def show_servers(): def show_servers():
"""Affiche la liste des serveurs disponibles""" """Affiche la liste des serveurs disponibles"""
@ -348,9 +348,9 @@ def clipboard(texte):
def show_file(fname): def show_file(fname):
"""Affiche le contenu d'un fichier""" """Affiche le contenu d'un fichier"""
gotit, value = get_file(fname) value = get_file(fname)
if not gotit: if value == False:
print value.encode("utf-8") # value contient le message d'erreur print u"Fichier introuvable".encode("utf-8")
return return
(sin, sout) = gpg('decrypt') (sin, sout) = gpg('decrypt')
sin.write(value['contents'].encode("utf-8")) sin.write(value['contents'].encode("utf-8"))
@ -376,13 +376,13 @@ def show_file(fname):
def edit_file(fname): def edit_file(fname):
"""Modifie/Crée un fichier""" """Modifie/Crée un fichier"""
gotit, value = get_file(fname) value = get_file(fname)
nfile = False nfile = False
annotations = u"" annotations = u""
if not gotit and not "pas les droits" in value: if value == False:
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("Créer fichier ?"):
return return
annotations += u"""Ceci est un fichier initial contenant un mot de passe annotations += u"""Ceci est un fichier initial contenant un mot de passe
aléatoire, pensez à rajouter une ligne "login: ${login}" 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") 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"))
sin.close() sin.close()
texte = sout.read().decode("utf-8") texte = sout.read().decode("utf-8")
value['roles'] = NROLES or value['roles'] value['roles'] = NROLES or value['roles']
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(value['roles']), ', '.join(value['roles']),
@ -413,20 +410,21 @@ C'est-à-dire pour les utilisateurs suivants :\n%s""" % (
) )
ntexte = editor(texte, annotations) ntexte = editor(texte, annotations)
if ((not nfile and ntexte in [u'', texte] and NROLES == None) or # Fichier existant vidé ou inchangé if ntexte == None and not nfile and NROLES == None:
(nfile and ntexte == u'')): # Nouveau fichier créé vide print u"Pas de modifications effectuées".encode("utf-8")
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
success, message = put_password(fname, value['roles'], ntexte) if put_password(fname, value['roles'], ntexte):
print message.encode("utf-8") 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): def confirm(text):
"""Demande confirmation, sauf si on est mode ``FORCED``""" """Demande confirmation, sauf si on est mode ``FORCED``"""
if FORCED: return True if FORCED: return True
while 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': if out == 'o':
return True return True
elif out == 'n': elif out == 'n':
@ -434,10 +432,12 @@ 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): if not confirm((u'Êtes-vous sûr de vouloir supprimer %s ?' % fname).encode("utf-8")):
return return
message = rm_file(fname) if rm_file(fname):
print message.encode("utf-8") 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(): def my_check_keys():
@ -462,8 +462,7 @@ 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")
_, password = get_password(fname) put_password(fname, froles, 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

@ -66,10 +66,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, u"Vous n'avez pas les droits de lecture sur le fichier %s." % filename] return False
return [True, obj] return obj
except IOError: except IOError:
return [False, u"Le fichier %s n'existe pas." % filename] return False
def putfile(filename): def putfile(filename):
@ -81,38 +81,41 @@ 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, u"Entrée invalide"] return False
gotit, old = getfile(filename) try:
if not gotit: old = getfile(filename)
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, u"Modification effectuée."] return True
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"""
gotit, old = getfile(filename) try:
if not gotit: old = getfile(filename)
return old # contient le message d'erreur roles = old['roles']
roles = old['roles'] except TypeError:
if validate(roles, 'w'): return True
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: else:
return u"Vous n'avez pas les droits d'écriture sur le fichier %s." % filename if validate(roles,'w'):
return u"Suppression effectuée" 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): def backup(corps, fname, old):
"""Backupe l'ancienne version du fichier""" """Backupe l'ancienne version du fichier"""

View file

@ -67,12 +67,12 @@ KEYS = {
#: Les variables suivantes sont utilisées pour définir le dictionnaire des #: Les variables suivantes sont utilisées pour définir le dictionnaire des
#: rôles. #: rôles.
RTC = [ RTC=[
"samir" "iffrig"
] ]
#: Liste des usernames des nounous #: Liste des usernames des nounous
NOUNOUS = RTC + [ NOUNOUS=RTC+[
"blockelet", "blockelet",
"becue", "becue",
"dstan", "dstan",
@ -85,33 +85,14 @@ NOUNOUS = RTC + [
"parret-freaud", "parret-freaud",
"cauderlier", "cauderlier",
"maioli", "maioli",
"iffrig", "samir",
"boilard", "boilard",
"legallic", "legallic",
] ]
# Autogen: # Autogen:
#: Liste des usernames des apprentis #: Liste des usernames des apprentis
APPRENTIS = [ APPRENTIS=['grande', 'bonaque', 'moisy-mabille', 'baste', 'duplouy', 'besson', 'pvincent', 'quelennec', 'pommeret', 'guiraud', 'serrano', 'kherouf', 'randazzo', 'tilquin', 'lasseri', 'epalle', 'soret', 'gstalter', 'kviard']
'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 #: Liste des usernames des membres du CA
CA = [ CA = [