Unicodification : fix; gestion de messages d'erreur; ajout du CA
This commit is contained in:
parent
0e68a8e638
commit
bbc6cb73f6
3 changed files with 90 additions and 64 deletions
|
@ -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 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
|
||||||
|
@ -264,8 +264,10 @@ 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"""
|
||||||
remotefile = get_file(name)
|
gotit, remotefile = get_file(name)
|
||||||
return decrypt(remotefile['contents'])
|
if gotit:
|
||||||
|
remotefile = decrypt(remotefile['contents'])
|
||||||
|
return [gotit, remotefile]
|
||||||
|
|
||||||
######
|
######
|
||||||
## Interface
|
## Interface
|
||||||
|
@ -289,9 +291,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"""
|
||||||
|
@ -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 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"""
|
||||||
|
@ -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"""
|
||||||
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"))
|
||||||
|
@ -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"""
|
||||||
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("Créer fichier ?"):
|
if not confirm(u"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,6 +396,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"))
|
||||||
|
@ -411,20 +414,19 @@ 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``"""
|
||||||
if FORCED: return True
|
if FORCED: return True
|
||||||
while True:
|
while True:
|
||||||
out = raw_input((text + ' (O/N)').encode("utf-8")).lower()
|
out = raw_input((text + u' (O/N)').encode("utf-8")).lower()
|
||||||
if out == 'o':
|
if out == 'o':
|
||||||
return True
|
return True
|
||||||
elif out == 'n':
|
elif out == 'n':
|
||||||
|
@ -432,12 +434,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():
|
||||||
|
@ -462,7 +462,8 @@ def update_role():
|
||||||
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"""
|
||||||
|
|
31
server.py
31
server.py
|
@ -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
|
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):
|
||||||
|
@ -81,41 +81,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"""
|
||||||
|
|
|
@ -66,7 +66,7 @@ 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 = [
|
||||||
"iffrig"
|
"samir"
|
||||||
]
|
]
|
||||||
#: Liste des usernames des nounous
|
#: Liste des usernames des nounous
|
||||||
NOUNOUS = RTC + [
|
NOUNOUS = RTC + [
|
||||||
|
@ -82,17 +82,45 @@ NOUNOUS=RTC+[
|
||||||
"parret-freaud",
|
"parret-freaud",
|
||||||
"cauderlier",
|
"cauderlier",
|
||||||
"maioli",
|
"maioli",
|
||||||
"samir",
|
"iffrig",
|
||||||
"boilard",
|
"boilard",
|
||||||
"legallic",
|
"legallic",
|
||||||
]
|
]
|
||||||
|
|
||||||
# Autogen:
|
# Autogen:
|
||||||
#: Liste des usernames des apprentis
|
#: 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
|
#: Liste des usernames des membres du CA
|
||||||
CA = [
|
CA = [
|
||||||
|
"becue",
|
||||||
|
"duplouy",
|
||||||
|
"epalle",
|
||||||
|
"guiraud",
|
||||||
|
"lajus",
|
||||||
|
"lasseri",
|
||||||
|
"lerisson",
|
||||||
|
"randazzo",
|
||||||
|
"soret",
|
||||||
]
|
]
|
||||||
|
|
||||||
#: Les roles utilisés pour savoir qui a le droit le lire/écrire quoi
|
#: Les roles utilisés pour savoir qui a le droit le lire/écrire quoi
|
||||||
|
@ -101,6 +129,6 @@ ROLES = {
|
||||||
"ca-w": CA,
|
"ca-w": CA,
|
||||||
"nounous": NOUNOUS,
|
"nounous": NOUNOUS,
|
||||||
"nounous-w": NOUNOUS,
|
"nounous-w": NOUNOUS,
|
||||||
"apprentis-w": NOUNOUS,
|
|
||||||
"apprentis": NOUNOUS + APPRENTIS,
|
"apprentis": NOUNOUS + APPRENTIS,
|
||||||
|
"apprentis-w": NOUNOUS,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue