# -*- coding: utf-8 -*- """修 _resolve_received 里相对路径那一段的误判(file_pull / 接收文件)。 问题链: path = "java_payload.bin"(文件名,不是绝对路径) → relative = (cwd / path) = <程序目录>\\java_payload.bin → 它在 app_dir() 里面 → 被判定为"敏感目录" → 直接 return None,**根本走不到下面按文件名查找的逻辑** → 报"文件不存在" 也就是说:只要被控端装在程序目录里传文件,就永远拉不回来。 正确的做法:只有这个相对路径**真的指向一个存在的文件**时,才做敏感判断; 否则老老实实往下走,去接收目录里按文件名找。 """ from __future__ import annotations import sys from pathlib import Path SERVER = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\windows" r"\lanremote\server.py") OLD = ''' if relative is not None: if self._is_sensitive(relative): self._log(f"[文件] 拒绝拉取数据目录: {raw}") return None allowed_roots = [self.store.received_dir()] if self.features is not None: allowed_roots.extend(self.features.allowed_roots()) for root in allowed_roots: try: relative.relative_to(root.resolve()) if relative.is_file(): return relative break # 在允许目录内但不是文件,交给下面按名字找 except (ValueError, OSError): continue''' NEW = ''' if relative is not None and relative.is_file(): # 只有真的命中一个**存在的文件**时才做敏感判断。 # 否则 (cwd/文件名) 会拼出一个程序目录内的假路径, # 被误判成敏感目录 -> 直接返回 None -> 走不到下面的按名字查找, # 表现就是"接收文件永远拿不到东西"。 if self._is_sensitive(relative): self._log(f"[文件] 拒绝拉取数据目录: {raw}") return None allowed_roots = [self.store.received_dir()] if self.features is not None: allowed_roots.extend(self.features.allowed_roots()) for root in allowed_roots: try: relative.relative_to(root.resolve()) return relative except (ValueError, OSError): continue self._log(f"[文件] 拒绝拉取允许范围外的路径: {relative}") return None''' def main() -> int: text = SERVER.read_text(encoding="utf-8") if OLD not in text: print(" [失败] 锚点没找到") return 1 SERVER.write_text(text.replace(OLD, NEW, 1), encoding="utf-8") print(" 已修:只有存在的文件才做敏感判断") import ast try: ast.parse(SERVER.read_text(encoding="utf-8")) print(" server.py: 语法 OK") except SyntaxError as exc: print(f" server.py: 语法错误 {exc}") return 1 return 0 if __name__ == "__main__": sys.exit(main())