diff --git a/TODO.md b/TODO.md index 200293b..724a404 100644 --- a/TODO.md +++ b/TODO.md @@ -30,18 +30,6 @@ P2: security: per-origin rate limiting # Completed Steps -- 2026-10-15 a cached file left empty or partial is no longer served, or fetched - again on every request (closes #252). Source and transformed image files, and - each transformed image's `.meta` file, are synced to disk before they are - renamed into place, and their directory after; the `.meta` file is written - before the image, and a failed directory sync removes the renamed file. The - reconciliation pass, at startup and every five minutes, removes a cached - source or transformed image whose file is empty, or not the size the database - records for it, with its rows and a warning naming the file, so the next - request fetches the source or converts the image again; requests compare no - sizes. Storing a source over a file of another size replaces that file. A - source that fails to decode is not removed for that alone: a damaged upstream - image would then be fetched on every request. - 2026-10-15 logging out ends every login session (closes #256): a login session was a cookie with nothing kept on the server, so `/logout` removed it from one browser and a copy of it kept working for its 30 days. Every login is made @@ -59,6 +47,18 @@ P2: security: per-origin rate limiting the cookie, as anyone can take a CSRF token from the login page. A logout that cannot be saved answers 500. `session.NewManager`, which the tests use, keeps the value in memory only; pixad uses `session.NewManagerWithDatabase`. +- 2026-10-15 a cached file left empty or partial is no longer served, or fetched + again on every request (closes #252). Source and transformed image files, and + each transformed image's `.meta` file, are synced to disk before they are + renamed into place, and their directory after; the `.meta` file is written + before the image, and a failed directory sync removes the renamed file. The + reconciliation pass, at startup and every five minutes, removes a cached + source or transformed image whose file is empty, or not the size the database + records for it, with its rows and a warning naming the file, so the next + request fetches the source or converts the image again; requests compare no + sizes. Storing a source over a file of another size replaces that file. A + source that fails to decode is not removed for that alone: a damaged upstream + image would then be fetched on every request. - 2026-10-15 a transcode stops once its request's `downstream_timeout` has ended, unless it has begun encoding (closes #243): the image processor looked at its context only while it waited for a processing slot, so an image was