docker-ubuntu-vnc-desktop/web/auth/__init__.py
2015-05-19 16:13:07 +08:00

119 lines
2.9 KiB
Python

__all__ = ['auth']
__version__ = '0.1'
from flask_login import (LoginManager,
login_required,
login_user,
current_user,
login_fresh,
logout_user,
AnonymousUserMixin,
)
from functools import wraps
from db.sql import User as DbUser
import sha
def noauth(func):
@wraps(func)
def with_logging(*args, **kwargs):
return func(*args, **kwargs)
return with_logging
class Auth(object):
def init_app(self, app, method):
self._login_manager = LoginManager()
self._login_manager.session_protection = "basic"
self._login_manager.init_app(app)
self._login_manager.user_loader(self._load_user)
self._login_manager.anonymous_user = Anonymous
self.login_required = login_required
self.login_fresh = login_fresh
self.current_user = current_user
def login(self, **kargs):
if 'username' in kargs and 'password' in kargs:
u = User.get(kargs['username'], kargs['password'])
if u is None:
return None
login_user(u, remember=kargs['remember'])
return u
return None
def unauthorized_handler(self, func):
self._login_manager.unauthorized_handler(func)
@staticmethod
def _load_user(userid):
u = User.get(userid, None)
return u
def logout(self, username):
User.delete(username)
return logout_user()
class User(object):
_users = {}
def __init__(self, userid):
self._userid = userid
self._is_admin = False
@classmethod
def get(cls, u, password):
if password is None:
if u in cls._users:
return cls._users[u]
return None
if not cls.authenticate(u, password):
return None
user = User(u)
if u == 'admin':
user._is_admin = True
cls._users[u] = user
return user
@classmethod
def authenticate(cls, u, password):
users = DbUser.select().where(DbUser.user == u)
if users.count() <= 0:
return False
if users[0].password == sha.new(password).hexdigest():
return True
return False
@classmethod
def delete(cls, u):
if u in cls._users:
del cls._users[u]
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def is_admin(self):
return self._is_admin
def get_id(self):
return self._userid
def username(self):
return self._userid
class Anonymous(AnonymousUserMixin):
def __init__(self):
self._userid = 'Anonymous'
def username(self):
return self._userid
auth = Auth()