github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/routers/web/login.go (about)

     1  package web
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  
     7  	"github.com/covergates/covergates/config"
     8  	"github.com/covergates/covergates/core"
     9  	"github.com/drone/go-login/login"
    10  	"github.com/gin-gonic/gin"
    11  	log "github.com/sirupsen/logrus"
    12  )
    13  
    14  const (
    15  	keyLogin   = "login"
    16  	keyAccess  = "access"
    17  	keyRefresh = "refresh"
    18  	keyExpires = "expires"
    19  )
    20  
    21  // HandleLogin user
    22  func HandleLogin(
    23  	config *config.Config,
    24  	scm core.SCMProvider,
    25  	scmService core.SCMService,
    26  	session core.Session,
    27  ) gin.HandlerFunc {
    28  	return func(c *gin.Context) {
    29  		if !c.GetBool(keyLogin) {
    30  			return
    31  		}
    32  		ctx := c.Request.Context()
    33  		client, err := scmService.Client(scm)
    34  		if err != nil {
    35  			c.String(500, err.Error())
    36  			return
    37  		}
    38  		token := TokenFrom(c)
    39  		user := session.GetUser(c)
    40  		if session.ShouldBindUser(c) {
    41  			user, err = client.Users().Bind(ctx, user, token)
    42  			session.EndBindUser(c)
    43  		} else {
    44  			user, err = createOrUpdateUser(ctx, client, token)
    45  		}
    46  
    47  		if err != nil {
    48  			log.Error(err)
    49  			c.String(400, err.Error())
    50  		}
    51  		if err := session.CreateUser(c, user); err != nil {
    52  			log.Error(err)
    53  			c.String(400, err.Error())
    54  			return
    55  		}
    56  		c.Redirect(301, config.Server.BaseURL())
    57  	}
    58  }
    59  
    60  func createOrUpdateUser(ctx context.Context, client core.Client, token *core.Token) (*core.User, error) {
    61  	user, err := client.Users().Find(ctx, token)
    62  	if err != nil {
    63  		user, err = client.Users().Create(ctx, token)
    64  	} else {
    65  		user, err = client.Users().Update(ctx, token)
    66  	}
    67  	return user, err
    68  }
    69  
    70  // MiddlewareLogin context
    71  func MiddlewareLogin(scm core.SCMProvider, m core.LoginMiddleware) gin.HandlerFunc {
    72  	return func(c *gin.Context) {
    73  		middleware := m.Handler(scm)
    74  		h := middleware.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    75  			ctx := r.Context()
    76  			err := login.ErrorFrom(ctx)
    77  			if err != nil {
    78  				c.Error(err)
    79  				c.Abort()
    80  				return
    81  			}
    82  			tok := login.TokenFrom(ctx)
    83  			c.Set(keyLogin, true)
    84  			c.Set(keyAccess, tok.Access)
    85  			c.Set(keyExpires, tok.Expires)
    86  			c.Set(keyRefresh, tok.Refresh)
    87  		}))
    88  		h.ServeHTTP(c.Writer, c.Request)
    89  	}
    90  }
    91  
    92  // MiddlewareBindUser handle bind user request
    93  func MiddlewareBindUser(session core.Session) gin.HandlerFunc {
    94  	return func(c *gin.Context) {
    95  		_, bind := c.GetQuery("bind")
    96  		if !bind {
    97  			return
    98  		}
    99  		user := session.GetUser(c)
   100  		if user.Login == "" {
   101  			c.String(401, "Unauthorized")
   102  			c.Abort()
   103  			return
   104  		}
   105  		session.StartBindUser(c)
   106  	}
   107  }