From 3e3a7a0ea5148cc0ec6a737f3c1cc2b8ce1f2aa9 Mon Sep 17 00:00:00 2001 From: Simone Gotti Date: Fri, 29 Mar 2019 14:33:41 +0100 Subject: [PATCH] gateway: move user la and login validation to command layer --- cmd/agola/cmd/userlacreate.go | 24 ++------- internal/services/gateway/api/user.go | 65 ++++++----------------- internal/services/gateway/command/user.go | 33 +++++++++++- internal/services/gateway/gateway.go | 6 +-- 4 files changed, 54 insertions(+), 74 deletions(-) diff --git a/cmd/agola/cmd/userlacreate.go b/cmd/agola/cmd/userlacreate.go index 2efa58b..6dec20b 100644 --- a/cmd/agola/cmd/userlacreate.go +++ b/cmd/agola/cmd/userlacreate.go @@ -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 } diff --git a/internal/services/gateway/api/user.go b/internal/services/gateway/api/user.go index ef71eed..2477627 100644 --- a/internal/services/gateway/api/user.go +++ b/internal/services/gateway/api/user.go @@ -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 } diff --git a/internal/services/gateway/command/user.go b/internal/services/gateway/command/user.go index f0ce6b2..4b2cad1 100644 --- a/internal/services/gateway/command/user.go +++ b/internal/services/gateway/command/user.go @@ -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, "") diff --git a/internal/services/gateway/gateway.go b/internal/services/gateway/gateway.go index 88359b1..ecfafe2 100644 --- a/internal/services/gateway/gateway.go +++ b/internal/services/gateway/gateway.go @@ -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()