Improved permission check #393
This commit is contained in:
		@@ -24,3 +24,4 @@ class FeatureFlagsEnum(Enum):
 | 
			
		||||
    game_server = "GameServer"
 | 
			
		||||
    sync_xp = "SyncXp"
 | 
			
		||||
    short_role_name = "ShortRoleName"
 | 
			
		||||
    technician_full_access = "TechnicianFullAccess"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ class FeatureFlagsSettings(ConfigurationModelABC):
 | 
			
		||||
        FeatureFlagsEnum.game_server.value: False,  # 25.09.2023 #366
 | 
			
		||||
        FeatureFlagsEnum.sync_xp.value: False,  # 25.09.2023 #366
 | 
			
		||||
        FeatureFlagsEnum.short_role_name.value: False,  # 28.09.2023 #378
 | 
			
		||||
        FeatureFlagsEnum.technician_full_access.value: False,  # 02.10.2023 #393
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, **kwargs: dict):
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
from typing import Callable
 | 
			
		||||
 | 
			
		||||
from ariadne import ObjectType
 | 
			
		||||
from cpl_core.configuration import ConfigurationABC
 | 
			
		||||
from cpl_core.dependency_injection import ServiceProviderABC
 | 
			
		||||
from cpl_core.type import T
 | 
			
		||||
from cpl_discord.service import DiscordBotServiceABC
 | 
			
		||||
@@ -10,6 +11,7 @@ from bot_api.exception.service_error_code_enum import ServiceErrorCode
 | 
			
		||||
from bot_api.exception.service_exception import ServiceException
 | 
			
		||||
from bot_api.route.route import Route
 | 
			
		||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
			
		||||
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
 | 
			
		||||
from bot_data.model.achievement import Achievement
 | 
			
		||||
from bot_data.model.auth_role_enum import AuthRoleEnum
 | 
			
		||||
from bot_data.model.auth_user import AuthUser
 | 
			
		||||
@@ -75,7 +77,12 @@ class QueryABC(ObjectType):
 | 
			
		||||
        def get_services(services: ServiceProviderABC) -> ServiceProviderABC:
 | 
			
		||||
            return services
 | 
			
		||||
 | 
			
		||||
        @ServiceProviderABC.inject
 | 
			
		||||
        def get_config(config: ConfigurationABC) -> ConfigurationABC:
 | 
			
		||||
            return config
 | 
			
		||||
 | 
			
		||||
        services = get_services()
 | 
			
		||||
        config = get_config()
 | 
			
		||||
        permissions: PermissionService = services.get_service(PermissionService)
 | 
			
		||||
        bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
 | 
			
		||||
 | 
			
		||||
@@ -84,6 +91,13 @@ class QueryABC(ObjectType):
 | 
			
		||||
 | 
			
		||||
        for u in user.users:
 | 
			
		||||
            guild = bot.get_guild(u.server.discord_id)
 | 
			
		||||
 | 
			
		||||
            settings: ServerConfig = config.get_configuration(f"ServerConfig_{guild.id}")
 | 
			
		||||
            if not FeatureFlagsSettings.get_flag_from_dict(
 | 
			
		||||
                settings.feature_flags, FeatureFlagsEnum.technician_full_access
 | 
			
		||||
            ):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            if permissions.is_member_technician(guild.get_member(u.discord_id)):
 | 
			
		||||
                return True
 | 
			
		||||
 | 
			
		||||
@@ -216,23 +230,40 @@ class QueryABC(ObjectType):
 | 
			
		||||
 | 
			
		||||
    @ServiceProviderABC.inject
 | 
			
		||||
    def _can_user_mutate_data(self, server: Server, permission: UserRoleEnum, services: ServiceProviderABC):
 | 
			
		||||
        @ServiceProviderABC.inject
 | 
			
		||||
        def get_config(config: ConfigurationABC) -> ConfigurationABC:
 | 
			
		||||
            return config
 | 
			
		||||
 | 
			
		||||
        config = get_config()
 | 
			
		||||
        permissions: PermissionService = services.get_service(PermissionService)
 | 
			
		||||
        bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
 | 
			
		||||
 | 
			
		||||
        auth_user = Route.get_user()
 | 
			
		||||
        if auth_user == "system" or auth_user.auth_role == AuthRoleEnum.admin:
 | 
			
		||||
        if auth_user == "system":
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        member = bot.get_guild(server.discord_id).get_member(
 | 
			
		||||
            auth_user.users.where(lambda x: x.server.id == server.id).single().discord_id
 | 
			
		||||
        )
 | 
			
		||||
        settings: ServerConfig = config.get_configuration(f"ServerConfig_{member.guild.id}")
 | 
			
		||||
        technician_full_access_flag = FeatureFlagsSettings.get_flag_from_dict(
 | 
			
		||||
            settings.feature_flags, FeatureFlagsEnum.technician_full_access
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        check_perm = lambda x: True
 | 
			
		||||
        check_perm = lambda x: False
 | 
			
		||||
        match permission:
 | 
			
		||||
            case UserRoleEnum.moderator:
 | 
			
		||||
                check_perm = lambda x: permissions.is_member_moderator(x)
 | 
			
		||||
                check_perm = (
 | 
			
		||||
                    lambda x: technician_full_access_flag
 | 
			
		||||
                    and permissions.is_member_technician(x)
 | 
			
		||||
                    or permissions.is_member_moderator(x)
 | 
			
		||||
                )
 | 
			
		||||
            case UserRoleEnum.admin:
 | 
			
		||||
                check_perm = lambda x: permissions.is_member_admin(x)
 | 
			
		||||
                check_perm = (
 | 
			
		||||
                    lambda x: technician_full_access_flag
 | 
			
		||||
                    and permissions.is_member_technician(x)
 | 
			
		||||
                    or permissions.is_member_admin(x)
 | 
			
		||||
                )
 | 
			
		||||
            case UserRoleEnum.technician:
 | 
			
		||||
                check_perm = lambda x: permissions.is_member_technician(x)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user