Fix signin page redirection in single instance mode
authorr <r@freesoftwareextremist.com>
Fri, 29 May 2020 13:28:42 +0000 (13:28 +0000)
committerr <r@freesoftwareextremist.com>
Fri, 29 May 2020 16:02:26 +0000 (16:02 +0000)
service/auth.go
service/transport.go

index d16fab958c988cba70cf8539bd608ff52e51226b..ef701c1cd7f652accfeb27462220470e5c6998bb 100644 (file)
@@ -10,6 +10,7 @@ import (
 
 var (
        errInvalidSession   = errors.New("invalid session")
+       errInvalidAccessToken = errors.New("invalid access token")
        errInvalidCSRFToken = errors.New("invalid csrf token")
 )
 
@@ -23,7 +24,7 @@ func NewAuthService(sessionRepo model.SessionRepo, appRepo model.AppRepo, s Serv
        return &as{sessionRepo, appRepo, s}
 }
 
-func (s *as) authenticateClient(c *model.Client) (err error) {
+func (s *as) initClient(c *model.Client) (err error) {
        if len(c.Ctx.SessionID) < 1 {
                return errInvalidSession
        }
@@ -46,6 +47,17 @@ func (s *as) authenticateClient(c *model.Client) (err error) {
        return nil
 }
 
+func (s *as) authenticateClient(c *model.Client) (err error) {
+       err = s.initClient(c)
+       if err != nil {
+               return
+       }
+       if len(c.Session.AccessToken) < 1 {
+               return errInvalidAccessToken
+       }
+       return nil
+}
+
 func checkCSRF(c *model.Client) (err error) {
        if c.Ctx.CSRFToken != c.Session.CSRFToken {
                return errInvalidCSRFToken
@@ -179,7 +191,7 @@ func (s *as) NewSession(instance string) (redirectUrl string,
 func (s *as) Signin(c *model.Client, sessionID string,
        code string) (token string, userID string, err error) {
        err = s.authenticateClient(c)
-       if err != nil {
+       if err != nil && err != errInvalidAccessToken {
                return
        }
 
index 8dccd92080c06f62d69f3f2ef8c118fc61d414a3..131c5800be9f27d0b0492fe5f55951a9409f2a8b 100644 (file)
@@ -76,6 +76,11 @@ func NewHandler(s Service, staticDir string) http.Handler {
                        c := newClient(w, req, "")
                        err := s.ServeRootPage(c)
                        if err != nil {
+                               if (err == errInvalidAccessToken) {
+                                       w.Header().Add("Location", "/signin")
+                                       w.WriteHeader(http.StatusFound)
+                                       return
+                               }
                                w.WriteHeader(http.StatusInternalServerError)
                                s.ServeErrorPage(c, err)
                                return