- Panel over HTTPS on the game port (TLS handshake detected like HTTP); self-signed
certificate in data/panel_cert.pfx (fingerprint in the log) or an own PFX
(PanelCertificatePath); remote HTTP is redirected to HTTPS (not locally / behind
a proxy); cookie Secure over HTTPS; PanelHttps=false turns it off
- Panel login: also locked per user name (16 failures / 15 min), failure lists
bounded, user names in the log without control characters
- panel_users.json, panel_sessions.json, server.json, certificate: owner-only on Linux
- Players: names/chat without control or direction characters (no fake log lines),
no '<' '>' in names; '* ' system-style chat, msco.* messages (time/weather) and
MSCO_INSTALL only from admins; NaN/absurd money changes dropped (could break the
shared money for good)
- Extra headers: Permissions-Policy, Cross-Origin-Opener-Policy
- 11 new tests (165 pass)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mods -> MSCO mod list: search the approved mods from msco.mbm.wtf/mods and add or
update one with a click. The server lists and downloads only from the official
keymaster (never from a URL in the answer), checks the SHA-256 and stores it in
data/mods like an uploaded mod. Admins only. 6 new tests (154 pass).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ModStore: mods in data/mods (id, name, version, SHA-256), console "mods [reload]"
- ModList is sent before Welcome, files on request in 60 KB parts (once per connection)
- ModMessage relayed between players (max 64 KB)
- Heartbeat reports the mods to the keymaster (automatic "modded" tag)
- Web panel page "Mods": upload, remove, reload (DE/EN)
- Tests for list, download, checksum, relay and limits
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The restart used to refuse when the panel was disabled, so it stayed
reachable. Now it stops the panel (also the relay on the game port);
'panel on|off' in the console turns it on/off and saves server.json.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
World & Backups -> Start new game (console: new-game, also when stopped):
the save is backed up and replaced by a new-game marker (also as reset
point). Joining players are told to start a new game; the server pulls the
first player's save and from then on runs normally. Reset world returns to
a new game when the reset point is one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Updater checks git.mbm.wtf every 6 h (and on demand) for a newer <Version>
on main, shows the new commits and the required mod version
- Install: download the source, build it with dotnet publish into
data/app/current, warn players and restart (exit code 75 for Docker/systemd,
self-relaunch on Windows). At startup a newer installed update is loaded in
its own AssemblyLoadContext; after 3 failed starts the built-in version runs
- Panel: Update page, sidebar badge, full-screen progress overlay (download,
build, install, restart) that survives the restart and reloads the panel
- Panel sessions survive restarts (hashed tokens in data/panel_sessions.json)
- Docker image is based on the .NET SDK so it can build updates
- Version 2.9.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>