diff options
author | Earl Warren <109468362+earl-warren@users.noreply.github.com> | 2023-11-05 13:48:32 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-05 13:48:32 +0100 |
commit | 59f9ef9feebb19337b8a153e6cac0371ca706268 (patch) | |
tree | 65ec7ec5581cee21a54caf19d125468c4b496169 /models | |
parent | da0c4b8d10cce85c854370ae3c399b542cb04306 (diff) | |
download | gitea-59f9ef9feebb19337b8a153e6cac0371ca706268.tar.gz gitea-59f9ef9feebb19337b8a153e6cac0371ca706268.zip |
Remove action runners on user deletion (#27902)
- On user deletion, delete action runners that the user has created.
- Add a database consistency check to remove action runners that have
nonexistent belonging owner.
- Resolves https://codeberg.org/forgejo/forgejo/issues/1720
(cherry picked from commit 009ca7223dab054f7f760b7ccae69e745eebfabb)
Co-authored-by: Gusted <postmaster@gusted.xyz>
Diffstat (limited to 'models')
-rw-r--r-- | models/actions/runner.go | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/models/actions/runner.go b/models/actions/runner.go index ec6b49cf16..2c092c2b4a 100644 --- a/models/actions/runner.go +++ b/models/actions/runner.go @@ -266,3 +266,27 @@ func CreateRunner(ctx context.Context, t *ActionRunner) error { _, err := db.GetEngine(ctx).Insert(t) return err } + +func CountRunnersWithoutBelongingOwner(ctx context.Context) (int64, error) { + // Only affect action runners were a owner ID is set, as actions runners + // could also be created on a repository. + return db.GetEngine(ctx).Table("action_runner"). + Join("LEFT", "user", "`action_runner`.owner_id = `user`.id"). + Where("`action_runner`.owner_id != ?", 0). + And(builder.IsNull{"`user`.id"}). + Count(new(ActionRunner)) +} + +func FixRunnersWithoutBelongingOwner(ctx context.Context) (int64, error) { + subQuery := builder.Select("`action_runner`.id"). + From("`action_runner`"). + Join("LEFT", "user", "`action_runner`.owner_id = `user`.id"). + Where(builder.Neq{"`action_runner`.owner_id": 0}). + And(builder.IsNull{"`user`.id"}) + b := builder.Delete(builder.In("id", subQuery)).From("`action_runner`") + res, err := db.GetEngine(ctx).Exec(b) + if err != nil { + return 0, err + } + return res.RowsAffected() +} |