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)
This commit is contained in:
Warren
2026-06-24 00:46:33 +08:00
parent 5300b672cb
commit 57fd6a475f
33 changed files with 1211 additions and 253 deletions

View File

@@ -84,10 +84,10 @@ pub async fn dispatch_frame(
return Some(bytes);
}
// SMB3 encryption check: TRANSFORM_HEADER magic (0x534D4220 = "SMB ")
// SMB3 encryption check: TRANSFORM_HEADER magic (0x534D4272 = "SMBr")
if frame.len() >= 4 {
let magic = u32::from_be_bytes([frame[0], frame[1], frame[2], frame[3]]);
if magic == 0x534D4220 {
if magic == 0x534D4272 {
// Encrypted packet - decrypt and process
return handle_encrypted_frame(server, conn, frame).await;
}
@@ -195,6 +195,7 @@ async fn handle_encrypted_frame(
let session = session_arc.read().await;
let encryption_enabled = session.encryption_enabled;
let encryption_key = session.encryption_key;
let encryption_cipher = session.encryption_cipher.unwrap_or(CipherAlgorithm::Aes128Gcm);
if !encryption_enabled {
warn!("session does not have encryption enabled");
@@ -209,8 +210,8 @@ async fn handle_encrypted_frame(
}
};
// Decrypt packet
let encryption = match Smb3Encryption::new(&encryption_key, CipherAlgorithm::Aes128Gcm) {
// Decrypt packet using the session's negotiated cipher
let encryption = match Smb3Encryption::new(&encryption_key, encryption_cipher) {
Ok(e) => e,
Err(e) => {
warn!(error = %e, "failed to create encryption context");
@@ -983,7 +984,7 @@ mod tests {
user: "alice".to_string(),
domain: String::new(),
};
let session = Session::new(1, identity, [0; 16], [0; 16], None, false, false, None);
let session = Session::new(1, identity, [0; 16], [0; 16], None, false, false, None, None);
let session = Arc::new(tokio::sync::RwLock::new(session));
let share = state.find_share("home").await.expect("share");
let tree = Arc::new(tokio::sync::RwLock::new(TreeConnect::new(