@@ -9,61 +9,60 @@
# of the License or (at your opinion) any later version of the license.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
"""
Created on April 4, 2010
@author: marcink
from beaker.cache import cache_region
from pylons import config, session, url, request
from pylons.controllers.util import abort, redirect
from pylons_app.lib.utils import get_repo_slug
from pylons_app.model import meta
from pylons_app.model.db import User, RepoToPerm, Repository, Permission
from sqlalchemy.exc import OperationalError
from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
import crypt
import hashlib
from decorator import decorator
import logging
log = logging.getLogger(__name__)
def get_crypt_password(password):
Cryptographic function used for password hashing
"""Cryptographic function used for password hashing based on sha1
@param password: password to hash
return crypt.crypt(password, '6a')
hashed = hashlib.sha1(password).hexdigest()
return hashed[3:] + hashed[:3]
@cache_region('super_short_term', 'cached_user')
def get_user_cached(username):
sa = meta.Session
try:
user = sa.query(User).filter(User.username == username).one()
finally:
meta.Session.remove()
return user
def authfunc(environ, username, password):
password_crypt = get_crypt_password(password)
user = get_user_cached(username)
except (NoResultFound, MultipleResultsFound, OperationalError) as e:
log.error(e)
user = None
if user:
if user.active:
if user.username == username and user.password == password_crypt:
log.info('user %s authenticated correctly', username)
return True
else:
@@ -130,85 +129,87 @@ def fill_perms(user):
Fills user permission attribute with permissions taken from database
@param user:
user.permissions['repositories'] = {}
user.permissions['global'] = set()
#first fetch default permissions
default_perms = sa.query(RepoToPerm, Repository, Permission)\
.join((Repository, RepoToPerm.repository_id == Repository.repo_id))\
.join((Permission, RepoToPerm.permission_id == Permission.permission_id))\
.filter(RepoToPerm.user_id == sa.query(User).filter(User.username ==
'default').one().user_id).all()
if user.is_admin:
user.permissions['global'].add('hg.admin')
#admin have all rights set to admin
for perm in default_perms:
p = 'repository.admin'
user.permissions['repositories'][perm.RepoToPerm.repository.repo_name] = p
user.permissions['global'].add('repository.create')
user.permissions['global'].add('hg.register')
if perm.Repository.private and not perm.Repository.user_id == user.user_id:
#disable defaults for private repos,
p = 'repository.none'
elif perm.Repository.user_id == user.user_id:
#set admin if owner
p = perm.Permission.permission_name
user_perms = sa.query(RepoToPerm, Permission, Repository)\
.filter(RepoToPerm.user_id == user.user_id).all()
#overwrite userpermissions with defaults
for perm in user_perms:
#set write if owner
if perm.Repository.user_id == user.user_id:
p = 'repository.write'
def get_user(session):
Gets user from session, and wraps permissions into user
@param session:
user = session.get('hg_app_user', AuthUser())
if user.is_authenticated:
user = fill_data(user)
user = fill_perms(user)
session['hg_app_user'] = user
session.save()
#===============================================================================
# CHECK DECORATORS
class LoginRequired(object):
"""Must be logged in to execute this function else redirect to login page"""
def __call__(self, func):
return decorator(self.__wrapper, func)
def __wrapper(self, func, *fargs, **fkwargs):
log.debug('Checking login required for user:%s', user.username)
log.debug('user %s is authenticated', user.username)
return func(*fargs, **fkwargs)
log.warn('user %s not authenticated', user.username)
log.debug('redirecting to login page')
return redirect(url('login_home'))
Status change: