func SetUser() gin.HandlerFunc { return func(c *gin.Context) { var user *model.User t, err := token.ParseRequest(c.Request, func(t *token.Token) (string, error) { var err error user, err = store.GetUserLogin(c, t.Text) return user.Hash, err }) if err == nil { c.Set("user", user) // if this is a session token (ie not the API token) // this means the user is accessing with a web browser, // so we should implement CSRF protection measures. if t.Kind == token.SessToken { err = token.CheckCsrf(c.Request, func(t *token.Token) (string, error) { return user.Hash, nil }) // if csrf token validation fails, exit immediately // with a not authorized error. if err != nil { c.AbortWithStatus(http.StatusUnauthorized) return } } } c.Next() } }
func GetUser(c *gin.Context) { user, err := store.GetUserLogin(c, c.Param("user")) if err != nil { c.AbortWithStatus(http.StatusNotFound) return } c.JSON(http.StatusOK, user) }
func GetLogin(c *gin.Context) { remote := remote.FromContext(c) tmpUser, err := remote.Login(c.Writer, c.Request) if err != nil { log.Errorf("failed to authenticate user. %s", err) c.Redirect(http.StatusSeeOther, "/login?error=oauth_error") return } if tmpUser == nil { return } u, err := store.GetUserLogin(c, tmpUser.Login) if err != nil { count, err := store.CountUsers(c) if err != nil { log.Errorf("cannot register %s. %s", tmpUser.Login, err) c.Redirect(http.StatusSeeOther, "/login?error=internal_error") return } // if self-registration is disabled we should // return a notAuthorized error. the only exception // is if no users exist yet in the system we'll proceed. if count != 0 { log.Errorf("failed to register %s.", tmpUser.Login) c.Redirect(http.StatusSeeOther, "/login?error=access_denied") return } // create the user account u = &model.User{} u.Login = tmpUser.Login u.Hash = base32.StdEncoding.EncodeToString( securecookie.GenerateRandomKey(32), ) // insert the user into the database if err := store.CreateUser(c, u); err != nil { log.Errorf("failed to insert %s. %s", u.Login, err) c.Redirect(http.StatusSeeOther, "/login?error=internal_error") return } // if this is the first user, they // should be an admin. if count == 0 { u.Admin = true } } // update the user meta data and authorization // data and cache in the datastore. u.Token = tmpUser.Token if err := store.UpdateUser(c, u); err != nil { log.Errorf("failed to update %s. %s", u.Login, err) c.Redirect(http.StatusSeeOther, "/login?error=internal_error") return } exp := time.Now().Add(time.Hour * 72).Unix() token := token.New(token.SessToken, u.Login) tokenstr, err := token.SignExpires(u.Hash, exp) if err != nil { log.Errorf("failed to create token for %s. %s", u.Login, err) c.Redirect(http.StatusSeeOther, "/login?error=internal_error") return } httputil.SetCookie(c.Writer, c.Request, "user_sess", tokenstr) redirect := httputil.GetCookie(c.Request, "user_last") if len(redirect) == 0 { redirect = "/" } c.Redirect(http.StatusSeeOther, redirect) }