Commit Graph

202 Commits

Author SHA1 Message Date
Warren
dfe464303d Add default user 'demo' on login page
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
2026-06-30 07:47:52 +08:00
Warren
fe983c6528 Merge m5max128gitea Web GUI + Backup features with local SMB fixes
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
Merged from m5max128gitea:
- Web GUI Phase 11: User/Share/Dashboard management
- NFS stub + nfsserve dependency
- Backup/Snapshot REST API endpoints
- Integration tests for user/share management
- Feature comparison docs (Proxmox/Unraid/OpenNAS)

Preserved from local:
- upload_path config (tested stable)
- delete_file/preview_file routes (MyFiles)
- SSH async I/O
- auth.sqlite (important user data)
- Admin WebDAV + CorsLayer

Conflicts resolved:
- AGENTS.md: kept remote (more complete docs)
- myfiles.rs: kept local upload_path
- server.rs: merged both routes (preview + backup)
- auth.sqlite: preserved local (important user data)
2026-06-30 07:37:34 +08:00
Warren
4fa8fd8c1f Merge origin SMB fixes with local Phase 21-22 features
Origin changes merged:
- SMB performance optimization (pread/pwrite, tokio Mutex)
- macOS SMB mount fix (AAPL caps, credit grant)
- Compound request integration tests
- CTDB architecture analysis

Local changes preserved:
- upload_path config (deployed, tested stable)
- delete_file + preview_file routes (MyFiles UI)
- SSH async I/O (cipher.rs, packet.rs, server.rs)
- auth.sqlite (86016 bytes, important user data)
- Admin WebDAV + CorsLayer
- api/admin.rs + api/config.rs (new endpoints)

Conflicts resolved:
- myfiles.rs: kept upload_path + OnceLock static
- auth.sqlite: preserved local version (important data)

Test results: 393 passed, 5 auth tests failed
- PG tests require external PostgreSQL
- Auth tests expect specific password hashes
- auth.sqlite preserved with actual user credentials
2026-06-30 07:25:04 +08:00
Warren
1418e9958b Apply clippy fixes for code quality
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
Clippy Fixes Applied:
- Removed unused imports
- Fixed manual implementation of .is_multiple_of()
- Fixed unnecessary_sort_by suggestions
- Added missing Ipv4Addr imports

Files Modified:
- forward_acl.rs: Add Ipv4Addr import
- known_hosts.rs: Add Ipv4Addr import
- Various files: Remove unused imports

Build:  markbase-core
Tests: 495 passed
2026-06-24 11:18:02 +08:00
Warren
a7a01a8e86 Add user/share management integration tests
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
Integration Tests:
- test_user_workflow: Create, update, reset password, delete user
- test_multiple_users: Create multiple users, verify list, cleanup
- test_user_permissions: Admin vs regular user permissions

Test Features:
- Unique usernames (timestamp-based) to avoid conflicts
- Using existing data/auth.sqlite database
- Cleanup after each test
- Password verification
- Permission checking

Test Coverage:
- create_user() + bcrypt password hashing
- get_user() + user data verification
- check_password() + correct/wrong password tests
- update_user() + home_dir, uid, permissions update
- reset_password() + password change verification
- list_users() + multiple users list
- delete_user() + cleanup verification

Build:  markbase-core
Tests: 3 passed, 0 failed
2026-06-24 06:31:25 +08:00
Warren
0f77983483 Implement NFS Support stub (Phase 11 P0 #3)
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
NFS Support Features:
- nfs_server.rs: NFSv3 server stub
- nfs_server CLI tool: Port 2049, export directory
- nfsserve crate dependency (v0.11.0)

Implementation Status:
- NfsVfsServer: Placeholder implementation
- NfsConfig: Configuration struct
- CLI: nfs-server command with --port, --root, --share-name

Technical Details:
- nfsserve crate provides NFSFileSystem trait
- NFSFileSystem requires 14 async methods
- Current implementation is stub (pending API study)

Build:  markbase-core + nfs feature
Tests: 495 markbase-core (without nfs feature)

Note: Full NFS server implementation requires studying nfsserve crate API
(expected time: 2-3 days for 500 lines)
2026-06-24 05:42:15 +08:00
Warren
e07d17aee7 Implement User Management UI (Phase 11 P0 #1)
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
User Management Features:
- Users.vue: Complete user CRUD interface
- Tauri commands: 5 auth user endpoints
- REST API: DataProvider trait extensions

UI Components:
- User list table (username, home_dir, status)
- Create user dialog (username, password, home_dir, status)
- Edit user dialog (password optional, home_dir, status)
- Delete user confirmation
- Reset password prompt

Tauri Commands (renamed to avoid conflict):
- list_auth_users: List all users from auth database
- create_auth_user: Create user with bcrypt password
- update_auth_user: Update user (optional password)
- delete_auth_user: Delete user
- reset_auth_password: Reset password

DataProvider Trait Extensions:
- list_users(): List all users
- create_user(): Create user with password
- update_user(): Update user (optional password)
- delete_user(): Delete user
- reset_password(): Reset password

Implementations:
- SqliteProvider: Full implementation (sftpgo_users table)
- PgProvider: Full implementation (users table)

Router:
- Added /users route

Home.vue:
- Added User Management card

Build:  Tauri + markbase-core
Tests: 495 markbase-core + 201 smb-server
2026-06-24 05:10:27 +08:00
Warren
d76a200560 Add incremental backup support (Phase 8)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
BackupScheduler Enhancement:
- Added incremental: bool field to BackupScheduleConfig
- Default: incremental=true (enabled by default)
- copy_incremental_to_snapshot() method
- file_changed() detection (size + mtime comparison)
- Hardlink unchanged files to base snapshot (ZFS-style)

Incremental Backup Algorithm:
1. If incremental=true and previous snapshot exists:
   - Compare file size and mtime with base snapshot
   - If unchanged: create hardlink to base (zero disk usage)
   - If changed: copy and compress (new content)
2. If incremental=false or no previous snapshot:
   - Full copy (traditional backup)

Storage Savings:
- Unchanged files: hardlink (0 extra disk space)
- Changed files: copy + compress (minimal overhead)
- Similar to ZFS snapshot mechanism

BackupConfigResponse Updated:
- Added incremental field
- Added compress field (GUI: dropdown select)

Backup.vue Updated:
- Incremental switch with explanation text
- Compression dropdown (None/LZ4/ZSTD)
- Default values loaded from backend

REST API Test:
curl /api/v2/backup/config
{incremental:true,compress:zstd,...}

Build: 495 tests pass
2026-06-24 04:20:33 +08:00
Warren
2d8e9049b0 Add compression support to backup workflow
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
BackupScheduler Enhancement:
- copy_file() now compresses files using ZSTD or LZ4
- min_size threshold: 1024 bytes (smaller files not compressed)
- compression level: 3 (balanced speed/compression)

BackupConfigResponse Updated:
- Added compress, encrypt, include_checksums fields
- compress: 'none' | 'lz4' | 'zstd'
- Default: 'zstd'

REST API Enhancement:
- GET /api/v2/backup/config returns full config
- POST /api/v2/backup/config accepts compression settings

Test Results:
- Set compress='lz4':  Config updated
- Set compress='zstd':  Config updated
- Compression applied via run_backup() (scheduled backup)

Note: Direct create_snapshot API doesn't use compression
(scheduler.run_backup() is the primary backup mechanism)

Build: 495 tests pass
2026-06-24 04:14:24 +08:00
Warren
55caeabd94 Add root parameter to backup/snapshot REST API
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
API Enhancement:
- All snapshot endpoints now accept 'root' query parameter
- Default root: /data (for production)
- Test root: configurable (e.g., /tmp/backup_test)

Endpoints updated:
- GET /api/v2/snapshots?root=<path>
- POST /api/v2/snapshots/:name?root=<path>
- DELETE /api/v2/snapshots/:name?root=<path>
- POST /api/v2/snapshots/:name/restore?root=<path>
- GET /api/v2/storage/stats?root=<path>

Integration Testing Results :
- Create snapshot: test_snap1 created
- List snapshots: ['test_snap1'] returned
- Modify file: 'original content' → 'modified content'
- Restore snapshot: 'modified content' → 'original content' 
- Delete snapshot: test_snap1 removed

Snapshot metadata format:
{
  'name': 'test_snap1',
  'created': {'secs_since_epoch': 1782243041, 'nanos_since_epoch': 344384000},
  'source_path': '/tmp/backup_test'
}

Build: 495 tests pass
Server: Port 11438 running with root parameter support
2026-06-24 03:31:43 +08:00
Warren
26d4199203 Add Backup REST API endpoints (Phase 5-6)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
REST API Implementation:
- 8 backup/snapshot endpoints added to server.rs
- BackupScheduler: add get_config()/set_config() methods

Endpoints:
- GET /api/v2/backup/stats - Scheduler status
- GET/POST /api/v2/backup/config - Config management
- POST /api/v2/backup/run - Manual backup trigger
- GET /api/v2/snapshots - List snapshots
- POST/DELETE /api/v2/snapshots/:name - Create/delete snapshot
- POST /api/v2/snapshots/:name/restore - Restore snapshot
- GET /api/v2/storage/stats - Storage metrics

Test Results:
- curl /api/v2/backup/stats 
- curl /api/v2/backup/config 
- curl /api/v2/storage/stats 
- curl /api/v2/snapshots 

Build: 495 tests pass
Server: Port 11438 running with new endpoints
2026-06-24 03:25:41 +08:00
Warren
1d9e140e6c Fix Backup/Restore API compilation errors
- chrono timestamp_opt API: use TimeZone trait method
- VfsError::Io/NotFound: use String literals
- SendFormat: add PartialEq derive
- VfsRaidConfig tests: add disk_paths field
- BackupStats test: use relative timestamps
- HashSet file tracking: use (String, u64) tuple
- BackupStream::receive: clone format before use
- collect_file_data: fix temporary lifetime

All tests pass: 495 markbase-core + 201 smb-server = 696 total
2026-06-24 02:37:03 +08:00
Warren
5f12e9f5d7 Implement scrub scheduler + dedup repair: Phase 5-6 complete
Phase 5: Background scrub scheduler (~220 lines)
- ScrubScheduler: periodic scrub at configurable interval
- ScrubSchedulerConfig: interval_secs, scrub_on_startup, repair_enabled
- start/stop/run_once methods
- ScrubStats: running, scrub_count, last/next scrub time
- 6 unit tests: default config, start/stop, stats, timestamp format

Phase 6: Dedup repair integration (~30 lines)
- DedupStore::get_block_by_checksum(): retrieve by SHA-256 hash
- DedupStore::has_block_by_checksum(): check existence
- DedupStore::repair_from_checksum(): repair corrupted block
- checksum::repair_block_from_dedup(): integration hook

Tests: 471 passed (+6 new scrub_scheduler tests)

Files:
- markbase-core/src/vfs/scrub_scheduler.rs (NEW)
- markbase-core/src/vfs/dedup.rs (MOD +30 lines)
- markbase-core/src/vfs/checksum.rs (MOD +20 lines)
- markbase-core/src/vfs/mod.rs (MOD +1 line)
2026-06-24 01:46:08 +08:00
Warren
ffc3f03744 Implement block-level checksum: Phase 1-4 complete
Phase 1: VfsBlockChecksum struct + JSON storage (~240 lines)
- VfsBlockChecksum: offset + SHA-256 hash
- VfsChecksumFile: block_size + algorithm + blocks + file_size
- compute_block_hash() + verify_block_hash()
- ChecksumMode: Lazy (default) + OnRead
- ScrubResult: total/verified/corrupted/repaired blocks metrics

Phase 2: ChecksumFile wrapper (~180 lines)
- VfsFile wrapper with transparent checksum
- Lazy verification (only on scrub)
- Cache of verified blocks
- Update checksum on flush()
- read_at/write_at support

Phase 3: Scrub API (~150 lines)
- scrub_file(): verify single file integrity
- scrub_all(): recursive directory scrub
- create_checksums_for_file(): generate checksums
- repair_block(): placeholder for RAID/Dedup

Phase 4: RAID repair integration (~160 lines)
- repair_block_from_parity(): reconstruct from RAID parity
- reconstruct_from_p(): XOR reconstruction for RaidZ1
- reconstruct_from_pq/pqr(): placeholder for RaidZ2/3

Tests: 15 checksum tests pass (465 total)

Files:
- markbase-core/src/vfs/checksum.rs (NEW)
- markbase-core/src/vfs/checksum_file.rs (NEW)
- markbase-core/src/vfs/raid.rs (MOD +160 lines)
- markbase-core/src/vfs/mod.rs (MOD +2 lines)
2026-06-24 01:41:56 +08:00
Warren
7c4476e19c Implement at-rest encryption: AES-256-GCM VFS layer
- Added encrypted_fs.rs module for transparent file encryption
- EncryptedVfs wraps any VfsBackend with AES-256-GCM encryption
- Per-file key derivation from master key + file path (SHA-256)
- File format: MBE1 magic + version + nonce + original_size + ciphertext + tag
- EncryptedFile transparently decrypts on read, encrypts on flush
- 5 unit tests: roundtrip, different keys, key derivation, header format, password config

Tests: 457 markbase-core (+5 new), 201 smb-server (658 total)
2026-06-24 00:57:53 +08:00
Warren
57fd6a475f macOS Time Machine AFP monitoring: backup_time update on file modification
- Added afp_monitor.rs module to track AFP_AfpInfo backup_time
- Open struct now has 'modified' flag to track file modifications
- write.rs sets modified=true on successful write
- close.rs calls AfpMonitor::update_backup_time() on modified files
- create.rs calls AfpMonitor::init_afp_info() on new file creation
- AFP_AfpInfo stored as xattr com.apple.aapl.AfpInfo
- backup_time updated to current epoch time on modification

Also includes:
- LZ4 compression using lz4_flex crate
- Case sensitivity conditional on backend capabilities
- LDAP cfg feature gate fix
- RAID rebuild reconstruction implementation
- DOS attributes xattr persistence
- Snapshot disk persistence

Tests: 201 smb-server, 452 markbase-core (653 total)
2026-06-24 00:46:33 +08:00
Warren
637227f4e4 SMB: reusable read buffer in VfsHandle (avoid per-read allocation + zero-init)
- Add FileAndBuf struct wrapping file + reusable read_buf Vec
- read(): reuse Vec capacity across calls, use unsafe set_len to skip memset
- ~15% read throughput improvement (2.6 → 3.0 GB/s on localhost smbclient)
2026-06-23 10:05:39 +08:00
Warren
d4f60929fa SMB performance optimization: pread/pwrite, tokio::sync::Mutex, direct response, fast-path
- VfsFile trait: add read_at()/write_at() with seek+read default impl
- LocalFs: override with real pread/pwrite (FileExt::read_at/write_at) — 1 syscall vs 2
- smb_server_backend: use read_at/write_at + tokio::sync::Mutex (non-blocking async)
- read handler: build response directly, avoid Bytes→Vec<u8> copy + intermediate struct
- oplock break: fast-path skip when ≤1 open entry (single-user scenario)
2026-06-23 09:58:19 +08:00
Warren
e7863a3034 Fix macOS SMB mount: AAPL caps, credit grant, file_index, QueryDirectory padding
- AAPL: Restore UNIX_BASED+NFS_ACE server_caps, RESOLVE_ID+FULL_SYNC volume_caps (Samba baseline)
- Credit: Grant min 1 credit in dispatch response for smbclient compatibility
- file_index: Assign 1-based index per entry in list_dir (both VFS and local backends)
- smb_match(): Add wildcard pattern filter (*/?) for macOS single-entry QueryDirectory probes
- FILE_ID_BOTH_DIR_INFORMATION: Add 2-byte Reserved2 padding between ShortName and FileId
- macOS Sequoia 15.5 mount_smbfs now succeeds (tested: ls, cat, read)
2026-06-23 09:44:01 +08:00
Warren
866d0536c8 Add SMB AAPL Extensions Phase 1-6 + VFS xattr support
Phase 1: AAPL Create Context negotiation
Phase 2: AFP_AfpInfo Stream structure (Finder info + creation time)
Phase 2.5: SMB Named Stream Backend (NamedStreamPath)
Phase 2.6: Backend Named Stream Support in handlers
Phase 2.7: VFS Extended Attributes (get/set/remove/list_xattr)
Phase 4: Time Machine share config (time_machine field)
Phase 5: Server/Volume Capabilities
Phase 6: macOS Unicode mapping (private range ↔ ASCII)

Tests: 174 smb-server tests pass, 52 VFS tests pass
2026-06-22 14:21:53 +08:00
Warren
64709ec529 Add CTDB Phase 1-5: TDB storage + Node management + Control protocol + IP manager + Recovery 2026-06-22 14:21:39 +08:00
Warren
a8d81f2a9c Revert "Remove Download Center routes from server.rs (dead code cleanup)"
This reverts commit 20b208bb7f.
2026-06-22 14:12:14 +08:00
Warren
20b208bb7f Remove Download Center routes from server.rs (dead code cleanup)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
Removed routes:
- /api/v2/products/* (CRUD + file assignment)
- /api/v2/download/* (file download + stats)
- /api/v2/files/:user_id (list + info via download module)
- /upload, /files, /products (HTML pages)
Kept: /api/v2/upload-unlimited, /downloads, category/series APIs
2026-06-22 11:00:41 +08:00
Warren
60e4329eed Add VirtualFs tag-mode WebDAV + MyFiles UI + Admin WebDAV endpoint
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- VirtualFs: SQLite-backed virtual folders (tag mode), 16 unit tests
- MyFiles module: API endpoints + Web UI for folder/tag management
- Admin WebDAV: /admin-webdav/*path with Basic Auth + URI prefix rewrite
- CLI: webdav-folder/tag/untag/list/start --virtual-mode commands
- Deployed and tested on M5Max48: PROPFIND, PUT, GET, DELETE all working
2026-06-22 10:38:25 +08:00
Warren
37d0fe1a3c Fix duplicate derive(Clone)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:28:33 +08:00
Warren
4003864d28 Fix WebDAV: add Clone to WebdavCredentials
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:26:54 +08:00
Warren
8039f0d375 Fix WebDAV auth: use map_or for password check
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:25:53 +08:00
Warren
3d395584a8 Fix WebDAV: middleware use extensions().get() to not consume
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:23:57 +08:00
Warren
cf57d46ca5 Fix WebDAV: handle_dav extract WebdavCredentials Extension
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:22:01 +08:00
Warren
8a5a23a309 Fix WebDAV Extension layer order
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:20:34 +08:00
Warren
a7f50ff747 Update WebDAV: root path + 0.0.0.0 bind
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 07:17:45 +08:00
Warren
e7a9f886ed Fix web server bind to 0.0.0.0 for external access
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 06:20:17 +08:00
Warren
52c38b1919 Add SMB Configuration Templates (Phase 6)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 05:22:14 +08:00
Warren
ebe976eee4 Implement Write/Read Cache (Phase 3)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 04:42:55 +08:00
Warren
88590d3611 Add LDAP CLI parameters to SMB server (Phase 2.2)
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
2026-06-22 04:13:10 +08:00
Warren
912bc21929 Implement LDAP Provider Phase 2.1: DataProvider trait with OpenLDAP/AD support
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
2026-06-22 03:34:17 +08:00
Warren
097521b35d P2: Fix S3 multipart route - use query param for action
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- Change route from /s3/multipart/:bucket/*key/init to /s3/multipart/:bucket/*key?action=init
- Add multipart_handler to unify all multipart operations
- Use Response type instead of impl IntoResponse for type compatibility
2026-06-22 01:22:16 +08:00
Warren
321310582b E: Security improvements - auth + policy enforcement
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- Add Signature V4 auth to multipart endpoints (init/upload/complete/abort)
- Add policy checks to main S3 handlers (get/put/delete)
- extract_user_from_auth() helper for policy evaluation
- check_bucket_policy() integrated into all handlers
- Policy denied returns 403 FORBIDDEN

Tests: 299 passed, 0 failed
2026-06-21 23:43:24 +08:00
Warren
9b02bbac27 A: Code quality improvements - fix clippy warnings
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- Remove unused imports in server.rs (Body, HeaderValue, RwLock)
- Remove unused imports in forward_acl.rs (tests still need Ipv4Addr)
- Remove unused imports in host_key.rs (Read, Write)
- Remove unused imports in kex_exchange.rs (HostKeyType)
- Remove unused imports in known_hosts.rs (tests need Ipv4Addr)
- Remove unused imports in multiplex.rs (Arc)
- Auto-fix other unused imports via clippy --fix

Tests: 303 passed, 0 failed (4 new tests added)
2026-06-21 23:08:07 +08:00
Warren
02d98419e1 P3: Bucket Policy implementation complete
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- BucketPolicy struct with Version + Statement array
- PolicyStatement: Effect, Principal, Action, Resource, Condition
- Principal matching (wildcard + user-specific)
- Action/Resource pattern matching with wildcards
- GetBucketPolicy: GET /s3/policy/:bucket
- PutBucketPolicy: PUT /s3/policy/:bucket
- DeleteBucketPolicy: DELETE /s3/policy/:bucket
- Policy persistence to data/s3_policies/:bucket/policy.json
- check_bucket_policy() for authorization
- 6 unit tests

Tests: 299 passed, 0 failed
2026-06-21 22:50:53 +08:00
Warren
ca0f541a79 P2: S3 Multipart Upload support complete
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- InitiateMultipartUpload: POST /s3/multipart/:bucket/:key/init
- UploadPart: PUT /s3/multipart/:bucket/:key/part
- CompleteMultipartUpload: POST /s3/multipart/:bucket/:key/complete
- AbortMultipartUpload: DELETE /s3/multipart/:bucket/:key/abort
- In-memory upload tracking with once_cell::Lazy
- Part files stored in temp dir during upload
- Final file assembled on CompleteMultipartUpload
- XML responses for all operations

Tests: 293 passed, 0 failed
2026-06-21 22:44:17 +08:00
Warren
5487ad63a6 P1: AsyncS3Vfs native async implementation using reqwest
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- Replace spawn_blocking + ureq with native async reqwest
- AsyncS3Vfs uses reqwest::Client for HTTP operations
- rusty-s3 for presigned URL generation + XML parsing
- AsyncS3File with async read/write/seek/flush
- reqwest dependency added under async-vfs feature

Tests: 297 passed (293 + 4 new s3_auth tests)
2026-06-21 22:22:05 +08:00
Warren
f5074b2ce2 P0: AWS Signature V4 implementation complete
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- Full Canonical Request with signed headers
- Proper URI encoding (encode_slash option)
- X-Amz-Date timestamp support
- SignedHeaders extraction from Authorization header
- Payload hash from X-Amz-Content-Sha256
- 4 unit tests passing

Tests: 297 passed (293 + 4 new)
2026-06-21 22:14:34 +08:00
Warren
49873cb302 Phase 5.1: AsyncVfsDavFs spawn_blocking wrapper complete
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- AsyncVfsDavFs wraps VfsDavFs with spawn_blocking
- All DavFileSystem methods offloaded to blocking thread pool
- Uses tokio::runtime::Runtime::block_on inside spawn_blocking
- Prevents blocking async executor during VFS operations

Tests: 293 passed, 0 failed
2026-06-21 21:33:43 +08:00
Warren
c2ff6fc90e Phase 5: WebDAV async integration analysis - API mismatch found
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- dav-server DavFileSystem API changed (20+ compile errors)
- read_dir takes ReadDirMeta, not depth
- have_props/get_props/get_prop/patch_props new methods
- DavFile needs write_buf method
- DavMetaData/DavDirEntry async return types changed

Recommended approach: spawn_blocking wrapper (~2h)
Alternative: full rewrite (~8h)

Phase 5 blocked pending API analysis
2026-06-21 21:28:39 +08:00
Warren
23e0996b81 Phase 5: WebDAV async integration design framework
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- Detailed design notes for AsyncVfsDavFs
- AsyncVfsDavFile implementation pattern
- DavFileSystem trait async implementation
- Estimated: ~3 hours for full implementation

Phase 5 framework documented for future implementation
2026-06-21 21:20:47 +08:00
Warren
94a7584e64 P1: AsyncSmbVfs implementation (Phase 4)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- AsyncSmbVfs: spawn_blocking wrapper over SmbVfs
- AsyncSmbFile: tokio::sync::Mutex for async state
- Add Clone derive to SmbVfs (Arc<Mutex<Tree>>)
- Remove manual Clone impl (derive handles it)

Phase 4 complete: AsyncSmbVfs working
Phase 5 pending: WebDAV integration

Tests: 293 passed, 0 failed
2026-06-21 21:16:50 +08:00
Warren
5c9b51fc49 P1: AsyncS3Vfs implementation (Phase 3)
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- AsyncS3Vfs: spawn_blocking wrapper over S3Vfs
- AsyncS3File: tokio::sync::Mutex for async state
- Add Clone derive to S3Vfs
- All backend methods wrapped with spawn_blocking

Phase 3 complete: AsyncS3Vfs working
Phase 4 pending: AsyncSmbVfs
Phase 5 pending: WebDAV integration

Tests: 293 passed, 0 failed
2026-06-21 21:08:48 +08:00
Warren
790efe13f4 P1: AsyncLocalFs implementation (Phase 2)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
- AsyncLocalFile: tokio::fs::File wrapper
- AsyncLocalFs: AsyncVfsBackend impl using tokio::fs
- Key methods: read_dir, open_file, stat, create_dir, remove_file, rename
- 4 async tests passing

Phase 2 complete: AsyncLocalFs working
Phase 3 pending: AsyncS3Vfs
Phase 4 pending: AsyncSmbVfs
Phase 5 pending: WebDAV integration

Tests: 293 passed, 0 failed
2026-06-21 20:59:41 +08:00
Warren
6242a5eaab P1: AsyncVfsBackend trait design (Phase 1 - framework)
Some checks failed
Test / build (push) Has been cancelled
Test / test (push) Has been cancelled
- Add AsyncVfsBackend + AsyncVfsFile trait definitions
- Use cfg(feature = "async-vfs") for optional compilation
- Design notes for Phase 2-5 implementation
- Estimated: ~13 hours (multi-day project)

Phase 2: AsyncLocalFs (tokio::fs)
Phase 3: AsyncS3Vfs (async client)
Phase 4: AsyncSmbVfs (async wrapper)
Phase 5: WebDAV integration

Tests: 289 passed, 0 failed
2026-06-21 20:52:31 +08:00