Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
Cranspasswords
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Gabriel Detraz
Cranspasswords
Commits
bbc6cb73
Commit
bbc6cb73
authored
Apr 13, 2013
by
Vincent Le gallic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Unicodification : fix; gestion de messages d'erreur; ajout du CA
parent
0e68a8e6
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
90 additions
and
64 deletions
+90
-64
cranspasswords.py
cranspasswords.py
+30
-29
server.py
server.py
+25
-28
serverconfig.example.py
serverconfig.example.py
+35
-7
No files found.
cranspasswords.py
View file @
bbc6cb73
...
@@ -55,7 +55,7 @@ GPG_TRUSTLEVELS = {
...
@@ -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 deman
d
er 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):
...
@@ -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""):
...
@@ -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():
...
@@ -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
().
key
s
():
for
(
role
,
usernames
)
in
all_roles
().
iteritem
s
():
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):
...
@@ -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):
...
@@ -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
==
Fals
e
:
if
not
gotit
and
not
"pas les droits"
in
valu
e
:
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,13 +396,16 @@ Enregistrez le fichier vide pour annuler.\n"""
...
@@ -396,13 +396,16 @@ 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'
]),
...
@@ -410,21 +413,20 @@ C'est-à-dire pour les utilisateurs suivants :\n%s""" % (
...
@@ -410,21 +413,20 @@ 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):
...
@@ -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():
...
@@ -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"""
...
...
server.py
View file @
bbc6cb73
...
@@ -66,10 +66,10 @@ def getfile(filename):
...
@@ -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):
...
@@ -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
:
if
not
validate
(
oldroles
,
'w'
):
oldroles
=
old
[
'roles'
]
return
False
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
)
corps
=
u
"Le fichier %s a été modifié par %s."
%
(
filename
,
MYUID
)
notification
(
u
"Modification de %s"
%
filename
,
corps
,
filename
,
old
)
backup
(
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
:
roles
=
old
[
'roles'
]
return
old
# contient le message d'erreur
except
TypeError
:
roles
=
old
[
'roles'
]
return
True
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
:
else
:
if
validate
(
roles
,
'w'
):
return
u
"Vous n'avez pas les droits d'écriture sur le fichier %s."
%
filename
corps
=
u
"Le fichier %s a été supprimé par %s."
%
(
filename
,
MYUID
)
return
u
"Suppression effectuée"
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"""
...
...
serverconfig.example.py
View file @
bbc6cb73
...
@@ -65,11 +65,11 @@ KEYS = {
...
@@ -65,11 +65,11 @@ 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
+
[
"blockelet"
,
"blockelet"
,
"becue"
,
"becue"
,
"dstan"
,
"dstan"
,
...
@@ -82,17 +82,45 @@ 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 = {
...
@@ -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
,
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment