summaryrefslogtreecommitdiffstats
path: root/routers/repo/http.go
diff options
context:
space:
mode:
Diffstat (limited to 'routers/repo/http.go')
-rw-r--r--routers/repo/http.go54
1 files changed, 37 insertions, 17 deletions
diff --git a/routers/repo/http.go b/routers/repo/http.go
index 4173c7a91f..a209c2b254 100644
--- a/routers/repo/http.go
+++ b/routers/repo/http.go
@@ -73,11 +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
+ var (
+ askAuth = !isPublicPull || setting.Service.RequireSignInView
+ authUser *models.User
+ authUsername string
+ authPasswd string
+ )
// check access
if askAuth {
@@ -90,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
@@ -103,15 +107,33 @@ func Http(ctx *middleware.Context) {
authUser, err = models.GetUserByName(authUsername)
if err != nil {
- ctx.Handle(401, "no basic auth and digit auth", nil)
- return
- }
+ if err != models.ErrUserNotExist {
+ ctx.Handle(500, "GetUserByName", err)
+ return
+ }
- 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)
- return
+ // 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
+ }
+ authUser, err = models.GetUserById(token.Uid)
+ if err != nil {
+ ctx.Handle(500, "GetUserById", err)
+ return
+ }
+ authUsername = authUser.Name
+ } else {
+ // Check user's password when username is correctly presented.
+ if !authUser.ValidtePassword(authPasswd) {
+ ctx.Handle(401, "invalid password", nil)
+ return
+ }
}
if !isPublicPull {
@@ -139,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