##// END OF EJS Templates
Added file annotation template. Bumped version to 0.6.8. Changelog and changeset are now cleaned with js, it's still very beta.
Added file annotation template. Bumped version to 0.6.8. Changelog and changeset are now cleaned with js, it's still very beta.

File last commit:

r190:d8eb7ee2 default
r193:50a39f92 default
Show More
auth.py
98 lines | 3.5 KiB | text/x-python | PythonLexer
Marcin Kuzminski
Added app basic auth....
r41 from datetime import datetime
Added LoginRequired decorator, empty User data container, hash functions
r190 from decorator import decorator
from functools import wraps
implemented autentication
r52 from pylons import session, url
from pylons.controllers.util import abort, redirect
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 from pylons_app.model import meta
from pylons_app.model.db import Users, UserLogs
Added LoginRequired decorator, empty User data container, hash functions
r190 from sqlalchemy.exc import OperationalError
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
Added LoginRequired decorator, empty User data container, hash functions
r190 import crypt
import logging
log = logging.getLogger(__name__)
Marcin Kuzminski
Added app basic auth....
r41
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 def get_crypt_password(password):
Added LoginRequired decorator, empty User data container, hash functions
r190 """
Cryptographic function used for password hashing
@param password: password to hash
"""
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 return crypt.crypt(password, '6a')
Marcin Kuzminski
Static files for production fixed...
r46
Marcin Kuzminski
Added app basic auth....
r41 def authfunc(environ, username, password):
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 sa = meta.Session
password_crypt = get_crypt_password(password)
try except error on non existing user table
r42 try:
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 user = sa.query(Users).filter(Users.username == username).one()
except (NoResultFound, MultipleResultsFound, OperationalError) as e:
try except error on non existing user table
r42 log.error(e)
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 user = None
if user:
if user.active:
if user.username == username and user.password == password_crypt:
Marcin Kuzminski
Added app basic auth....
r41 log.info('user %s authenticated correctly', username)
implemented admin page login
r45 if environ:
http_accept = environ.get('HTTP_ACCEPT')
if http_accept.startswith('application/mercurial') or \
environ['PATH_INFO'].find('raw-file') != -1:
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 repo = environ['PATH_INFO']
implemented admin page login
r45 for qry in environ['QUERY_STRING'].split('&'):
if qry.startswith('cmd'):
Marcin Kuzminski
Added app basic auth....
r41
implemented admin page login
r45 try:
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 user_log = UserLogs()
user_log.user_id = user.user_id
user_log.action = qry
user_log.repository = repo
user_log.action_date = datetime.now()
sa.add(user_log)
sa.commit()
log.info('Adding user %s, action %s', username, qry)
implemented admin page login
r45 except Exception as e:
Marcin Kuzminski
Changed auth lib for sqlalchemy
r64 sa.rollback()
implemented admin page login
r45 log.error(e)
Marcin Kuzminski
Added app basic auth....
r41 return True
else:
log.error('user %s is disabled', username)
return False
Added LoginRequired decorator, empty User data container, hash functions
r190 class AuthUser(object):
"""
A simple object that handles a mercurial username for authentication
"""
username = 'Empty'
is_authenticated = False
is_admin = False
permissions = set()
group = set()
def __init__(self):
pass
#===============================================================================
# DECORATORS
#===============================================================================
class LoginRequired(object):
"""
Must be logged in to execute this function else redirect to login page
"""
def __init__(self):
pass
def __call__(self, func):
log.info('Checking login required')
@wraps(func)
def _wrapper(*fargs, **fkwargs):
user = session.get('hg_app_user', AuthUser())
if user.is_authenticated:
log.info('user %s is authenticated', user.username)
func(*fargs)
else:
logging.info('user %s not authenticated', user.username)
return redirect(url('login_home'))
implemented autentication
r52
Added LoginRequired decorator, empty User data container, hash functions
r190 return _wrapper