Guest User

Untitled

a guest
Mar 3rd, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #coding=utf8
  3. # PTI #5
  4.  
  5. import pickle
  6. import fcntl
  7.  
  8. USER_DATABASE = 'users.db'
  9.  
  10. class User(object):
  11. ''' Classe représentant un utilisateur '''
  12.  
  13. def __init__(self, username, mail, password):
  14. self.username = username
  15. self.mail = mail
  16. self.password = password
  17. self.firstname = None
  18. self.lastname = None
  19.  
  20. def __repr__(self):
  21. return '<User %s>' % self.username
  22.  
  23.  
  24. class Users(object):
  25. ''' Classe de gestion des utilisateurs '''
  26.  
  27. def __init__(self, user_database_filename=USER_DATABASE):
  28. self.user_database_filename = user_database_filename
  29. self.users = []
  30. self._load()
  31.  
  32. def _secure_save(func):
  33. ''' Décorateur permettant de sauvegarder le fichier des
  34. utilisateurs de manière sécurisée, avec un verrou sur le
  35. fichier pour éviter les accès concurrents. '''
  36.  
  37. def f(self, *args, **kwargs):
  38. f_users = open(self.user_database_filename, 'r+b')
  39. fcntl.lockf(f_users, fcntl.LOCK_EX) # Verrou
  40. self.users = pickle.load(f_users) # Dé-sérialisation
  41.  
  42. func(self, *args, **kwargs) # Appel de la fonction décorée
  43.  
  44. f_users.seek(0) # Retour au début du fichier pour écriture
  45. pickle.dump(self.users, f_users) # Sérialisation
  46. fcntl.lockf(f_users, fcntl.LOCK_UN) # Relachement du verrou
  47. f_users.close()
  48.  
  49. return f
  50.  
  51. @_secure_save
  52. def create_user(self, username, mail, firstname, lastname, password):
  53. ''' Création d'un nouvel utilisateur '''
  54.  
  55. username = username.lower()
  56. if username in (u.username for u in self.users):
  57. raise self.UserAlreadyExist('User already exist on database')
  58. else:
  59. new_user = User(username, mail, password)
  60. new_user.firstname = firstname
  61. new_user.lastname = lastname
  62. self.users.append(new_user)
  63.  
  64. @_secure_save
  65. def delete_user(self, username):
  66. ''' Suppression d'un utilisateur '''
  67.  
  68. username = username.lower()
  69. found = [u for u in self.users if u.username == username]
  70. if not found:
  71. raise UserDoesntExist('User doesn\'t exist on database')
  72. else:
  73. self.users.remove(found[0])
  74.  
  75. @_secure_save
  76. def change_password(self, username, new_password):
  77. ''' Changer le mot de passe d'un utilisateur '''
  78.  
  79. username = username.lower()
  80. found = [u for u in self.users if u.username == username]
  81. if not found:
  82. raise UserDoesntExist('User doesn\'t exist on database')
  83. else:
  84. found[0].password = new_password
  85.  
  86. def _load(self):
  87. ''' (Re)Charge le fichier des utilisateurs '''
  88.  
  89. f_users = open(self.user_database_filename, 'rb')
  90. self.users = pickle.load(f_users)
  91. f_users.close()
  92.  
  93. # Exceptions :
  94.  
  95. class UserAlreadyExist(Exception):
  96. pass
  97.  
  98. class UserDoesntExist(Exception):
  99. pass
Add Comment
Please, Sign In to add comment