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"
"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
2022-05-20 17:08:52 +03:00
ctx . ContextUser , err = user_model . GetUserByName ( ctx , username )
2022-03-26 12:04:22 +03:00
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 )
}
}
}
}