Commit Graph
4851 Commits
Author SHA1 Message Date
Kristoffer Dalby 3b170f04f1 hscontrol: check API replay outcomes apart from status
A listed status hid a call flipping between allowed and refused, and
validate refusals SaaS answers with 200 went unchecked.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 1525c185ac servertest: recapture v2 OAuth and policy API golden data
Tag writes are read back once the tags hold, and both files carry a
baseline snapshot. Statuses and read-backs match the first capture.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby da312948d9 servertest, policy/v2: replay tag owner chain joins through registration
A key login never asks the policy about requested tags, so the joins are
checked where headscale decides them. OAuth mints stay at
TagOwnedByTags.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 90125c8a23 servertest: recapture re-authentication golden data
The probe now stops a refused login's retries; the replay disconnects
there too. Outcomes match the first capture, and user IDs are labels.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 7cdecd4e78 servertest: fail on skip entries no lifecycle replay reads
Consumers check entries under their own capture only, so a bare or
misspelled key never went stale.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby f49add10bb servertest: check route continuity in every streamed step
Removal and route drops were judged only on steps SaaS sent frames for;
silent steps and a clear-then-restore within a step went unchecked.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby a391107369 servertest: fail step checks that never hold
A match on the last sample before the deadline no longer passes.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 6e303d0027 servertest: keep the address family in filter comparisons
A rule missing one family of a peer's addresses compared equal.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 6c6648b4e5 servertest: check peer visibility, routes and addresses apart
A listed difference in one no longer hides the others; the exit route
entries now key the AllowedIPs check alone.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 755346921b policy/v2: name the destination in sshTests failure breakdowns
A failure reported against the wrong dst alias no longer passes.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 4348f6b545 servertest: check peers and filters apart after a via source loss
The user node's filter already matches SaaS and is now asserted.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 26dbc55750 policy/v2: check the SSH login 0 mapping apart from the rules
Its skip entries no longer hide rule count, order or principals.
2026-10-30 14:55:35 +00:00
Kristoffer Dalby 629eb158a3 policy/v2: add grant port list refusal capture
Grant and ACL refusals share one check-keyed refused/message check.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 8d01364b00 prek: exempt grant captures from the large file check
They keep a netmap per node and stay as recorded.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 4912ec1231 servertest, state: add map delivery golden data
A retag through the API, a running peer's DERP, disco, hostname and
port, down and up gaps around policy pushes; peers, filters and frames
per node.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 58982b8d8c servertest: add via HA failover golden data
One route on a non-via router and a via pair through crashes and
returns, the via group down, expiry, approval loss, withdraw,
re-advertise and delete; route owner and peers per viewer per step.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 0b9f8cb6c0 servertest: join replayed routers with their routes
A route update sent after the join could be overtaken by the stream's
first request and dropped; the probe joined with the routes set.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby c5d037b347 servertest, hscontrol: add ephemeral, expiry, pending login golden data
Ephemeral devices through logout, deletes, re-auth and collection;
expired routers and nodes, a client's own expiry and logout; a login
waiting across restarts, replayed exchange by exchange.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 7f82bab0ef servertest: add login flag, endpoint, disco rotation and expiry helpers
WithLoginFlags and WithEndpoints shape what a client sends; RotateDisco
logs in again on a new disco key and leaves an auth URL waiting;
SetExpirySooner asks for an earlier key expiry.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 4501c49d16 hscontrol, servertest: add v2 OAuth and policy API golden data
OAuth clients, tokens, keys and tag writes by principal, and policy
writes over a baseline, replayed through v1 and v2; a deleted parent
client's key joins real clients.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby f60eff1bd8 policy/v2, servertest: add via port captures
A port-limited ACL entry beside a via grant, and a via tag with no
advertiser. Via HA replays now compare router filters by address.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 7461d04e07 policy/v2, servertest: add multi-route router captures
A seven-route router and an exit node under six policies; replayed
through policy, peer map and map stream. Peer map now checked against
SaaS peers.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 3c99f6bade policy/v2, mapper: add nextdns attr captures
SaaS accepts malformed nextdns profiles and keeps them in the CapMap;
its resolver skips them. DoH addresses compare per node: path, query,
ID.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby c72da1f20d policy/v2: add user token captures
SaaS answers for unknown users, a short name and a bare "@" at every
site. Each capture also runs under headscale-only user rows, at boot and
runtime; SaaS nodes must not change and overlay nodes get nothing.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 7768867738 policy/v2, servertest: add via source loss captures
Repeated via destinations, a user via source, and an empty one.
A rename that empties the via source must reach open streams as v67.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 7249bcef71 policy/v2, servertest: add validation matrix and grant shape captures
SaaS answers for sshTests sources, tests semantics, failure reports,
duplicate destinations, empty and allow-all policies, and refusals.
ACL and SSH compat checks are keyed per check; differences listed.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby c1e34fd113 policy/v2: recapture tester rows with failure detail
Re-runs keep SaaS's error data and validate answer. Tester compat checks
verdict, message, failure breakdown and node labels.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby c5613b18b7 servertest: check refused policies leave the live policy unchanged
Posts every policy SaaS refused through v2; filter, SSH, body and ETag
must stay as before. Policies headscale accepts are skip entries.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 9f853f0616 policy/v2: build tester nodes from the capture topology
The fixed node list had other addresses than the captures, so address
and range tests ran against nodes SaaS never saw.
2026-10-30 14:55:34 +00:00
Kristoffer Dalby 8393b1ff44 policy/v2: compare compat captures through the policy manager
ACL, grant and SSH captures now also check FilterForNode and SSHPolicy,
which add the global merge and caches the per-node compile skips.
2026-10-30 14:55:34 +00:00
github-actions[bot] 4472cd8b83 Update VOUCHED list
https://github.com/juanfont/headscale/issues/3629#issuecomment-6525293776
2026-10-30 15:35:25 +01:00
Kristoffer Dalby 526daf0841 policy/v2: resolve an ACL's sources once, not once per destination
An ACL compiles to one grant per destination, and each resolved and
merged the same sources again. A wide CI-style ACL took 3s and 674MB
per compile; 88ms and 23MB now.
2026-10-30 14:36:19 +01:00
Kristoffer Dalby 8e45958341 CHANGELOG: align the 0.29.x sections with the releases
0.29.7 now matches what ships; 0.30.0 drops entries 0.29.7 already
released. #3398 never shipped in 0.29.3, #3236 missed 0.29.0.
2026-10-30 10:35:22 +01:00
Kristoffer Dalby 545ace5673 hscontrol: remove unused OIDC user change result 2026-10-29 20:51:50 +01:00
Kristoffer Dalby c0925962c2 hscontrol: bound pending authentication without evicting sessions 2026-10-29 20:51:50 +01:00
Kristoffer Dalby a9508935b9 CHANGELOG: document SSH acceptEnv fix
Updates #3559
2026-10-29 20:51:36 +01:00
Kristoffer Dalby 52842f4c0d integration: guard SSH acceptEnv forwarding
Updates #3559
2026-10-29 20:51:36 +01:00
arkie 8cf43952af types: emit SSH environment capability by default
Fixes #3559
2026-10-29 20:51:36 +01:00
Kristoffer Dalby beb1214926 release: reject dirty sources and build artifacts
Fixes #3583
2026-10-29 15:39:30 +01:00
Kristoffer Dalby c285eff776 CHANGELOG: list the oss-scanner findings for 0.29.7
Move the #3603 entries to 0.29.7 and link the pull request.
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 729464091e testcapture: refuse golden captures that name no tool commit
It walks every testdata folder, so a new folder is covered too. Captures
taken since tscap refuses such builds are listed until taken again.
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 208043c88d oidc: keep email_verified with the address it came with
Fixes ANT-2026-MX8FKG4K
2026-10-29 14:00:02 +01:00
Kristoffer Dalby b5bebf9b32 db, state: let only the delete that removed a node free its addresses
Fixes ANT-2026-NWTIBB02
2026-10-29 14:00:02 +01:00
Kristoffer Dalby c9e9f72857 state: drop registration locks once unused
The lock is taken before any credential check, so client-chosen machine
keys grew the map forever. Ref-count entries; delete at zero.

Fixes ANT-2026-ZC18AF82
2026-10-29 14:00:02 +01:00
Kristoffer Dalby b833be283c types, auth, noise: let one request wait on each auth session
One verdict per session, so one waiter: the newest. A displaced one
returns at once (register error, SSH re-delegate), not at session end.
A waiter keeps only the follow-up URL and the cached registration.

Fixes ANT-2026-NM50ZP4N
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 7892a8462c auth: check the follow-up's machine key before it waits
A session has one verdict; another machine holding the URL could take
it.

Fixes ANT-2026-NM50ZP4N
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 28959cb27c noise: time out stalled bodies and idle tunnels
The hijack drops the outer server's deadlines; any machine key gets a
tunnel.

Fixes ANT-2026-K903ZEUA
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 5a4d366ce1 auth, state: keep only hostname, OS and tags in pending registrations
The rest arrives with the first MapRequest. A relogin keeps the node's
current Hostinfo, endpoints and disco key; an oversized merge is a 400.

Fixes ANT-2026-RQS7JAPP
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 4ce928411e state: bound client reports of nodes loaded at startup
Rows stored before the bounds are trimmed the same way at load; a
Hostinfo still over budget is dropped until the node reports again.

Fixes ANT-2026-RQS7JAPP
Fixes ANT-2026-5B6KE87K
Fixes ANT-2026-KFCFFM34
2026-10-29 14:00:02 +01:00
Kristoffer Dalby 2e563635d0 types, noise: bound the Hostinfo and endpoints a client reports
Keep the first 256 endpoints and 4096 routes; refuse longer hostnames,
too many tags, zoned endpoints and >64 KiB NetInfo or other Hostinfo.
The body limit counted wire bytes, not what NodeStore and peers keep.

Fixes ANT-2026-RQS7JAPP
Fixes ANT-2026-5B6KE87K
Fixes ANT-2026-KFCFFM34
2026-10-29 14:00:02 +01:00