Commit Graph
100 Commits
Author SHA1 Message Date
Frank eee6c3a369 Auto-trigger locked-files restoration exactly at the 60s deadline
Previously the restore check only ran lazily on a player's next
message, so files could stay wrongly-removed for an arbitrary amount
of time after the window expired. The frontend now schedules a
setTimeout (using the server-provided deadline, mirroring the terminal
lock's reveal timer) that pings the backend right at the deadline so
the check runs promptly regardless of player activity. Restored via
data-files-removal-deadline on page load too, so a refresh mid-window
doesn't lose the timer.
2026-07-11 17:45:08 +02:00
Frank e6ba469ef9 Restore locked files if not all removed within 60 seconds
Removing one of the 3 AI-virus-protected files now starts a 60-second
window (tracked session-wide via LockedFilesRemovalDeadline). If the
other locked files aren't also removed before it expires, the virus
restores whichever ones were deleted and broadcasts a red warning to
the whole session, forcing players to coordinate the removal instead
of picking them off one at a time.

Also extends the Mercure broadcast payload with an optional 3rd
"messageType" element so pushed messages can render red (virus) or
green (mainframe) instead of always defaulting to green.
2026-07-11 17:26:59 +02:00
Frank f6a0d62017 Make terminal output more authentic: smaller font, tighter line spacing
Message font dropped from 20px to 14px and the 10px inline margin-bottom
(set from JS on every message) replaced with a 2px CSS margin so the
terminal reads like dense console output instead of spaced-out chat
bubbles. Colors are unchanged.
2026-07-11 17:21:41 +02:00
Frank 6fd0b5d993 Grant rm right alongside sudo when player 1 decodes their message
rm was checked everywhere but never actually added to any player's
rights, so the command was unreachable until now.
2026-07-11 17:08:44 +02:00
Frank 6db9d42852 Wire up decode puzzle chain and lock terminal on file removal
Connects the previously-disconnected /decode command to per-player
messages: player 1 unlocks sudo for everyone, player 2 unlocks a scan
command that reveals which files the AI virus has locked, player 3
learns those files should be removed.

Also adds a retaliation mechanic: successfully removing a file locks
the player's terminal. The AI virus locks it out in red immediately;
the mainframe reveals a 12-character recovery code in green after 30
seconds, which can be submitted via /unlock to restore access early,
otherwise the terminal auto-recovers after 45 seconds.
2026-07-11 16:48:15 +02:00
Frank 1e644eb13b Add "Looking for Help" page for the open visual artist request
Adds a /looking-for-help page listing the open volunteer request and
links it from the site footer on every page.
2026-07-04 23:23:04 +02:00
Frank 8554f04735 Add "In Development" watermark badge over AI virus artwork
Overlay a rotated CSS badge on the homepage hero and briefing page
image instead of baking it into the PNG, so it's easy to remove once
the game ships.
2026-07-04 23:02:46 +02:00
Frank 839113c356 Add AI Virus Deflection story to homepage and new agent briefing page
Give the public homepage a themed breach-alert hero and add a /briefing
page with the full mission narrative, both linking into the existing
game dashboard flow.
2026-07-04 23:00:31 +02:00
FrankandClaude Sonnet 5 7dbb738da8 Show marketing opt-in status in admin users overview
Adds a Marketing column to the admin users table and a total opt-in
count in the header, so admins can see who signed up for updates on
future projects.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 20:48:48 +02:00
FrankandClaude Sonnet 5 ec34a1ddb9 Add Terms and Conditions and marketing opt-in checkboxes to registration
Registration now requires agreeing to the Terms and Conditions and lets
users opt in to hear about future projects. The opt-in is persisted on
the user via a new marketing_opt_in column (migration included).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 20:28:52 +02:00
FrankandClaude Sonnet 5 703d2af3d8 Add admin nav link and reuse site header/footer on admin pages
Admins now see an Admin link in the main navigation, and the admin
section inherits the branded header/footer from layout/site.html.twig
instead of the bare base layout.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 19:15:24 +02:00
Frank 5b03bd1d1c Complete layout overhaul 2026-07-04 19:08:31 +02:00
FrankandClaude Sonnet 5 05f4f2c32f Fix EveryoneVerified setting being scoped to a specific player
checkIfAllPlayersVerified() read and wrote the EveryoneVerified
setting scoped to whichever player happened to trigger the check
(getSetting(..., $player) / setPlayer($player)), but it's meant to be
a single session-wide flag. getFileContent() correctly reads it as
session-global (no player, filters player IS NULL), so the two never
matched: the "everyone verified" Mercure message still fired (that
code path only checks its own player-scoped copy), but the special
code injection into the Doyle/Vega/Lennox report files never ran
since getFileContent() never found the setting. Store and read it
consistently as session-global.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 18:19:14 +02:00
FrankandClaude Sonnet 5 ddd2726687 Fix cat command using relative path for physical file lookup
getFileContent() built the game1 filesystem path as a relative
string with no leading slash. That only resolves correctly when
PHP's cwd happens to be the project root (e.g. CLI), but under
PHP-FPM/nginx the cwd is nginx's document root (public/), so
file_exists() always failed for real requests even though the file
existed and the in-memory virtual file list (used by ls) said it
should. Use the already-injected $projectDir (%kernel.project_dir%),
matching how the class already builds the session log path.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 18:12:55 +02:00
FrankandClaude Sonnet 5 3721abcc5d Fix missing leading slash in player's initial working directory
Every possible path/file in GameResponseService uses a leading slash
(e.g. /var/home/{username}), but a player's initial pwd was seeded as
'var/home/{username}' without one. getAllCurrentFilesInDirectory()
matches entries by comparing getPrevPath() (which always has the
leading slash) against pwd, so a fresh player's ls always came back
empty until their first cd command happened to normalize the format.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 17:03:30 +02:00
FrankandClaude Sonnet 5 e76d0b0f07 Fix Mercure reload spam on waiting page in Chrome
When the last player clicked ready, toggleReady() published a
redundant 'player_ready' event on top of checkAllPlayersReady()'s
'all_ready', and the client reloaded on every message with no guard
and without closing the EventSource. Chrome kept the old page's
script (and its EventSource) alive across the overlapping reload
calls, causing repeated reconnects to the Mercure hub; Firefox
apparently tore the page down fast enough to mask it. Skip the
redundant publish server-side, and make the client reload idempotent
by tracking whether it already fired and closing the EventSource
before reloading.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 16:26:47 +02:00
FrankandClaude Sonnet 5 b7693bd9d0 Remove quotes around MERCURE_CORS_ALLOWED_ORIGINS in docker/.env.dist
docker/.env feeds MERCURE_EXTRA_DIRECTIVES, a Caddyfile-style config
block, via Compose variable substitution. Quoting a space-separated
value there makes Caddy treat both origins as one single malformed
token rather than two arguments, which crash-loops the Mercure
container on startup. Compose's .env parsing for values with spaces
doesn't require quotes (unlike Symfony's Dotenv), so drop them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 15:43:03 +02:00
FrankandClaude Sonnet 5 b4f6a531c9 Fix Mercure CORS to allow both www and bare domain
Production's MERCURE_CORS_ALLOWED_ORIGINS only allowed
https://escapepage.com, but nginx has no www redirect
(server_name _;), so the site is also reachable at
https://www.escapepage.com. Visitors on the www host got a CORS
error on the Mercure EventSource connection since the Origin header
didn't match the allow-list. Dev's .env already allowed both; bring
docker/.env.dist in line, and fix its stale MERCURE_PUBLIC_URL
(bare domain instead of the mercure. subdomain actually used).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 15:26:17 +02:00
FrankandClaude Sonnet 5 c4e5139ec4 Increase email header logo size from 40px to 140px
40px made the logo too small in the header banner.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 14:55:15 +02:00
FrankandClaude Sonnet 5 238705495e Add shared HTML layout for transactional emails
confirmation_email.html.twig and reset_password/email.html.twig were
plain unstyled HTML with no shared structure. Extract a table-based
layout (templates/emails/layout.html.twig) with header/logo, content
block, and footer, so future transactional emails can extend it
instead of starting from scratch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 14:51:34 +02:00
FrankandClaude Sonnet 5 4a5d83ef53 Fix duplicate EmailLog rows for a single sent email
Mailer dispatches MessageEvent twice when routed through Messenger:
once when queuing (queued=true) and once on the actual send from the
worker (queued=false). EmailLoggerListener logged on both, creating
two rows per email actually sent. Skip the queued dispatch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 14:44:03 +02:00
FrankandClaude Sonnet 5 0e12e7fa8f Switch docker/.env.dist mailer template from SendGrid to Mailgun
The project now sends mail via Mailgun (symfony/mailgun-mailer), not
SendGrid, so the tracked template should reflect the real transport
in use.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 14:23:21 +02:00
Frank 58c9c60ad2 Mailer 2026-07-04 13:57:00 +02:00
FrankandClaude Sonnet 5 a1ff6df721 Add root .env.dist template
.env/.env.dev/.env.prod/.env.test are now gitignored, leaving no
tracked reference for what variables a fresh checkout needs. Add a
placeholder-only .env.dist (mirroring docker/.env.dist) to copy from.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 12:49:51 +02:00
FrankandClaude Sonnet 5 487019d360 Stop tracking .env files and sanitize docker/.env.dist
.env, .env.dev, .env.prod, .env.test, and docker/.env contained real
production secrets and were tracked in git despite the Symfony
convention of keeping them local-only. Untrack them and ignore them
going forward; docker/.env.dist stays as a template but now uses
placeholder values instead of live credentials.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 12:29:04 +02:00
Frank 3b1d3a5aad Fixed network v4 2026-03-11 07:59:23 +01:00
Frank 8b3bf68954 Fixed network v3 2026-03-11 07:57:49 +01:00
Frank 74dadf102d Fixed network v2 2026-03-11 07:55:47 +01:00
Frank 74d5cd15b6 Fixed network 2026-03-11 07:52:11 +01:00
Frank 4e696af231 Fixed ip addresses 2026-03-10 22:13:22 +01:00
Frank 539a243353 Fix database container creation 2026-03-10 22:04:23 +01:00
Frank eb3d36c99f Unfixed ips 2026-03-10 22:00:08 +01:00
Frank 8564257761 Fixed ips 2026-03-10 21:55:21 +01:00
Frank be01de83ed network defined 2026-03-10 21:52:05 +01:00
Frank 700160e198 Mercure ssl 2026-01-17 22:56:34 +01:00
Frank 96c2e4ca61 Mercure cors error 3 2026-01-17 19:36:01 +01:00
Frank e5f959210a Mercure cors error 2 2026-01-17 19:27:01 +01:00
Frank e14cf8457b Mercure cors error 2026-01-17 19:03:25 +01:00
Frank 2c970fa9e7 nullable screen 2026-01-17 15:35:26 +01:00
Frank 714496fa77 Remote allowance 2026-01-17 15:12:08 +01:00
Frank 2b7e667bb3 captcha keys 2026-01-17 14:51:14 +01:00
Frank b8c1fecea2 executable 2026-01-17 14:24:54 +01:00
Frank 4f40c96ce5 restart via 1 script. 2026-01-17 14:22:08 +01:00
Frank 4545572b65 Verification mails solving try 1 2026-01-17 14:12:57 +01:00
Frank 1c27c093c7 Verification mails solving try 1 2026-01-17 13:47:56 +01:00
Frank 6d8d30e91a Added domain to verification mail 2026-01-16 21:01:01 +01:00
Frank 5c8a5f0bf5 Send variables to containers. 2026-01-14 14:00:11 +01:00
Frank 6b5c205a27 Request resend of verification mail 2026-01-14 13:09:32 +01:00
Frank 70f5aa785e captcha 2026-01-13 21:54:26 +01:00
Frank 6c96d45a04 Verifying mail addresses 2026-01-13 17:43:17 +01:00
Frank 8d4e08e4bc Mailer From 2026-01-11 23:10:30 +01:00
Frank 6fba1cbcf3 Try to fix 1 2026-01-11 15:46:46 +01:00
Frank 1512a3dde9 Revert compose files 2026-01-11 15:41:40 +01:00
Frank 5f4e2acd27 Niet weggooien van images 4 2026-01-11 15:38:33 +01:00
Frank 203dfaa13b Niet weggooien van images 3 2026-01-11 15:37:13 +01:00
Frank 799858d52c Niet weggooien van images 2 2026-01-11 15:35:10 +01:00
Frank ce79b77244 onbekende flag 5 2026-01-11 15:30:21 +01:00
Frank 5f17c9b89f onbekende flag 4 2026-01-11 15:28:40 +01:00
Frank 5335e62cfd onbekende flag 3 2026-01-11 15:26:34 +01:00
Frank 04b1ff6243 onbekende flag 2 2026-01-11 15:25:03 +01:00
Frank 84b7b1c64a onbekende flag 2026-01-11 15:21:19 +01:00
Frank b0af41c5d2 container en cache clear erin en image clear eruit 2026-01-10 17:21:59 +01:00
Frank a94b8cbef3 csrf error solve. try 5 2026-01-10 14:28:03 +01:00
Frank 3f33ec6fef csrf error solve. try 4 2026-01-10 14:19:57 +01:00
Frank ab80d4de83 csrf error solve. try 3 2026-01-10 14:06:29 +01:00
Frank b2817c5d8c csrf error solve. try 2 2026-01-10 13:37:14 +01:00
Frank c59d131b80 csrf error solve. try 1 2026-01-10 00:39:33 +01:00
Frank e8a6c9cc7a Validation fails 2026-01-10 00:25:57 +01:00
Frank e84f2c274e pass on token 2026-01-10 00:17:36 +01:00
Frank d9bc8c352f Restart containers 2026-01-09 23:40:25 +01:00
Frank ece3b05a9c Add error log 2026-01-09 23:36:50 +01:00
Frank 4cf614a98c Mercure en hostfile 2026-01-09 18:38:57 +01:00
Frank 24f51bf38d database volume 2026-01-09 16:53:47 +01:00
Frank 0acf60760f Fixed ips 2026-01-09 16:42:15 +01:00
Frank 342858fa0e rights to user 2026-01-09 16:10:44 +01:00
Frank 3c9bd13cc2 Meer updates. Next try 7 2026-01-09 15:47:44 +01:00
Frank eeda97cef8 Meer updates. Next try 6 2026-01-09 15:42:43 +01:00
Frank 5a6616484f Meer updates. Next try 5 2026-01-09 15:33:52 +01:00
Frank f0bcc9fe06 Meer updates. Next try 4 2026-01-09 15:25:41 +01:00
Frank 550cc1b2ed Meer updates. Next try 3 2026-01-09 15:18:25 +01:00
Frank b1910a63c3 Meer updates. Next try 2 2026-01-09 15:10:44 +01:00
Frank 60d52d7b5e Meer updates. Next try 2026-01-09 15:01:12 +01:00
Frank 0c7bbc2670 Meer updates. Hopelijk beter nu. 2026-01-09 14:51:31 +01:00
Frank 3e73cba942 Updated dockerfile om migrations uit te kunnen voeren 2026-01-09 14:41:59 +01:00
Frank 6027dcb56c Running containers 2026-01-09 14:30:05 +01:00
Frank a5a895b67f Settings from env files 2026-01-09 13:08:09 +01:00
Frank b063e17863 Remove .env.* files from tracking and update .gitignore 2026-01-09 12:13:31 +01:00
Frank 2008a379a8 Lost page 2026-01-08 20:32:21 +01:00
Frank 928ab3cbfe Added mercure to update when everyone is ready 2026-01-08 20:11:14 +01:00
Frank 4d021e7cf1 Trying to add waiting pages 2026-01-08 19:32:13 +01:00
Frank 30aa73bf53 Look into session logfiles 2026-01-08 18:26:32 +01:00
Frank 9d9de0fd0d Logfiles for sessions 2026-01-08 18:14:56 +01:00
Frank 2984a6acb2 Most of the cat command 2026-01-08 17:02:16 +01:00
Frank cdb469456f Dynamic number of players 2026-01-08 15:49:47 +01:00
Frank b6c09c267f Message when everyone is verified 2026-01-08 15:34:43 +01:00
Frank 5eff66c24d Post return messages 2026-01-08 11:41:46 +01:00
Frank cdd5bc3fd8 Verification done 2026-01-07 20:06:28 +01:00
Frank 173407cd26 ls 2026-01-07 17:45:17 +01:00
Frank 90e5fd904f Sudo, rm and setup for ls 2026-01-07 15:00:28 +01:00
Frank 225c14124a Hint for first part 2026-01-07 14:33:10 +01:00