Fix nested iOS media directory extraction

Create parent directories when an iOS backup manifest contains a nested directory path. Add a regression test covering the reported iOS 26 layout.
This commit is contained in:
Sanjay Santhanam
2026-07-19 15:48:38 -07:00
parent 3ecb74b0bd
commit 12981a148b
2 changed files with 28 additions and 4 deletions
+1 -4
View File
@@ -230,10 +230,7 @@ class BackupExtractor:
flags = row["flags"]
if flags == 2: # Directory
try:
os.mkdir(destination)
except FileExistsError:
pass
os.makedirs(destination, exist_ok=True)
elif flags == 1: # File
shutil.copyfile(os.path.join(self.base_dir, folder, hashes), destination)
metadata = BPListReader(row["metadata"]).parse()
+27
View File
@@ -0,0 +1,27 @@
import sqlite3
from types import SimpleNamespace
from Whatsapp_Chat_Exporter.ios_media_handler import BackupExtractor
def test_extract_media_files_creates_nested_directories(tmp_path, monkeypatch):
backup_dir = tmp_path / "backup"
backup_dir.mkdir()
with sqlite3.connect(backup_dir / "Manifest.db") as manifest:
manifest.execute(
"CREATE TABLE Files "
"(fileID TEXT, domain TEXT, relativePath TEXT, "
"flags INTEGER, file BLOB)"
)
manifest.execute(
"INSERT INTO Files VALUES (?, ?, ?, ?, ?)",
("unused", "WhatsApp.shared", "parent/child", 2, None),
)
monkeypatch.chdir(tmp_path)
identifiers = SimpleNamespace(DOMAIN="WhatsApp.shared")
extractor = BackupExtractor(backup_dir, identifiers, decrypt_chunk_size=0)
extractor._extract_media_files()
assert (tmp_path / "WhatsApp.shared" / "parent" / "child").is_dir()