From 2b692f2f5cb729e77dc57b924cf26bd50543777b Mon Sep 17 00:00:00 2001 From: forgejo-backport-action Date: Sun, 26 Apr 2026 16:00:57 +0200 Subject: [PATCH] [v15.0/forgejo] fix: allow viewing Actions run triggered by deleted user (#12272) **Backport:** https://codeberg.org/forgejo/forgejo/pulls/12271 Fixes #9371. Manually reproduced and tested by setting `action_run.triggering_user_id` to a non-existent user ID. Manually tested that runs can be cancelled in this state as well. ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. All work and communication must conform to Forgejo's [AI Agreement](https://codeberg.org/forgejo/governance/src/branch/main/AIAgreement.md). There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests for Go changes - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. - I ran... - [x] `make pr-go` before pushing ### Documentation - [ ] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [x] I did not document these changes and I do not expect someone else to do it. ### Release notes - [x] This change will be noticed by a Forgejo user or admin (feature, bug fix, performance, etc.). I suggest to include a release note for this change. - [ ] This change is not visible to a Forgejo user or admin (refactor, dependency upgrade, etc.). I think there is no need to add a release note for this change. Co-authored-by: Mathieu Fenniak Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12272 Reviewed-by: Mathieu Fenniak --- models/actions/run.go | 4 +++- models/actions/run_test.go | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/models/actions/run.go b/models/actions/run.go index a9c458c86d..5185eb28bd 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -153,7 +153,9 @@ func (run *ActionRun) LoadAttributes(ctx context.Context) error { if run.TriggerUser == nil { u, err := user_model.GetPossibleUserByID(ctx, run.TriggerUserID) - if err != nil { + if user_model.IsErrUserNotExist(err) { + u = user_model.NewGhostUser() + } else if err != nil { return err } run.TriggerUser = u diff --git a/models/actions/run_test.go b/models/actions/run_test.go index 9a5eb99537..f8b2c9fb2d 100644 --- a/models/actions/run_test.go +++ b/models/actions/run_test.go @@ -19,9 +19,6 @@ import ( "github.com/stretchr/testify/require" ) -func TestGetRunBefore(t *testing.T) { -} - func TestSetConcurrencyGroup(t *testing.T) { run := ActionRun{} run.SetConcurrencyGroup("abc123") @@ -686,3 +683,12 @@ jobs: assert.Zero(t, insertedJobs[1].TaskID) assert.Equal(t, StatusWaiting, insertedJobs[1].Status) } + +func TestActionRunLoadAttributes(t *testing.T) { + run := &ActionRun{ + RepoID: 10, + TriggerUserID: 1000, + } + require.NoError(t, run.LoadAttributes(t.Context())) + assert.Equal(t, "ghost", run.TriggerUser.LowerName) +}