Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- #coding=utf8
- # PTI #5
- import pickle
- import fcntl
- USER_DATABASE = 'users.db'
- class User(object):
- ''' Classe représentant un utilisateur '''
- def __init__(self, username, mail, password):
- self.username = username
- self.mail = mail
- self.password = password
- self.firstname = None
- self.lastname = None
- def __repr__(self):
- return '<User %s>' % self.username
- class Users(object):
- ''' Classe de gestion des utilisateurs '''
- def __init__(self, user_database_filename=USER_DATABASE):
- self.user_database_filename = user_database_filename
- self.users = []
- self._load()
- def _secure_save(func):
- ''' Décorateur permettant de sauvegarder le fichier des
- utilisateurs de manière sécurisée, avec un verrou sur le
- fichier pour éviter les accès concurrents. '''
- def f(self, *args, **kwargs):
- f_users = open(self.user_database_filename, 'r+b')
- fcntl.lockf(f_users, fcntl.LOCK_EX) # Verrou
- self.users = pickle.load(f_users) # Dé-sérialisation
- func(self, *args, **kwargs) # Appel de la fonction décorée
- f_users.seek(0) # Retour au début du fichier pour écriture
- pickle.dump(self.users, f_users) # Sérialisation
- fcntl.lockf(f_users, fcntl.LOCK_UN) # Relachement du verrou
- f_users.close()
- return f
- @_secure_save
- def create_user(self, username, mail, firstname, lastname, password):
- ''' Création d'un nouvel utilisateur '''
- username = username.lower()
- if username in (u.username for u in self.users):
- raise self.UserAlreadyExist('User already exist on database')
- else:
- new_user = User(username, mail, password)
- new_user.firstname = firstname
- new_user.lastname = lastname
- self.users.append(new_user)
- @_secure_save
- def delete_user(self, username):
- ''' Suppression d'un utilisateur '''
- username = username.lower()
- found = [u for u in self.users if u.username == username]
- if not found:
- raise UserDoesntExist('User doesn\'t exist on database')
- else:
- self.users.remove(found[0])
- @_secure_save
- def change_password(self, username, new_password):
- ''' Changer le mot de passe d'un utilisateur '''
- username = username.lower()
- found = [u for u in self.users if u.username == username]
- if not found:
- raise UserDoesntExist('User doesn\'t exist on database')
- else:
- found[0].password = new_password
- def _load(self):
- ''' (Re)Charge le fichier des utilisateurs '''
- f_users = open(self.user_database_filename, 'rb')
- self.users = pickle.load(f_users)
- f_users.close()
- # Exceptions :
- class UserAlreadyExist(Exception):
- pass
- class UserDoesntExist(Exception):
- pass
Add Comment
Please, Sign In to add comment