# coding: utf-8 import string, random, hashlib import uuid from db import User, session class UserManager: SUCCESS = 0 INVALID_ID = 1 NO_SUCH_USER = 2 NAME_EXISTS = 3 WRONG_PASS = 4 @staticmethod def get(uid): if type(uid) in (str, unicode): try: uid = uuid.UUID(uid) except: return UserManager.INVALID_ID, None elif type(uid) is uuid.UUID: pass else: return UserManager.INVALID_ID, None user = User.query.get(uid) if user is None: return UserManager.NO_SUCH_USER, None return UserManager.SUCCESS, user @staticmethod def add(name, password, mail, admin): if User.query.filter(User.name == name).first(): return UserManager.NAME_EXISTS crypt, salt = UserManager.__encrypt_password(password) user = User(name = name, mail = mail, password = crypt, salt = salt, admin = admin) session.add(user) session.commit() return UserManager.SUCCESS @staticmethod def delete(uid): status, user = UserManager.get(uid) if status != UserManager.SUCCESS: return status session.delete(user) session.commit() return UserManager.SUCCESS @staticmethod def try_auth(name, password): user = User.query.filter(User.name == name).first() if not user: return UserManager.NO_SUCH_USER, None elif UserManager.__encrypt_password(password, user.salt)[0] != user.password: return UserManager.WRONG_PASS, None else: return UserManager.SUCCESS, user @staticmethod def error_str(err): if err == UserManager.SUCCESS: return 'No error' elif err == UserManager.INVALID_ID: return 'Invalid user id' elif err == UserManager.NO_SUCH_USER: return 'No such user' elif err == UserManager.NAME_EXISTS: return 'There is already a user with that name' elif err == UserManager.WRONG_PASS: return 'Wrong password' else: return 'Unkown error' @staticmethod def __encrypt_password(password, salt = None): if salt is None: salt = ''.join(random.choice(string.printable.strip()) for i in xrange(6)) return hashlib.sha1(salt + password).hexdigest(), salt