Compare commits

...
1 Commits
Author SHA1 Message Date
mathiasandClaude Sonnet 5 43714047be fix(auth): owner allowlist trusts pass-through-authenticated callers (#59)
CD / Lint / Test / Vet (push) Successful in 9s
CD / Build & Import (push) Successful in 25s
CD / Deploy via GitOps (push) Has been skipped
Allowlist.Check now takes ctx: when the caller authenticated with
their own Gitea PAT (pass-through, v0.12.0), it skips the static
GITEA_MCP_ALLOWED_OWNERS check entirely — Gitea's own permission
model already gates that caller's access more precisely than a coarse
owner-name list can. The static list still applies unchanged for the
shared static-token/JWT path, where it's the only defense against the
service token's blast radius.

Mechanical: every tool call site already had ctx in scope, so this is
a signature-only change at 41 call sites, no other tool behavior
changes. Closes the "Deferred" item from #59.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 08:31:43 +02:00
43 changed files with 80 additions and 48 deletions
+14 -2
View File
@@ -1,6 +1,11 @@
package allowlist package allowlist
import "fmt" import (
"context"
"fmt"
"git.d-ma.be/mathias/gitea-mcp/internal/gitea"
)
type Allowlist struct { type Allowlist struct {
owners map[string]struct{} owners map[string]struct{}
@@ -14,10 +19,17 @@ func New(owners []string) *Allowlist {
return &Allowlist{owners: m} return &Allowlist{owners: m}
} }
func (a *Allowlist) Check(owner string) error { // Check gates owner access to the static list — except for a caller
// authenticated with their own Gitea PAT (pass-through, gitea-mcp#59), whose
// access Gitea's own permission model already gates more precisely than a
// coarse owner name list ever could.
func (a *Allowlist) Check(ctx context.Context, owner string) error {
if owner == "" { if owner == "" {
return fmt.Errorf("owner required") return fmt.Errorf("owner required")
} }
if _, ok := gitea.TokenFromContext(ctx); ok {
return nil
}
if _, ok := a.owners[owner]; !ok { if _, ok := a.owners[owner]; !ok {
return fmt.Errorf("owner %q not in allowlist", owner) return fmt.Errorf("owner %q not in allowlist", owner)
} }
+24 -4
View File
@@ -1,16 +1,36 @@
package allowlist_test package allowlist_test
import ( import (
"context"
"testing" "testing"
"git.d-ma.be/mathias/gitea-mcp/internal/allowlist" "git.d-ma.be/mathias/gitea-mcp/internal/allowlist"
"git.d-ma.be/mathias/gitea-mcp/internal/gitea"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestAllowlistCheck(t *testing.T) { func TestAllowlistCheck(t *testing.T) {
a := allowlist.New([]string{"mathias", "acme"}) a := allowlist.New([]string{"mathias", "acme"})
assert.NoError(t, a.Check("mathias")) ctx := context.Background()
assert.NoError(t, a.Check("acme")) assert.NoError(t, a.Check(ctx, "mathias"))
assert.Error(t, a.Check("evil")) assert.NoError(t, a.Check(ctx, "acme"))
assert.Error(t, a.Check("")) assert.Error(t, a.Check(ctx, "evil"))
assert.Error(t, a.Check(ctx, ""))
}
// A caller authenticated with their own Gitea PAT (pass-through, gitea-mcp#59)
// is gated by Gitea's own permission model, not the MCP's static owner list —
// otherwise a legitimate second user could never touch their own repos.
func TestAllowlistCheckTrustsPassthroughAuthenticatedCaller(t *testing.T) {
a := allowlist.New([]string{"mathias"})
ctx := gitea.WithToken(context.Background(), "someone-elses-pat")
assert.NoError(t, a.Check(ctx, "someone-else"))
}
// Empty owner is a structural input error, not an authz question — still
// rejected even on the pass-through path.
func TestAllowlistCheckStillRejectsEmptyOwnerOnPassthrough(t *testing.T) {
a := allowlist.New([]string{"mathias"})
ctx := gitea.WithToken(context.Background(), "someone-elses-pat")
assert.Error(t, a.Check(ctx, ""))
} }
+1 -1
View File
@@ -46,7 +46,7 @@ func (t *BranchDelete) Call(ctx context.Context, raw json.RawMessage) (json.RawM
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Branch == "" { if args.Branch == "" {
+1 -1
View File
@@ -47,7 +47,7 @@ func (t *BranchList) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *BranchProtectionGet) Call(ctx context.Context, raw json.RawMessage) (js
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -70,7 +70,7 @@ func (t *CodeSearch) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if args.Q == "" { if args.Q == "" {
return nil, fmt.Errorf("q is required: %w", gitea.ErrValidation) return nil, fmt.Errorf("q is required: %w", gitea.ErrValidation)
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Page < 1 { if args.Page < 1 {
@@ -111,7 +111,7 @@ func (t *CreateProjectFromTemplate) Call(ctx context.Context, raw json.RawMessag
} }
// Allowlist check first. // Allowlist check first.
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -47,7 +47,7 @@ func (t *DirList) Call(ctx context.Context, raw json.RawMessage) (json.RawMessag
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -52,7 +52,7 @@ func (t *FileDelete) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Sha == "" { if args.Sha == "" {
+1 -1
View File
@@ -51,7 +51,7 @@ func (t *FileRead) Call(ctx context.Context, raw json.RawMessage) (json.RawMessa
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -57,7 +57,7 @@ func (t *FileWriteBranch) Call(ctx context.Context, raw json.RawMessage) (json.R
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Branch == "" { if args.Branch == "" {
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *IssueClose) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
iss, err := t.c.SetIssueState(ctx, args.Owner, args.Repo, args.Number, "closed") iss, err := t.c.SetIssueState(ctx, args.Owner, args.Repo, args.Number, "closed")
+1 -1
View File
@@ -50,7 +50,7 @@ func (t *IssueComment) Call(ctx context.Context, raw json.RawMessage) (json.RawM
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -56,7 +56,7 @@ func (t *IssueCreate) Call(ctx context.Context, raw json.RawMessage) (json.RawMe
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Title == "" { if args.Title == "" {
+1 -1
View File
@@ -53,7 +53,7 @@ func (t *IssueEdit) Call(ctx context.Context, raw json.RawMessage) (json.RawMess
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -43,7 +43,7 @@ func (t *IssueGet) Call(ctx context.Context, raw json.RawMessage) (json.RawMessa
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
iss, err := t.c.GetIssue(ctx, args.Owner, args.Repo, args.Number) iss, err := t.c.GetIssue(ctx, args.Owner, args.Repo, args.Number)
+1 -1
View File
@@ -50,7 +50,7 @@ func (t *IssueLabel) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -53,7 +53,7 @@ func (t *IssueList) Call(ctx context.Context, raw json.RawMessage) (json.RawMess
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.State == "" { if args.State == "" {
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *IssueListComments) Call(ctx context.Context, raw json.RawMessage) (json
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
comments, err := t.c.ListIssueComments(ctx, args.Owner, args.Repo, args.Number) comments, err := t.c.ListIssueComments(ctx, args.Owner, args.Repo, args.Number)
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *IssueReopen) Call(ctx context.Context, raw json.RawMessage) (json.RawMe
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
iss, err := t.c.SetIssueState(ctx, args.Owner, args.Repo, args.Number, "open") iss, err := t.c.SetIssueState(ctx, args.Owner, args.Repo, args.Number, "open")
+1 -1
View File
@@ -43,7 +43,7 @@ func (t *LabelList) Call(ctx context.Context, raw json.RawMessage) (json.RawMess
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
labels, err := t.c.ListLabels(ctx, args.Owner, args.Repo) labels, err := t.c.ListLabels(ctx, args.Owner, args.Repo)
+1 -1
View File
@@ -50,7 +50,7 @@ func (t *PRComment) Call(ctx context.Context, raw json.RawMessage) (json.RawMess
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -56,7 +56,7 @@ func (t *PRCreate) Call(ctx context.Context, raw json.RawMessage) (json.RawMessa
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Title == "" { if args.Title == "" {
+1 -1
View File
@@ -63,7 +63,7 @@ func (t *PRFilesDiff) Call(ctx context.Context, raw json.RawMessage) (json.RawMe
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -44,7 +44,7 @@ func (t *PRGet) Call(ctx context.Context, raw json.RawMessage) (json.RawMessage,
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -51,7 +51,7 @@ func (t *PRList) Call(ctx context.Context, raw json.RawMessage) (json.RawMessage
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
state := args.State state := args.State
+1 -1
View File
@@ -52,7 +52,7 @@ func (t *PRMerge) Call(ctx context.Context, raw json.RawMessage) (json.RawMessag
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Number < 1 { if args.Number < 1 {
+1 -1
View File
@@ -55,7 +55,7 @@ func (t *ReleaseCreate) Call(ctx context.Context, raw json.RawMessage) (json.Raw
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
rel, err := t.c.CreateRelease(ctx, args.Owner, args.Repo, gitea.CreateReleaseArgs{ rel, err := t.c.CreateRelease(ctx, args.Owner, args.Repo, gitea.CreateReleaseArgs{
+1 -1
View File
@@ -53,7 +53,7 @@ func (t *RepoCreate) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
createArgs := gitea.CreateRepoArgs{ createArgs := gitea.CreateRepoArgs{
+1 -1
View File
@@ -46,7 +46,7 @@ func (t *RepoDelete) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Confirm != args.Repo { if args.Confirm != args.Repo {
+1 -1
View File
@@ -38,7 +38,7 @@ func (t *RepoGet) Call(ctx context.Context, raw json.RawMessage) (json.RawMessag
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
r, err := t.c.GetRepo(ctx, args.Owner, args.Repo) r, err := t.c.GetRepo(ctx, args.Owner, args.Repo)
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *RepoList) Call(ctx context.Context, raw json.RawMessage) (json.RawMessa
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
args.Limit = capLimit(args.Limit, 30) args.Limit = capLimit(args.Limit, 30)
+1 -1
View File
@@ -96,7 +96,7 @@ func (t *RepoMirrorPush) Call(ctx context.Context, raw json.RawMessage) (json.Ra
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
switch args.Action { switch args.Action {
+2 -2
View File
@@ -53,7 +53,7 @@ func (t *RepoSearch) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
return nil, fmt.Errorf("q is required: %w", gitea.ErrValidation) return nil, fmt.Errorf("q is required: %w", gitea.ErrValidation)
} }
if args.Owner != "" { if args.Owner != "" {
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
} }
@@ -75,7 +75,7 @@ func (t *RepoSearch) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if len(parts) != 2 { if len(parts) != 2 {
continue continue
} }
if t.a.Check(parts[0]) == nil { if t.a.Check(ctx, parts[0]) == nil {
filtered = append(filtered, r) filtered = append(filtered, r)
} }
} }
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *RepoStatus) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *RepoTopicsUpdate) Call(ctx context.Context, raw json.RawMessage) (json.
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if err := t.c.UpdateTopics(ctx, args.Owner, args.Repo, args.Topics); err != nil { if err := t.c.UpdateTopics(ctx, args.Owner, args.Repo, args.Topics); err != nil {
+1 -1
View File
@@ -45,7 +45,7 @@ func (t *RepoTree) Call(ctx context.Context, raw json.RawMessage) (json.RawMessa
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
tree, err := t.c.GetTree(ctx, args.Owner, args.Repo, args.Ref, true) tree, err := t.c.GetTree(ctx, args.Owner, args.Repo, args.Ref, true)
+1 -1
View File
@@ -60,7 +60,7 @@ func (t *RepoUpdate) Call(ctx context.Context, raw json.RawMessage) (json.RawMes
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
+1 -1
View File
@@ -50,7 +50,7 @@ func (t *TagCreate) Call(ctx context.Context, raw json.RawMessage) (json.RawMess
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Tag == "" { if args.Tag == "" {
+1 -1
View File
@@ -145,7 +145,7 @@ func (t *TBDShip) Call(ctx context.Context, raw json.RawMessage) (json.RawMessag
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Path == "" || args.Content == "" || args.Message == "" { if args.Path == "" || args.Content == "" || args.Message == "" {
+1 -1
View File
@@ -57,7 +57,7 @@ func (t *WorkflowRunList) Call(ctx context.Context, raw json.RawMessage) (json.R
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
args.Limit = capLimit(args.Limit, 10) args.Limit = capLimit(args.Limit, 10)
+1 -1
View File
@@ -47,7 +47,7 @@ func (t *WorkflowRunStatus) Call(ctx context.Context, raw json.RawMessage) (json
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.RunID < 1 { if args.RunID < 1 {
+1 -1
View File
@@ -62,7 +62,7 @@ func (t *WorkflowRunTrigger) Call(ctx context.Context, raw json.RawMessage) (jso
if err := parseArgs(raw, &args); err != nil { if err := parseArgs(raw, &args); err != nil {
return nil, err return nil, err
} }
if err := t.a.Check(args.Owner); err != nil { if err := t.a.Check(ctx, args.Owner); err != nil {
return nil, err return nil, err
} }
if args.Workflow == "" { if args.Workflow == "" {