headscale/hscontrol/db
Kristoffer Dalby 75e56df9e4 hscontrol: enforce that tagged nodes never have user_id
Tagged nodes are owned by their tags, not a user. Enforce this
invariant at every write path:

- createAndSaveNewNode: do not set UserID for tagged PreAuthKey
  registration; clear UserID when advertise-tags are applied
  during OIDC/CLI registration
- SetNodeTags: clear UserID/User when tags are assigned
- processReauthTags: clear UserID/User when tags are applied
  during re-authentication
- validateNodeOwnership: reject tagged nodes with non-nil UserID
- NodeStore: skip nodesByUser indexing for tagged nodes since
  they have no owning user
- HandleNodeFromPreAuthKey: add fallback lookup for tagged PAK
  re-registration (tagged nodes indexed under UserID(0)); guard
  against nil User deref for tagged nodes in different-user check

Since tagged nodes now have user_id = NULL, ListNodesByUser
will not return them and DestroyUser naturally allows deleting
users whose nodes have all been tagged. The ON DELETE CASCADE
FK cannot reach tagged nodes through a NULL foreign key.

Also tone down shouty comments throughout state.go.

Fixes #3077
2026-02-20 21:51:00 +01:00
..
sqliteconfig all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
testdata/sqlite db: use PolicyManager for RequestTags migration 2026-01-21 15:10:29 +01:00
api_key.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
api_key_test.go grpc: support expire/delete API keys by ID 2026-01-20 17:13:38 +01:00
db.go hscontrol/db: add migration to clear user_id on tagged nodes 2026-02-20 21:51:00 +01:00
db_test.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
ephemeral_garbage_collector_test.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
ip.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
ip_test.go all: upgrade to Go 1.26rc2 and modernize codebase 2026-02-08 12:35:23 +01:00
node.go node: implement disable key expiry via CLI and API 2026-02-20 21:49:55 +01:00
node_test.go node: implement disable key expiry via CLI and API 2026-02-20 21:49:55 +01:00
policy.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
preauth_keys.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
preauth_keys_test.go all: upgrade to Go 1.26rc2 and modernize codebase 2026-02-08 12:35:23 +01:00
schema.sql hscontrol/db: add migration to clear user_id on tagged nodes 2026-02-20 21:51:00 +01:00
suite_test.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
text_serialiser.go all: fix golangci-lint issues (#3064) 2026-02-06 21:45:32 +01:00
user_update_test.go hscontrol: use Updates() instead of Save() for partial updates 2025-11-11 12:47:48 -06:00
users.go hscontrol: enforce that tagged nodes never have user_id 2026-02-20 21:51:00 +01:00
users_test.go all: apply golangci-lint 2.9.0 fixes 2026-02-19 08:21:23 +01:00
versioncheck.go db: fix database_versions table creation for PostgreSQL 2026-02-19 08:21:23 +01:00
versioncheck_test.go db: enforce strict version upgrade path 2026-02-19 08:21:23 +01:00