Commit Graph
26 Commits
Author SHA1 Message Date
tim b68c2eb568 Give the feed of an empty site the current date.
The feed passed NULL to strtotime() when there were no stories.
2026-09-26 15:27:51 +02:00
tim 8d6282348c Show no date for a story without one.
Such a story showed the date of the story before it, or caused a warning when it came first.
2026-09-26 15:27:51 +02:00
tim 71f768bff2 Log out with a POST form.
The logout link put the CSRF token in the URL, which goes into logs and the browser history.
2026-09-26 15:27:51 +02:00
tim 061f9c1a37 Hash the password for an unknown username at login.
An unknown username got a fast answer, which showed which usernames exist.
2026-09-26 15:27:51 +02:00
tim c8030b759d Leave the image data out of the story lists.
A page of 50 stories read 50 images from the database only to see which stories had one.
2026-09-26 15:27:51 +02:00
tim ed8918e7fd Refuse session ids that PHP did not make. 2026-09-26 15:27:51 +02:00
tim 30b275b902 Send HSTS on HTTPS pages. 2026-09-26 15:27:51 +02:00
tim b6a1eff3e6 Stop other sites from framing the pages. 2026-09-26 15:27:51 +02:00
tim ed6f98e0ac Limit a story to 64 KB before HTML Purifier runs.
A preview purified any posted story, even without a token or a captcha. A few megabytes took seconds and hundreds of megabytes.
2026-09-26 15:27:51 +02:00
tim bf36ec25fd Load a saved story into the form for editors only.
Visitors could post an id to /publish and read the author's email address.
2026-09-26 15:27:51 +02:00
tim 8f4851e576 Reject invalid uploads and expand flow tests. 2026-09-26 15:27:51 +02:00
tim 716a609f4e Hide form parts with the hidden attribute. 2026-09-26 15:27:51 +02:00
tim 65426a327d Remove Google Analytics.
Google shut down the Universal Analytics script that the pages loaded,
and we haven't used it probably a decade
2026-09-26 15:27:51 +02:00
tim 77800174c9 Use the reCAPTCHA Enterprise API. 2026-09-26 15:27:51 +02:00
tim 45bca9e76a Use the default for an empty UPLOAD_DIR_LIMIT_MB.
An empty or bad value gave a limit of zero, so previews kept no images.
2026-09-26 15:27:51 +02:00
tim 504d363642 Limit each image to 1 MB.
UPLOAD_MAX_MB changes the limit, and UPLOAD_MAX_MB=none removes it.
2026-09-26 15:27:51 +02:00
tim c4fcef21aa Limit the images that previews keep.
A preview that fails the captcha or the form token keeps no image. A session keeps one image, the directory has a size limit, and abandoned images go at the next upload.
2026-09-26 15:27:51 +02:00
tim fe30a0aaa1 Do not let caches keep queued or hidden images. 2026-09-26 15:27:51 +02:00
tim 3df88e0b4c Check editor accounts.
A new editor needs a username and a password of at least 12 characters. A persistent login needs an unexpired key and an existing account. Removing an account revokes its persistent logins, and its sessions end.
2026-09-26 15:27:51 +02:00
tim 5d657d7e45 Take the site address from SITE_URL.
The feed links, the notification email, the webmaster address and the cookie domain now use it.
2026-09-26 15:27:51 +02:00
tim 52f4855850 Ignore request values that are not strings.
An array action or username no longer causes a PHP error.
2026-09-26 15:27:51 +02:00
tim be814a3ba5 Take redirects off the Host header.
Same-site redirects are now relative paths, and a saved page on another site is ignored. The HTTP to HTTPS redirect takes its host from the new SITE_URL setting, and without it the pages refuse plain HTTP.
2026-09-26 15:27:51 +02:00
tim 4657088d23 Keep the space of the line-break note under the image box.
An invisible copy of the note sits under the image box, so the page
does not jump when the tabs change.
2026-09-26 15:27:51 +02:00
tim 2214a6ae38 Mark the active Text or Image tab.
The active tab stays solid green, and the other tab is pale with green
text. A tab whose field failed validation now shows red text.
2026-09-26 15:27:51 +02:00
tim b7022ab486 Add JavaScript tests.
Run "npm install", then "npm test".
2026-09-26 03:48:09 +02:00
tim ed959888b4 Add PHP unit tests and page tests.
Run "composer install", then "composer test".
2026-09-26 03:48:09 +02:00