Private
Public Access
1
0

重构:文件系统模块化架构,优化应用启动流程

This commit is contained in:
2026-01-28 00:28:54 +08:00
parent 4a9b25a505
commit 8c577f70e7
123 changed files with 32030 additions and 967 deletions

View File

@@ -0,0 +1,355 @@
package filesystem
import "path/filepath"
// Config 文件系统配置
// 所有安全策略和性能参数都通过配置管理,避免硬编码
type Config struct {
// Security 安全策略配置
Security SecurityConfig
// Performance 性能配置
Performance PerformanceConfig
// Features 功能开关
Features FeatureConfig
}
// SecurityConfig 安全策略配置
type SecurityConfig struct {
// PathValidation 路径验证配置
PathValidation PathValidationConfig
// DeleteRestrictions 删除限制配置
DeleteRestrictions DeleteRestrictionsConfig
// FileTypes 文件类型配置
FileTypes FileTypeConfig
}
// PathValidationConfig 路径验证配置
type PathValidationConfig struct {
// AllowSymlinks 是否允许符号链接默认false
AllowSymlinks bool
// AllowUNCPaths 是否允许UNC网络路径默认false
AllowUNCPaths bool
// CheckWindowsSystemPaths 是否检查Windows系统路径默认true
CheckWindowsSystemPaths bool
// ForbiddenPaths 禁止访问的路径列表
ForbiddenPaths []string
// SensitivePaths 敏感路径列表(需要额外确认)
SensitivePaths []string
// MaxDepth 最大路径深度0=不限制)
MaxDepth int
}
// DeleteRestrictionsConfig 删除限制配置
type DeleteRestrictionsConfig struct {
// Enabled 是否启用删除限制
Enabled bool
// MaxFileSizeGB 单个文件最大大小GB0=不限制
MaxFileSizeGB float64
// MaxDirSizeGB 目录最大大小GB0=不限制
MaxDirSizeGB float64
// MaxDepth 最大目录深度0=不限制
MaxDepth int
// MaxFileCount 最大文件数量0=不限制
MaxFileCount int
// RequireConfirm 超过限制是否需要用户确认而非直接拒绝
RequireConfirm bool
// ForbiddenPaths 禁止删除的路径(系统关键目录)
ForbiddenPaths []string
}
// FileTypeConfig 文件类型配置
type FileTypeConfig struct {
// AllowedExtensions 允许的文件扩展名白名单
AllowedExtensions map[string]bool
// ForbiddenExtensions 禁止的文件扩展名黑名单
ForbiddenExtensions map[string]bool
// MIMETypeMapping 扩展名到MIME类型的映射
MIMETypeMapping map[string]string
// MaxFileSizeMap 各文件类型的最大文件大小(字节)
MaxFileSizeMap map[string]int64
}
// PerformanceConfig 性能配置
type PerformanceConfig struct {
// BufferSizes 缓冲区大小配置
BufferSizes BufferSizeConfig
// Timeouts 超时配置
Timeouts TimeoutConfig
}
// BufferSizeConfig 缓冲区大小配置
type BufferSizeConfig struct {
// AuditLog 审计日志缓冲区大小
AuditLog int
// FileIO 文件读写缓冲区大小
FileIO int
// Zip ZIP操作缓冲区大小
Zip int
}
// TimeoutConfig 超时配置
type TimeoutConfig struct {
// AuditFlush 审计日志刷新间隔
AuditFlush string // duration string
// LockCheckRetry 文件锁检查重试间隔
LockCheckRetry string // duration string
// TempFileCleanup 临时文件清理周期
TempFileCleanup string // duration string
}
// FeatureConfig 功能开关配置
type FeatureConfig struct {
// AuditLog 是否启用审计日志
AuditLog bool
// RecycleBin 是否启用回收站
RecycleBin bool
// FileLockCheck 是否启用文件锁检查
FileLockCheck bool
// HTTPFileServer 是否启用HTTP文件服务
HTTPFileServer bool
// ZipExtraction 是否启用ZIP文件提取
ZipExtraction bool
}
// DefaultConfig 返回默认配置
// 所有默认值都在这里定义,方便调整
func DefaultConfig() *Config {
return &Config{
Security: SecurityConfig{
PathValidation: PathValidationConfig{
AllowSymlinks: false,
AllowUNCPaths: false,
CheckWindowsSystemPaths: true,
ForbiddenPaths: getDefaultForbiddenPaths(),
SensitivePaths: getDefaultSensitivePaths(),
MaxDepth: 0, // 不限制
},
DeleteRestrictions: DeleteRestrictionsConfig{
Enabled: false, // 默认不启用(避免过度限制)
MaxFileSizeGB: 1.0,
MaxDirSizeGB: 1.0,
MaxDepth: 15,
MaxFileCount: 1000,
RequireConfirm: true, // 超过限制时要求确认而非直接拒绝
ForbiddenPaths: getDeleteForbiddenPaths(),
},
FileTypes: FileTypeConfig{
AllowedExtensions: getAllowedExtensions(),
ForbiddenExtensions: getForbiddenExtensions(),
MIMETypeMapping: getMIMETypeMapping(),
MaxFileSizeMap: make(map[string]int64),
},
},
Performance: PerformanceConfig{
BufferSizes: BufferSizeConfig{
AuditLog: AuditLogBufferSize,
FileIO: 32 * 1024, // 32KB
Zip: 64 * 1024, // 64KB
},
Timeouts: TimeoutConfig{
AuditFlush: "5s",
LockCheckRetry: "100ms",
TempFileCleanup: "24h",
},
},
Features: FeatureConfig{
AuditLog: true,
RecycleBin: true,
FileLockCheck: false, // 默认关闭(性能考虑)
HTTPFileServer: true,
ZipExtraction: true,
},
}
}
// getDefaultForbiddenPaths 获取默认禁止访问的路径
func getDefaultForbiddenPaths() []string {
if filepath.Separator == '\\' {
// Windows
return []string{
`C:\Windows`,
`C:\Program Files`,
`C:\Program Files (x86)`,
`C:\ProgramData`,
`C:\System Volume Information`,
`C:\Recovery`,
`C:\Boot`,
}
}
// Unix-like
return []string{
"/bin",
"/sbin",
"/usr/bin",
"/usr/sbin",
"/etc",
"/boot",
"/sys",
"/proc",
}
}
// getDefaultSensitivePaths 获取默认敏感路径列表
func getDefaultSensitivePaths() []string {
return []string{
filepath.Join(".ssh"),
filepath.Join(".gnupg"),
filepath.Join(".config"),
filepath.Join("node_modules"),
filepath.Join(".git"),
filepath.Join(".github"),
filepath.Join(".vscode"),
filepath.Join(".idea"),
}
}
// getDeleteForbiddenPaths 获取删除操作的禁止路径
func getDeleteForbiddenPaths() []string {
paths := []string{
"node_modules",
".git",
".github",
".vscode",
".idea",
"src",
"dist",
"build",
"target",
"bin",
"obj",
"database",
"db",
"data",
"backup",
"backups",
}
return paths
}
// getAllowedExtensions 获取允许的文件扩展名白名单
func getAllowedExtensions() map[string]bool {
return map[string]bool{
// 图片
".jpg": true,
".jpeg": true,
".png": true,
".gif": true,
".bmp": true,
".svg": true,
".webp": true,
".ico": true,
// 视频
".mp4": true,
".webm": true,
".mov": true,
".avi": true,
".mkv": true,
// 音频
".mp3": true,
".wav": true,
".ogg": true,
// 文档
".pdf": true,
// 文本
".txt": true,
".md": true,
".json": true,
".xml": true,
".html": true,
".css": true,
".js": true,
}
}
// getForbiddenExtensions 获取禁止的文件扩展名黑名单
func getForbiddenExtensions() map[string]bool {
return map[string]bool{
".env": true,
".key": true,
".pem": true,
".p12": true,
".pfx": true,
".der": true,
".csr": true,
".crt": true,
".cert": true,
".ssh": true,
".rsa": true,
".gpg": true,
".asc": true,
".config": true,
".conf": true,
".ini": true,
".cfg": true,
".yaml": true,
".yml": true,
".toml": true,
".bak": true,
".old": true,
".tmp": true,
".swp": true,
".swo": true,
".log": true,
".sql": true,
".db": true,
".sqlite": true,
".sqlite3": true,
".mdb": true,
".accdb": true,
}
}
// getMIMETypeMapping 获取MIME类型映射
func getMIMETypeMapping() map[string]string {
return map[string]string{
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".png": "image/png",
".gif": "image/gif",
".bmp": "image/bmp",
".svg": "image/svg+xml",
".webp": "image/webp",
".ico": "image/x-icon",
".mp4": "video/mp4",
".webm": "video/webm",
".mov": "video/quicktime",
".avi": "video/x-msvideo",
".mkv": "video/x-matroska",
".mp3": "audio/mpeg",
".wav": "audio/wav",
".ogg": "audio/ogg",
".pdf": "application/pdf",
".txt": "text/plain; charset=utf-8",
".html": "text/html; charset=utf-8",
".css": "text/css",
".js": "application/javascript",
".json": "application/json",
}
}