diff --git a/astrbot/core/platform/manager.py b/astrbot/core/platform/manager.py index 6b33693e7..c8043e56b 100644 --- a/astrbot/core/platform/manager.py +++ b/astrbot/core/platform/manager.py @@ -27,6 +27,17 @@ def __init__(self, config: AstrBotConfig, event_queue: Queue): 约定整个项目中对 unique_session 的引用都从 default 的配置中获取""" self.event_queue = event_queue + def _is_valid_platform_id(self, platform_id: str | None) -> bool: + if not platform_id: + return False + return ":" not in platform_id and "!" not in platform_id + + def _sanitize_platform_id(self, platform_id: str | None) -> tuple[str | None, bool]: + if not platform_id: + return platform_id, False + sanitized = platform_id.replace(":", "_").replace("!", "_") + return sanitized, sanitized != platform_id + async def initialize(self): """初始化所有平台适配器""" for platform in self.platforms_config: @@ -53,6 +64,22 @@ async def load_platform(self, platform_config: dict): try: if not platform_config["enable"]: return + platform_id = platform_config.get("id") + if not self._is_valid_platform_id(platform_id): + sanitized_id, changed = self._sanitize_platform_id(platform_id) + if sanitized_id and changed: + logger.warning( + "平台 ID %r 包含非法字符 ':' 或 '!',已替换为 %r。", + platform_id, + sanitized_id, + ) + platform_config["id"] = sanitized_id + self.astrbot_config.save_config() + else: + logger.error( + f"平台 ID {platform_id!r} 不能为空,跳过加载该平台适配器。", + ) + return logger.info( f"载入 {platform_config['type']}({platform_config['id']}) 平台适配器 ...", diff --git a/dashboard/src/components/platform/AddNewPlatform.vue b/dashboard/src/components/platform/AddNewPlatform.vue index 67b6b99da..118aa202a 100644 --- a/dashboard/src/components/platform/AddNewPlatform.vue +++ b/dashboard/src/components/platform/AddNewPlatform.vue @@ -421,6 +421,10 @@ export default { return false; } + if (!this.isPlatformIdValid(this.selectedPlatformConfig?.id)) { + return false; + } + // 如果是使用现有配置文件模式 if (this.aBConfigRadioVal === '0') { return !!this.selectedAbConfId; @@ -637,6 +641,12 @@ export default { return; } + if (!this.isPlatformIdValid(id)) { + this.loading = false; + this.showError(this.tm('dialog.invalidPlatformId')); + return; + } + try { // 更新平台配置 let resp = await axios.post('/api/config/platform/update', { @@ -662,6 +672,12 @@ export default { } }, async savePlatform() { + if (!this.isPlatformIdValid(this.selectedPlatformConfig?.id)) { + this.loading = false; + this.showError(this.tm('dialog.invalidPlatformId')); + return; + } + // 检查 ID 是否已存在 const existingPlatform = this.config_data.platform?.find(p => p.id === this.selectedPlatformConfig.id); if (existingPlatform || this.selectedPlatformConfig.id === 'webchat') { @@ -808,6 +824,13 @@ export default { this.$emit('show-toast', { message: message, type: 'error' }); }, + isPlatformIdValid(id) { + if (!id) { + return false; + } + return !/[!:]/.test(id); + }, + // 获取该平台适配器使用的所有配置文件(新版本:直接操作路由表) async getPlatformConfigs(platformId) { if (!platformId) { @@ -1032,4 +1055,4 @@ export default { overflow-y: auto; padding: 16px 16px 24px 16px; } - \ No newline at end of file + diff --git a/dashboard/src/i18n/locales/en-US/features/platform.json b/dashboard/src/i18n/locales/en-US/features/platform.json index 96a2696aa..ea1bc0180 100644 --- a/dashboard/src/i18n/locales/en-US/features/platform.json +++ b/dashboard/src/i18n/locales/en-US/features/platform.json @@ -42,7 +42,8 @@ "title": "Security Warning", "aiocqhttpTokenMissing": "To enhance connection security, it is strongly recommended to set ws_reverse_token. Not setting a token may lead to security risks.", "learnMore": "Learn More" - } + }, + "invalidPlatformId": "Platform ID cannot contain ':' or '!'." }, "messages": { "updateSuccess": "Update successful!", @@ -76,4 +77,4 @@ "traceback": "Traceback", "close": "Close" } -} \ No newline at end of file +} diff --git a/dashboard/src/i18n/locales/zh-CN/features/platform.json b/dashboard/src/i18n/locales/zh-CN/features/platform.json index 7f8ef7c0d..204e5c58b 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/platform.json +++ b/dashboard/src/i18n/locales/zh-CN/features/platform.json @@ -42,7 +42,8 @@ "title": "安全提醒", "aiocqhttpTokenMissing": "为了增强连接安全性,强烈建议您设置 ws_reverse_token。未设置 Token 可能导致安全风险。", "learnMore": "了解更多" - } + }, + "invalidPlatformId": "平台 ID 不能包含 ':' 或 '!'。" }, "messages": { "updateSuccess": "更新成功!", @@ -76,4 +77,4 @@ "traceback": "错误堆栈", "close": "关闭" } -} \ No newline at end of file +}