2022-03-26 12:04:22 +03:00
// Copyright 2022 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2022-03-26 12:04:22 +03:00
package context
import (
"fmt"
"net/http"
"strings"
user_model "code.gitea.io/gitea/models/user"
)
// UserAssignmentWeb returns a middleware to handle context-user assignment for web routes
2024-02-27 10:12:22 +03:00
func UserAssignmentWeb ( ) func ( ctx * Context ) {
return func ( ctx * Context ) {
2023-07-04 21:36:08 +03:00
errorFn := func ( status int , title string , obj any ) {
2022-03-26 12:04:22 +03:00
err , ok := obj . ( error )
if ! ok {
err = fmt . Errorf ( "%s" , obj )
}
if status == http . StatusNotFound {
ctx . NotFound ( title , err )
} else {
ctx . ServerError ( title , err )
}
2023-05-21 04:50:53 +03:00
}
ctx . ContextUser = userAssignment ( ctx . Base , ctx . Doer , errorFn )
2023-09-06 09:38:14 +03:00
ctx . Data [ "ContextUser" ] = ctx . ContextUser
2022-03-26 12:04:22 +03:00
}
}
2023-04-04 05:08:23 +03:00
// UserIDAssignmentAPI returns a middleware to handle context-user assignment for api routes
2024-02-27 10:12:22 +03:00
func UserIDAssignmentAPI ( ) func ( ctx * APIContext ) {
return func ( ctx * APIContext ) {
2023-04-04 05:08:23 +03:00
userID := ctx . ParamsInt64 ( ":user-id" )
if ctx . IsSigned && ctx . Doer . ID == userID {
ctx . ContextUser = ctx . Doer
} else {
var err error
ctx . ContextUser , err = user_model . GetUserByID ( ctx , userID )
if err != nil {
if user_model . IsErrUserNotExist ( err ) {
ctx . Error ( http . StatusNotFound , "GetUserByID" , err )
} else {
ctx . Error ( http . StatusInternalServerError , "GetUserByID" , err )
}
}
}
}
}
2022-03-26 12:04:22 +03:00
// UserAssignmentAPI returns a middleware to handle context-user assignment for api routes
2024-02-27 10:12:22 +03:00
func UserAssignmentAPI ( ) func ( ctx * APIContext ) {
return func ( ctx * APIContext ) {
2023-05-21 04:50:53 +03:00
ctx . ContextUser = userAssignment ( ctx . Base , ctx . Doer , ctx . Error )
2022-03-26 12:04:22 +03:00
}
}
2024-02-27 10:12:22 +03:00
func userAssignment ( ctx * Base , doer * user_model . User , errCb func ( int , string , any ) ) ( contextUser * user_model . User ) {
2022-03-26 12:04:22 +03:00
username := ctx . Params ( ":username" )
2023-05-21 04:50:53 +03:00
if doer != nil && doer . LowerName == strings . ToLower ( username ) {
contextUser = doer
2022-03-26 12:04:22 +03:00
} else {
var err error
2023-05-21 04:50:53 +03:00
contextUser , err = user_model . GetUserByName ( ctx , username )
2022-03-26 12:04:22 +03:00
if err != nil {
if user_model . IsErrUserNotExist ( err ) {
2023-09-25 16:17:37 +03:00
if redirectUserID , err := user_model . LookupUserRedirect ( ctx , username ) ; err == nil {
2024-02-27 10:12:22 +03:00
RedirectToUser ( ctx , username , redirectUserID )
2022-03-26 12:04:22 +03:00
} else if user_model . IsErrUserRedirectNotExist ( err ) {
errCb ( http . StatusNotFound , "GetUserByName" , err )
} else {
errCb ( http . StatusInternalServerError , "LookupUserRedirect" , err )
}
} else {
errCb ( http . StatusInternalServerError , "GetUserByName" , err )
}
}
}
2023-05-21 04:50:53 +03:00
return contextUser
2022-03-26 12:04:22 +03:00
}