Unicodification : solving merge conflict due to cherry-pick

Conflicts:
	cranspasswords.py
This commit is contained in:
Vincent Le Gallic 2013-04-13 03:14:14 +02:00
parent d39b1b324b
commit 0e68a8e638
2 changed files with 85 additions and 91 deletions

View file

@ -70,9 +70,9 @@ def gpg(command, args = None):
if args: if args:
full_command.extend(args) full_command.extend(args)
if VERB: if VERB:
stderr=sys.stderr stderr = sys.stderr
else: else:
stderr=subprocess.PIPE stderr = subprocess.PIPE
full_command.extend(['--debug-level=1']) full_command.extend(['--debug-level=1'])
#print full_command #print full_command
proc = subprocess.Popen(full_command, proc = subprocess.Popen(full_command,
@ -163,7 +163,7 @@ def gen_password():
random.seed(datetime.datetime.now().microsecond) random.seed(datetime.datetime.now().microsecond)
chars = string.letters + string.digits + '/=+*' chars = string.letters + string.digits + '/=+*'
length = 15 length = 15
return ''.join([random.choice(chars) for _ in xrange(length)]) return u''.join([random.choice(chars) for _ in xrange(length)])
###### ######
## Local commands ## Local commands
@ -174,36 +174,35 @@ def update_keys():
keys = all_keys() keys = all_keys()
_, stdout = gpg("receive-keys", [key for _, key in keys.values() if key]) _, stdout = gpg("receive-keys", [key for _, key in keys.values() if key])
return stdout.read() return stdout.read().decode("utf-8")
def check_keys(): def check_keys():
"""Vérifie les clés existantes""" """Vérifie les clés existantes"""
print "Who cares ?" keys = all_keys()
# keys = all_keys() gpg = gnupg.GPG(gnupghome='~/.gnupg')
# gpg = gnupg.GPG(gnupghome='~/.gnupg') localkeys = gpg.list_keys()
# localkeys = gpg.list_keys() failed = False
# failed = False for (mail, fpr) in keys.values():
# for (mail, fpr) in keys.values(): if fpr:
# if fpr: if VERB: print (u"Checking %s" % (mail)).encode("utf-8")
# if VERB: print "Checking %s" % (mail) corresponds = [key for key in localkeys if key["fingerprint"] == fpr]
# corresponds = [key for key in localkeys if key["fingerprint"] == fpr] # On vérifie qu'on possède la clé…
# # On vérifie qu'on possède la clé… if len(corresponds) == 1:
# if len(corresponds) == 1: correspond = corresponds[0]
# correspond = corresponds[0] # …qu'elle correspond au mail…
# # …qu'elle correspond au mail… if mail.lower() in sum([re.findall("<(.*)>", uid.lower()) for uid in correspond["uids"]], []):
# if mail.lower() in sum([re.findall("<(.*)>", uid.lower()) for uid in correspond["uids"]], []): meaning, trustvalue = GPG_TRUSTLEVELS[correspond["trust"]]
# meaning, trustvalue = GPG_TRUSTLEVELS[correspond["trust"]] # … et qu'on lui fait confiance
# # … et qu'on lui fait confiance if not trustvalue:
# if not trustvalue: print (u"--> Fail on %s:%s\nLa confiance en la clé est : %s" % (meaning,)).encode("utf-8")
# print (u"--> Fail on %s:%s\nLa confiance en la clé est : %s" % (meaning,)).encode("utf-8") failed = True
# failed = True else:
# else: print (u"--> Fail on %s:%s\n!! Le fingerprint et le mail ne correspondent pas !" % (fpr, mail)).encode("utf-8")
# print (u"--> Fail on %s:%s\n!! Le fingerprint et le mail ne correspondent pas !" % (fpr, mail)).encode("utf-8") failed = True
# failed = True else:
# else: print (u"--> Fail on %s:%s\nPas (ou trop) de clé avec ce fingerprint." % (fpr, mail)).encode("utf-8")
# print (u"--> Fail on %s:%s\nPas (ou trop) de clé avec ce fingerprint." % (fpr, mail)).encode("utf-8") failed = True
# failed = True return not failed
# return not failed
def get_recipients_of_roles(roles): def get_recipients_of_roles(roles):
"""Renvoie les destinataires d'un rôle""" """Renvoie les destinataires d'un rôle"""
@ -212,13 +211,12 @@ def get_recipients_of_roles(roles):
for role in roles: for role in roles:
for recipient in allroles[role]: for recipient in allroles[role]:
recipients.add(recipient) recipients.add(recipient)
return recipients return recipients
def get_dest_of_roles(roles): def get_dest_of_roles(roles):
"""Renvoie la liste des "username : mail (fingerprint)" """ """Renvoie la liste des "username : mail (fingerprint)" """
allkeys = all_keys() allkeys = all_keys()
return ["%s : %s (%s)" % (rec, allkeys[rec][0], allkeys[rec][1]) return [u"%s : %s (%s)" % (rec, allkeys[rec][0], allkeys[rec][1])
for rec in get_recipients_of_roles(roles) if allkeys[rec][1]] for rec in get_recipients_of_roles(roles) if allkeys[rec][1]]
def encrypt(roles, contents): def encrypt(roles, contents):
@ -235,11 +233,11 @@ def encrypt(roles, contents):
fpr_recipients.append(fpr) fpr_recipients.append(fpr)
stdin, stdout = gpg("encrypt", fpr_recipients) stdin, stdout = gpg("encrypt", fpr_recipients)
stdin.write(contents) stdin.write(contents.encode("utf-8"))
stdin.close() stdin.close()
out = stdout.read() out = stdout.read().decode("utf-8")
if out == '': if out == '':
if VERB: print "Échec de chiffrement" if VERB: print u"Échec de chiffrement".encode("utf-8")
return None return None
else: else:
return out return out
@ -247,9 +245,9 @@ def encrypt(roles, contents):
def decrypt(contents): def decrypt(contents):
"""Déchiffre le contenu""" """Déchiffre le contenu"""
stdin, stdout = gpg("decrypt") stdin, stdout = gpg("decrypt")
stdin.write(contents) stdin.write(contents.encode("utf-8"))
stdin.close() stdin.close()
return stdout.read() return stdout.read().decode("utf-8")
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
@ -258,7 +256,7 @@ def put_password(name, roles, contents):
if NROLES != None: if NROLES != None:
roles = NROLES roles = NROLES
if VERB: if VERB:
print "Pas de nouveaux rôles" print u"Pas de nouveaux rôles".encode("utf-8")
if enc_pwd <> None: if enc_pwd <> None:
return put_file(name, roles, enc_pwd) return put_file(name, roles, enc_pwd)
else: else:
@ -272,7 +270,7 @@ def get_password(name):
###### ######
## Interface ## Interface
def editor(texte, annotations=""): def editor(texte, annotations=u""):
""" Lance $EDITOR sur texte. """ Lance $EDITOR sur texte.
Renvoie le nouveau texte si des modifications ont été apportées, ou None Renvoie le nouveau texte si des modifications ont été apportées, ou None
""" """
@ -281,23 +279,23 @@ def editor(texte, annotations=""):
# for annotations ... # for annotations ...
f = tempfile.NamedTemporaryFile(suffix='.txt') f = tempfile.NamedTemporaryFile(suffix='.txt')
atexit.register(f.close) atexit.register(f.close)
f.write(texte) if annotations:
for l in annotations.split('\n'): annotations = "# " + annotations.replace("\n", "\n# ")
f.write("# %s\n" % l.encode('utf-8')) f.write((texte + "\n" + annotations).encode("utf-8"))
f.flush() f.flush()
proc = subprocess.Popen([os.getenv('EDITOR', '/usr/bin/editor'), f.name]) proc = subprocess.Popen([os.getenv('EDITOR', '/usr/bin/editor'), f.name])
os.waitpid(proc.pid, 0) os.waitpid(proc.pid, 0)
f.seek(0) f.seek(0)
ntexte = f.read() ntexte = f.read().decode("utf-8")
f.close() f.close()
ntexte = '\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: if texte != ntexte:
return ntexte return ntexte
return None 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"""
print """Liste des fichiers disponibles :""" print u"Liste des fichiers disponibles :".encode("utf-8")
my_roles = get_my_roles() my_roles = get_my_roles()
files = all_files() files = all_files()
keys = files.keys() keys = files.keys()
@ -310,16 +308,16 @@ def show_files():
def show_roles(): def show_roles():
"""Affiche la liste des roles existants""" """Affiche la liste des roles existants"""
print """Liste des roles disponibles :""" print u"Liste des roles disponibles".encode("utf-8")
for role in all_roles().keys(): for role in all_roles().keys():
if not role.endswith('-w'): if not role.endswith('-w'):
print " * " + role print (u" * " + role ).encode("utf-8")
def show_servers(): def show_servers():
"""Affiche la liste des serveurs disponibles""" """Affiche la liste des serveurs disponibles"""
print """Liste des serveurs disponibles :""" print u"Liste des serveurs disponibles".encode("utf-8")
for server in config.servers.keys(): for server in config.servers.keys():
print " * " + server print (u" * " + server).encode("utf-8")
old_clipboard = None old_clipboard = None
def saveclipboard(restore=False): def saveclipboard(restore=False):
@ -333,7 +331,7 @@ def saveclipboard(restore=False):
if not restore: if not restore:
old_clipboard = proc.stdout.read() old_clipboard = proc.stdout.read()
else: else:
raw_input("Appuyez sur Entrée pour récupérer le contenu précédent du presse papier.") raw_input(u"Appuyez sur Entrée pour récupérer le contenu précédent du presse papier.".encode("utf-8"))
proc.stdin.write(old_clipboard) proc.stdin.write(old_clipboard)
proc.stdin.close() proc.stdin.close()
proc.stdout.close() proc.stdout.close()
@ -343,37 +341,35 @@ def clipboard(texte):
saveclipboard() saveclipboard()
proc =subprocess.Popen(['xclip', '-selection', 'clipboard'],\ proc =subprocess.Popen(['xclip', '-selection', 'clipboard'],\
stdin=subprocess.PIPE, stdout=sys.stdout, stderr=sys.stderr) stdin=subprocess.PIPE, stdout=sys.stdout, stderr=sys.stderr)
proc.stdin.write(texte) proc.stdin.write(texte.encode("utf-8"))
proc.stdin.close() proc.stdin.close()
return "[Le mot de passe a été mis dans le presse papier]" return u"[Le mot de passe a été mis dans le presse papier]"
def show_file(fname): def show_file(fname):
"""Affiche le contenu d'un fichier""" """Affiche le contenu d'un fichier"""
value = get_file(fname) value = get_file(fname)
if value == False: if value == False:
print "Fichier introuvable" print u"Fichier introuvable".encode("utf-8")
return return
(sin, sout) = gpg('decrypt') (sin, sout) = gpg('decrypt')
sin.write(value['contents']) sin.write(value['contents'].encode("utf-8"))
sin.close() sin.close()
texte = sout.read() texte = sout.read().decode("utf-8")
ntexte = "" ntexte = u""
hidden = False # Est-ce que le mot de passe a été caché ? hidden = False # Est-ce que le mot de passe a été caché ?
lines = texte.split('\n') lines = texte.split('\n')
for line in lines: for line in lines:
catchPass = PASS.match(line) catchPass = PASS.match(line)
if catchPass != None and CLIPBOARD: if catchPass != None and CLIPBOARD:
hidden=True hidden = True
line = clipboard(catchPass.group(1)) line = clipboard(catchPass.group(1))
ntexte += line + '\n' ntexte += line + '\n'
showbin = "cat" if hidden else "less" showbin = "cat" if hidden else "less"
proc = subprocess.Popen(showbin, stdin=subprocess.PIPE, shell=True) proc = subprocess.Popen(showbin, stdin=subprocess.PIPE, shell=True)
out = proc.stdin out = proc.stdin
out.write("Fichier %s:\n\n" % (fname,)) raw = u"Fichier %s:\n\n%s-----\nVisible par: %s\n" % (fname, ntexte, ','.join(value['roles']))
out.write(ntexte) out.write(raw.encode("utf-8"))
out.write("-----\n")
out.write("Visible par: %s\n" % ','.join(value['roles']))
out.close() out.close()
os.waitpid(proc.pid, 0) os.waitpid(proc.pid, 0)
@ -385,26 +381,26 @@ def edit_file(fname):
annotations = u"" annotations = u""
if value == False: if value == False:
nfile = True nfile = True
print "Fichier introuvable" print u"Fichier introuvable".encode("utf-8")
if not confirm("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}"
Enregistrez le fichier vide pour annuler.\n""" Enregistrez le fichier vide pour annuler.\n"""
texte = "pass: %s\n" % gen_password() texte = u"pass: %s\n" % gen_password()
roles = get_my_roles() roles = get_my_roles()
# Par défaut les roles d'un fichier sont ceux en écriture de son # Par défaut les roles d'un fichier sont ceux en écriture de son
# créateur # créateur
roles = [ r[:-2] for r in roles if r.endswith('-w') ] roles = [ r[:-2] for r in roles if r.endswith('-w') ]
if roles == []: if roles == []:
print "Vous ne possédez aucun rôle en écriture ! Abandon." print u"Vous ne possédez aucun rôle en écriture ! Abandon.".encode("utf-8")
return return
value = {'roles' : roles} value = {'roles' : roles}
else: else:
(sin, sout) = gpg('decrypt') (sin, sout) = gpg('decrypt')
sin.write(value['contents']) sin.write(value['contents'].encode("utf-8"))
sin.close() sin.close()
texte = sout.read() 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
@ -416,19 +412,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 ntexte == None and not nfile and NROLES == None:
print "Pas de modifications effectuées" print u"Pas de modifications effectuées".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): if put_password(fname, value['roles'], ntexte):
print "Modifications enregistrées" print u"Modifications enregistrées".encode("utf-8")
else: else:
print "Erreur lors de l'enregistrement (avez-vous les droits suffisants ?)" 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)').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':
@ -436,12 +432,12 @@ def confirm(text):
def remove_file(fname): def remove_file(fname):
"""Supprime un fichier""" """Supprime un fichier"""
if not confirm('Ê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
if rm_file(fname): if rm_file(fname):
print "Suppression effectuée" print u"Suppression effectuée".encode("utf-8")
else: else:
print "Erreur de suppression (avez-vous les droits ?)" print u"Erreur de suppression (avez-vous les droits ?)".encode("utf-8")
def my_check_keys(): def my_check_keys():
@ -450,7 +446,7 @@ def my_check_keys():
def my_update_keys(): def my_update_keys():
"""Met à jour les clés existantes et affiche le résultat""" """Met à jour les clés existantes et affiche le résultat"""
print update_keys() print update_keys().encode("utf-8")
def update_role(): def update_role():
"""Rechiffre les fichiers""" """Rechiffre les fichiers"""
@ -465,7 +461,7 @@ def update_role():
for (fname, froles) in all_files().iteritems(): for (fname, froles) in all_files().iteritems():
if set(roles).intersection(froles) == set([]): if set(roles).intersection(froles) == set([]):
continue continue
print "Rechiffrement de %s" % fname print (u"Rechiffrement de %s" % fname).encode("utf-8")
put_password(fname, froles, get_password(fname)) put_password(fname, froles, get_password(fname))
def parse_roles(strroles): def parse_roles(strroles):
@ -478,17 +474,17 @@ def parse_roles(strroles):
writable = False writable = False
for role in strroles.split(','): for role in strroles.split(','):
if role not in roles.keys(): if role not in roles.keys():
print("Le rôle %s n'existe pas !" % role) print (u"Le rôle %s n'existe pas !" % role).encode("utf-8")
return False return False
if role.endswith('-w'): if role.endswith('-w'):
print("Le rôle %s ne devrait pas être utilisé ! (utilisez %s)" print (u"Le rôle %s ne devrait pas être utilisé ! (utilisez %s)"
% (role,role[:-2])) % (role,role[:-2])).encode("utf-8")
return False return False
writable = writable or role in my_roles_w writable = writable or role in my_roles_w
ret.add(role) ret.add(role)
if not FORCED and not writable: if not FORCED and not writable:
if not confirm("""Vous vous apprêtez à perdre vos droits d'écritures\ if not confirm(u"""Vous vous apprêtez à perdre vos droits d'écritures\
(role ne contient pas %s) sur ce fichier, continuer ?""" % (role ne contient pas %s) sur ce fichier, continuer ?""" %
", ".join(my_roles_w)): ", ".join(my_roles_w)):
return False return False
@ -555,7 +551,7 @@ if __name__ == "__main__":
if parsed.action.func_code.co_argcount == 0: if parsed.action.func_code.co_argcount == 0:
parsed.action() parsed.action()
elif parsed.fname == None: elif parsed.fname == None:
print("Vous devez fournir un nom de fichier avec cette commande") print u"Vous devez fournir un nom de fichier avec cette commande".encode("utf-8")
parser.print_help() parser.print_help()
else: else:
parsed.action(parsed.fname) parsed.action(parsed.fname)

View file

@ -93,10 +93,9 @@ def putfile(filename):
if not validate(oldroles,'w'): if not validate(oldroles,'w'):
return False return False
backup(filename, old) corps = u"Le fichier %s a été modifié par %s." % (filename, MYUID)
notification(u"Modification de %s" % filename, backup(corps, filename, old)
u"Le fichier %s a été modifié par %s." % (filename, MYUID), notification(u"Modification de %s" % filename, corps, filename, old)
filename, old)
writefile(filepath, json.dumps({'roles': roles, 'contents': contents})) writefile(filepath, json.dumps({'roles': roles, 'contents': contents}))
return True return True
@ -110,21 +109,20 @@ def rmfile(filename):
return True return True
else: else:
if validate(roles,'w'): if validate(roles,'w'):
backup(filename, old) corps = u"Le fichier %s a été supprimé par %s." % (filename, MYUID)
notification(u"Suppression de %s" % filename, backup(corps, filename, old)
u"Le fichier %s a été supprimé par %s." % (filename, MYUID), notification(u"Suppression de %s" % filename, corps, filename, old)
filename, old)
os.remove(getpath(filename)) os.remove(getpath(filename))
else: else:
return False return False
return True return True
def backup(fname, old): def backup(corps, fname, old):
"""Backupe l'ancienne version du fichier""" """Backupe l'ancienne version du fichier"""
back = open(getpath(fname, backup=True), 'a') back = open(getpath(fname, backup=True), 'a')
back.write(json.dumps(old)) back.write(json.dumps(old))
back.write('\n') back.write('\n')
back.write('* %s: %s\n' % (str(datetime.datetime.now()),corps)) back.write((u'* %s: %s\n' % (str(datetime.datetime.now()), corps)).encode("utf-8"))
back.close() back.close()
def notification(subject, corps, fname, old): def notification(subject, corps, fname, old):