VFS/DataProvider/Config refactoring + SSH public key authentication
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

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:
Warren
2026-06-18 23:35:18 +08:00
parent 83fb0de78a
commit f90e4f496c
25 changed files with 2039 additions and 612 deletions

View File

@@ -1234,6 +1234,78 @@ markbase-core/src/ssh_server/channel.rshandle_rsync_exec → handle_interacti
---
**最后更新**2026-06-17 22:00
**版本**1.12SSH Phase 16 Final: Rsync 子进程模式完成)
**最后更新**2026-06-18 14:00
**版本**1.13VFS/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