code.gitea.io/gitea@v1.22.3/services/context/user.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package context 5 6 import ( 7 "fmt" 8 "net/http" 9 "strings" 10 11 user_model "code.gitea.io/gitea/models/user" 12 ) 13 14 // UserAssignmentWeb returns a middleware to handle context-user assignment for web routes 15 func UserAssignmentWeb() func(ctx *Context) { 16 return func(ctx *Context) { 17 errorFn := func(status int, title string, obj any) { 18 err, ok := obj.(error) 19 if !ok { 20 err = fmt.Errorf("%s", obj) 21 } 22 if status == http.StatusNotFound { 23 ctx.NotFound(title, err) 24 } else { 25 ctx.ServerError(title, err) 26 } 27 } 28 ctx.ContextUser = userAssignment(ctx.Base, ctx.Doer, errorFn) 29 ctx.Data["ContextUser"] = ctx.ContextUser 30 } 31 } 32 33 // UserIDAssignmentAPI returns a middleware to handle context-user assignment for api routes 34 func UserIDAssignmentAPI() func(ctx *APIContext) { 35 return func(ctx *APIContext) { 36 userID := ctx.ParamsInt64(":user-id") 37 38 if ctx.IsSigned && ctx.Doer.ID == userID { 39 ctx.ContextUser = ctx.Doer 40 } else { 41 var err error 42 ctx.ContextUser, err = user_model.GetUserByID(ctx, userID) 43 if err != nil { 44 if user_model.IsErrUserNotExist(err) { 45 ctx.Error(http.StatusNotFound, "GetUserByID", err) 46 } else { 47 ctx.Error(http.StatusInternalServerError, "GetUserByID", err) 48 } 49 } 50 } 51 } 52 } 53 54 // UserAssignmentAPI returns a middleware to handle context-user assignment for api routes 55 func UserAssignmentAPI() func(ctx *APIContext) { 56 return func(ctx *APIContext) { 57 ctx.ContextUser = userAssignment(ctx.Base, ctx.Doer, ctx.Error) 58 } 59 } 60 61 func userAssignment(ctx *Base, doer *user_model.User, errCb func(int, string, any)) (contextUser *user_model.User) { 62 username := ctx.Params(":username") 63 64 if doer != nil && doer.LowerName == strings.ToLower(username) { 65 contextUser = doer 66 } else { 67 var err error 68 contextUser, err = user_model.GetUserByName(ctx, username) 69 if err != nil { 70 if user_model.IsErrUserNotExist(err) { 71 if redirectUserID, err := user_model.LookupUserRedirect(ctx, username); err == nil { 72 RedirectToUser(ctx, username, redirectUserID) 73 } else if user_model.IsErrUserRedirectNotExist(err) { 74 errCb(http.StatusNotFound, "GetUserByName", err) 75 } else { 76 errCb(http.StatusInternalServerError, "LookupUserRedirect", err) 77 } 78 } else { 79 errCb(http.StatusInternalServerError, "GetUserByName", err) 80 } 81 } 82 } 83 return contextUser 84 }