Skip to content

fix(cloudkitSharing): skip NoteStore.sqlite files without the CloudKit table - #1773

Merged
abrignoni merged 1 commit into
abrignoni:mainfrom
Sanjays2402:fix/cloudkit-sharing-missing-table
Jul 26, 2026
Merged

fix(cloudkitSharing): skip NoteStore.sqlite files without the CloudKit table#1773
abrignoni merged 1 commit into
abrignoni:mainfrom
Sanjays2402:fix/cloudkit-sharing-missing-table

Conversation

@Sanjays2402

Copy link
Copy Markdown
Contributor

Closes #1726

iOS leaves zero-byte NoteStore.sqlite placeholders under group.com.apple.notes/Backups/<date>/, and the artifact's *NoteStore.sqlite* glob matches them. sqlite3 opens a zero-byte file as an empty database, so the first SELECT raised no such table: ZICCLOUDSYNCINGOBJECT and aborted both CloudKit processors before the real NoteStore.sqlite in the same extraction was read — which is why the reporter saw no shares at all until they deleted the backup files by hand.

Both processors now guard with does_table_exist_in_db(), the same idiom scripts/artifacts/notes.py already uses for its own queries.

Test in admin/test/scripts/test_cloudkit_sharing_missing_table.py runs both processors over a zero-byte placeholder alongside a schema-bearing db; it fails with the reported OperationalError without the guard and passes with it.

…t table

iOS leaves zero-byte NoteStore.sqlite placeholders under
group.com.apple.notes/Backups/<date>/, and the artifact's '*NoteStore.sqlite*'
glob matches them. sqlite3 opens a zero-byte file as an empty database, so the
first SELECT raised 'no such table: ZICCLOUDSYNCINGOBJECT' and aborted both
CloudKit artifacts before the real NoteStore.sqlite was read - the examiner got
no shares at all, only a parsing error in the log.

Both processors now guard with does_table_exist_in_db(), the same idiom
scripts/artifacts/notes.py already uses for its own queries.

Adds admin/test/scripts/test_cloudkit_sharing_missing_table.py covering both
processors against a zero-byte placeholder alongside a schema-bearing db.
@abrignoni
abrignoni merged commit 6e507d7 into abrignoni:main Jul 26, 2026
4 checks passed
pull Bot pushed a commit to nagyist/abrignoni-iLEAPP that referenced this pull request Jul 26, 2026
…ing schema

PR abrignoni#1773 guards both CloudKit processors with does_table_exist_in_db so the
zero-byte NoteStore.sqlite placeholders iOS leaves under Backups/<date>/ no
longer abort the artifact. The guard skipped silently, though, which is right
for a placeholder but would also swallow a truncated or unreadable database:
the examiner would get no shares and nothing in the run log to explain it.

Both call sites now go through has_cloudkit_table(), which logs the file and
its size on the way out. A 0-byte skip reads as routine, while a skip with real
bytes in the file flags data the examiner should look at.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

cloudkitSharing.py - module fails when backup folders are present

2 participants