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
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Maxime Bombar
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 = {
VERB
=
False
#: Par défaut, place-t-on le mdp dans le presse-papier ?
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
#: Droits à définir sur le fichier en édition
NROLES
=
None
...
...
@@ -264,8 +264,10 @@ def put_password(name, roles, contents):
def
get_password
(
name
):
"""Récupère le mot de passe donné par name"""
remotefile
=
get_file
(
name
)
return
decrypt
(
remotefile
[
'contents'
])
gotit
,
remotefile
=
get_file
(
name
)
if
gotit
:
remotefile
=
decrypt
(
remotefile
[
'contents'
])
return
[
gotit
,
remotefile
]
######
## Interface
...
...
@@ -289,9 +291,7 @@ def editor(texte, annotations=u""):
ntexte
=
f
.
read
().
decode
(
"utf-8"
)
f
.
close
()
ntexte
=
u
'
\n
'
.
join
(
filter
(
lambda
l
:
not
l
.
startswith
(
'#'
),
ntexte
.
split
(
'
\n
'
)))
if
texte
!=
ntexte
:
return
ntexte
return
None
return
ntexte
def
show_files
():
"""Affiche la liste des fichiers disponibles sur le serveur distant"""
...
...
@@ -309,9 +309,9 @@ def show_files():
def
show_roles
():
"""Affiche la liste des roles existants"""
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'
):
print
(
u
" *
"
+
role
).
encode
(
"utf-8"
)
print
(
u
" *
%s : %s"
%
(
role
,
", "
.
join
(
usernames
))
).
encode
(
"utf-8"
)
def
show_servers
():
"""Affiche la liste des serveurs disponibles"""
...
...
@@ -348,9 +348,9 @@ def clipboard(texte):
def
show_file
(
fname
):
"""Affiche le contenu d'un fichier"""
value
=
get_file
(
fname
)
if
value
==
False
:
print
u
"Fichier introuvable"
.
encode
(
"utf-8"
)
gotit
,
value
=
get_file
(
fname
)
if
not
gotit
:
print
value
.
encode
(
"utf-8"
)
# value contient le message d'erreur
return
(
sin
,
sout
)
=
gpg
(
'decrypt'
)
sin
.
write
(
value
[
'contents'
].
encode
(
"utf-8"
))
...
...
@@ -376,13 +376,13 @@ def show_file(fname):
def
edit_file
(
fname
):
"""Modifie/Crée un fichier"""
value
=
get_file
(
fname
)
gotit
,
value
=
get_file
(
fname
)
nfile
=
False
annotations
=
u
""
if
value
==
Fals
e
:
if
not
gotit
and
not
"pas les droits"
in
valu
e
:
nfile
=
True
print
u
"Fichier introuvable"
.
encode
(
"utf-8"
)
if
not
confirm
(
"Créer fichier ?"
):
if
not
confirm
(
u
"Créer fichier ?"
):
return
annotations
+=
u
"""Ceci est un fichier initial contenant un mot de passe
aléatoire, pensez à rajouter une ligne "login: ${login}"
...
...
@@ -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"
)
return
value
=
{
'roles'
:
roles
}
elif
not
gotit
:
print
value
.
encode
(
"utf-8"
)
# value contient le message d'erreur
return
else
:
(
sin
,
sout
)
=
gpg
(
'decrypt'
)
sin
.
write
(
value
[
'contents'
].
encode
(
"utf-8"
))
sin
.
close
()
texte
=
sout
.
read
().
decode
(
"utf-8"
)
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'
]),
...
...
@@ -410,21 +413,20 @@ C'est-à-dire pour les utilisateurs suivants :\n%s""" % (
)
ntexte
=
editor
(
texte
,
annotations
)
if
ntexte
==
None
and
not
nfile
and
NROLES
==
None
:
print
u
"Pas de modifications effectuées"
.
encode
(
"utf-8"
)
if
((
not
nfile
and
ntexte
in
[
u
''
,
texte
]
and
NROLES
==
None
)
or
# Fichier existant vidé ou inchangé
(
nfile
and
ntexte
==
u
''
)):
# Nouveau fichier créé vide
print
u
"Pas de modification effectuée"
.
encode
(
"utf-8"
)
else
:
ntexte
=
texte
if
ntexte
==
None
else
ntexte
if
put_password
(
fname
,
value
[
'roles'
],
ntexte
):
print
u
"Modifications enregistrées"
.
encode
(
"utf-8"
)
else
:
print
u
"Erreur lors de l'enregistrement (avez-vous les droits suffisants ?)"
.
encode
(
"utf-8"
)
success
,
message
=
put_password
(
fname
,
value
[
'roles'
],
ntexte
)
print
message
.
encode
(
"utf-8"
)
def
confirm
(
text
):
"""Demande confirmation, sauf si on est mode ``FORCED``"""
if
FORCED
:
return
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'
:
return
True
elif
out
==
'n'
:
...
...
@@ -432,12 +434,10 @@ def confirm(text):
def
remove_file
(
fname
):
"""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
if
rm_file
(
fname
):
print
u
"Suppression effectuée"
.
encode
(
"utf-8"
)
else
:
print
u
"Erreur de suppression (avez-vous les droits ?)"
.
encode
(
"utf-8"
)
message
=
rm_file
(
fname
)
print
message
.
encode
(
"utf-8"
)
def
my_check_keys
():
...
...
@@ -462,7 +462,8 @@ def update_role():
if
set
(
roles
).
intersection
(
froles
)
==
set
([]):
continue
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
):
"""Interprête une liste de rôles fournie par l'utilisateur"""
...
...
server.py
View file @
bbc6cb73
...
...
@@ -66,10 +66,10 @@ def getfile(filename):
try
:
obj
=
json
.
loads
(
open
(
filepath
).
read
())
if
not
validate
(
obj
[
'roles'
]):
return
False
return
obj
return
[
False
,
u
"Vous n'avez pas les droits de lecture sur le fichier %s."
%
filename
]
return
[
True
,
obj
]
except
IOError
:
return
False
return
[
False
,
u
"Le fichier %s n'existe pas."
%
filename
]
def
putfile
(
filename
):
...
...
@@ -81,41 +81,38 @@ def putfile(filename):
roles
=
parsed_stdin
[
'roles'
]
contents
=
parsed_stdin
[
'contents'
]
except
KeyError
:
return
False
return
[
False
,
u
"Entrée invalide"
]
try
:
old
=
getfile
(
filename
)
oldroles
=
old
[
'roles'
]
except
TypeError
:
gotit
,
old
=
getfile
(
filename
)
if
not
gotit
:
old
=
u
"[Création du fichier]"
pass
else
:
if
not
validate
(
oldroles
,
'w'
):
return
False
corps
=
u
"Le fichier %s a été modifié par %s."
%
(
filename
,
MYUID
)
backup
(
corps
,
filename
,
old
)
notification
(
u
"Modification de %s"
%
filename
,
corps
,
filename
,
old
)
oldroles
=
old
[
'roles'
]
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
)
notification
(
u
"Modification de %s"
%
filename
,
corps
,
filename
,
old
)
writefile
(
filepath
,
json
.
dumps
({
'roles'
:
roles
,
'contents'
:
contents
}))
return
True
return
[
True
,
u
"Modification effectuée."
]
def
rmfile
(
filename
):
"""Supprime le fichier filename après avoir vérifié les droits sur le fichier"""
try
:
old
=
getfile
(
filename
)
roles
=
old
[
'roles'
]
except
TypeError
:
return
True
gotit
,
old
=
getfile
(
filename
)
if
not
gotit
:
return
old
# contient le message d'erreur
roles
=
old
[
'roles'
]
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
:
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
:
return
False
return
True
return
u
"Vous n'avez pas les droits d'écriture sur le fichier %s."
%
filename
return
u
"Suppression effectuée"
def
backup
(
corps
,
fname
,
old
):
"""Backupe l'ancienne version du fichier"""
...
...
serverconfig.example.py
View file @
bbc6cb73
...
...
@@ -65,11 +65,11 @@ KEYS = {
#: Les variables suivantes sont utilisées pour définir le dictionnaire des
#: rôles.
RTC
=
[
"
iffrig
"
RTC
=
[
"
samir
"
]
#: Liste des usernames des nounous
NOUNOUS
=
RTC
+
[
NOUNOUS
=
RTC
+
[
"blockelet"
,
"becue"
,
"dstan"
,
...
...
@@ -82,17 +82,45 @@ NOUNOUS=RTC+[
"parret-freaud"
,
"cauderlier"
,
"maioli"
,
"
samir
"
,
"
iffrig
"
,
"boilard"
,
"legallic"
,
]
# Autogen:
#: 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
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
...
...
@@ -101,6 +129,6 @@ ROLES = {
"ca-w"
:
CA
,
"nounous"
:
NOUNOUS
,
"nounous-w"
:
NOUNOUS
,
"apprentis-w"
:
NOUNOUS
,
"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