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:
11
vendor/smb-server/src/dispatch.rs
vendored
11
vendor/smb-server/src/dispatch.rs
vendored
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user