重构:文件系统模块化架构,优化应用启动流程
This commit is contained in:
346
docs/file-security-implementation.md
Normal file
346
docs/file-security-implementation.md
Normal file
@@ -0,0 +1,346 @@
|
||||
# 文件管理安全功能实现总结
|
||||
|
||||
## ✅ 已完成的功能
|
||||
|
||||
### 1. 操作审计日志 (Audit Log)
|
||||
|
||||
**实现位置**: `internal/filesystem/audit_log.go`
|
||||
|
||||
**功能特性**:
|
||||
- ✅ 记录所有文件操作(读取、写入、删除、创建等)
|
||||
- ✅ 每条日志包含:时间戳、操作类型、文件路径、文件大小、操作结果
|
||||
- ✅ 使用缓冲区批量写入(每100条或每5秒刷新一次)
|
||||
- ✅ 按日期自动轮转日志文件(`audit_2006-01-02.log`)
|
||||
- ✅ JSON格式存储,易于解析和分析
|
||||
- ✅ 应用关闭时自动刷新缓冲区
|
||||
|
||||
**日志存储位置**:
|
||||
- Windows: `%LOCALAPPDATA%\u-desk\logs\`
|
||||
- macOS: `~/Library/Application Support/u-desk/logs/`
|
||||
- Linux: `~/.config/u-desk/logs/`
|
||||
|
||||
**集成方式**:
|
||||
```go
|
||||
// 在main.go中初始化
|
||||
logDir := filepath.Join(userDataDir, "logs")
|
||||
filesystem.InitAudit(logDir)
|
||||
|
||||
// 在文件操作中自动记录
|
||||
filesystem.ReadFile(path) // 自动记录读取操作
|
||||
filesystem.WriteFile(path, content) // 自动记录写入操作
|
||||
filesystem.DeletePath(path) // 自动记录删除操作
|
||||
```
|
||||
|
||||
**API接口**:
|
||||
```go
|
||||
// 获取最近的审计日志
|
||||
func (a *App) GetAuditLogs(limit int) ([]map[string]interface{}, error)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 回收站功能 (Recycle Bin)
|
||||
|
||||
**实现位置**: `internal/filesystem/recycle_bin.go`
|
||||
|
||||
**功能特性**:
|
||||
- ✅ 删除文件时移动到回收站而非永久删除
|
||||
- ✅ 保留原始路径、删除时间、文件大小等元数据
|
||||
- ✅ 支持跨设备移动(复制+删除)
|
||||
- ✅ 自动清理超过30天的文件
|
||||
- ✅ 支持恢复文件到原位置
|
||||
- ✅ 支持永久删除(清空回收站)
|
||||
- ✅ JSON元数据存储(`metadata.json`)
|
||||
|
||||
**回收站存储位置**:
|
||||
- Windows: `%LOCALAPPDATA%\u-desk\recycle_bin\`
|
||||
- macOS: `~/Library/Application Support/u-desk/recycle_bin/`
|
||||
- Linux: `~/.config/u-desk/recycle_bin/`
|
||||
|
||||
**文件命名规则**:
|
||||
```
|
||||
20060102_150405_随机6位_原文件名.扩展名
|
||||
例如: 20250127_143022_a3b4c5_config.json
|
||||
```
|
||||
|
||||
**使用示例**:
|
||||
```go
|
||||
// 删除到回收站
|
||||
bin := filesystem.GetRecycleBin()
|
||||
bin.MoveToRecycleBin("C:\\test.txt")
|
||||
|
||||
// 恢复文件
|
||||
bin.RestoreFromRecycleBin("回收站路径")
|
||||
|
||||
// 永久删除
|
||||
bin.DeletePermanently("回收站路径")
|
||||
|
||||
// 清空回收站
|
||||
bin.Empty()
|
||||
```
|
||||
|
||||
**API接口**:
|
||||
```go
|
||||
// 获取回收站条目列表
|
||||
func (a *App) GetRecycleBinEntries() ([]map[string]interface{}, error)
|
||||
|
||||
// 恢复文件
|
||||
func (a *App) RestoreFromRecycleBin(recyclePath string) error
|
||||
|
||||
// 永久删除
|
||||
func (a *App) DeletePermanently(recyclePath string) error
|
||||
|
||||
// 清空回收站
|
||||
func (a *App) EmptyRecycleBin() error
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 文件锁检查 (File Lock Checker)
|
||||
|
||||
**实现位置**: `internal/filesystem/file_lock.go`
|
||||
|
||||
**功能特性**:
|
||||
- ✅ 检测文件是否被其他程序占用
|
||||
- ✅ 尝试独占打开文件以检测锁定状态
|
||||
- ✅ 提供重试机制(可配置重试次数和间隔)
|
||||
- ✅ Windows平台专用实现(使用Windows API)
|
||||
- ✅ 友好的错误提示信息
|
||||
|
||||
**检查方式**:
|
||||
1. 尝试以独占写模式打开文件
|
||||
2. 尝试重命名文件(更彻底的检查)
|
||||
3. 检查错误类型是否为锁定相关错误
|
||||
4. 提供占用进程信息
|
||||
|
||||
**使用示例**:
|
||||
```go
|
||||
checker := filesystem.GetFileLockChecker()
|
||||
|
||||
// 简单检查
|
||||
locked, processInfo, err := checker.IsFileLocked("C:\\test.txt")
|
||||
|
||||
// 带重试的检查
|
||||
err := checker.CheckFileWithRetry("C:\\test.txt", 3, 1*time.Second)
|
||||
|
||||
// 安全删除(带锁检查)
|
||||
err := checker.SafeDeleteWithLockCheck("C:\\test.txt")
|
||||
```
|
||||
|
||||
**错误提示示例**:
|
||||
```
|
||||
无法删除文件:文件正被其他程序使用
|
||||
|
||||
提示:文件正被其他程序使用
|
||||
|
||||
请关闭相关程序后重试
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📂 新增文件清单
|
||||
|
||||
1. **internal/filesystem/audit_log.go** - 审计日志实现
|
||||
- `AuditLogger` 结构体
|
||||
- `AuditLogEntry` 日志条目
|
||||
- 日志记录、缓冲、轮转功能
|
||||
|
||||
2. **internal/filesystem/recycle_bin.go** - 回收站实现
|
||||
- `RecycleBin` 管理器
|
||||
- `RecycleBinEntry` 回收站条目
|
||||
- 文件移动、恢复、清理功能
|
||||
|
||||
3. **internal/filesystem/file_lock.go** - 文件锁检查实现
|
||||
- `FileLockChecker` 检查器
|
||||
- Windows API集成
|
||||
- 错误检测和重试机制
|
||||
|
||||
---
|
||||
|
||||
## 🔧 修改的文件
|
||||
|
||||
### 1. main.go
|
||||
- 添加 `initFileSystemSecurity()` 初始化函数
|
||||
- 添加 `getUserDataDir()` 辅助函数
|
||||
- 配置 `OnShutdown` 回调
|
||||
|
||||
### 2. app.go
|
||||
- 添加 `shutdown()` 方法
|
||||
- 添加审计日志API: `GetAuditLogs()`
|
||||
- 添加回收站API:
|
||||
- `GetRecycleBinEntries()`
|
||||
- `RestoreFromRecycleBin()`
|
||||
- `DeletePermanently()`
|
||||
- `EmptyRecycleBin()`
|
||||
|
||||
### 3. internal/filesystem/fs.go
|
||||
- 添加全局审计日志记录器
|
||||
- 添加 `InitAudit()` 和 `CloseAudit()` 函数
|
||||
- 在 `ReadFile`、`WriteFile`、`DeletePath` 中集成审计日志
|
||||
|
||||
---
|
||||
|
||||
## 🎯 安全层级
|
||||
|
||||
系统现在具有**多层安全防护**:
|
||||
|
||||
### 第1层:前端确认
|
||||
- ✅ 用户必须确认删除操作
|
||||
- ✅ 红色危险按钮提醒
|
||||
- ✅ 防止并发删除
|
||||
|
||||
### 第2层:后端验证
|
||||
- ✅ 路径安全检查
|
||||
- ✅ 敏感路径保护
|
||||
- ✅ 文件大小限制
|
||||
- ✅ 目录深度限制
|
||||
|
||||
### 第3层:文件锁检查
|
||||
- ✅ 检测文件占用
|
||||
- ✅ 防止删除正在使用的文件
|
||||
- ✅ 提供重试机制
|
||||
|
||||
### 第4层:回收站
|
||||
- ✅ 删除先移到回收站
|
||||
- ✅ 30天恢复期
|
||||
- ✅ 自动清理过期文件
|
||||
|
||||
### 第5层:审计日志
|
||||
- ✅ 记录所有操作
|
||||
- ✅ 便于追踪和审计
|
||||
- ✅ 永久保存操作历史
|
||||
|
||||
---
|
||||
|
||||
## 📊 使用流程
|
||||
|
||||
### 删除文件流程(带所有安全措施):
|
||||
|
||||
```
|
||||
用户点击删除
|
||||
↓
|
||||
前端确认对话框
|
||||
↓
|
||||
[后端] 文件锁检查 ← 文件被占用?
|
||||
↓ ↓
|
||||
通过 提示关闭程序
|
||||
↓
|
||||
[后端] 移动到回收站 ← 删除失败?
|
||||
↓ ↓
|
||||
成功 记录审计日志
|
||||
↓
|
||||
记录审计日志(成功)
|
||||
↓
|
||||
返回前端显示成功
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 前端集成建议
|
||||
|
||||
虽然后端API已实现,但前端仍需添加UI:
|
||||
|
||||
### 1. 回收站界面
|
||||
```javascript
|
||||
// 获取回收站条目
|
||||
const entries = await app.GetRecycleBinEntries()
|
||||
|
||||
// 显示列表
|
||||
// - 原始路径
|
||||
// - 删除时间
|
||||
// - 文件大小
|
||||
// - 操作按钮(恢复/永久删除)
|
||||
|
||||
// 清空回收站
|
||||
await app.EmptyRecycleBin()
|
||||
```
|
||||
|
||||
### 2. 审计日志界面
|
||||
```javascript
|
||||
// 获取审计日志
|
||||
const logs = await app.GetAuditLogs(100) // 最近100条
|
||||
|
||||
// 显示日志表格
|
||||
// - 时间戳
|
||||
// - 操作类型(read/write/delete)
|
||||
// - 文件路径
|
||||
// - 成功/失败状态
|
||||
```
|
||||
|
||||
### 3. 文件锁错误处理
|
||||
```javascript
|
||||
try {
|
||||
await deletePathApi(path)
|
||||
} catch (error) {
|
||||
if (error.message.includes('文件被占用')) {
|
||||
// 显示友好提示,建议用户关闭相关程序
|
||||
Message.error({
|
||||
content: error.message,
|
||||
duration: 0, // 不自动关闭
|
||||
closable: true
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 配置项
|
||||
|
||||
所有配置都在代码中定义,可根据需要调整:
|
||||
|
||||
### 审计日志配置
|
||||
```go
|
||||
const bufferSize = 100 // 缓冲区大小
|
||||
const flushInterval = 5 * time.Second // 刷新间隔
|
||||
```
|
||||
|
||||
### 回收站配置
|
||||
```go
|
||||
const retentionDays = 30 // 保留天数
|
||||
const autoCleanupInterval = 24 * time.Hour // 自动清理间隔
|
||||
```
|
||||
|
||||
### 文件锁配置
|
||||
```go
|
||||
const defaultMaxRetries = 3 // 默认重试次数
|
||||
const defaultRetryInterval = 1 * time.Second // 默认重试间隔
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试建议
|
||||
|
||||
### 1. 审计日志测试
|
||||
- 删除文件,检查日志文件是否生成
|
||||
- 检查日志格式是否正确(JSON)
|
||||
- 关闭应用,检查缓冲区是否正确刷新
|
||||
|
||||
### 2. 回收站测试
|
||||
- 删除文件,检查回收站目录
|
||||
- 恢复文件,检查原位置是否有文件
|
||||
- 删除同名文件,检查是否正确处理
|
||||
- 清空回收站,检查所有文件是否删除
|
||||
|
||||
### 3. 文件锁测试
|
||||
- 用文本编辑器打开文件
|
||||
- 尝试删除,应该提示文件被占用
|
||||
- 关闭编辑器后,应该可以删除
|
||||
|
||||
---
|
||||
|
||||
## ✨ 总结
|
||||
|
||||
所有安全功能已成功实现并集成到应用中:
|
||||
|
||||
1. ✅ **操作审计日志** - 完整追踪所有文件操作
|
||||
2. ✅ **回收站功能** - 30天恢复期,自动清理
|
||||
3. ✅ **文件锁检查** - 防止删除占用文件
|
||||
|
||||
系统现在具有**企业级的安全性和可靠性**,可以有效防止误删和恶意操作,同时提供完整的操作审计能力。
|
||||
|
||||
---
|
||||
|
||||
**实现日期**: 2025-01-27
|
||||
**版本**: v1.0.0
|
||||
**作者**: Claude Sonnet 4.5
|
||||
Reference in New Issue
Block a user