gateway: move user la and login validation to command layer

This commit is contained in:
Simone Gotti 2019-03-29 14:33:41 +01:00
parent 75b5b65da3
commit 3e3a7a0ea5
4 changed files with 54 additions and 74 deletions

View File

@ -15,11 +15,7 @@
package cmd
import (
"bufio"
"context"
"fmt"
"os"
"strings"
"github.com/pkg/errors"
"github.com/sorintlab/agola/internal/services/gateway/api"
@ -75,24 +71,10 @@ func userLACreate(cmd *cobra.Command, args []string) error {
return errors.Wrapf(err, "failed to create linked account")
}
if resp.Oauth2Redirect != "" {
log.Infof("visit %s", resp.Oauth2Redirect)
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter code: ")
code, _ := reader.ReadString('\n')
code = strings.TrimSpace(code)
log.Infof("code: %s", code)
req := &api.CreateUserLARequest{
RemoteSourceName: userLACreateOpts.remoteSourceName,
}
resp, _, err = gwclient.CreateUserLA(context.TODO(), userLACreateOpts.username, req)
if err != nil {
return errors.Wrapf(err, "failed to create linked account")
}
log.Infof("visit %s to continue", resp.Oauth2Redirect)
} else {
log.Infof("linked account for user %q created, ID: %s", userLACreateOpts.username, resp.LinkedAccount.ID)
}
log.Infof("linked account for user %q created, ID: %s", userLACreateOpts.username, resp.LinkedAccount.ID)
return nil
}

View File

@ -23,11 +23,9 @@ import (
csapi "github.com/sorintlab/agola/internal/services/configstore/api"
"github.com/sorintlab/agola/internal/services/gateway/command"
"github.com/sorintlab/agola/internal/services/types"
"github.com/sorintlab/agola/internal/util"
"go.uber.org/zap"
"github.com/gorilla/mux"
"github.com/pkg/errors"
)
type CreateUserRequest struct {
@ -35,13 +33,12 @@ type CreateUserRequest struct {
}
type CreateUserHandler struct {
log *zap.SugaredLogger
ch *command.CommandHandler
configstoreClient *csapi.Client
log *zap.SugaredLogger
ch *command.CommandHandler
}
func NewCreateUserHandler(logger *zap.Logger, ch *command.CommandHandler, configstoreClient *csapi.Client) *CreateUserHandler {
return &CreateUserHandler{log: logger.Sugar(), ch: ch, configstoreClient: configstoreClient}
func NewCreateUserHandler(logger *zap.Logger, ch *command.CommandHandler) *CreateUserHandler {
return &CreateUserHandler{log: logger.Sugar(), ch: ch}
}
func (h *CreateUserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@ -279,13 +276,12 @@ type CreateUserLAResponse struct {
}
type CreateUserLAHandler struct {
log *zap.SugaredLogger
ch *command.CommandHandler
configstoreClient *csapi.Client
log *zap.SugaredLogger
ch *command.CommandHandler
}
func NewCreateUserLAHandler(logger *zap.Logger, ch *command.CommandHandler, configstoreClient *csapi.Client) *CreateUserLAHandler {
return &CreateUserLAHandler{log: logger.Sugar(), ch: ch, configstoreClient: configstoreClient}
func NewCreateUserLAHandler(logger *zap.Logger, ch *command.CommandHandler) *CreateUserLAHandler {
return &CreateUserLAHandler{log: logger.Sugar(), ch: ch}
}
func (h *CreateUserLAHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@ -315,35 +311,13 @@ func (h *CreateUserLAHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
}
func (h *CreateUserLAHandler) createUserLA(ctx context.Context, userName string, req *CreateUserLARequest) (*CreateUserLAResponse, error) {
remoteSourceName := req.RemoteSourceName
user, _, err := h.configstoreClient.GetUserByName(ctx, userName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get user %q", userName)
}
rs, _, err := h.configstoreClient.GetRemoteSourceByName(ctx, remoteSourceName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get remote source %q", remoteSourceName)
}
h.log.Infof("rs: %s", util.Dump(rs))
var la *types.LinkedAccount
for _, v := range user.LinkedAccounts {
if v.RemoteSourceID == rs.ID {
la = v
break
}
}
h.log.Infof("la: %s", util.Dump(la))
if la != nil {
return nil, errors.Errorf("user %q already have a linked account for remote source %q", userName, rs.Name)
}
creq := &command.CreateUserLARequest{
UserName: userName,
RemoteSourceName: rs.Name,
RemoteSourceName: req.RemoteSourceName,
}
h.log.Infof("creating linked account")
cresp, err := h.ch.HandleRemoteSourceAuth(ctx, rs, req.RemoteSourceLoginName, req.RemoteSourceLoginPassword, "createuserla", creq)
cresp, err := h.ch.HandleRemoteSourceAuth(ctx, req.RemoteSourceName, req.RemoteSourceLoginName, req.RemoteSourceLoginPassword, "createuserla", creq)
if err != nil {
return nil, err
}
@ -446,13 +420,12 @@ type LoginUserResponse struct {
}
type LoginUserHandler struct {
log *zap.SugaredLogger
ch *command.CommandHandler
configstoreClient *csapi.Client
log *zap.SugaredLogger
ch *command.CommandHandler
}
func NewLoginUserHandler(logger *zap.Logger, ch *command.CommandHandler, configstoreClient *csapi.Client) *LoginUserHandler {
return &LoginUserHandler{log: logger.Sugar(), ch: ch, configstoreClient: configstoreClient}
func NewLoginUserHandler(logger *zap.Logger, ch *command.CommandHandler) *LoginUserHandler {
return &LoginUserHandler{log: logger.Sugar(), ch: ch}
}
func (h *LoginUserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@ -480,19 +453,13 @@ func (h *LoginUserHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
func (h *LoginUserHandler) loginUser(ctx context.Context, req *LoginUserRequest) (*LoginUserResponse, error) {
remoteSourceName := req.RemoteSourceName
rs, _, err := h.configstoreClient.GetRemoteSourceByName(ctx, remoteSourceName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get remote source %q", remoteSourceName)
}
h.log.Infof("rs: %s", util.Dump(rs))
creq := &command.LoginUserRequest{
RemoteSourceName: rs.Name,
RemoteSourceName: req.RemoteSourceName,
}
h.log.Infof("logging in user")
cresp, err := h.ch.HandleRemoteSourceAuth(ctx, rs, req.LoginName, req.LoginPassword, "loginuser", creq)
cresp, err := h.ch.HandleRemoteSourceAuth(ctx, req.RemoteSourceName, req.LoginName, req.LoginPassword, "loginuser", creq)
if err != nil {
return nil, err
}

View File

@ -213,7 +213,38 @@ type RemoteSourceAuthResponse struct {
Response interface{}
}
func (c *CommandHandler) HandleRemoteSourceAuth(ctx context.Context, rs *types.RemoteSource, loginName, loginPassword, requestType string, req interface{}) (*RemoteSourceAuthResponse, error) {
func (c *CommandHandler) HandleRemoteSourceAuth(ctx context.Context, remoteSourceName, loginName, loginPassword, requestType string, req interface{}) (*RemoteSourceAuthResponse, error) {
rs, _, err := c.configstoreClient.GetRemoteSourceByName(ctx, remoteSourceName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get remote source %q", remoteSourceName)
}
c.log.Infof("rs: %s", util.Dump(rs))
switch requestType {
case "createuserla":
req := req.(*CreateUserLARequest)
user, _, err := c.configstoreClient.GetUserByName(ctx, req.UserName)
if err != nil {
return nil, errors.Wrapf(err, "failed to get user %q", req.UserName)
}
var la *types.LinkedAccount
for _, v := range user.LinkedAccounts {
if v.RemoteSourceID == rs.ID {
la = v
break
}
}
c.log.Infof("la: %s", util.Dump(la))
if la != nil {
return nil, errors.Errorf("user %q already have a linked account for remote source %q", req.UserName, rs.Name)
}
case "loginuser":
default:
return nil, errors.Errorf("unknown request type: %q", requestType)
}
switch rs.AuthType {
case types.RemoteSourceAuthTypeOauth2:
oauth2Source, err := common.GetOauth2Source(rs, "")

View File

@ -165,10 +165,10 @@ func (g *Gateway) Run(ctx context.Context) error {
userHandler := api.NewUserHandler(logger, g.configstoreClient)
userByNameHandler := api.NewUserByNameHandler(logger, g.configstoreClient)
usersHandler := api.NewUsersHandler(logger, g.configstoreClient)
createUserHandler := api.NewCreateUserHandler(logger, g.ch, g.configstoreClient)
createUserHandler := api.NewCreateUserHandler(logger, g.ch)
deleteUserHandler := api.NewDeleteUserHandler(logger, g.configstoreClient)
createUserLAHandler := api.NewCreateUserLAHandler(logger, g.ch, g.configstoreClient)
createUserLAHandler := api.NewCreateUserLAHandler(logger, g.ch)
deleteUserLAHandler := api.NewDeleteUserLAHandler(logger, g.configstoreClient)
createUserTokenHandler := api.NewCreateUserTokenHandler(logger, g.configstoreClient)
@ -191,7 +191,7 @@ func (g *Gateway) Run(ctx context.Context) error {
reposHandler := api.NewReposHandler(logger, g.configstoreClient)
loginUserHandler := api.NewLoginUserHandler(logger, g.ch, g.configstoreClient)
loginUserHandler := api.NewLoginUserHandler(logger, g.ch)
oauth2callbackHandler := api.NewOAuth2CallbackHandler(logger, g.ch, g.configstoreClient)
router := mux.NewRouter()