Photos shared root returns an empty timeline after opt-in #215

Closed
opened 2026-09-27 05:36:46 +00:00 by kayg · 3 comments
Owner

A real local adversarial run found that an active shared Photos root can return an empty timeline after the recipient opts in.

Reproduction from tests/adversarial/attack2.py:

  1. User A has a photo in Photos/2024/2024-06-02/ and the owner timeline shows it.
  2. User A shares Photos with User B.
  3. User B adds Shared/<owner-id>/Photos with PUT /api/v1/photos/library-roots (HTTP 200).
  4. Poll GET /api/v1/photos/timeline?before=2024-06-03&days=7&tiles_per_day=10 for 12 seconds.

Observed: every timeline response was HTTP 200 with {"days":[],"next_before":null}. The probe did not mark this finding SLOW. The same host round noted that no thumbnail appeared within 10 seconds and skipped a thumbnail-dependent check, so confirm whether media worker load affected the fixture.

Expected: the recipient sees the shared photo in the timeline after opting in. Revoking the Share must remove it from later reads.

The route updates the setting and starts index::refresh_user in the background. Please check whether the viewer's Photos index is refreshed from the active shared root and whether failures are visible to the caller or logs.

A real local adversarial run found that an active shared Photos root can return an empty timeline after the recipient opts in. Reproduction from `tests/adversarial/attack2.py`: 1. User A has a photo in `Photos/2024/2024-06-02/` and the owner timeline shows it. 2. User A shares `Photos` with User B. 3. User B adds `Shared/<owner-id>/Photos` with `PUT /api/v1/photos/library-roots` (HTTP 200). 4. Poll `GET /api/v1/photos/timeline?before=2024-06-03&days=7&tiles_per_day=10` for 12 seconds. Observed: every timeline response was HTTP 200 with `{"days":[],"next_before":null}`. The probe did not mark this finding SLOW. The same host round noted that no thumbnail appeared within 10 seconds and skipped a thumbnail-dependent check, so confirm whether media worker load affected the fixture. Expected: the recipient sees the shared photo in the timeline after opting in. Revoking the Share must remove it from later reads. The route updates the setting and starts `index::refresh_user` in the background. Please check whether the viewer's Photos index is refreshed from the active shared root and whether failures are visible to the caller or logs.
Author
Owner

Post-merge adversarial update from 2026-09-27: the media upload probe again reported thumbnail: none generated in 10 s (media worker busy or missing); header check skipped. This round did not report a shared-root timeline assertion failure, so it does not confirm or clear the original timeline result. The output does not separate worker failure from shared-host load. Hostile-byte checks reported zero findings.

Post-merge adversarial update from 2026-09-27: the media upload probe again reported `thumbnail: none generated in 10 s (media worker busy or missing); header check skipped`. This round did not report a shared-root timeline assertion failure, so it does not confirm or clear the original timeline result. The output does not separate worker failure from shared-host load. Hostile-byte checks reported zero findings.
Author
Owner

Follow-up from the #148 adversarial round after merge 61cdb607: the real local server again returned HTTP 200 with days: [] for every recipient Photos timeline poll during the 12-second active-share/opt-in window. This is not a SLOW finding. Several other adversarial runs were active on the shared host, so this still needs a quiet-host reproduction; the empty-timeline result itself repeated.

Follow-up from the #148 adversarial round after merge `61cdb607`: the real local server again returned HTTP 200 with `days: []` for every recipient Photos timeline poll during the 12-second active-share/opt-in window. This is not a SLOW finding. Several other adversarial runs were active on the shared host, so this still needs a quiet-host reproduction; the empty-timeline result itself repeated.
Author
Owner

Merged into dev by Claude after review (413ccaa7), deploying to calternal.cloud. Closing.

Merged into dev by Claude after review (413ccaa7), deploying to calternal.cloud. Closing.
kayg closed this issue 2026-09-28 23:46:35 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#215
No description provided.