crafty-4/app/classes/models/crafty_permissions.py

206 lines
7.8 KiB
Python
Raw Normal View History

2021-09-08 22:01:10 +00:00
import logging
import typing as t
from enum import Enum
from peewee import (
ForeignKeyField,
CharField,
IntegerField,
DoesNotExist,
)
2021-09-08 22:01:10 +00:00
from app.classes.models.base_model import BaseModel
from app.classes.models.servers import HelperServers
from app.classes.models.users import Users, ApiKeys, HelperUsers
2022-04-12 23:22:57 +00:00
from app.classes.shared.permission_helper import PermissionHelper
2021-09-08 22:01:10 +00:00
2022-03-08 04:40:44 +00:00
logger = logging.getLogger(__name__)
2021-10-09 08:45:40 +00:00
2023-02-15 23:01:21 +00:00
# **********************************************************************************
2021-09-08 22:01:10 +00:00
# User_Crafty Class
# **********************************************************************************
class UserCrafty(BaseModel):
user_id = ForeignKeyField(Users, backref="users_crafty")
2021-09-08 22:01:10 +00:00
permissions = CharField(default="00000000")
limit_server_creation = IntegerField(default=-1)
limit_user_creation = IntegerField(default=0)
limit_role_creation = IntegerField(default=0)
class Meta:
table_name = "user_crafty"
2021-09-08 22:01:10 +00:00
# **********************************************************************************
2021-09-08 22:01:10 +00:00
# Crafty Permissions Class
# **********************************************************************************
class EnumPermissionsCrafty(Enum):
SERVER_CREATION = 0
USER_CONFIG = 1
ROLES_CONFIG = 2
2021-09-08 22:01:10 +00:00
class PermissionsCrafty:
# **********************************************************************************
2021-09-08 22:01:10 +00:00
# Crafty Permissions Methods
# **********************************************************************************
2021-09-08 22:01:10 +00:00
@staticmethod
def get_permissions_list():
2022-05-17 22:55:05 +00:00
return list(EnumPermissionsCrafty.__members__.values())
2021-09-08 22:01:10 +00:00
@staticmethod
def get_permissions(permissions_mask):
2022-05-16 14:52:09 +00:00
return [
permission
2022-05-17 22:55:05 +00:00
for permission in EnumPermissionsCrafty.__members__.values()
2022-05-16 14:52:09 +00:00
if PermissionsCrafty.has_permission(permissions_mask, permission)
]
2021-09-08 22:01:10 +00:00
@staticmethod
def has_permission(permission_mask, permission_tested: EnumPermissionsCrafty):
2022-05-16 14:52:09 +00:00
return permission_mask[permission_tested.value] == "1"
2021-09-08 22:01:10 +00:00
@staticmethod
def set_permission(
permission_mask, permission_tested: EnumPermissionsCrafty, value
):
2022-05-16 14:52:09 +00:00
index = permission_tested.value
return permission_mask[:index] + str(value) + permission_mask[index + 1 :]
2021-09-08 22:01:10 +00:00
@staticmethod
def get_permission(permission_mask, permission_tested: EnumPermissionsCrafty):
2021-09-08 22:01:10 +00:00
return permission_mask[permission_tested.value]
2021-10-09 08:45:40 +00:00
2021-09-08 22:01:10 +00:00
@staticmethod
def get_crafty_permissions_mask(user_id):
2022-05-16 14:52:09 +00:00
# TODO: only get the permissions of the UserCrafty
user_crafty = PermissionsCrafty.get_user_crafty(user_id)
2021-09-08 22:01:10 +00:00
permissions_mask = user_crafty.permissions
return permissions_mask
@staticmethod
def get_all_permission_quantity_list():
2022-05-17 22:55:05 +00:00
return {name: -1 for name in EnumPermissionsCrafty.__members__.keys()}
2021-09-08 22:01:10 +00:00
@staticmethod
def get_permission_quantity_list(user_id):
user_crafty = PermissionsCrafty.get_user_crafty(user_id)
2021-09-08 22:01:10 +00:00
quantity_list = {
EnumPermissionsCrafty.SERVER_CREATION.name: user_crafty.limit_server_creation, # pylint: disable=line-too-long
EnumPermissionsCrafty.USER_CONFIG.name: user_crafty.limit_user_creation,
EnumPermissionsCrafty.ROLES_CONFIG.name: user_crafty.limit_role_creation,
2021-09-08 22:01:10 +00:00
}
return quantity_list
2021-10-09 08:45:40 +00:00
# **********************************************************************************
2021-09-08 22:01:10 +00:00
# User_Crafty Methods
# **********************************************************************************
2021-09-08 22:01:10 +00:00
@staticmethod
def get_user_crafty(user_id):
2021-09-08 22:01:10 +00:00
try:
2022-05-16 14:52:09 +00:00
user_crafty = UserCrafty.get(UserCrafty.user_id == user_id)
except DoesNotExist:
UserCrafty.insert(
{
UserCrafty.user_id: user_id,
UserCrafty.permissions: "000",
UserCrafty.limit_server_creation: 0,
UserCrafty.limit_user_creation: 0,
UserCrafty.limit_role_creation: 0,
}
).execute()
user_crafty = PermissionsCrafty.get_user_crafty(user_id)
2021-09-08 22:01:10 +00:00
return user_crafty
@staticmethod
def get_user_crafty_optional(user_id) -> t.Optional[UserCrafty]:
try:
return UserCrafty.get(UserCrafty.user_id == user_id)
except DoesNotExist:
return None
2021-09-08 22:01:10 +00:00
@staticmethod
def add_user_crafty(user_id, uc_permissions):
user_crafty = UserCrafty.insert(
{UserCrafty.user_id: user_id, UserCrafty.permissions: uc_permissions}
).execute()
2021-09-08 22:01:10 +00:00
return user_crafty
2021-10-09 08:45:40 +00:00
2021-09-08 22:01:10 +00:00
@staticmethod
def add_or_update_user(
user_id,
permissions_mask,
limit_server_creation,
limit_user_creation,
limit_role_creation,
):
# http://docs.peewee-orm.com/en/latest/peewee/querying.html#upsert
2022-06-06 21:04:45 +00:00
try:
user_crafty = UserCrafty.select().where(UserCrafty.user_id == user_id).get()
user_crafty.permissions = permissions_mask
user_crafty.limit_server_creation = limit_server_creation
user_crafty.limit_user_creation = limit_user_creation
user_crafty.limit_role_creation = limit_role_creation
UserCrafty.save(user_crafty)
except:
UserCrafty.insert(
{
UserCrafty.user_id: user_id,
UserCrafty.permissions: permissions_mask,
UserCrafty.limit_server_creation: limit_server_creation,
UserCrafty.limit_user_creation: limit_user_creation,
UserCrafty.limit_role_creation: limit_role_creation,
}
).execute()
2021-10-09 08:45:40 +00:00
2021-09-08 22:01:10 +00:00
@staticmethod
def get_created_quantity_list(user_id):
quantity_list = {
2022-08-21 00:47:15 +00:00
EnumPermissionsCrafty.SERVER_CREATION.name: HelperServers.get_total_owned_servers( # pylint: disable=line-too-long
user_id
),
EnumPermissionsCrafty.USER_CONFIG.name: HelperUsers.get_managed_users(
user_id
).count(),
EnumPermissionsCrafty.ROLES_CONFIG.name: HelperUsers.get_managed_roles(
user_id
).count(),
2021-09-08 22:01:10 +00:00
}
return quantity_list
@staticmethod
def get_crafty_limit_value(user_id, permission):
quantity_list = PermissionsCrafty.get_permission_quantity_list(user_id)
2021-09-08 22:01:10 +00:00
return quantity_list[permission]
@staticmethod
def can_add_in_crafty(user_id, permission):
user_crafty = PermissionsCrafty.get_user_crafty(user_id)
can = PermissionsCrafty.has_permission(user_crafty.permissions, permission)
limit_list = PermissionsCrafty.get_permission_quantity_list(user_id)
quantity_list = PermissionsCrafty.get_created_quantity_list(user_id)
return can and (
(quantity_list[permission.name] < limit_list[permission.name])
or limit_list[permission.name] == -1
)
2021-09-08 22:01:10 +00:00
2022-01-15 00:23:50 +00:00
@staticmethod
def get_api_key_permissions_list(key: ApiKeys):
user = HelperUsers.get_user(key.user_id)
if user["superuser"] and key.superuser:
return PermissionsCrafty.get_permissions_list()
2022-06-14 12:40:57 +00:00
if user["superuser"]:
# User is superuser but API key isn't
user_permissions_mask = "111"
2022-01-15 00:23:50 +00:00
else:
2022-06-14 12:40:57 +00:00
# Not superuser
user_permissions_mask = PermissionsCrafty.get_crafty_permissions_mask(
user["user_id"]
)
2022-06-14 12:40:57 +00:00
key_permissions_mask: str = key.crafty_permissions
permissions_mask = PermissionHelper.combine_masks(
user_permissions_mask, key_permissions_mask
)
permissions_list = PermissionsCrafty.get_permissions(permissions_mask)
return permissions_list