mirror of
https://github.com/juanfont/headscale.git
synced 2026-02-24 08:34:52 +01:00
hscontrol/db: add migration to clear user_id on tagged nodes
Tagged nodes are owned by their tags, not a user. Previously user_id was kept as "created by" tracking, but this prevents deleting users whose nodes have all been tagged, and the ON DELETE CASCADE FK would destroy the tagged nodes. Add a migration that sets user_id = NULL on all existing tagged nodes. Subsequent commits enforce this invariant at write time. Updates #3077
This commit is contained in:
@@ -704,6 +704,29 @@ AND auth_key_id NOT IN (
|
||||
},
|
||||
Rollback: func(db *gorm.DB) error { return nil },
|
||||
},
|
||||
{
|
||||
// Clear user_id on tagged nodes.
|
||||
// Tagged nodes are owned by their tags, not a user.
|
||||
// Previously user_id was kept as "created by" tracking,
|
||||
// but this prevents deleting users whose nodes have been
|
||||
// tagged, and the ON DELETE CASCADE FK would destroy the
|
||||
// tagged nodes if the user were deleted.
|
||||
// Fixes: https://github.com/juanfont/headscale/issues/3077
|
||||
ID: "202602201200-clear-tagged-node-user-id",
|
||||
Migrate: func(tx *gorm.DB) error {
|
||||
err := tx.Exec(`
|
||||
UPDATE nodes
|
||||
SET user_id = NULL
|
||||
WHERE tags IS NOT NULL AND tags != '[]' AND tags != '';
|
||||
`).Error
|
||||
if err != nil {
|
||||
return fmt.Errorf("clearing user_id on tagged nodes: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
Rollback: func(db *gorm.DB) error { return nil },
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -79,6 +79,8 @@ CREATE TABLE nodes(
|
||||
ipv6 text,
|
||||
hostname text,
|
||||
given_name varchar(63),
|
||||
-- user_id is NULL for tagged nodes (owned by tags, not a user).
|
||||
-- Only set for user-owned nodes (no tags).
|
||||
user_id integer,
|
||||
register_method text,
|
||||
tags text,
|
||||
|
||||
Reference in New Issue
Block a user