fix(sync): S-05 — delete and shred all chunks when truncating to 0 bytes
This commit is contained in:
@@ -1776,6 +1776,50 @@ impl Database {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Löscht und shreddert alle Chunks eines Knotens (z. B. beim Kürzen auf 0 Bytes) (S-05).
|
||||
pub fn delete_all_chunks(&self, node_id: i64) -> Result<()> {
|
||||
self.assert_not_carrier(node_id)?;
|
||||
let mut conn = self.conn.lock().unwrap();
|
||||
let tx = conn.transaction()?;
|
||||
{
|
||||
let mut stmt = tx
|
||||
.prepare("SELECT chunk_index, length(ciphertext) FROM chunks WHERE node_id = ?1")?;
|
||||
let chunks_to_shred: Vec<(u32, usize)> = stmt
|
||||
.query_map(params![node_id], |row| {
|
||||
Ok((row.get(0)?, row.get::<_, usize>(1)?))
|
||||
})?
|
||||
.filter_map(|r| r.ok())
|
||||
.collect();
|
||||
|
||||
let mut update_stmt = tx.prepare(
|
||||
"UPDATE chunks SET nonce = ?1, tag = ?2, ciphertext = ?3 WHERE node_id = ?4 AND chunk_index = ?5",
|
||||
)?;
|
||||
|
||||
for (idx, len) in chunks_to_shred {
|
||||
let mut dummy_nonce = [0u8; 12];
|
||||
let mut dummy_tag = [0u8; 16];
|
||||
let mut dummy_payload = vec![0u8; len];
|
||||
OsRng.fill_bytes(&mut dummy_nonce);
|
||||
OsRng.fill_bytes(&mut dummy_tag);
|
||||
OsRng.fill_bytes(&mut dummy_payload);
|
||||
|
||||
let _ = update_stmt.execute(params![
|
||||
dummy_nonce.as_slice(),
|
||||
dummy_tag.as_slice(),
|
||||
dummy_payload.as_slice(),
|
||||
node_id,
|
||||
idx
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
tx.execute("DELETE FROM chunks WHERE node_id = ?1", params![node_id])?;
|
||||
tx.commit()?;
|
||||
drop(conn);
|
||||
let _ = self.update_metadata_mac();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Erzeugt die deterministische kanonische Byterepräsentation aller Knoten für den Metadaten-MAC (K-01).
|
||||
pub fn canonical_nodes_bytes(&self) -> Result<Vec<u8>> {
|
||||
self.canonical_nodes_bytes_for_vault(0)
|
||||
|
||||
+6
-1
@@ -335,7 +335,12 @@ pub fn sync_single_file_to_vault(
|
||||
}
|
||||
|
||||
// Bei Überschreiben einer ehemals größeren Datei überzählige alte Chunks entfernen
|
||||
db.truncate_chunks_after(node_id, chunk_idx.saturating_sub(1))?;
|
||||
if bytes_written == 0 {
|
||||
// S-05: 0-Byte Datei: Alle Chunks (inkl. Chunk 0) restlos löschen und shreddern
|
||||
db.delete_all_chunks(node_id)?;
|
||||
} else {
|
||||
db.truncate_chunks_after(node_id, chunk_idx.saturating_sub(1))?;
|
||||
}
|
||||
// S-04: Verwende bytes_written statt local_size zur Vermeidung von TOCTOU-Diskrepanzen
|
||||
db.update_node_size_and_time(node_id, bytes_written, local_mtime)?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user