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 }