Changeset - 5d517bbf0a0d
[Not reviewed]
default
0 1 0
Marcin Kuzminski - 15 years ago 2010-07-06 23:57:57
marcin@python-works.com
some extra checks for auth lib
1 file changed with 22 insertions and 10 deletions:
0 comments (0 inline, 0 general)
pylons_app/lib/auth.py
Show inline comments
 
@@ -197,88 +197,94 @@ class PermsDecorator(object):
 
            if self.check_permissions():
 
                log.debug('Permission granted for %s', func.__name__)
 
                return func(*fargs)
 
            
 
            else:
 
                log.warning('Permission denied for %s', func.__name__)
 
                #redirect with forbidden ret code
 
                return abort(403)
 
        return _wrapper
 
        
 
        
 
    def check_permissions(self):
 
        """
 
        Dummy function for overriding
 
        """
 
        raise Exception('You have to write this function in child class')
 

	
 
class HasPermissionAllDecorator(PermsDecorator):
 
    """
 
    Checks for access permission for all given predicates. All of them have to
 
    be meet in order to fulfill the request
 
    """
 
        
 
    def check_permissions(self):
 
        if self.required_perms.issubset(self.user_perms['global']):
 
        if self.required_perms.issubset(self.user_perms.get('global')):
 
            return True
 
        return False
 
            
 

	
 
class HasPermissionAnyDecorator(PermsDecorator):
 
    """
 
    Checks for access permission for any of given predicates. In order to 
 
    fulfill the request any of predicates must be meet
 
    """
 
    
 
    def check_permissions(self):
 
        if self.required_perms.intersection(self.user_perms['global']):
 
        if self.required_perms.intersection(self.user_perms.get('global')):
 
            return True
 
        return False
 

	
 
class HasRepoPermissionAllDecorator(PermsDecorator):
 
    """
 
    Checks for access permission for all given predicates for specific 
 
    repository. All of them have to be meet in order to fulfill the request
 
    """
 
            
 
    def check_permissions(self):
 
        repo_name = get_repo_slug(request)
 
        user_perms = set([self.user_perms['repositories'][repo_name]])
 
        try:
 
            user_perms = set([self.user_perms['repositories'][repo_name]])
 
        except KeyError:
 
            return False
 
        if self.required_perms.issubset(user_perms):
 
            return True
 
        return False
 
            
 

	
 
class HasRepoPermissionAnyDecorator(PermsDecorator):
 
    """
 
    Checks for access permission for any of given predicates for specific 
 
    repository. In order to fulfill the request any of predicates must be meet
 
    """
 
            
 
    def check_permissions(self):
 
        repo_name = get_repo_slug(request)
 
        
 
        user_perms = set([self.user_perms['repositories'][repo_name]])
 
        try:
 
            user_perms = set([self.user_perms['repositories'][repo_name]])
 
        except KeyError:
 
            return False
 
        if self.required_perms.intersection(user_perms):
 
            return True
 
        return False
 
#===============================================================================
 
# CHECK FUNCTIONS
 
#===============================================================================
 

	
 
class PermsFunction(object):
 
    """
 
    Base function for other check functions
 
    """
 
    
 
    def __init__(self, *perms):
 
        available_perms = config['available_permissions']
 
        
 
        for perm in perms:
 
            if perm not in available_perms:
 
                raise Exception("'%s' permission in not defined" % perm)
 
        self.required_perms = set(perms)
 
        self.user_perms = None
 
        self.granted_for = ''
 
        self.repo_name = None
 
        
 
    def __call__(self, check_Location=''):
 
@@ -286,88 +292,94 @@ class PermsFunction(object):
 
        if not user:
 
            return False
 
        self.user_perms = user.permissions
 
        self.granted_for = user.username        
 
        log.debug('checking %s %s', self.__class__.__name__, self.required_perms)            
 
        
 
        if self.check_permissions():
 
            log.debug('Permission granted for %s @%s', self.granted_for,
 
                      check_Location)
 
            return True
 
        
 
        else:
 
            log.warning('Permission denied for %s @%s', self.granted_for,
 
                        check_Location)
 
            return False 
 
    
 
    def check_permissions(self):
 
        """
 
        Dummy function for overriding
 
        """
 
        raise Exception('You have to write this function in child class')
 
        
 
class HasPermissionAll(PermsFunction):
 
    def check_permissions(self):
 
        if self.required_perms.issubset(self.user_perms['global']):
 
        if self.required_perms.issubset(self.user_perms.get('global')):
 
            return True
 
        return False
 

	
 
class HasPermissionAny(PermsFunction):
 
    def check_permissions(self):
 
        if self.required_perms.intersection(self.user_perms['global']):
 
        if self.required_perms.intersection(self.user_perms.get('global')):
 
            return True
 
        return False
 

	
 
class HasRepoPermissionAll(PermsFunction):
 
    
 
    def __call__(self, repo_name=None, check_Location=''):
 
        self.repo_name = repo_name
 
        return super(HasRepoPermissionAll, self).__call__(check_Location)
 
            
 
    def check_permissions(self):
 
        if not self.repo_name:
 
            self.repo_name = get_repo_slug(request)
 

	
 
        self.user_perms = set([self.user_perms['repositories']\
 
                               .get(self.repo_name)])
 
        try:
 
            self.user_perms = set([self.user_perms['repositories']\
 
                                   [self.repo_name]])
 
        except KeyError:
 
            return False
 
        self.granted_for = self.repo_name       
 
        if self.required_perms.issubset(self.user_perms):
 
            return True
 
        return False
 
            
 
class HasRepoPermissionAny(PermsFunction):
 
    
 
    
 
    def __call__(self, repo_name=None, check_Location=''):
 
        self.repo_name = repo_name
 
        return super(HasRepoPermissionAny, self).__call__(check_Location)
 
        
 
    def check_permissions(self):
 
        if not self.repo_name:
 
            self.repo_name = get_repo_slug(request)
 

	
 
        self.user_perms = set([self.user_perms['repositories']\
 
                               .get(self.repo_name)])
 
        try:
 
            self.user_perms = set([self.user_perms['repositories']\
 
                                   [self.repo_name]])
 
        except KeyError:
 
            return False
 
        self.granted_for = self.repo_name
 
        if self.required_perms.intersection(self.user_perms):
 
            return True
 
        return False
 

	
 
#===============================================================================
 
# SPECIAL VERSION TO HANDLE MIDDLEWARE AUTH
 
#===============================================================================
 

	
 
class HasPermissionAnyMiddleware(object):
 
    def __init__(self, *perms):
 
        self.required_perms = set(perms)
 
    
 
    def __call__(self, user, repo_name):
 
        usr = AuthUser()
 
        usr.user_id = user.user_id
 
        usr.username = user.username
 
        usr.is_admin = user.admin
 
        
 
        try:
 
            self.user_perms = set([fill_perms(usr)\
 
                                   .permissions['repositories'][repo_name]])
 
        except:
 
            self.user_perms = set()
0 comments (0 inline, 0 general)