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