Ajouts de commentaires dans l'éditeur
Il permet de tester d'un coup d'œil les destinataires d'un chiffrement. Ceci évite donc de se faire flouter par un serveur fournissant la mauvaise liste de destinataires.
This commit is contained in:
parent
5fbc58fb61
commit
9857aae8f7
1 changed files with 57 additions and 11 deletions
|
@ -61,6 +61,18 @@ def gpg(command, args = None):
|
||||||
proc.stderr.close()
|
proc.stderr.close()
|
||||||
return proc.stdin, proc.stdout
|
return proc.stdin, proc.stdout
|
||||||
|
|
||||||
|
|
||||||
|
class simple_memoize(object):
|
||||||
|
""" Memoization/Lazy """
|
||||||
|
def __init__(self, f):
|
||||||
|
self.f = f
|
||||||
|
self.val = None
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
if self.val==None:
|
||||||
|
self.val = self.f()
|
||||||
|
return self.val
|
||||||
|
|
||||||
######
|
######
|
||||||
## Remote commands
|
## Remote commands
|
||||||
|
|
||||||
|
@ -89,14 +101,17 @@ def remote_command(command, arg = None, stdin_contents = None):
|
||||||
sshin.close()
|
sshin.close()
|
||||||
return json.loads(sshout.read())
|
return json.loads(sshout.read())
|
||||||
|
|
||||||
|
@simple_memoize
|
||||||
def all_keys():
|
def all_keys():
|
||||||
"""Récupère les clés du serveur distant"""
|
"""Récupère les clés du serveur distant"""
|
||||||
return remote_command("listkeys")
|
return remote_command("listkeys")
|
||||||
|
|
||||||
|
@simple_memoize
|
||||||
def all_roles():
|
def all_roles():
|
||||||
"""Récupère les roles du serveur distant"""
|
"""Récupère les roles du serveur distant"""
|
||||||
return remote_command("listroles")
|
return remote_command("listroles")
|
||||||
|
|
||||||
|
@simple_memoize
|
||||||
def all_files():
|
def all_files():
|
||||||
"""Récupère les fichiers du serveur distant"""
|
"""Récupère les fichiers du serveur distant"""
|
||||||
return remote_command("listfiles")
|
return remote_command("listfiles")
|
||||||
|
@ -113,6 +128,7 @@ def rm_file(filename):
|
||||||
"""Supprime le fichier sur le serveur distant"""
|
"""Supprime le fichier sur le serveur distant"""
|
||||||
return remote_command("rmfile", filename)
|
return remote_command("rmfile", filename)
|
||||||
|
|
||||||
|
@simple_memoize
|
||||||
def get_my_roles():
|
def get_my_roles():
|
||||||
"""Retoure la liste des rôles perso"""
|
"""Retoure la liste des rôles perso"""
|
||||||
allr = all_roles()
|
allr = all_roles()
|
||||||
|
@ -145,17 +161,28 @@ def check_keys():
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def encrypt(roles, contents):
|
def get_recipients_of_roles(roles):
|
||||||
"""Chiffre le contenu pour les roles donnés"""
|
"""Renvoie les destinataires d'un rôle"""
|
||||||
|
|
||||||
recipients = set()
|
recipients = set()
|
||||||
allroles = all_roles()
|
allroles = all_roles()
|
||||||
allkeys = all_keys()
|
|
||||||
|
|
||||||
email_recipients = []
|
|
||||||
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
|
||||||
|
|
||||||
|
def get_dest_of_roles(roles):
|
||||||
|
allkeys = all_keys()
|
||||||
|
return ["%s (%s -> %s)" % (rec, allkeys[rec][0], allkeys[rec][1]) for rec in \
|
||||||
|
get_recipients_of_roles(roles)]
|
||||||
|
|
||||||
|
def encrypt(roles, contents):
|
||||||
|
"""Chiffre le contenu pour les roles donnés"""
|
||||||
|
|
||||||
|
allkeys = all_keys()
|
||||||
|
recipients = get_recipients_of_roles(roles)
|
||||||
|
|
||||||
|
email_recipients = []
|
||||||
for recipient in recipients:
|
for recipient in recipients:
|
||||||
email, key = allkeys[recipient]
|
email, key = allkeys[recipient]
|
||||||
if key:
|
if key:
|
||||||
|
@ -199,18 +226,28 @@ def get_password(name):
|
||||||
|
|
||||||
## Interface
|
## Interface
|
||||||
|
|
||||||
def editor(texte):
|
def editor(texte, annotations=""):
|
||||||
""" Lance $EDITOR sur texte"""
|
""" Lance $EDITOR sur texte.
|
||||||
f = tempfile.NamedTemporaryFile()
|
Renvoie le nouveau texte si des modifications ont été apportées, ou None
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Avoid syntax hilight with ".txt". Would be nice to have some colorscheme
|
||||||
|
# for annotations ...
|
||||||
|
f = tempfile.NamedTemporaryFile(suffix='.txt')
|
||||||
atexit.register(f.close)
|
atexit.register(f.close)
|
||||||
f.write(texte)
|
f.write(texte)
|
||||||
|
for l in annotations.split('\n'):
|
||||||
|
f.write("# %s\n" % l.encode('utf-8'))
|
||||||
f.flush()
|
f.flush()
|
||||||
proc = subprocess.Popen(os.getenv('EDITOR') + ' ' + f.name,shell=True)
|
proc = subprocess.Popen(os.getenv('EDITOR') + ' ' + f.name,shell=True)
|
||||||
os.waitpid(proc.pid,0)
|
os.waitpid(proc.pid,0)
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
ntexte = f.read()
|
ntexte = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
return texte <> ntexte and ntexte or None
|
ntexte = '\n'.join(filter(lambda l: not l.startswith('#'), ntexte.split('\n')))
|
||||||
|
if texte != ntexte:
|
||||||
|
return ntexte
|
||||||
|
return None
|
||||||
|
|
||||||
def show_files():
|
def show_files():
|
||||||
proc = subprocess.Popen("cat",stdin=subprocess.PIPE,shell=True)
|
proc = subprocess.Popen("cat",stdin=subprocess.PIPE,shell=True)
|
||||||
|
@ -312,7 +349,16 @@ def edit_file(fname):
|
||||||
sin.write(value['contents'])
|
sin.write(value['contents'])
|
||||||
sin.close()
|
sin.close()
|
||||||
texte = sout.read()
|
texte = sout.read()
|
||||||
ntexte = editor(texte)
|
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']),
|
||||||
|
'\n'.join(' %s' % rec for rec in get_dest_of_roles(value['roles']))
|
||||||
|
)
|
||||||
|
|
||||||
|
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 "Pas de modifications effectuées"
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue