Skip to content

Commit 20597e1

Browse files
committed
Refactor Actions Token Access
* allow public repositories
1 parent ebd88af commit 20597e1

File tree

4 files changed

+45
-53
lines changed

4 files changed

+45
-53
lines changed

models/perm/access/repo_permission.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"slices"
1010

11+
actions_model "code.gitea.io/gitea/models/actions"
1112
"code.gitea.io/gitea/models/db"
1213
"code.gitea.io/gitea/models/organization"
1314
perm_model "code.gitea.io/gitea/models/perm"
@@ -253,6 +254,34 @@ func finalProcessRepoUnitPermission(user *user_model.User, perm *Permission) {
253254
}
254255
}
255256

257+
// GetActionsUserRepoPermission returns the actions user permissions to the repository
258+
func GetActionsUserRepoPermission(ctx context.Context, repo *repo_model.Repository, actionsUser *user_model.User, taskID int64) (perm Permission, err error) {
259+
if actionsUser.ID != user_model.ActionsUserID {
260+
setting.PanicInDevOrTesting("GetActionsUserRepoPermission can only be called by the actions user")
261+
}
262+
task, err := actions_model.GetTaskByID(ctx, taskID)
263+
if err != nil {
264+
return perm, err
265+
}
266+
if task.RepoID != repo.ID {
267+
// Allow public repo read access
268+
return GetUserRepoPermission(ctx, repo, actionsUser)
269+
}
270+
271+
var accessMode perm_model.AccessMode
272+
if task.IsForkPullRequest {
273+
accessMode = perm_model.AccessModeRead
274+
} else {
275+
accessMode = perm_model.AccessModeWrite
276+
}
277+
278+
if err := repo.LoadUnits(ctx); err != nil {
279+
return perm, err
280+
}
281+
perm.SetUnitsWithDefaultAccessMode(repo.Units, accessMode)
282+
return perm, nil
283+
}
284+
256285
// GetUserRepoPermission returns the user permissions to the repository
257286
func GetUserRepoPermission(ctx context.Context, repo *repo_model.Repository, user *user_model.User) (perm Permission, err error) {
258287
defer func() {

routers/api/v1/api.go

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ import (
7070
"net/http"
7171
"strings"
7272

73-
actions_model "code.gitea.io/gitea/models/actions"
7473
auth_model "code.gitea.io/gitea/models/auth"
7574
"code.gitea.io/gitea/models/organization"
7675
"code.gitea.io/gitea/models/perm"
@@ -190,27 +189,11 @@ func repoAssignment() func(ctx *context.APIContext) {
190189

191190
if ctx.Doer != nil && ctx.Doer.ID == user_model.ActionsUserID {
192191
taskID := ctx.Data["ActionsTaskID"].(int64)
193-
task, err := actions_model.GetTaskByID(ctx, taskID)
192+
ctx.Repo.Permission, err = access_model.GetActionsUserRepoPermission(ctx, repo, ctx.Doer, taskID)
194193
if err != nil {
195194
ctx.APIErrorInternal(err)
196195
return
197196
}
198-
if task.RepoID != repo.ID {
199-
ctx.APIErrorNotFound()
200-
return
201-
}
202-
203-
if task.IsForkPullRequest {
204-
ctx.Repo.Permission.AccessMode = perm.AccessModeRead
205-
} else {
206-
ctx.Repo.Permission.AccessMode = perm.AccessModeWrite
207-
}
208-
209-
if err := ctx.Repo.Repository.LoadUnits(ctx); err != nil {
210-
ctx.APIErrorInternal(err)
211-
return
212-
}
213-
ctx.Repo.Permission.SetUnitsWithDefaultAccessMode(ctx.Repo.Repository.Units, ctx.Repo.Permission.AccessMode)
214197
} else {
215198
needTwoFactor, err := doerNeedTwoFactorAuth(ctx, ctx.Doer)
216199
if err != nil {

routers/web/repo/githttp.go

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"sync"
2020
"time"
2121

22-
actions_model "code.gitea.io/gitea/models/actions"
2322
auth_model "code.gitea.io/gitea/models/auth"
2423
"code.gitea.io/gitea/models/perm"
2524
access_model "code.gitea.io/gitea/models/perm/access"
@@ -190,29 +189,17 @@ func httpBase(ctx *context.Context) *serviceHandler {
190189

191190
if ctx.Data["IsActionsToken"] == true {
192191
taskID := ctx.Data["ActionsTaskID"].(int64)
193-
task, err := actions_model.GetTaskByID(ctx, taskID)
192+
p, err := access_model.GetActionsUserRepoPermission(ctx, repo, ctx.Doer, taskID)
194193
if err != nil {
195-
ctx.ServerError("GetTaskByID", err)
196-
return nil
197-
}
198-
if task.RepoID != repo.ID {
199-
ctx.PlainText(http.StatusForbidden, "User permission denied")
194+
ctx.ServerError("GetUserRepoPermission", err)
200195
return nil
201196
}
202197

203-
if task.IsForkPullRequest {
204-
if accessMode > perm.AccessModeRead {
205-
ctx.PlainText(http.StatusForbidden, "User permission denied")
206-
return nil
207-
}
208-
environ = append(environ, fmt.Sprintf("%s=%d", repo_module.EnvActionPerm, perm.AccessModeRead))
209-
} else {
210-
if accessMode > perm.AccessModeWrite {
211-
ctx.PlainText(http.StatusForbidden, "User permission denied")
212-
return nil
213-
}
214-
environ = append(environ, fmt.Sprintf("%s=%d", repo_module.EnvActionPerm, perm.AccessModeWrite))
198+
if !p.CanAccess(accessMode, unitType) {
199+
ctx.PlainText(http.StatusNotFound, "Repository not found")
200+
return nil
215201
}
202+
environ = append(environ, fmt.Sprintf("%s=%d", repo_module.EnvActionPerm, p.UnitAccessMode(unitType)))
216203
} else {
217204
p, err := access_model.GetUserRepoPermission(ctx, repo, ctx.Doer)
218205
if err != nil {

services/lfs/server.go

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"strconv"
2020
"strings"
2121

22-
actions_model "code.gitea.io/gitea/models/actions"
2322
auth_model "code.gitea.io/gitea/models/auth"
2423
git_model "code.gitea.io/gitea/models/git"
2524
perm_model "code.gitea.io/gitea/models/perm"
@@ -519,28 +518,22 @@ func authenticate(ctx *context.Context, repository *repo_model.Repository, autho
519518
accessMode = perm_model.AccessModeWrite
520519
}
521520

521+
var perm access_model.Permission
522+
var err error
522523
if ctx.Data["IsActionsToken"] == true {
523524
taskID := ctx.Data["ActionsTaskID"].(int64)
524-
task, err := actions_model.GetTaskByID(ctx, taskID)
525+
perm, err = access_model.GetActionsUserRepoPermission(ctx, repository, ctx.Doer, taskID)
525526
if err != nil {
526-
log.Error("Unable to GetTaskByID for task[%d] Error: %v", taskID, err)
527+
log.Error("Unable to GetActionsUserRepoPermission for task[%d] Error: %v", taskID, err)
527528
return false
528529
}
529-
if task.RepoID != repository.ID {
530+
} else {
531+
// ctx.IsSigned is unnecessary here, this will be checked in perm.CanAccess
532+
perm, err = access_model.GetUserRepoPermission(ctx, repository, ctx.Doer)
533+
if err != nil {
534+
log.Error("Unable to GetUserRepoPermission for user %-v in repo %-v Error: %v", ctx.Doer, repository, err)
530535
return false
531536
}
532-
533-
if task.IsForkPullRequest {
534-
return accessMode <= perm_model.AccessModeRead
535-
}
536-
return accessMode <= perm_model.AccessModeWrite
537-
}
538-
539-
// ctx.IsSigned is unnecessary here, this will be checked in perm.CanAccess
540-
perm, err := access_model.GetUserRepoPermission(ctx, repository, ctx.Doer)
541-
if err != nil {
542-
log.Error("Unable to GetUserRepoPermission for user %-v in repo %-v Error: %v", ctx.Doer, repository, err)
543-
return false
544537
}
545538

546539
canRead := perm.CanAccess(accessMode, unit.TypeCode)

0 commit comments

Comments
 (0)