]> source.dussan.org Git - gitea.git/commitdiff
#842 able to use access token replace basic auth
authorUnknwon <u@gogs.io>
Wed, 2 Sep 2015 06:40:15 +0000 (02:40 -0400)
committerUnknwon <u@gogs.io>
Wed, 2 Sep 2015 06:40:15 +0000 (02:40 -0400)
gogs.go
models/error.go
models/token.go
modules/auth/auth.go
modules/middleware/context.go
routers/repo/http.go
templates/.VERSION

diff --git a/gogs.go b/gogs.go
index edebcc4efa05276dddb62999b907125f763b0b72..dc7d13483c19349127514197110593b67b136d8b 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
        "github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.6.7.0901 Beta"
+const APP_VER = "0.6.7.0902 Beta"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
index 4d888c870beddbab3a630497dd8fcd4566d270cc..92cc187b4398b60cb99be40633f34fd3216c27e3 100644 (file)
@@ -183,6 +183,26 @@ func (err ErrDeployKeyNameAlreadyUsed) Error() string {
        return fmt.Sprintf("public key already exists: [repo_id: %d, name: %s]", err.RepoID, err.Name)
 }
 
+//    _____                                   ___________     __
+//   /  _  \   ____  ____  ____   ______ _____\__    ___/___ |  | __ ____   ____
+//  /  /_\  \_/ ___\/ ___\/ __ \ /  ___//  ___/ |    | /  _ \|  |/ // __ \ /    \
+// /    |    \  \__\  \__\  ___/ \___ \ \___ \  |    |(  <_> )    <\  ___/|   |  \
+// \____|__  /\___  >___  >___  >____  >____  > |____| \____/|__|_ \\___  >___|  /
+//         \/     \/    \/    \/     \/     \/                    \/    \/     \/
+
+type ErrAccessTokenNotExist struct {
+       SHA string
+}
+
+func IsErrAccessTokenNotExist(err error) bool {
+       _, ok := err.(ErrAccessTokenNotExist)
+       return ok
+}
+
+func (err ErrAccessTokenNotExist) Error() string {
+       return fmt.Sprintf("access token does not exist: [sha: %s]", err.SHA)
+}
+
 // ________                            .__                __  .__
 // \_____  \_______  _________    ____ |__|____________ _/  |_|__| ____   ____
 //  /   |   \_  __ \/ ___\__  \  /    \|  \___   /\__  \\   __\  |/  _ \ /    \
index 6c4328e53e9c9341d2b9443f985c799deb6568f8..852a910fecc2f68f3b316599258eee8d36f3d5f0 100644 (file)
@@ -5,17 +5,12 @@
 package models
 
 import (
-       "errors"
        "time"
 
        "github.com/gogits/gogs/modules/base"
        "github.com/gogits/gogs/modules/uuid"
 )
 
-var (
-       ErrAccessTokenNotExist = errors.New("Access token does not exist")
-)
-
 // AccessToken represents a personal access token.
 type AccessToken struct {
        ID                int64 `xorm:"pk autoincr"`
@@ -42,7 +37,7 @@ func GetAccessTokenBySHA(sha string) (*AccessToken, error) {
        if err != nil {
                return nil, err
        } else if !has {
-               return nil, ErrAccessTokenNotExist
+               return nil, ErrAccessTokenNotExist{sha}
        }
        return t, nil
 }
index 71cb2bb28b6001fccae47045b62af15f345256f7..9b624594799b028a7bf10236caf06b4cf972d580 100644 (file)
@@ -5,7 +5,6 @@
 package auth
 
 import (
-       "net/http"
        "reflect"
        "strings"
        "time"
@@ -26,32 +25,39 @@ func IsAPIPath(url string) bool {
        return strings.HasPrefix(url, "/api/")
 }
 
-// SignedInId returns the id of signed in user.
-func SignedInId(req *http.Request, sess session.Store) int64 {
+// SignedInID returns the id of signed in user.
+func SignedInID(ctx *macaron.Context, sess session.Store) int64 {
        if !models.HasEngine {
                return 0
        }
 
-       // API calls need to check access token.
-       if IsAPIPath(req.URL.Path) {
-               auHead := req.Header.Get("Authorization")
+       // Check access token.
+       tokenSHA := ctx.Query("token")
+       if len(tokenSHA) == 0 {
+               // Well, check with header again.
+               auHead := ctx.Req.Header.Get("Authorization")
                if len(auHead) > 0 {
                        auths := strings.Fields(auHead)
                        if len(auths) == 2 && auths[0] == "token" {
-                               t, err := models.GetAccessTokenBySHA(auths[1])
-                               if err != nil {
-                                       if err != models.ErrAccessTokenNotExist {
-                                               log.Error(4, "GetAccessTokenBySHA: %v", err)
-                                       }
-                                       return 0
-                               }
-                               t.Updated = time.Now()
-                               if err = models.UpdateAccessToekn(t); err != nil {
-                                       log.Error(4, "UpdateAccessToekn: %v", err)
-                               }
-                               return t.UID
+                               tokenSHA = auths[1]
+                       }
+               }
+       }
+
+       // Let's see if token is valid.
+       if len(tokenSHA) > 0 {
+               t, err := models.GetAccessTokenBySHA(tokenSHA)
+               if err != nil {
+                       if models.IsErrAccessTokenNotExist(err) {
+                               log.Error(4, "GetAccessTokenBySHA: %v", err)
                        }
+                       return 0
+               }
+               t.Updated = time.Now()
+               if err = models.UpdateAccessToekn(t); err != nil {
+                       log.Error(4, "UpdateAccessToekn: %v", err)
                }
+               return t.UID
        }
 
        uid := sess.Get("uid")
@@ -72,16 +78,16 @@ func SignedInId(req *http.Request, sess session.Store) int64 {
 
 // SignedInUser returns the user object of signed user.
 // It returns a bool value to indicate whether user uses basic auth or not.
-func SignedInUser(req *http.Request, sess session.Store) (*models.User, bool) {
+func SignedInUser(ctx *macaron.Context, sess session.Store) (*models.User, bool) {
        if !models.HasEngine {
                return nil, false
        }
 
-       uid := SignedInId(req, sess)
+       uid := SignedInID(ctx, sess)
 
        if uid <= 0 {
                if setting.Service.EnableReverseProxyAuth {
-                       webAuthUser := req.Header.Get(setting.ReverseProxyAuthUser)
+                       webAuthUser := ctx.Req.Header.Get(setting.ReverseProxyAuthUser)
                        if len(webAuthUser) > 0 {
                                u, err := models.GetUserByName(webAuthUser)
                                if err != nil {
@@ -112,7 +118,7 @@ func SignedInUser(req *http.Request, sess session.Store) (*models.User, bool) {
                }
 
                // Check with basic auth.
-               baHead := req.Header.Get("Authorization")
+               baHead := ctx.Req.Header.Get("Authorization")
                if len(baHead) > 0 {
                        auths := strings.Fields(baHead)
                        if len(auths) == 2 && auths[0] == "Basic" {
index 9a8bb8865eab174e14dc4c3e758d19c3baf521c4..141e8ace40ec1b79661f8cad6a4c8f17a5c3f3f7 100644 (file)
@@ -211,7 +211,7 @@ func Contexter() macaron.Handler {
                }
 
                // Get user from session if logined.
-               ctx.User, ctx.IsBasicAuth = auth.SignedInUser(ctx.Req.Request, ctx.Session)
+               ctx.User, ctx.IsBasicAuth = auth.SignedInUser(ctx.Context, ctx.Session)
 
                if ctx.User != nil {
                        ctx.IsSigned = true
index 9c1f22739170b629fa4f742d729e4a25b0d3370b..52c9fbd39edd595318bbf07852830da7bf3cf523 100644 (file)
@@ -115,7 +115,7 @@ func Http(ctx *middleware.Context) {
                        // Assume username now is a token.
                        token, err := models.GetAccessTokenBySHA(authUsername)
                        if err != nil {
-                               if err == models.ErrAccessTokenNotExist {
+                               if models.IsErrAccessTokenNotExist(err) {
                                        ctx.HandleText(401, "invalid token")
                                } else {
                                        ctx.Handle(500, "GetAccessTokenBySha", err)
index bcf63ee3df619df039fadf280d4055a759d3efac..21be2047c5e643216a8972a7892138f2ebc6e900 100644 (file)
@@ -1 +1 @@
-0.6.7.0901 Beta
\ No newline at end of file
+0.6.7.0902 Beta
\ No newline at end of file