diff options
author | KN4CK3R <admin@oldschoolhack.me> | 2022-03-26 10:04:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-26 17:04:22 +0800 |
commit | 59b867dc2dfc1ecb0ee703ff44e1be9c5c53cf86 (patch) | |
tree | 7114b991554e6e7dcb4123c0aa365c674d8411a0 /services | |
parent | f36701c702dc67011999cfaaf37e002c13e7a87e (diff) | |
download | gitea-59b867dc2dfc1ecb0ee703ff44e1be9c5c53cf86.tar.gz gitea-59b867dc2dfc1ecb0ee703ff44e1be9c5c53cf86.zip |
Add `ContextUser` to http request context (#18798)
This PR adds a middleware which sets a ContextUser (like GetUserByParams before) in a single place which can be used by other methods. For routes which represent a repo or org the respective middlewares set the field too.
Also fix a bug in modules/context/org.go during refactoring.
Diffstat (limited to 'services')
-rw-r--r-- | services/context/user.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/services/context/user.go b/services/context/user.go new file mode 100644 index 0000000000..c5efd43782 --- /dev/null +++ b/services/context/user.go @@ -0,0 +1,62 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package context + +import ( + "fmt" + "net/http" + "strings" + + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/context" +) + +// UserAssignmentWeb returns a middleware to handle context-user assignment for web routes +func UserAssignmentWeb() func(ctx *context.Context) { + return func(ctx *context.Context) { + userAssignment(ctx, func(status int, title string, obj interface{}) { + err, ok := obj.(error) + if !ok { + err = fmt.Errorf("%s", obj) + } + if status == http.StatusNotFound { + ctx.NotFound(title, err) + } else { + ctx.ServerError(title, err) + } + }) + } +} + +// UserAssignmentAPI returns a middleware to handle context-user assignment for api routes +func UserAssignmentAPI() func(ctx *context.APIContext) { + return func(ctx *context.APIContext) { + userAssignment(ctx.Context, ctx.Error) + } +} + +func userAssignment(ctx *context.Context, errCb func(int, string, interface{})) { + username := ctx.Params(":username") + + if ctx.IsSigned && ctx.Doer.LowerName == strings.ToLower(username) { + ctx.ContextUser = ctx.Doer + } else { + var err error + ctx.ContextUser, err = user_model.GetUserByName(username) + if err != nil { + if user_model.IsErrUserNotExist(err) { + if redirectUserID, err := user_model.LookupUserRedirect(username); err == nil { + context.RedirectToUser(ctx, username, redirectUserID) + } else if user_model.IsErrUserRedirectNotExist(err) { + errCb(http.StatusNotFound, "GetUserByName", err) + } else { + errCb(http.StatusInternalServerError, "LookupUserRedirect", err) + } + } else { + errCb(http.StatusInternalServerError, "GetUserByName", err) + } + } + } +} |