diff --git a/.gitignore b/.gitignore index 4c9468e..483ad90 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,26 @@ -```gitignore +``` # Python __pycache__/ -*.py[cod] -*$py.class -*.so -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg +*.pyc +*.pyo +*.pyd -# IDE -.vscode/ -.idea/ - -# Environment +# Dependencies +.venv/ +venv/ .env .env.local -.env.* +*.env.* + +# Editors +.vscode/ +.idea/ # Logs *.log -# OS -.DS_Store -Thumbs.db +# Build artifacts +dist/ +build/ +target/ ``` \ No newline at end of file diff --git a/store/@{FutureOSS}/http-tcp/__pycache__/server.cpython-312.pyc b/store/@{FutureOSS}/http-tcp/__pycache__/server.cpython-312.pyc index 3ec62c1..d1cb8f9 100644 Binary files a/store/@{FutureOSS}/http-tcp/__pycache__/server.cpython-312.pyc and b/store/@{FutureOSS}/http-tcp/__pycache__/server.cpython-312.pyc differ diff --git a/store/@{FutureOSS}/http-tcp/server.py b/store/@{FutureOSS}/http-tcp/server.py index 7598762..f519520 100644 --- a/store/@{FutureOSS}/http-tcp/server.py +++ b/store/@{FutureOSS}/http-tcp/server.py @@ -133,9 +133,18 @@ class TcpHttpServer: buffer = b"" + except ConnectionResetError: + # 客户端断开连接,正常情况 + pass + except BrokenPipeError: + # 管道破裂,正常情况 + pass + except OSError as e: + if self.event_bus: + self.event_bus.emit(TcpEvent(type=EVENT_ERROR, client=client, context={"error": f"OSError: {e}"})) except Exception as e: if self.event_bus: - self.event_bus.emit(TcpEvent(type=EVENT_ERROR, client=client, context={"error": str(e)})) + self.event_bus.emit(TcpEvent(type=EVENT_ERROR, client=client, context={"error": f"{type(e).__name__}: {e}"})) finally: del self._clients[client.id] client.close() @@ -179,7 +188,12 @@ class TcpHttpServer: "headers": headers, "body": body, } + except UnicodeDecodeError: + return None + except ValueError: + return None except Exception: + # 其他解析错误 return None def _format_response(self, response: dict) -> bytes: diff --git a/store/@{FutureOSS}/plugin-loader/__pycache__/main.cpython-312.pyc b/store/@{FutureOSS}/plugin-loader/__pycache__/main.cpython-312.pyc index 15851e1..ecd1293 100644 Binary files a/store/@{FutureOSS}/plugin-loader/__pycache__/main.cpython-312.pyc and b/store/@{FutureOSS}/plugin-loader/__pycache__/main.cpython-312.pyc differ diff --git a/store/@{FutureOSS}/plugin-loader/main.py b/store/@{FutureOSS}/plugin-loader/main.py index 5a6ebad..6641d25 100644 --- a/store/@{FutureOSS}/plugin-loader/main.py +++ b/store/@{FutureOSS}/plugin-loader/main.py @@ -371,15 +371,47 @@ class PluginManager: with open(rf, "r", encoding="utf-8") as f: return f.read() def _load_config(self, plugin_dir: Path) -> dict: + """加载插件配置文件""" cf = plugin_dir / "config.py" - if not cf.exists(): return {} - with open(cf, "r", encoding="utf-8") as f: content = f.read() + if not cf.exists(): + return {} + try: + with open(cf, "r", encoding="utf-8") as f: + content = f.read() + except FileNotFoundError: + Log.warn("plugin-loader", f"配置文件不存在:{cf}") + return {} + except PermissionError as e: + Log.error("plugin-loader", f"配置文件无权限读取:{cf} - {e}") + return {} + except UnicodeDecodeError as e: + Log.error("plugin-loader", f"配置文件编码错误:{cf} - {e}") + return {} + + # 安全检查 for p in ['import ', 'open(', 'exec(', 'eval(', 'os.', 'sys.', 'subprocess']: - if p in content: Log.warn("plugin-loader", f"{cf} 包含危险代码: {p}"); return {} + if p in content: + Log.warn("plugin-loader", f"{cf} 包含危险代码:{p}") + return {} + sg = {"__builtins__": {"True": True, "False": False, "None": None, "dict": dict, "list": list, "str": str, "int": int, "float": float, "bool": bool}} lv = {} - try: code = compile(content, str(cf), "exec"); exec(code, sg, lv) - except Exception as e: Log.error("plugin-loader", f"配置文件解析失败: {e}"); return {} + try: + code = compile(content, str(cf), "exec") + exec(code, sg, lv) + except SyntaxError as e: + Log.error("plugin-loader", f"配置文件语法错误:{cf} - {e}") + return {} + except NameError as e: + Log.error("plugin-loader", f"配置文件名称错误:{cf} - {e}") + return {} + except TypeError as e: + Log.error("plugin-loader", f"配置文件类型错误:{cf} - {e}") + return {} + except Exception as e: + Log.error("plugin-loader", f"配置文件解析失败:{cf} - {type(e).__name__}: {e}") + return {} + return {k: v for k, v in lv.items() if not k.startswith("_") and not callable(v)} def _load_extensions(self, plugin_dir: Path) -> dict: