Return nicer error if trying to pull from non-existent user (#18288)
* Return nicer error if trying to pull from non-existent user Gitea serv will currently return an 500 if we try to pull from a repository where the owner does not exist. This PR checks for the UserNotExist Error when checking for the user and will return a NotFound error instead. Fix #18225
This commit is contained in:
parent
a15353dc00
commit
4b4884ce88
|
@ -111,8 +111,17 @@ func ServCommand(ctx *context.PrivateContext) {
|
||||||
|
|
||||||
owner, err := user_model.GetUserByName(results.OwnerName)
|
owner, err := user_model.GetUserByName(results.OwnerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if user_model.IsErrUserNotExist(err) {
|
||||||
|
// User is fetching/cloning a non-existent repository
|
||||||
|
log.Warn("Failed authentication attempt (cannot find repository: %s/%s) from %s", results.OwnerName, results.RepoName, ctx.RemoteAddr())
|
||||||
|
ctx.JSON(http.StatusNotFound, private.ErrServCommand{
|
||||||
|
Results: results,
|
||||||
|
Err: fmt.Sprintf("Cannot find repository: %s/%s", results.OwnerName, results.RepoName),
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
log.Error("Unable to get repository owner: %s/%s Error: %v", results.OwnerName, results.RepoName, err)
|
log.Error("Unable to get repository owner: %s/%s Error: %v", results.OwnerName, results.RepoName, err)
|
||||||
ctx.JSON(http.StatusInternalServerError, private.ErrServCommand{
|
ctx.JSON(http.StatusForbidden, private.ErrServCommand{
|
||||||
Results: results,
|
Results: results,
|
||||||
Err: fmt.Sprintf("Unable to get repository owner: %s/%s %v", results.OwnerName, results.RepoName, err),
|
Err: fmt.Sprintf("Unable to get repository owner: %s/%s %v", results.OwnerName, results.RepoName, err),
|
||||||
})
|
})
|
||||||
|
@ -135,7 +144,7 @@ func ServCommand(ctx *context.PrivateContext) {
|
||||||
for _, verb := range ctx.FormStrings("verb") {
|
for _, verb := range ctx.FormStrings("verb") {
|
||||||
if "git-upload-pack" == verb {
|
if "git-upload-pack" == verb {
|
||||||
// User is fetching/cloning a non-existent repository
|
// User is fetching/cloning a non-existent repository
|
||||||
log.Error("Failed authentication attempt (cannot find repository: %s/%s) from %s", results.OwnerName, results.RepoName, ctx.RemoteAddr())
|
log.Warn("Failed authentication attempt (cannot find repository: %s/%s) from %s", results.OwnerName, results.RepoName, ctx.RemoteAddr())
|
||||||
ctx.JSON(http.StatusNotFound, private.ErrServCommand{
|
ctx.JSON(http.StatusNotFound, private.ErrServCommand{
|
||||||
Results: results,
|
Results: results,
|
||||||
Err: fmt.Sprintf("Cannot find repository: %s/%s", results.OwnerName, results.RepoName),
|
Err: fmt.Sprintf("Cannot find repository: %s/%s", results.OwnerName, results.RepoName),
|
||||||
|
@ -325,7 +334,7 @@ func ServCommand(ctx *context.PrivateContext) {
|
||||||
userMode := perm.UnitAccessMode(unitType)
|
userMode := perm.UnitAccessMode(unitType)
|
||||||
|
|
||||||
if userMode < mode {
|
if userMode < mode {
|
||||||
log.Error("Failed authentication attempt for %s with key %s (not authorized to %s %s/%s) from %s", user.Name, key.Name, modeString, ownerName, repoName, ctx.RemoteAddr())
|
log.Warn("Failed authentication attempt for %s with key %s (not authorized to %s %s/%s) from %s", user.Name, key.Name, modeString, ownerName, repoName, ctx.RemoteAddr())
|
||||||
ctx.JSON(http.StatusUnauthorized, private.ErrServCommand{
|
ctx.JSON(http.StatusUnauthorized, private.ErrServCommand{
|
||||||
Results: results,
|
Results: results,
|
||||||
Err: fmt.Sprintf("User: %d:%s with Key: %d:%s is not authorized to %s %s/%s.", user.ID, user.Name, key.ID, key.Name, modeString, ownerName, repoName),
|
Err: fmt.Sprintf("User: %d:%s with Key: %d:%s is not authorized to %s %s/%s.", user.ID, user.Name, key.ID, key.Name, modeString, ownerName, repoName),
|
||||||
|
|
Loading…
Reference in a new issue