docs: reflect the plugin-runner security tiers
- plugins: the Windows runner task runs as LocalService now, and public-registry names need --allow-public-registry - automation + SDK README: connect()'s zero-config credential is the scoped plugin token; pairing administration and hook registration need an explicit PUNKTFUNK_MGMT_TOKEN opt-in Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -157,6 +157,13 @@ The canonical "decide, don't just observe" pattern — approve pairing from your
|
|||||||
`POST /api/v1/native/pending/{id}/approve` when you tap yes. The full API is documented at
|
`POST /api/v1/native/pending/{id}/approve` when you tap yes. The full API is documented at
|
||||||
[`/api/docs`](/api) on your host.
|
[`/api/docs`](/api) on your host.
|
||||||
|
|
||||||
|
> A unit under the runner auto-connects with the host's **scoped plugin token**, which covers
|
||||||
|
> the everyday surface (status, library, sessions, events) but deliberately not **hook
|
||||||
|
> registration** or **pairing administration** — so a plugin defect can't admit new devices or
|
||||||
|
> install commands. A script that should administer pairing (like the approval pattern above)
|
||||||
|
> opts into the full-admin credential explicitly: set `PUNKTFUNK_MGMT_TOKEN` on the unit (e.g.
|
||||||
|
> a `systemctl --user edit punktfunk-scripting` drop-in) or pass `{ token }` to `connect()`.
|
||||||
|
|
||||||
## Recipe: full controller passthrough (VirtualHere)
|
## Recipe: full controller passthrough (VirtualHere)
|
||||||
|
|
||||||
To get a controller's *native* features on the host — DualSense gyro, touchpad, adaptive
|
To get a controller's *native* features on the host — DualSense gyro, touchpad, adaptive
|
||||||
|
|||||||
@@ -31,8 +31,9 @@ punktfunk-host plugins enable # turn the runner on (once)
|
|||||||
<Tab value="Windows">
|
<Tab value="Windows">
|
||||||
|
|
||||||
Run these from an **elevated** PowerShell — right-click **PowerShell** → **Run as administrator**.
|
Run these from an **elevated** PowerShell — right-click **PowerShell** → **Run as administrator**.
|
||||||
The plugins directory lives under `%ProgramData%\punktfunk`, which is admin-owned, and the runner
|
The plugins directory lives under `%ProgramData%\punktfunk`, which is admin-owned. The runner task
|
||||||
task runs as SYSTEM.
|
itself runs as the low-privilege `NT AUTHORITY\LocalService` account — `plugins enable` sets that
|
||||||
|
up (including read access to the runner's scoped API token).
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
punktfunk-host plugins add playnite # or: rom-manager
|
punktfunk-host plugins add playnite # or: rom-manager
|
||||||
@@ -62,11 +63,13 @@ The runner is **opt-in**: `plugins add` installs, `plugins enable` turns it on.
|
|||||||
| `punktfunk-host plugins disable` | Stop + disable the runner. |
|
| `punktfunk-host plugins disable` | Stop + disable the runner. |
|
||||||
| `punktfunk-host plugins status` | Is the runner enabled and running? |
|
| `punktfunk-host plugins status` | Is the runner enabled and running? |
|
||||||
|
|
||||||
A bare name resolves to the first-party package — `playnite` installs `@punktfunk/plugin-playnite`.
|
A bare name resolves to the first-party package — `playnite` installs `@punktfunk/plugin-playnite`,
|
||||||
A scoped (`@scope/pkg`) or `punktfunk-plugin-*` name is used verbatim, so third-party plugins work
|
always from Punktfunk's own package registry. Any other name (`punktfunk-plugin-*`, a foreign
|
||||||
the same way.
|
`@scope/pkg`) would install from the **public npm registry** and is refused unless you add
|
||||||
|
`--allow-public-registry` — a guard against typos and look-alike packages pulling untrusted code
|
||||||
|
onto your host.
|
||||||
|
|
||||||
> Plugins are operator-installed code that runs as the host user — they can launch games and run
|
> Plugins are operator-installed code with operator privileges — they can launch games and run
|
||||||
> commands. Install only plugins you trust, from a registry you control.
|
> commands. Install only plugins you trust, from a registry you control.
|
||||||
|
|
||||||
## ROM Manager
|
## ROM Manager
|
||||||
|
|||||||
+10
-4
@@ -106,7 +106,7 @@ Plus a real-world recipe:
|
|||||||
| What | Source |
|
| What | Source |
|
||||||
|---|---|
|
|---|---|
|
||||||
| URL | `{ url }` → `PUNKTFUNK_MGMT_URL` → `https://127.0.0.1:47990` |
|
| URL | `{ url }` → `PUNKTFUNK_MGMT_URL` → `https://127.0.0.1:47990` |
|
||||||
| Token | `{ token }` → `PUNKTFUNK_MGMT_TOKEN` → `<config_dir>/mgmt-token` |
|
| Token | `{ token }` → `PUNKTFUNK_MGMT_TOKEN` → `PUNKTFUNK_PLUGIN_TOKEN` → `<config_dir>/plugin-token` → `<config_dir>/mgmt-token` |
|
||||||
| TLS pin | `{ ca }` → `PUNKTFUNK_MGMT_CA` (path) → `<config_dir>/cert.pem` |
|
| TLS pin | `{ ca }` → `PUNKTFUNK_MGMT_CA` (path) → `<config_dir>/cert.pem` |
|
||||||
|
|
||||||
`<config_dir>` is `~/.config/punktfunk` (Linux/macOS) or `%ProgramData%\punktfunk` (Windows) —
|
`<config_dir>` is `~/.config/punktfunk` (Linux/macOS) or `%ProgramData%\punktfunk` (Windows) —
|
||||||
@@ -115,8 +115,13 @@ the host's self-signed identity cert (chain-verified; the hostname check is waiv
|
|||||||
is deliberately CN-only, native clients pin its fingerprint). Bun and Node are first-class;
|
is deliberately CN-only, native clients pin its fingerprint). Bun and Node are first-class;
|
||||||
other runtimes fall back to system trust (point your runtime's CA option at `cert.pem`).
|
other runtimes fall back to system trust (point your runtime's CA option at `cert.pem`).
|
||||||
|
|
||||||
The bearer token is the host's **admin** credential and is honored from loopback only — run
|
The zero-config default is the host's **scoped plugin token** (`plugin-token`): the everyday
|
||||||
scripts on the host box (or through an SSH tunnel).
|
surface — status, library, sessions, events, the plugin UI lease — but deliberately **not** hook
|
||||||
|
registration or pairing administration, so a plugin defect can't install commands or admit
|
||||||
|
devices. A script that needs the full admin surface opts in explicitly with
|
||||||
|
`PUNKTFUNK_MGMT_TOKEN` or `{ token }` (`mgmt-token` remains the fallback on hosts that predate
|
||||||
|
the plugin token). Both tokens are honored from loopback only — run scripts on the host box (or
|
||||||
|
through an SSH tunnel).
|
||||||
|
|
||||||
## Events
|
## Events
|
||||||
|
|
||||||
@@ -260,7 +265,8 @@ WantedBy=default.target
|
|||||||
|
|
||||||
Windows Task Scheduler: a task triggered *At log on* running
|
Windows Task Scheduler: a task triggered *At log on* running
|
||||||
`bun C:\Users\me\punktfunk-scripts\myscript.ts` (the SDK reads
|
`bun C:\Users\me\punktfunk-scripts\myscript.ts` (the SDK reads
|
||||||
`%ProgramData%\punktfunk\mgmt-token` — run the task as an account that can).
|
`%ProgramData%\punktfunk\plugin-token` — run the task as an account that can; the managed
|
||||||
|
runner's `plugins enable` grants its LocalService principal exactly that read).
|
||||||
|
|
||||||
## Compatibility
|
## Compatibility
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user