Skip to content

Instantly share code, notes, and snippets.

@NaPs
Created April 30, 2009 18:54
Show Gist options
  • Select an option

  • Save NaPs/104613 to your computer and use it in GitHub Desktop.

Select an option

Save NaPs/104613 to your computer and use it in GitHub Desktop.
#!/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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment