Commit Graph

4122 Commits

Author SHA1 Message Date
rcourtman 7f80f29db7 Bound Patrol evaluator finding writes 2026-08-14 18:51:05 +01:00
rcourtman 67bbed4c40 Keep Patrol continuations stateless 2026-08-14 17:58:15 +01:00
rcourtman d435b4c0c6 Bound Patrol follow-up execution 2026-08-14 17:31:06 +01:00
rcourtman 34b77e53b4 Remove overlapping Patrol finding tool 2026-08-14 16:43:25 +01:00
rcourtman f39e7d1d0f Preserve scoped Patrol finding decisions 2026-08-14 16:28:58 +01:00
rcourtman 91281a299e Add second reviewed Patrol model route 2026-08-14 16:10:21 +01:00
rcourtman bb34eec409 Recognize reviewed OpenRouter free route pricing 2026-08-14 16:04:53 +01:00
rcourtman daccf6c4d7 Fold the action ledger into Patrol navigation 2026-08-14 13:08:12 +01:00
rcourtman 48fac73ff0 Rework Patrol around outcome-driven autonomous operations 2026-08-14 12:52:51 +01:00
rcourtman 772ff3087d Rework Patrol around outcomes and quiet autonomy 2026-08-14 09:45:30 +01:00
rcourtman 2373ace026 Complete Patrol retained objective loop 2026-08-14 03:11:10 +01:00
rcourtman 6f09bc4676 Run Patrol against canonical availability signals 2026-08-14 01:56:18 +01:00
rcourtman 00e570b188 Preserve Patrol objective intent through remediation 2026-08-14 01:41:46 +01:00
rcourtman e31fc37983 Gate Patrol actions on agent preflight 2026-08-14 01:12:49 +01:00
rcourtman ff15c91274 Run validated local Patrol observers 2026-08-14 00:45:22 +01:00
rcourtman 71a0fa37a1 Add model-authored Patrol observer proposals 2026-08-14 00:24:52 +01:00
rcourtman ff2bfbb320 Make platform telemetry presentation evidence-aware 2026-08-14 00:18:23 +01:00
rcourtman 903b579f8a Add durable Patrol objectives 2026-08-13 23:59:33 +01:00
rcourtman a7646e5f86 Fix Patrol autonomy and refusal reporting 2026-08-13 23:26:08 +01:00
rcourtman d27abf6fda Fix vSphere backup status presentation 2026-08-13 23:22:30 +01:00
rcourtman 14a3b8b5af Fix thermal history for agent machines 2026-08-13 22:58:29 +01:00
rcourtman 929c03b490 Prepare v6.2.2-rc.2 release 2026-08-13 10:54:36 +01:00
rcourtman 3355f7a671 Read host Docker credentials for private registry update checks
Container update detection only ever negotiated anonymous pull tokens, so
containers from registries that reject anonymous digest HEADs pinned a
permanent "authentication required" badge (#1706). The agent already runs
on the Docker host, so the checker now resolves the same credential store
docker pull uses - config.json auths entries, credsStore/credHelpers
credential helpers (docker-credential-<name> get), and Podman's auth.json -
and presents the stored login: Basic auth on Bearer token negotiation and
on the hardcoded Docker Hub / ghcr.io token endpoints, direct answers to
Basic challenges, and the refresh-token grant for identity-token logins
such as Azure ACR.

Credentials never leave the host: they are only presented to the registry
or its token endpoint, helper output stays out of reported check errors,
and lookups are cached in memory for five minutes. Helper names are
validated before exec, and a stale login falls back to the anonymous path
so checks that used to work keep working. Set
PULSE_DISABLE_REGISTRY_CREDENTIALS=true (--disable-registry-credentials)
to keep detection anonymous-only. The agent-lifecycle and security-privacy
subsystem contracts pin the host-local credential boundary.
2026-08-13 10:06:26 +01:00
rcourtman faf13973c4 Keep release race builds off WSL tmpfs 2026-08-12 17:56:11 +01:00
rcourtman 647f3e6a6c Keep shipped upgrade guide in release sync 2026-08-12 17:43:09 +01:00
rcourtman 2c48696ad7 Prepare v6.2.2-rc.1 release 2026-08-12 17:22:10 +01:00
rcourtman 31b626d73c Fix release worker Go toolchain parity check 2026-08-12 17:11:04 +01:00
rcourtman 1bb9ba4208 Accelerate release qualification with exact-SHA worker 2026-08-12 17:07:12 +01:00
rcourtman 4eb156661e Document the 5.x proxy-auth mitigation and its end-of-life status
The 5.x line is end-of-life and will not be patched for the proxy-auth admin
gating defect, so the docs have to carry its mitigation: a 5.x operator has
nowhere else to look, and the security advisory is a moment in time while this
page is where they actually land.

5.x needs two changes, and either alone leaves admin open. It never applies the
documented "admin" default, so PROXY_AUTH_ADMIN_ROLE must be set explicitly.
It also only evaluates roles when the header carries a value — absent or empty
leaves isAdmin at its true default — so the proxy has to send a placeholder for
users with no groups, which is exactly the case an IdP tends to produce for the
least privileged account. 6.x fixes both: gating activates on the role header
alone, and a blank header resolves to non-admin.

Includes the negative test both ways round, since "it returns 200" is the only
symptom an operator can actually observe.
2026-08-12 10:21:46 +01:00
rcourtman abf5e45b70 Clarify proxy-auth upgrade requirements 2026-08-12 09:51:29 +01:00
rcourtman fbc584554c Add v6.2.2 proxy-auth release note 2026-08-12 09:48:19 +01:00
rcourtman 46f11fffc4 Document the proxy auth header trust boundary
The proxy auth docs never told operators that the identity and role headers
must be replaced rather than appended, nor that Pulse has to be unreachable
except through the proxy. Both are prerequisites for the scheme being safe at
all, and neither is enforceable from inside Pulse.

The append case is the sharp edge: Pulse reads the first value of a repeated
header, so a client-supplied role header that arrives ahead of the proxy's
value decides the admin verdict. The client does not need the shared secret to
do it, because the proxy attaches the secret itself. Verified against a scratch
instance: sending "X-Proxy-Roles: user" then "admin" yields 403 while "admin"
then "user" yields 200 on /api/system/settings.

Documented rather than fixed in code on purpose. Matching any value instead of
the first would make injection strictly easier, and rejecting repeated headers
outright would break identity providers that legitimately emit one header per
group. The trust boundary is the proxy's to hold.
2026-08-12 09:47:55 +01:00
rcourtman 0c3f475dea Warn when proxy role gating falls back to the default admin role
Configuring PROXY_AUTH_ROLE_HEADER without PROXY_AUTH_ADMIN_ROLE now gates
admin access on an exact-case match against the "admin" default. That closes
the fail-open, but it also means an IdP sending "Admins", "Admin", or
"authentik Admins" grants nobody admin — and a proxy-auth-only deployment has
no local credential to fall back on. The change is recoverable by setting
PROXY_AUTH_ADMIN_ROLE and restarting, but only if the operator can tell that
is what happened.

Log a startup warning naming the header, the effective admin role, the
case-sensitivity, and both ways out. The warning is scoped to deployments
that actually configured a role header; defaulting the value with no role
header is inert and stays at info. The troubleshooting entry in
docs/PROXY_AUTH.md now leads with the exact-match rule, since that is where
a locked-out operator looks first.
2026-08-12 09:43:52 +01:00
rcourtman 11a8aa3b2f Fail closed when proxy auth configures a role header but no admin role
A reverse-proxy deployment that set PROXY_AUTH_ROLE_HEADER without also
setting PROXY_AUTH_ADMIN_ROLE granted every proxy-authenticated user full
administrator access. CheckProxyAuth only evaluated roles when both values
were non-empty, so the half-configuration skipped role gating entirely and
returned isAdmin=true. docs/PROXY_AUTH.md has always documented an `admin`
default for that variable, but the Config struct's envconfig `default` tags
are legacy and never applied (config.go), so nothing ever populated it.

CheckProxyAuth is the single admin verdict all 20+ proxy-auth gates consume,
so the fail-open reached every one of them. Verified on a scratch instance
with PROXY_AUTH_ROLE_HEADER set and no admin role: a request carrying only
`X-Proxy-Roles: user` received HTTP 200 and the full admin payload from
GET /api/system/settings, HTTP 200 from POST /api/system/settings/update,
and proxyAuthIsAdmin=true from /api/security/status. All three now return
403 / false, while `X-Proxy-Roles: admin` still passes.

Resolve the documented default in both layers that can produce the verdict:
config load populates ProxyAuthAdminRole when proxy auth is configured, and
CheckProxyAuth now keys role gating on the role header alone, resolving an
empty admin role through config.DefaultProxyAuthAdminRole. Configuring a
role header is the operator's signal that admin access is role-gated;
leaving the admin role unset must not switch that off.

Deployments that intentionally treat every proxied user as an admin are
unaffected: that is still expressed by leaving the role header unset.
2026-08-12 09:38:02 +01:00
rcourtman 34194e57be Show the real monitoring cadence to non-admin sessions
Non-admin sessions cannot read GET /api/system/settings, so the Settings
General Monitoring Cadence card fell back to the Realtime (10s) preset
regardless of the configured interval; an issue #1601 reporter read that
as the server polling faster for non-admins. Publish the effective
pvePollingInterval on the authenticated runtime-display projection
(runtime config first, persisted value only as fallback, matching the
admin route's precedence), consume it in the viewer fallback of the
settings state, and run that initialization for sessions without
infrastructureRead too, whose ungated General panel previously never
initialized presentation state at all.
2026-08-12 09:20:01 +01:00
rcourtman 3adeb77d60 Secure configuration transfer authorization (#1714)
Co-authored-by: Pulse Autonomous Maintainer <rcourtman@users.noreply.github.com>
2026-08-12 07:32:50 +01:00
rcourtman 359a372cdf Make per-guest backup/snapshot toggles inherit global thresholds
The per-guest Backup/Snapshot toggle persisted a full copy of the current
global defaults just to flip enabled, freezing the threshold values into
the override. Later global edits (a 32-day backup warning) then silently
never applied to toggled guests, which kept firing at the frozen factory
7-day warning. Reported twice in discussion #1126.

- Guest overrides now resolve against the globals at evaluation time:
  zero-valued fields inherit the global value, explicit values still win,
  and hand-written sparse overrides stop decoding as accidental zeros.
- The toggles write enabled-only overrides instead of freezing a copy.
- Normalization rewrites stored overrides whose thresholds exactly match
  the current globals into sparse form, which is behavior-preserving at
  migration time and un-freezes existing installs.
- The Backups/Snapshots global editors reconcile warning/critical pairs
  by adjusting the untouched field, so typing a 32-day warning no longer
  silently snaps back to the 14-day critical default.

Refs #1126
2026-08-12 06:38:25 +01:00
Pulse Autonomous Maintainer 1dcb414167 Harden audit signatures against boundary forgery 2026-08-12 05:05:11 +01:00
rcourtman a1b5f085b3 docs: update remote builder hostname 2026-08-12 00:38:21 +01:00
rcourtman 63f1a14f31 Show LXC mount points from container config on the API path again
Stock Proxmox reports no per-mount LXC usage through the status API, so
v6's API-polled containers listed only rootfs. The v5.1.32 fallback that
synthesized mount rows from the container config never crossed to the v6
line, and the v6.2.0 pct-df agent path only covers nodes running the
unified agent. Restore the fallback and improve it: parse size= so
config-only rows carry capacity, mark live usage unknown with the -1
sentinel, and merge without displacing the aggregate-seeded rootfs row.

Frontend consumers stop fabricating percents for sentinel rows: the
workloads row bar and summary math exclude them (tooltip lists them with
capacity), the drawer Filesystems block renders ?/<size> with no percent,
disk normalization preserves the sentinel, and per-machine max-disk
derivations skip them. Mock mode seeds one running container in this
exact shape so the surfaces stay exercised.

Related to #1477
2026-08-11 20:46:11 +01:00
Pulse Autonomous Maintainer 986a281006 Reflect global settings for non-admin viewers 2026-08-11 19:57:47 +01:00
rcourtman 56262c6368 Fix provider MSP evaluation setup flow 2026-08-11 16:51:15 +01:00
courtmanr@gmail.com c76f07e5ec docs(agents): add customer support communication guidance 2026-08-11 16:39:36 +01:00
courtmanr@gmail.com 1b0cf176bd Explain retained alert delivery notices 2026-08-11 16:39:36 +01:00
courtmanr@gmail.com a49e016246 Hide duplicate PBS profile identities 2026-08-11 16:38:46 +01:00
courtmanr@gmail.com 66d8e90c0c Show Patrol findings in alert emails 2026-08-11 16:38:21 +01:00
courtmanr@gmail.com 16f9dbc709 Add push preferences to relay connect frames 2026-08-11 16:38:21 +01:00
courtmanr@gmail.com e21a3c4434 Classify normal WebSocket shutdowns as informational 2026-08-11 16:38:21 +01:00
courtmanr@gmail.com b3fdab4cae Persist first-run auth for systemd installs 2026-08-11 16:38:21 +01:00
courtmanr@gmail.com 1d0a0b7f7e Allow existing API tokens to be renamed 2026-08-11 16:38:21 +01:00