mirror of
https://github.com/juanfont/headscale.git
synced 2026-04-23 09:08:44 +02: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 },
|
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,
|
ipv6 text,
|
||||||
hostname text,
|
hostname text,
|
||||||
given_name varchar(63),
|
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,
|
user_id integer,
|
||||||
register_method text,
|
register_method text,
|
||||||
tags text,
|
tags text,
|
||||||
|
|||||||
Reference in New Issue
Block a user