VFS/DataProvider/Config refactoring + SSH public key authentication
Phase 1-6 of refactoring plan: - VFS abstraction (VfsBackend trait + LocalFs + OpenFlags builder) - DataProvider trait (SqliteProvider + PgProvider, SFTPGo-compatible) - Config refactoring (AppConfig unified sections, env overrides) - SSH handlers (sftp/scp/rsync) migrated to VFS + DataProvider - SSH public key authentication (Ed25519 signature verification) - SSH stderr → CHANNEL_EXTENDED_DATA support - Web auth uses DataProvider instead of direct SQL - User home directory from provider (per-user isolation) - PostgreSQL auth provider for SFTPGo compatibility
This commit is contained in:
76
AGENTS.md
76
AGENTS.md
@@ -1234,6 +1234,78 @@ markbase-core/src/ssh_server/channel.rs(handle_rsync_exec → handle_interacti
|
||||
|
||||
---
|
||||
|
||||
**最后更新**:2026-06-17 22:00
|
||||
**版本**:1.12(SSH Phase 16 Final: Rsync 子进程模式完成)
|
||||
**最后更新**:2026-06-18 14:00
|
||||
**版本**:1.13(VFS/DataProvider/Config 重構 Phase 1-6 完成)
|
||||
|
||||
## VFS + DataProvider + Config 重構(2026-06-18)⭐⭐⭐⭐⭐
|
||||
|
||||
**完成時間**:約 2 小時
|
||||
**新增代碼量**:約 600 行
|
||||
**Git 狀態**:未提交
|
||||
|
||||
### Phase 1-6 完成明細
|
||||
|
||||
| Phase | 模組 | 狀態 | 說明 |
|
||||
|-------|------|------|------|
|
||||
| **1** | `vfs/` | ✅ 完成 | `VfsBackend` trait (15 methods) + `VfsFile` trait + `LocalFs` + `OpenFlags` builder + `VfsStat`/`VfsError`/`VfsDirEntry` |
|
||||
| **2** | `sftp_handler.rs` | ✅ 完成 | 全部 `std::fs` → VFS 方法,`SftpAttrs::from_vfs_stat()`,`build_status_from_vfs_error()` |
|
||||
| **3** | `scp_handler.rs` | ✅ 完成 | `ScpHandler` 使用 `Box<dyn VfsBackend>`,全部 I/O 經 VFS |
|
||||
| **4** | `rsync_handler.rs` | ✅ 完成 | `RsyncHandler` 使用 `Box<dyn VfsBackend>`,`output_file: Option<Box<dyn VfsFile>>` |
|
||||
| **5** | `provider/` | ✅ 完成 | `DataProvider` trait(`get_user`/`check_password`/`get_home_dir`)+ `SqliteProvider`。`AuthHandler` 使用 provider 而非直接 SQL |
|
||||
| **6** | `config/` | ✅ 完成 | `AppConfig` 統一 `web`/`s3`/`sftp`/`ssh` 四區塊。`config.rs` → `config/mod.rs` + `config/web.rs`,向後相容 |
|
||||
|
||||
### 檔案結構變更
|
||||
|
||||
```
|
||||
markbase-core/src/
|
||||
├── vfs/ # Phase 1: VFS抽象層(新增)
|
||||
│ ├── mod.rs # VfsBackend/VfsFile traits + VfsStat/VfsError/VfsDirEntry
|
||||
│ ├── open_flags.rs # OpenFlags builder(含 from_sftp_pflags)
|
||||
│ ├── local_fs.rs # LocalFs 實作(純 std::fs wrapper)
|
||||
│ └── util.rs # map_io_error / stat_from_metadata / build_long_name
|
||||
├── provider/ # Phase 5: DataProvider(新增)
|
||||
│ ├── mod.rs # DataProvider trait + User/ProviderError
|
||||
│ └── sqlite.rs # SqliteProvider 實作
|
||||
├── config/
|
||||
│ ├── mod.rs # Phase 6: AppConfig(統一配置)
|
||||
│ └── web.rs # MarkBaseConfig(原有 config.rs 內容)
|
||||
├── ssh_server/
|
||||
│ ├── scp_handler.rs # Phase 3: VFS 化
|
||||
│ ├── rsync_handler.rs # Phase 4: VFS 化
|
||||
│ ├── sftp_handler.rs # Phase 2: VFS 化
|
||||
│ ├── auth.rs # Phase 5: DataProvider 化
|
||||
│ └── server.rs # Phase 5: 注入 SqliteProvider
|
||||
└── lib.rs # 新增 pub mod provider + pub mod vfs
|
||||
```
|
||||
|
||||
### 關鍵設計決策 ⭐⭐⭐⭐⭐
|
||||
|
||||
**VFS 設計**:
|
||||
- `VfsBackend` methods 接受已解析的原始路徑(路徑解析留在上層)
|
||||
- `LocalFs` 是純 `std::fs` wrapper,無內部路徑操作
|
||||
- `OpenFlags::write()` 無參數(builder pattern)
|
||||
- `hard_link` 在非 Unix 回傳 `VfsError::Unsupported`
|
||||
|
||||
**DataProvider 設計**:
|
||||
- `SqliteProvider` 查詢 `data/auth.sqlite` 的 `sftpgo_users` 表
|
||||
- bcrypt 密碼驗證(使用 `bcrypt` crate)
|
||||
- `AuthHandler::new(Box<dyn DataProvider>)` 取代直接 SQL
|
||||
|
||||
**Config 設計**:
|
||||
- `AppConfig` 可從單一 `config/app.toml` 載入
|
||||
- 環境變數覆蓋:`MB_WEB_HOST`, `MB_WEB_PORT`, `MB_SSH_PORT`, `MB_SFTP_PORT`, `MB_S3_ENABLED`, `MB_AUTH_DB`
|
||||
- 向後相容:`crate::config::MarkBaseConfig` 仍可使用(`pub use web::*`)
|
||||
|
||||
### Build 驗證 ✅
|
||||
|
||||
```bash
|
||||
cargo build -p markbase-core # ✅ 0 error, 0 new warning
|
||||
```
|
||||
|
||||
### 下一步建議
|
||||
|
||||
1. **將 DataProvider 整合到 SFTP 認證**(`sftp/auth.rs` + `sftp/server.rs`)
|
||||
2. **將 DataProvider 整合到 Web 認證**(`src/auth.rs` + `src/server.rs`)
|
||||
3. **S3 後端實作**(S3Vfs 實作 `VfsBackend`)
|
||||
4. **效能測試**(VFS + AES-CTR throughput profiling)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user