From b82f8606a81199b30f246f96bd36b237f2b3daf9 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Fri, 10 Feb 2023 15:08:12 -0800 Subject: [PATCH] add ValidateEnvironmentName method --- cli/packages/api/api.go | 21 +++++++++++++++++++++ cli/packages/api/model.go | 12 ++++++++++++ cli/packages/cmd/run.go | 4 ---- cli/packages/util/secrets.go | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/cli/packages/api/api.go b/cli/packages/api/api.go index 7417a2594..37bd5f299 100644 --- a/cli/packages/api/api.go +++ b/cli/packages/api/api.go @@ -166,3 +166,24 @@ func CallIsAuthenticated(httpClient *resty.Client) bool { return true } + +func CallGetAccessibleEnvironments(httpClient *resty.Client, request GetAccessibleEnvironmentsRequest) (GetAccessibleEnvironmentsResponse, error) { + var accessibleEnvironmentsResponse GetAccessibleEnvironmentsResponse + response, err := httpClient. + R(). + SetResult(&accessibleEnvironmentsResponse). + SetHeader("User-Agent", USER_AGENT). + Get(fmt.Sprintf("%v/v2/workspace/%s/environments", config.INFISICAL_URL, request.WorkspaceId)) + + log.Debugln(fmt.Errorf("CallGetAccessibleEnvironments: Unsuccessful response: [response=%v]", response)) + + if err != nil { + return GetAccessibleEnvironmentsResponse{}, err + } + + if response.IsError() { + return GetAccessibleEnvironmentsResponse{}, fmt.Errorf("CallGetAccessibleEnvironments: Unsuccessful response: [response=%v]", response) + } + + return accessibleEnvironmentsResponse, nil +} diff --git a/cli/packages/api/model.go b/cli/packages/api/model.go index 8f929bf69..22f3e4c4a 100644 --- a/cli/packages/api/model.go +++ b/cli/packages/api/model.go @@ -250,3 +250,15 @@ type GetServiceTokenDetailsResponse struct { UpdatedAt time.Time `json:"updatedAt"` V int `json:"__v"` } + +type GetAccessibleEnvironmentsRequest struct { + WorkspaceId string `json:"workspaceId"` +} + +type GetAccessibleEnvironmentsResponse struct { + AccessibleEnvironments []struct { + Name string `json:"name"` + Slug string `json:"slug"` + IsWriteDenied bool `json:"isWriteDenied"` + } `json:"accessibleEnvironments"` +} diff --git a/cli/packages/cmd/run.go b/cli/packages/cmd/run.go index bd1be4300..265da0aba 100644 --- a/cli/packages/cmd/run.go +++ b/cli/packages/cmd/run.go @@ -64,10 +64,6 @@ var runCmd = &cobra.Command{ util.HandleError(err, "Unable to parse flag") } - // if !util.IsSecretEnvironmentValid(envName) { - // util.PrintMessageAndExit("Invalid environment name passed. Environment names can only be prod, dev, test or staging") - // } - secretOverriding, err := cmd.Flags().GetBool("secret-overriding") if err != nil { util.HandleError(err, "Unable to parse flag") diff --git a/cli/packages/util/secrets.go b/cli/packages/util/secrets.go index 7a4bc09db..5b4cd2480 100644 --- a/cli/packages/util/secrets.go +++ b/cli/packages/util/secrets.go @@ -130,6 +130,12 @@ func GetAllEnvironmentVariables(params models.GetAllSecretsParameters) ([]models return nil, err } + // Verify environment + err = ValidateEnvironmentName(params.Environment, workspaceFile.WorkspaceId, loggedInUserDetails.UserCredentials) + if err != nil { + return nil, fmt.Errorf("unable to validate environment name because [err=%s]", err) + } + secretsToReturn, errorToReturn = GetPlainTextSecretsViaJTW(loggedInUserDetails.UserCredentials.JTWToken, loggedInUserDetails.UserCredentials.PrivateKey, workspaceFile.WorkspaceId, params.Environment) log.Debugf("GetAllEnvironmentVariables: Trying to fetch secrets JTW token [err=%s]", errorToReturn) @@ -156,6 +162,33 @@ func GetAllEnvironmentVariables(params models.GetAllSecretsParameters) ([]models return secretsToReturn, errorToReturn } +func ValidateEnvironmentName(environmentName string, workspaceId string, userLoggedInDetails models.UserCredentials) error { + httpClient := resty.New() + httpClient.SetAuthToken(userLoggedInDetails.JTWToken). + SetHeader("Accept", "application/json") + + response, err := api.CallGetAccessibleEnvironments(httpClient, api.GetAccessibleEnvironmentsRequest{WorkspaceId: workspaceId}) + if err != nil { + return err + } + + listOfEnvSlugs := []string{} + mapOfEnvSlugs := make(map[string]interface{}) + + for _, environment := range response.AccessibleEnvironments { + listOfEnvSlugs = append(listOfEnvSlugs, environment.Slug) + mapOfEnvSlugs[environment.Slug] = environment + } + + _, exists := mapOfEnvSlugs[environmentName] + if !exists { + HandleError(fmt.Errorf("the environment [%s] does not exist in project with [id=%s]. Only [%s] are available", environmentName, workspaceId, strings.Join(listOfEnvSlugs, ","))) + } + + return nil + +} + func getExpandedEnvVariable(secrets []models.SingleEnvironmentVariable, variableWeAreLookingFor string, hashMapOfCompleteVariables map[string]string, hashMapOfSelfRefs map[string]string) string { if value, found := hashMapOfCompleteVariables[variableWeAreLookingFor]; found { return value