| class Checker(TrustedCheckerBase): |
class Checker(TrustedCheckerBase): |
| implements(INameBasedChecker) |
implements(INameBasedChecker) |
| |
|
| def __init__(self, permission_func, |
def __init__(self, get_permissions, set_permissions=None): |
| setattr_permission_func=lambda name: None |
|
| ): |
|
| """Create a checker |
"""Create a checker |
| |
|
| A dictionary or a callable must be provided for computing |
A dictionary must be provided for computing permissions for |
| permissions for names. The callable will be called with |
names. The disctionary get will be called with attribute names |
| attribute names and must return a permission id, None, or the |
and must return a permission id, None, or the special marker, |
| special marker, CheckerPublic. If None is returned, then |
CheckerPublic. If None is returned, then access to the name is |
| access to the name is forbidden. If CheckerPublic is returned, |
forbidden. If CheckerPublic is returned, then access will be |
| then access will be granted without checking a permission. |
granted without checking a permission. |
| |
|
| An optional setattr permission function or dictionary may be |
An optional setattr dictionary may be provided for checking |
| provided for checking set attribute access. |
set attribute access. |
| """ |
|
| |
|
| if type(permission_func) is dict: |
|
| permission_func = permission_func.get |
|
| self._permission_func = permission_func |
|
| |
|
| if type(setattr_permission_func) is dict: |
|
| setattr_permission_func = setattr_permission_func.get |
|
| self._setattr_permission_func = setattr_permission_func |
|
| |
|
| def getPermission_func(self): |
""" |
| return self._permission_func |
|
| |
|
| def getSetattrPermission_func(self): |
assert isinstance(get_permissions, dict) |
| return self._setattr_permission_func |
self.get_permissions = get_permissions |
| |
if set_permissions is not None: |
| |
assert isinstance(set_permissions, dict) |
| |
self.set_permissions = set_permissions |
| |
|
| def permission_id(self, name): |
def permission_id(self, name): |
| 'See INameBasedChecker' |
'See INameBasedChecker' |
| return self._permission_func(name) |
return self.get_permissions.get(name) |
| |
|
| def setattr_permission_id(self, name): |
def setattr_permission_id(self, name): |
| 'See INameBasedChecker' |
'See INameBasedChecker' |
| return self._setattr_permission_func(name) |
if self.set_permissions: |
| |
return self.set_permissions.get(name) |
| |
|
| def check_getattr(self, object, name): |
def check_getattr(self, object, name): |
| 'See IChecker' |
'See IChecker' |
| |
|
| def check_setattr(self, object, name): |
def check_setattr(self, object, name): |
| 'See IChecker' |
'See IChecker' |
| permission = self._setattr_permission_func(name) |
if self.set_permissions: |
| |
permission = self.set_permissions.get(name) |
| |
else: |
| |
permission = None |
| |
|
| if permission is not None: |
if permission is not None: |
| if permission is CheckerPublic: |
if permission is CheckerPublic: |
| return # Public |
return # Public |
| |
|
| def check(self, object, name): |
def check(self, object, name): |
| 'See IChecker' |
'See IChecker' |
| permission = self._permission_func(name) |
permission = self.get_permissions.get(name) |
| if permission is not None: |
if permission is not None: |
| if permission is CheckerPublic: |
if permission is CheckerPublic: |
| return # Public |
return # Public |
| raise DuplicationError(name) |
raise DuplicationError(name) |
| data[name] = permission_id |
data[name] = permission_id |
| |
|
| return Checker(data.get) |
return Checker(data) |
| |
|
| def InterfaceChecker(interface, permission_id=CheckerPublic, **__kw__): |
def InterfaceChecker(interface, permission_id=CheckerPublic, **__kw__): |
| return NamesChecker(interface.names(all=True), permission_id, **__kw__) |
return NamesChecker(interface.names(all=True), permission_id, **__kw__) |
| raise DuplicationError(name) |
raise DuplicationError(name) |
| data[name] = permission_id |
data[name] = permission_id |
| |
|
| return Checker(data.get) |
return Checker(data) |
| |
|
| def selectChecker(object): |
def selectChecker(object): |
| """Get a checker for the given object |
"""Get a checker for the given object |
| |
|
| _getChecker = _checkers.get |
_getChecker = _checkers.get |
| |
|
| _defaultChecker = Checker({}.get) |
_defaultChecker = Checker({}) |
| |
|
| def _instanceChecker(inst): |
def _instanceChecker(inst): |
| checker = _checkers.get(inst.__class__, _defaultChecker) |
checker = _checkers.get(inst.__class__, _defaultChecker) |