Skip to content

Commit 20c1d28

Browse files
Copilotpelikhan
andcommitted
fix: permission validation only requires read permissions from toolsets
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
1 parent 482fca3 commit 20c1d28

2 files changed

Lines changed: 26 additions & 43 deletions

File tree

pkg/workflow/permissions_validation.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,20 +193,13 @@ func collectRequiredPermissions(toolsets []string, readOnly bool) map[Permission
193193
continue
194194
}
195195

196-
// Add read permissions
196+
// Add read permissions only (write tools are not considered for permission requirements)
197197
for _, scope := range perms.ReadPermissions {
198198
// Always require at least read access
199199
if existing, found := required[scope]; !found || existing == PermissionNone {
200200
required[scope] = PermissionRead
201201
}
202202
}
203-
204-
// Add write permissions only if not in read-only mode
205-
if !readOnly {
206-
for _, scope := range perms.WritePermissions {
207-
required[scope] = PermissionWrite
208-
}
209-
}
210203
}
211204

212205
return required

pkg/workflow/permissions_validator_test.go

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func TestCollectRequiredPermissions(t *testing.T) {
2525
toolsets: []string{"repos"},
2626
readOnly: false,
2727
expected: map[PermissionScope]PermissionLevel{
28-
PermissionContents: PermissionWrite,
28+
PermissionContents: PermissionRead,
2929
},
3030
},
3131
{
@@ -41,51 +41,51 @@ func TestCollectRequiredPermissions(t *testing.T) {
4141
toolsets: []string{"issues"},
4242
readOnly: false,
4343
expected: map[PermissionScope]PermissionLevel{
44-
PermissionIssues: PermissionWrite,
44+
PermissionIssues: PermissionRead,
4545
},
4646
},
4747
{
4848
name: "Multiple toolsets",
4949
toolsets: []string{"repos", "issues", "pull_requests"},
5050
readOnly: false,
5151
expected: map[PermissionScope]PermissionLevel{
52-
PermissionContents: PermissionWrite,
53-
PermissionIssues: PermissionWrite,
54-
PermissionPullRequests: PermissionWrite,
52+
PermissionContents: PermissionRead,
53+
PermissionIssues: PermissionRead,
54+
PermissionPullRequests: PermissionRead,
5555
},
5656
},
5757
{
5858
name: "Default toolsets in read-write mode",
5959
toolsets: DefaultGitHubToolsets,
6060
readOnly: false,
6161
expected: map[PermissionScope]PermissionLevel{
62-
PermissionContents: PermissionWrite,
63-
PermissionIssues: PermissionWrite,
64-
PermissionPullRequests: PermissionWrite,
62+
PermissionContents: PermissionRead,
63+
PermissionIssues: PermissionRead,
64+
PermissionPullRequests: PermissionRead,
6565
},
6666
},
6767
{
68-
name: "Actions toolset (read-write)",
68+
name: "Actions toolset",
6969
toolsets: []string{"actions"},
7070
readOnly: false,
7171
expected: map[PermissionScope]PermissionLevel{
72-
PermissionActions: PermissionWrite,
72+
PermissionActions: PermissionRead,
7373
},
7474
},
7575
{
7676
name: "Code security toolset",
7777
toolsets: []string{"code_security"},
7878
readOnly: false,
7979
expected: map[PermissionScope]PermissionLevel{
80-
PermissionSecurityEvents: PermissionWrite,
80+
PermissionSecurityEvents: PermissionRead,
8181
},
8282
},
8383
{
8484
name: "Discussions toolset",
8585
toolsets: []string{"discussions"},
8686
readOnly: false,
8787
expected: map[PermissionScope]PermissionLevel{
88-
PermissionDiscussions: PermissionWrite,
88+
PermissionDiscussions: PermissionRead,
8989
},
9090
},
9191
{
@@ -150,9 +150,9 @@ func TestValidatePermissions_MissingPermissions(t *testing.T) {
150150
{
151151
name: "Default toolsets with all required permissions",
152152
permissions: NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
153-
PermissionContents: PermissionWrite,
154-
PermissionIssues: PermissionWrite,
155-
PermissionPullRequests: PermissionWrite,
153+
PermissionContents: PermissionRead,
154+
PermissionIssues: PermissionRead,
155+
PermissionPullRequests: PermissionRead,
156156
}),
157157
githubToolConfig: &GitHubToolConfig{
158158
Toolset: GitHubToolsets{"default"},
@@ -162,17 +162,15 @@ func TestValidatePermissions_MissingPermissions(t *testing.T) {
162162
expectHasIssues: false,
163163
},
164164
{
165-
name: "Default toolsets with only read permissions (missing write)",
165+
name: "Default toolsets with no permissions (missing read)",
166166
permissions: NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
167-
PermissionContents: PermissionRead,
168-
PermissionIssues: PermissionRead,
169-
PermissionPullRequests: PermissionRead,
167+
PermissionContents: PermissionRead,
170168
}),
171169
githubToolConfig: &GitHubToolConfig{
172170
Toolset: GitHubToolsets{"default"},
173-
ReadOnly: false, // Need write permissions
171+
ReadOnly: false, // Only read permissions required
174172
},
175-
expectMissingCount: 3, // All need write
173+
expectMissingCount: 2, // Missing issues: read, pull-requests: read
176174
expectHasIssues: true,
177175
},
178176
{
@@ -192,19 +190,19 @@ func TestValidatePermissions_MissingPermissions(t *testing.T) {
192190
{
193191
name: "Specific toolsets with partial permissions",
194192
permissions: NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
195-
PermissionContents: PermissionWrite,
193+
PermissionContents: PermissionRead,
196194
}),
197195
githubToolConfig: &GitHubToolConfig{
198196
Toolset: GitHubToolsets{"repos", "issues"},
199197
ReadOnly: false,
200198
},
201-
expectMissingCount: 1, // Missing issues: write
199+
expectMissingCount: 1, // Missing issues: read
202200
expectHasIssues: true,
203201
},
204202
{
205-
name: "Actions toolset with write permission",
203+
name: "Actions toolset with read permission",
206204
permissions: NewPermissionsFromMap(map[PermissionScope]PermissionLevel{
207-
PermissionActions: PermissionWrite,
205+
PermissionActions: PermissionRead,
208206
}),
209207
githubToolConfig: &GitHubToolConfig{
210208
Toolset: GitHubToolsets{"actions"},
@@ -350,12 +348,7 @@ func TestValidatePermissions_ComplexScenarios(t *testing.T) {
350348
Toolset: GitHubToolsets{"default"},
351349
ReadOnly: false,
352350
},
353-
expectMsg: []string{
354-
"Missing required permissions for GitHub toolsets:",
355-
"contents: write",
356-
"issues: write",
357-
"pull-requests: write",
358-
},
351+
expectMsg: []string{}, // read-all satisfies the read-only permission requirements
359352
},
360353
{
361354
name: "All: read with discussions toolset",
@@ -364,10 +357,7 @@ func TestValidatePermissions_ComplexScenarios(t *testing.T) {
364357
Toolset: GitHubToolsets{"discussions"},
365358
ReadOnly: false,
366359
},
367-
expectMsg: []string{
368-
"Missing required permissions for GitHub toolsets:",
369-
"discussions: write",
370-
},
360+
expectMsg: []string{}, // all:read satisfies discussions read requirement
371361
},
372362
}
373363

0 commit comments

Comments
 (0)