3 changed files with 96 additions and 4 deletions
@ -0,0 +1,88 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# |
|||
# The MIT License (MIT) |
|||
# |
|||
# Copyright (C) 2017 Marcos Pereira <marcospereira.mpj@gmail.com> |
|||
# |
|||
# Permission is hereby granted, free of charge, to any person obtaining a copy of |
|||
# this software and associated documentation files (the "Software"), to deal in |
|||
# the Software without restriction, including without limitation the rights to |
|||
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
|||
# the Software, and to permit persons to whom the Software is furnished to do so, |
|||
# subject to the following conditions: |
|||
# |
|||
# The above copyright notice and this permission notice shall be included in all |
|||
# copies or substantial portions of the Software. |
|||
# |
|||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
|||
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
|||
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
|||
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|||
|
|||
from keycloak.exceptions import PermissionDefinitionError |
|||
|
|||
|
|||
class UMA_Permission(): |
|||
"""A class to conveniently assembly permissions. |
|||
The class itself is callable, and will return the assembled permission. |
|||
|
|||
Usage example: |
|||
|
|||
>>> r = Resource("Users") |
|||
>>> s = Scope("delete") |
|||
>>> permission = r(s) |
|||
>>> print(permission) |
|||
'Users#delete' |
|||
|
|||
""" |
|||
|
|||
def __init__(self, *, resource="", scope=""): |
|||
self.resource = resource |
|||
self.scope = scope |
|||
|
|||
def __str__(self): |
|||
scope = self.scope |
|||
if scope: |
|||
scope = "#"+scope |
|||
return "{}{}".format(self.resource, scope) |
|||
|
|||
def __eq__(self, __o: object) -> bool: |
|||
return str(self) == str(__o) |
|||
|
|||
def __repr__(self) -> str: |
|||
return self.__str__() |
|||
|
|||
def __hash__(self) -> int: |
|||
return hash(str(self)) |
|||
|
|||
def __call__(self, *args, resource="", scope="") -> object: |
|||
result_resource = self.resource |
|||
result_scope = self.scope |
|||
|
|||
for arg in args: |
|||
if not isinstance(arg, UMA_Permission): |
|||
raise PermissionDefinitionError( |
|||
"can't determine if '{}' is a resource or scope".format(arg)) |
|||
if arg.resource: |
|||
result_resource = str(arg.resource) |
|||
if arg.scope: |
|||
result_scope = str(arg.scope) |
|||
|
|||
if resource: |
|||
result_resource = str(resource) |
|||
if scope: |
|||
result_scope = str(scope) |
|||
|
|||
return UMA_Permission(resource=result_resource, scope=result_scope) |
|||
|
|||
|
|||
class Resource(UMA_Permission): |
|||
def __init__(self, resource): |
|||
super().__init__(resource=resource) |
|||
|
|||
|
|||
class Scope(UMA_Permission): |
|||
def __init__(self, scope): |
|||
super().__init__(scope=scope) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue