35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
|
import grp
|
||
|
import os
|
||
|
|
||
|
from library import exceptions
|
||
|
|
||
|
class _PermissionLevel:
|
||
|
def __init__(self, group_name, pretty_name):
|
||
|
self.group_name = group_name
|
||
|
self.pretty_name = pretty_name
|
||
|
|
||
|
PERMISSION_OFFICE = _PermissionLevel("office", "Office worker")
|
||
|
PERMISSION_LIBCOM = _PermissionLevel("libcom", "Library Committee")
|
||
|
|
||
|
def check_permissions(permission_level):
|
||
|
def decorator(fn):
|
||
|
def wrapped_function(*args, **kwargs):
|
||
|
if not has_permission(permission_level):
|
||
|
raise exceptions.PermissionsError(permission_level.pretty_name)
|
||
|
return fn(*args, **kwargs)
|
||
|
|
||
|
return wrapped_function
|
||
|
|
||
|
return decorator
|
||
|
|
||
|
def has_permission(permission_level):
|
||
|
return permission_level.group_name in _CURRENT_GROUPS_GETTER()
|
||
|
|
||
|
def _current_group_names():
|
||
|
group_ids = os.getgroups()
|
||
|
group_names = [grp.getgrgid(group_id).gr_name for group_id in group_ids]
|
||
|
return group_names
|
||
|
|
||
|
# Hack to allow dependency injection for testing
|
||
|
_CURRENT_GROUPS_GETTER = _current_group_names
|