confine the prefix again after wine boots, and fix two manifest package names

Two things the live install found.

The manifest was refused at discovery. `apt: 'wine wine32:i386'` is two
packages and an architecture suffix, and a package name may be neither — nor
should it be, since `dpkg --add-architecture i386` has to happen first and no
package name can express that. And Fedora's Xvfb package is
`xorg-x11-server-Xvfb`, with a capital X, which a manifest package name may not
have; the dnf entry is dropped rather than guessed, which turns into an
instruction to the owner instead of a wrong install.

More importantly: confining the prefix before wine starts is a confinement wine
can undo. Observed directly — after a run, every com* link had come back with a
fresh timestamp, because wine rebuilds dosdevices when it boots a prefix it
thinks needs updating, and a wine package upgrade is enough to make it think
so. Z: did not come back that time, but "the dangerous one happened not to
regenerate" is not a property to rely on. confineAndVerify now runs again once
the game is up and says so if Z: returned.

Verified on the live server: Z: and the three home symlinks are gone from a
prefix that had them, run/ is mode 700, nothing listens on 5907, and the RFB
handshake arrives through the platform relay with a valid owner token and
through nothing else.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
2026-08-23 17:52:02 +00:00
co-authored by Claude Opus 5
parent f3cc1242c4
commit b88cacecac
3 changed files with 42 additions and 7 deletions
+9 -2
View File
@@ -88,13 +88,20 @@ export const manifest: PluginManifest = {
{
binary: 'wine',
reason: 'Runs the game. Minesweeper X is a 32-bit Windows executable, so this host also needs i386 multiarch (`dpkg --add-architecture i386`) and the 32-bit wine package — a 64-bit-only wine cannot load it.',
packages: { apt: 'wine wine32:i386', dnf: 'wine', pacman: 'wine', brew: 'wine-stable' },
// `apt: 'wine'` alone, deliberately. The 32-bit half is `wine32:i386`, and a package name may not
// carry an architecture suffix or a second package — nor should it, since `dpkg --add-architecture
// i386` has to happen first and no package name can express that. The `reason` above carries the
// whole command, which is what the owner is shown when this is missing.
packages: { apt: 'wine', dnf: 'wine', pacman: 'wine', brew: 'wine-stable' },
scope: 'owner',
},
{
binary: 'Xvfb',
reason: 'The virtual display the game draws on. A framebuffer with no hardware behind it, so nothing appears on any real monitor.',
packages: { apt: 'xvfb', dnf: 'xorg-x11-server-Xvfb', pacman: 'xorg-server-xvfb' },
// No `dnf` entry, and not by omission. Fedora's package is `xorg-x11-server-Xvfb` — capital X —
// and a manifest package name must be lowercase. Left out means "cannot be installed automatically
// here", which turns into an instruction to the owner rather than a wrong guess.
packages: { apt: 'xvfb', pacman: 'xorg-server-xvfb' },
scope: 'owner',
},
{