headscale/hscontrol/policy/v2
Kristoffer Dalby b29ae25356 policy/v2: evaluate the tests block on user-initiated writes
v2 silently dropped policy.tests, so a policy that contradicted its
own assertions still applied. Resolve src/dst via the existing Alias
machinery, walk the compiled global filter rules (acls and grants
both contribute), and run on every user-write boundary: SetPolicy,
the file watcher, and `headscale policy check`. A failing test
rejects the write before it mutates live state.

Boot-time reload skips evaluation; an already-stored policy that
references a deleted user shouldn't lock the server out.

`headscale policy check` is a thin frontend for the new CheckPolicy
gRPC method. The server-side handler builds a fresh PolicyManager
from the request bytes and the state's live users/nodes, runs
SetPolicy on the sandbox so the tests block executes, and returns
the result through gRPC status. No persistence, no policy_mode
coupling. --bypass-grpc-and-access-database-directly opens the DB
directly when the server is not running.

cmd/headscale/cli/root.go no longer special-cases `policy check` in
init() (the early return from PR #2580 broke --config registration
and viper priming for --bypass).

integration/cli_policy_test.go covers policy_mode={file,database} x
fixture={acl-only, acl+passing-tests, acl+failing-tests} x
bypass={false,true} = 12 rows.

Updates #1803

Co-authored-by: Janis Jansons <janhouse@gmail.com>
2026-05-12 11:54:54 +01:00
..
testdata testdata: drop unused uppercase SSH-*.hujson fixtures 2026-05-05 11:59:01 +01:00
compiled.go policy/v2: surface autogroup:internet via grants on exit nodes 2026-04-30 19:22:45 +01:00
filter.go policy: surface exit nodes via autogroup:internet (#3212) 2026-04-29 11:24:33 +01:00
filter_test.go policy/v2: surface autogroup:internet via grants on exit nodes 2026-04-30 19:22:45 +01:00
issue_3212_test.go policy: surface exit nodes via autogroup:internet (#3212) 2026-04-29 11:24:33 +01:00
issue_3233_test.go policy/v2: surface autogroup:internet via grants on exit nodes 2026-04-30 19:22:45 +01:00
main_test.go all: fix test flakiness and improve test infrastructure 2026-03-14 02:52:28 -07:00
policy.go policy/v2: evaluate the tests block on user-initiated writes 2026-05-12 11:54:54 +01:00
policy_test.go policy/matcher: include CapGrant.Dsts in match destinations 2026-05-11 14:55:06 +01:00
tailscale_acl_data_compat_test.go all: rephrase prose to fit codebase voice 2026-04-29 16:22:19 +01:00
tailscale_grants_compat_test.go all: rephrase prose to fit codebase voice 2026-04-29 16:22:19 +01:00
tailscale_routes_data_compat_test.go all: rephrase prose to fit codebase voice 2026-04-29 16:22:19 +01:00
tailscale_ssh_data_compat_test.go testdata: drop unused uppercase SSH-*.hujson fixtures 2026-05-05 11:59:01 +01:00
test.go policy/v2: evaluate the tests block on user-initiated writes 2026-05-12 11:54:54 +01:00
test_test.go policy/v2: evaluate the tests block on user-initiated writes 2026-05-12 11:54:54 +01:00
types.go policy/v2: evaluate the tests block on user-initiated writes 2026-05-12 11:54:54 +01:00
types_test.go policy/v2: fix empty grants/acls returning FilterAllowAll 2026-04-29 08:55:07 +01:00
utils.go policy/v2: exclude exit routes from ReduceFilterRules 2026-04-01 14:10:42 +01:00
utils_test.go policy/v2: exclude exit routes from ReduceFilterRules 2026-04-01 14:10:42 +01:00