Enhance security and reliability across SFTP workflows

This commit is contained in:
liumangmang
2026-03-10 16:15:46 +08:00
parent 56c40410dc
commit 0c443b029d
23 changed files with 1477 additions and 394 deletions

190
AGENTS.md Normal file
View File

@@ -0,0 +1,190 @@
# `sftp-manager` AGENTS 指南
本文件面向在本仓库内执行任务的自动化 Coding Agent。
请将其作为本项目在构建、测试、编码规范方面的本地权威说明。
## 1项目概览
- 技术栈Spring Boot 2.7.18、Java 8、Maven、Spring Data JPA、H2、JSch、原生 HTML/CSS/JS。
- 启动入口:`src/main/java/com/sftp/manager/SftpManagerApplication.java`
- 主要目录结构:
- `src/main/java/com/sftp/manager/controller/`HTTP 控制器
- `src/main/java/com/sftp/manager/service/`业务逻辑SFTP、本地文件
- `src/main/java/com/sftp/manager/model/`:实体模型
- `src/main/java/com/sftp/manager/repository/`JPA 仓库
- `src/main/java/com/sftp/manager/dto/`:接口请求/响应 DTO
- `src/main/resources/static/`:前端静态资源
- `src/main/resources/application*.yml`:运行配置
- 默认端口:`48081`(见 `application.yml`)。
- 生产环境可启用 `prod` profile`application-prod.yml`)。
## 2Cursor / Copilot 规则检查结果
已检查以下路径,当前未发现规则文件:
- `.cursor/rules/`
- `.cursorrules`
- `.github/copilot-instructions.md`
若后续新增上述文件,请立即同步更新本 `AGENTS.md`
新增规则应视为更高优先级约束并优先遵循。
## 3构建、运行、测试命令
默认在仓库根目录执行命令。
### 3.1 Maven 构建与打包
- 仅编译:`mvn clean compile`
- 完整打包(含测试):`mvn clean package`
- 跳过测试打包:`mvn clean package -DskipTests`
- 安装到本地仓库:`mvn clean install`
### 3.2 本地运行
- 开发运行:`mvn spring-boot:run`
- 运行 JAR`java -jar target/sftp-manager-1.0.0.jar`
- 生产配置运行:`java -jar target/sftp-manager-1.0.0.jar --spring.profiles.active=prod`
### 3.3 Docker 运行
- Linux/Mac 一键启动:`./run.sh`
- Windows 一键启动:`run.bat`
- 手动启动:`docker compose up -d --build`
- 手动停止:`docker compose down`
### 3.4 测试命令(重点:单测定向执行)
当前仓库尚无 `src/test/**/*.java` 文件。
当新增测试后,按以下方式执行:
- 执行全部测试:`mvn test`
- 执行单个测试类:`mvn -Dtest=ConnectionServiceTest test`
- 执行单个测试方法:`mvn -Dtest=ConnectionServiceTest#connect_success test`
- 执行多个测试类:`mvn -Dtest=ConnectionServiceTest,FileControllerTest test`
若出现“测试未执行”,优先检查命名是否满足 Surefire 默认规则:
- `*Test`
- `*Tests`
- `*TestCase`
### 3.5 Lint / 质量门禁
`pom.xml` 当前未配置 Checkstyle、Spotless、PMD 等专用 lint 插件。
因此以“编译 + 测试”作为质量门禁:
- 快速门禁:`mvn clean compile`
- 完整门禁:`mvn clean test`
### 3.6 当前测试覆盖(供 Agent 参考)
目前已存在以下单测类,可按需定向执行:
- `ConnectionControllerTest`
- `FileControllerTest`
- `ConnectionServiceTest`
- `SessionManagerTest`
- `LocalFileServiceTest`
示例:
- 执行单个测试类:`mvn -Dtest=LocalFileServiceTest test`
- 执行单个测试方法:`mvn -Dtest=LocalFileServiceTest#renameFile_shouldAllowRenameInSameDirectory test`
## 4代码风格与工程约定
## 4.1 Java / Spring 通用约定
- 必须保持 Java 8 兼容,不使用 Java 9+ 语法。
- 包路径维持在 `com.sftp.manager` 下。
- 控制器保持轻量,核心逻辑放到 `service` 层。
- API 返回统一使用 `ApiResponse<T>`
- 延续既有接口前缀:
- `/api/connection/*`
- `/api/files/*`
- 沿用已有术语命名:`sessionId``sourcePath``targetPath``recursive`
## 4.2 依赖注入风格
- 现有代码大量使用字段注入 `@Autowired`,修改旧文件时保持一致。
- 新增类可用构造器注入,但同一类内不要混用多种注入风格。
- 避免“仅改一点却全文件重构注入方式”的无关变更。
## 4.3 Imports 与格式
- 保持文件现有 import 分组习惯,尽量与周边代码一致。
- 一般顺序:项目/第三方 → Spring → `javax.*``java.*`
- 避免通配符导入(`*`),优先显式导入。
- 使用 4 空格缩进,不使用 Tab。
- 保持现有大括号、注解换行和空行风格。
## 4.4 类型、DTO 与实体
- 避免原始类型集合,优先使用泛型(如 `List<FileInfo>`)。
- DTO/实体中,允许为空的数值或布尔优先用包装类型(`Integer``Long``Boolean`)。
- DTO 只做传输,不承载业务逻辑。
- 若同类文件已使用 Lombok `@Data`,新增同类对象可延续该模式。
## 4.5 命名规范
- 类名PascalCase`ConnectionService`)。
- 方法/变量/参数camelCase`getFileInfo`)。
- 常量UPPER_SNAKE_CASE`API_BASE`)。
- REST 路径:小写,必要时使用连字符,优先复用已有路径。
- Service 方法名优先“动词 + 对象”(如 `uploadToSftp``downloadFromSftp`)。
## 4.6 错误处理规范
- 先做参数校验,再执行核心逻辑。
- 控制器边界统一捕获异常,并映射为 `ApiResponse.error(...)`
- 错误信息要包含上下文(路径、会话、操作类型),但不得泄露敏感信息。
- 清理流程中的异常可按现有模式忽略,但主流程异常不可静默吞掉。
- 保持面向用户的提示语风格与现有代码一致(当前以中文提示为主)。
## 4.7 文件与流处理
- 所有 `InputStream` / `OutputStream` 优先使用 `try-with-resources`
- 明确“由谁负责关闭流”,避免重复关闭或泄漏。
- 递归文件操作需考虑部分失败、非法路径、权限不足等场景。
- 跨平台路径处理继续使用现有模式(`File.separator`、路径规范化)。
- 本地路径处理应统一规范化(`getCanonicalFile`),拒绝 `..` 上级目录穿越。
- 删除操作应防护根目录与系统关键目录Windows 与 Unix 路径均需考虑)。
- 重命名默认按“同目录重命名”语义实现,不在重命名接口里隐式做跨目录移动。
## 4.8 持久化与配置约定
- 实体默认值与时间戳钩子(`@PrePersist` / `@PreUpdate`)保持一致。
- 不提交 `data/` 下数据库产物(`.gitignore` 已忽略相关文件)。
- 生产配置中的环境变量占位符应保留(如 `DB_USERNAME``DB_PASSWORD`)。
- 非需求驱动情况下,不扩展 Actuator 暴露范围。
## 4.9 前端静态资源约定
- 项目未配置 Node 构建链路,前端资源直接编辑 `static` 目录。
- 保持当前 jQuery 风格与状态驱动结构(见 `static/js/app.js`)。
- 保持双面板交互和响应式行为,不破坏现有 UX。
- 保持 CSS 变量与设计令牌风格,不做大规模 UI 体系替换。
## 5Agent 工作流程建议
- 开始改动前,先阅读目标文件及相邻文件风格。
- 以最小必要改动为原则,避免无关重构。
- 未明确要求时不更改端口、context-path、profile 行为。
- 新增功能优先补充可验证逻辑;有测试目录后优先补单元测试。
- 完成后至少运行一次编译校验;如有测试则执行相关测试。
- 若新增关键命令或流程,请同步更新本 `AGENTS.md`
- 涉及安全边界认证、文件系统、CORS、主机密钥变更后必须补至少一条对应单测。
## 6常用命令速查
- `mvn clean compile`
- `mvn test`
- `mvn -Dtest=ClassName test`
- `mvn -Dtest=ClassName#methodName test`
- `mvn spring-boot:run`
- `mvn clean package -DskipTests`
- `java -jar target/sftp-manager-1.0.0.jar --spring.profiles.active=prod`
- `docker compose up -d --build`
请随项目演进持续维护本文件,确保其内容始终与仓库实际配置一致。