|
|
|
@ -73,12 +73,14 @@ func Http(ctx *middleware.Context) {
|
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// only public pull don't need auth
|
|
|
|
|
// Only public pull don't need auth.
|
|
|
|
|
isPublicPull := !repo.IsPrivate && isPull |
|
|
|
|
var askAuth = !isPublicPull || setting.Service.RequireSignInView |
|
|
|
|
var authUser *models.User |
|
|
|
|
var authUsername, passwd string |
|
|
|
|
usedToken := false |
|
|
|
|
var ( |
|
|
|
|
askAuth = !isPublicPull || setting.Service.RequireSignInView |
|
|
|
|
authUser *models.User |
|
|
|
|
authUsername string |
|
|
|
|
authPasswd string |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// check access
|
|
|
|
|
if askAuth { |
|
|
|
@ -91,12 +93,13 @@ func Http(ctx *middleware.Context) {
|
|
|
|
|
auths := strings.Fields(baHead) |
|
|
|
|
// currently check basic auth
|
|
|
|
|
// TODO: support digit auth
|
|
|
|
|
// FIXME: middlewares/context.go did basic auth check already
|
|
|
|
|
// FIXME: middlewares/context.go did basic auth check already,
|
|
|
|
|
// maybe could use that one.
|
|
|
|
|
if len(auths) != 2 || auths[0] != "Basic" { |
|
|
|
|
ctx.Handle(401, "no basic auth and digit auth", nil) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
authUsername, passwd, err = base.BasicAuthDecode(auths[1]) |
|
|
|
|
authUsername, authPasswd, err = base.BasicAuthDecode(auths[1]) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.Handle(401, "no basic auth and digit auth", nil) |
|
|
|
|
return |
|
|
|
@ -104,39 +107,31 @@ func Http(ctx *middleware.Context) {
|
|
|
|
|
|
|
|
|
|
authUser, err = models.GetUserByName(authUsername) |
|
|
|
|
if err != nil { |
|
|
|
|
// check if a token was given instead of username
|
|
|
|
|
tokens, err := models.ListAllAccessTokens() |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.Handle(401, "no basic auth and digit auth", nil) |
|
|
|
|
if err != models.ErrUserNotExist { |
|
|
|
|
ctx.Handle(500, "GetUserByName", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, token := range tokens { |
|
|
|
|
if token.Sha1 == authUsername { |
|
|
|
|
// get user belonging to token
|
|
|
|
|
authUser, err = models.GetUserById(token.Uid) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.Handle(401, "no basic auth and digit auth", nil) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
authUsername = authUser.Name |
|
|
|
|
usedToken = true |
|
|
|
|
break |
|
|
|
|
// Assume username now is a token.
|
|
|
|
|
token, err := models.GetAccessTokenBySha(authUsername) |
|
|
|
|
if err != nil { |
|
|
|
|
if err == models.ErrAccessTokenNotExist { |
|
|
|
|
ctx.Handle(401, "invalid token", nil) |
|
|
|
|
} else { |
|
|
|
|
ctx.Handle(500, "GetAccessTokenBySha", err) |
|
|
|
|
} |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if authUser == nil { |
|
|
|
|
ctx.Handle(401, "no basic auth and digit auth", nil) |
|
|
|
|
authUser, err = models.GetUserById(token.Uid) |
|
|
|
|
if err != nil { |
|
|
|
|
ctx.Handle(500, "GetUserById", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// check password if token is not used
|
|
|
|
|
if !usedToken { |
|
|
|
|
newUser := &models.User{Passwd: passwd, Salt: authUser.Salt} |
|
|
|
|
newUser.EncodePasswd() |
|
|
|
|
if authUser.Passwd != newUser.Passwd { |
|
|
|
|
ctx.Handle(401, "no basic auth and digit auth", nil) |
|
|
|
|
authUsername = authUser.Name |
|
|
|
|
} else { |
|
|
|
|
// Check user's password when username is correctly presented.
|
|
|
|
|
if !authUser.ValidtePassword(authPasswd) { |
|
|
|
|
ctx.Handle(401, "invalid password", nil) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -166,9 +161,7 @@ func Http(ctx *middleware.Context) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var f func(rpc string, input []byte) |
|
|
|
|
|
|
|
|
|
f = func(rpc string, input []byte) { |
|
|
|
|
var f = func(rpc string, input []byte) { |
|
|
|
|
if rpc == "receive-pack" { |
|
|
|
|
var lastLine int64 = 0 |
|
|
|
|
|
|
|
|
|