Skip to content

Commit 9b3cb10

Browse files
committed
clarify package context
1 parent 580b6cb commit 9b3cb10

File tree

4 files changed

+50
-14
lines changed

4 files changed

+50
-14
lines changed

modules/context/package.go

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"code.gitea.io/gitea/models/perm"
1313
"code.gitea.io/gitea/models/unit"
1414
user_model "code.gitea.io/gitea/models/user"
15+
mc "code.gitea.io/gitea/modules/cache"
1516
"code.gitea.io/gitea/modules/setting"
1617
"code.gitea.io/gitea/modules/structs"
1718
)
@@ -23,8 +24,30 @@ type Package struct {
2324
Descriptor *packages_model.PackageDescriptor
2425
}
2526

26-
// PackageAssignmentWebAPI returns a middleware to handle Context.Package assignment
27-
func PackageAssignmentWebAPI() func(ctx *Context) {
27+
type packageAssignmentCtx struct {
28+
*Base
29+
Doer *user_model.User
30+
ContextUser *user_model.User
31+
}
32+
33+
func PackageContexter() func(next http.Handler) http.Handler {
34+
return func(next http.Handler) http.Handler {
35+
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
36+
base, baseCleanUp := NewBaseContext(resp, req)
37+
ctx := &Context{
38+
Base: base,
39+
Cache: mc.GetCache(),
40+
}
41+
defer baseCleanUp()
42+
43+
ctx.Base.AppendContextValue(contextKey, ctx)
44+
next.ServeHTTP(ctx.Resp, ctx.Req)
45+
})
46+
}
47+
}
48+
49+
// PackageAssignmentWeb returns a middleware to handle Context.Package assignment
50+
func PackageAssignmentWeb() func(ctx *Context) {
2851
return func(ctx *Context) {
2952
errorFn := func(status int, title string, obj interface{}) {
3053
err, ok := obj.(error)
@@ -37,23 +60,25 @@ func PackageAssignmentWebAPI() func(ctx *Context) {
3760
ctx.ServerError(title, err)
3861
}
3962
}
40-
41-
ctx.Package = packageAssignment(ctx.Base, ctx.Doer, errorFn)
63+
paCtx := &packageAssignmentCtx{Base: ctx.Base, Doer: ctx.Doer, ContextUser: ctx.ContextUser}
64+
ctx.Package = packageAssignment(paCtx, errorFn)
4265
}
4366
}
4467

4568
// PackageAssignmentAPI returns a middleware to handle Context.Package assignment
4669
func PackageAssignmentAPI() func(ctx *APIContext) {
4770
return func(ctx *APIContext) {
48-
ctx.Package = packageAssignment(ctx.Base, ctx.Doer, ctx.Error)
71+
paCtx := &packageAssignmentCtx{Base: ctx.Base, Doer: ctx.Doer, ContextUser: ctx.ContextUser}
72+
ctx.Package = packageAssignment(paCtx, ctx.Error)
4973
}
5074
}
5175

52-
func packageAssignment(ctx *Base, doer *user_model.User, errCb func(int, string, interface{})) *Package {
53-
pkg := &Package{}
54-
76+
func packageAssignment(ctx *packageAssignmentCtx, errCb func(int, string, interface{})) *Package {
77+
pkg := &Package{
78+
Owner: ctx.ContextUser,
79+
}
5580
var err error
56-
pkg.AccessMode, err = determineAccessMode(ctx, pkg, doer)
81+
pkg.AccessMode, err = determineAccessMode(ctx.Base, pkg, ctx.Doer)
5782
if err != nil {
5883
errCb(http.StatusInternalServerError, "determineAccessMode", err)
5984
return pkg

modules/web/handler.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"reflect"
1111

1212
"code.gitea.io/gitea/modules/context"
13+
"code.gitea.io/gitea/modules/log"
1314
"code.gitea.io/gitea/modules/web/routing"
1415
)
1516

@@ -78,7 +79,13 @@ func preCheckHandler(fn reflect.Value, argsIn []reflect.Value) {
7879
}
7980
}
8081

81-
func prepareHandleArgsIn(resp http.ResponseWriter, req *http.Request, fn reflect.Value) []reflect.Value {
82+
func prepareHandleArgsIn(resp http.ResponseWriter, req *http.Request, fn reflect.Value, fnInfo *routing.FuncInfo) []reflect.Value {
83+
defer func() {
84+
if err := recover(); err != nil {
85+
log.Error("unable to prepare handler arguments for %s: %v", fnInfo.String(), err)
86+
panic(err)
87+
}
88+
}()
8289
isPreCheck := req == nil
8390

8491
argsIn := make([]reflect.Value, fn.Type().NumIn())
@@ -155,7 +162,7 @@ func toHandlerProvider(handler any) func(next http.Handler) http.Handler {
155162
}
156163

157164
// prepare the arguments for the handler and do pre-check
158-
argsIn := prepareHandleArgsIn(resp, req, fn)
165+
argsIn := prepareHandleArgsIn(resp, req, fn, funcInfo)
159166
if req == nil {
160167
preCheckHandler(fn, argsIn)
161168
return // it's doing pre-check, just return

routers/api/packages/api.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ func verifyAuth(r *web.Route, authMethods []auth.Method) {
9898
func CommonRoutes(ctx gocontext.Context) *web.Route {
9999
r := web.NewRoute()
100100

101+
r.Use(context.PackageContexter())
102+
101103
verifyAuth(r, []auth.Method{
102104
&auth.OAuth2{},
103105
&auth.Basic{},
@@ -561,7 +563,7 @@ func CommonRoutes(ctx gocontext.Context) *web.Route {
561563
})
562564
})
563565
}, reqPackageAccess(perm.AccessModeRead))
564-
}, context_service.UserAssignmentWeb(), context.PackageAssignmentWebAPI())
566+
}, context_service.UserAssignmentWeb(), context.PackageAssignmentWeb())
565567

566568
return r
567569
}
@@ -572,6 +574,8 @@ func CommonRoutes(ctx gocontext.Context) *web.Route {
572574
func ContainerRoutes(ctx gocontext.Context) *web.Route {
573575
r := web.NewRoute()
574576

577+
r.Use(context.PackageContexter())
578+
575579
verifyAuth(r, []auth.Method{
576580
&auth.Basic{},
577581
&container.Auth{},
@@ -726,7 +730,7 @@ func ContainerRoutes(ctx gocontext.Context) *web.Route {
726730

727731
ctx.Status(http.StatusNotFound)
728732
})
729-
}, container.ReqContainerAccess, context_service.UserAssignmentWeb(), context.PackageAssignmentWebAPI(), reqPackageAccess(perm.AccessModeRead))
733+
}, container.ReqContainerAccess, context_service.UserAssignmentWeb(), context.PackageAssignmentWeb(), reqPackageAccess(perm.AccessModeRead))
730734

731735
return r
732736
}

routers/web/web.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ func registerRoutes(m *web.Route) {
814814
}, reqPackageAccess(perm.AccessModeWrite))
815815
})
816816
})
817-
}, context.PackageAssignmentWebAPI(), reqPackageAccess(perm.AccessModeRead))
817+
}, context.PackageAssignmentWeb(), reqPackageAccess(perm.AccessModeRead))
818818
}
819819

820820
m.Group("/projects", func() {

0 commit comments

Comments
 (0)