From 5a93867417aa5f40d218a0162257a8cc3989cba9 Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:39:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(config):=20=E4=B8=B4=E6=97=B6=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20master=5Fusers=20=E5=8A=A0=E8=BD=BD=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: 由于未明原因,配置文件(bot_config.toml)中的 `permission.master_users` 字段在加载过程中被意外清空,导致权限系统无法正确识别 Master 用户。初步排查指向复杂的配置版本自动更新与迁移逻辑。 解决方案: 在 `config.py` 的 `load_config` 函数中,于 Pydantic 模型验证完成后,增加了一段临时修复代码。该代码会从 `tomlkit` 解析出的原始配置数据中,重新读取 `master_users` 的值,并将其强制赋给最终的 `config` 对象。 具体实现: 1. 使用 `config_data.unwrap()` 将 `tomlkit` 对象安全地转换为标准 Python 字典。 2. 从字典中提取 `permission.master_users` 的值。 3. 将提取到的值直接赋给 `config.permission.master_users`。 4. 添加了详细的日志,以便追踪此修复操作的执行情况。 影响: - **正面**:立即恢复了 Master 用户的识别功能,解决了权限检查失效的核心问题。 - **注意**:这是一个临时性的解决方案(workaround),并未从根本上解决配置更新逻辑中可能存在的缺陷。后续仍需对该逻辑进行深入排查和重构。 --- src/config/config.py | 18 ++++++++++ src/plugin_system/core/permission_manager.py | 37 +++++++++++++++----- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/config/config.py b/src/config/config.py index 833fca481..4d4615114 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -185,6 +185,11 @@ def _update_dict(target: TOMLDocument | dict | Table, source: TOMLDocument | dic if key == "version": continue + # 在合并 permission.master_users 时添加特别调试日志 + if key == "permission" and isinstance(value, (dict, Table)) and "master_users" in value: + logger.info(f"【调试日志】在 _update_dict 中检测到 'permission' 表,其 'master_users' 的值为: {value['master_users']}") + + if key in target: # 键已存在,更新值 target_value = target[key] @@ -497,6 +502,19 @@ def load_config(config_path: str) -> Config: logger.info("正在解析和验证配置文件...") config = Config.from_dict(config_data) logger.info("配置文件解析和验证完成") + + # 【临时修复】在验证后,手动从原始数据重新加载 master_users + try: + # 先将 tomlkit 对象转换为纯 Python 字典 + config_dict = config_data.unwrap() + if "permission" in config_dict and "master_users" in config_dict["permission"]: + raw_master_users = config_dict["permission"]["master_users"] + # 现在 raw_master_users 就是一个标准的 Python 列表了 + config.permission.master_users = raw_master_users + logger.info(f"【临时修复】已手动将 master_users 设置为: {config.permission.master_users}") + except Exception as patch_exc: + logger.error(f"【临时修复】手动设置 master_users 失败: {patch_exc}") + return config except Exception as e: logger.critical(f"配置文件解析失败: {e}") diff --git a/src/plugin_system/core/permission_manager.py b/src/plugin_system/core/permission_manager.py index 3132c48c8..6ef070237 100644 --- a/src/plugin_system/core/permission_manager.py +++ b/src/plugin_system/core/permission_manager.py @@ -34,20 +34,39 @@ class PermissionManager(IPermissionManager): def _load_master_users(self): """从配置文件加载Master用户列表""" + logger.info("开始从配置文件加载Master用户...") try: master_users_config = global_config.permission.master_users + if not isinstance(master_users_config, list): + logger.warning(f"配置文件中的 permission.master_users 不是一个列表,已跳过加载。") + self._master_users = set() + return + self._master_users = set() - for user_info in master_users_config: - if isinstance(user_info, list) and len(user_info) == 2: - platform, user_id = user_info - self._master_users.add((str(platform), str(user_id))) - logger.info(f"已加载 {len(self._master_users)} 个Master用户") + for i, user_info in enumerate(master_users_config): + if not isinstance(user_info, list) or len(user_info) != 2: + logger.warning(f"Master用户配置项格式错误 (索引: {i}): {user_info},应为 [\"platform\", \"user_id\"]") + continue + + platform, user_id = user_info + if not isinstance(platform, str) or not isinstance(user_id, str): + logger.warning( + f"Master用户配置项 platform 或 user_id 类型错误 (索引: {i}): [{type(platform).__name__}, {type(user_id).__name__}],应为字符串" + ) + continue + + self._master_users.add((platform, user_id)) + logger.debug(f"成功加载Master用户: platform={platform}, user_id={user_id}") + + logger.info(f"成功加载 {len(self._master_users)} 个Master用户") + except Exception as e: - logger.warning(f"加载Master用户配置失败: {e}") + logger.error(f"加载Master用户配置时发生严重错误: {e}", exc_info=True) self._master_users = set() def reload_master_users(self): """重新加载Master用户配置""" + logger.info("正在重新加载Master用户配置...") self._load_master_users() logger.info("Master用户配置已重新加载") @@ -62,10 +81,10 @@ class PermissionManager(IPermissionManager): bool: 是否为Master用户 """ user_tuple = (user.platform, user.user_id) - is_master = user_tuple in self._master_users - if is_master: + is_master_flag = user_tuple in self._master_users + if is_master_flag: logger.debug(f"用户 {user.platform}:{user.user_id} 是Master用户") - return is_master + return is_master_flag async def check_permission(self, user: UserInfo, permission_node: str) -> bool: """