@@ -15,6 +15,9 @@ import (
15
15
"syscall"
16
16
"time"
17
17
18
+ "github.com/Infisical/infisical-merge/packages/api"
19
+ "github.com/go-resty/resty/v2"
20
+
18
21
"github.com/Infisical/infisical-merge/packages/models"
19
22
"github.com/Infisical/infisical-merge/packages/util"
20
23
"github.com/fatih/color"
@@ -59,11 +62,11 @@ var runCmd = &cobra.Command{
59
62
return nil
60
63
},
61
64
Run : func (cmd * cobra.Command , args []string ) {
62
- environmentName , _ := cmd .Flags ().GetString ("env" )
65
+ environmentSlug , _ := cmd .Flags ().GetString ("env" )
63
66
if ! cmd .Flags ().Changed ("env" ) {
64
67
environmentFromWorkspace := util .GetEnvFromWorkspaceFile ()
65
68
if environmentFromWorkspace != "" {
66
- environmentName = environmentFromWorkspace
69
+ environmentSlug = environmentFromWorkspace
67
70
}
68
71
}
69
72
@@ -136,8 +139,20 @@ var runCmd = &cobra.Command{
136
139
util .HandleError (err , "Unable to parse flag" )
137
140
}
138
141
142
+ log .Debug ().Msgf ("Confirming selected environment is valid: %s" , environmentSlug )
143
+
144
+ hasEnvironment , err := confirmProjectHasEnvironment (environmentSlug , projectId , token )
145
+ if err != nil {
146
+ util .HandleError (err , "Could not confirm project has environment" )
147
+ }
148
+ if ! hasEnvironment {
149
+ util .HandleError (fmt .Errorf ("project does not have environment '%s'" , environmentSlug ))
150
+ }
151
+
152
+ log .Debug ().Msgf ("Project '%s' has environment '%s'" , projectId , environmentSlug )
153
+
139
154
request := models.GetAllSecretsParameters {
140
- Environment : environmentName ,
155
+ Environment : environmentSlug ,
141
156
WorkspaceId : projectId ,
142
157
TagSlugs : tagSlugs ,
143
158
SecretsPath : secretsPath ,
@@ -308,7 +323,6 @@ func waitForExitCommand(cmd *exec.Cmd) (int, error) {
308
323
}
309
324
310
325
func executeCommandWithWatchMode (commandFlag string , args []string , watchModeInterval int , request models.GetAllSecretsParameters , projectConfigDir string , secretOverriding bool , token * models.TokenDetails ) {
311
-
312
326
var cmd * exec.Cmd
313
327
var err error
314
328
var lastSecretsFetch time.Time
@@ -439,8 +453,53 @@ func executeCommandWithWatchMode(commandFlag string, args []string, watchModeInt
439
453
}
440
454
}
441
455
442
- func fetchAndFormatSecretsForShell (request models.GetAllSecretsParameters , projectConfigDir string , secretOverriding bool , token * models.TokenDetails ) (models.InjectableEnvironmentResult , error ) {
456
+ func confirmProjectHasEnvironment (environmentSlug , projectId string , token * models.TokenDetails ) (bool , error ) {
457
+ var accessToken string
458
+
459
+ if token != nil && (token .Type == util .SERVICE_TOKEN_IDENTIFIER || token .Type == util .UNIVERSAL_AUTH_TOKEN_IDENTIFIER ) {
460
+ accessToken = token .Token
461
+ } else {
462
+ util .RequireLogin ()
463
+ util .RequireLocalWorkspaceFile ()
464
+
465
+ loggedInUserDetails , err := util .GetCurrentLoggedInUserDetails (true )
466
+ if err != nil {
467
+ util .HandleError (err , "Unable to authenticate" )
468
+ }
443
469
470
+ if loggedInUserDetails .LoginExpired {
471
+ util .PrintErrorMessageAndExit ("Your login session has expired, please run [infisical login] and try again" )
472
+ }
473
+ accessToken = loggedInUserDetails .UserCredentials .JTWToken
474
+ }
475
+
476
+ if projectId == "" {
477
+ workspaceFile , err := util .GetWorkSpaceFromFile ()
478
+ if err != nil {
479
+ util .HandleError (err , "Unable to get local project details" )
480
+ }
481
+
482
+ projectId = workspaceFile .WorkspaceId
483
+ }
484
+
485
+ httpClient := resty .New ()
486
+ httpClient .SetAuthToken (accessToken ).
487
+ SetHeader ("Accept" , "application/json" )
488
+
489
+ project , err := api .CallGetProjectById (httpClient , projectId )
490
+ if err != nil {
491
+ return false , err
492
+ }
493
+
494
+ for _ , env := range project .Environments {
495
+ if env .Slug == environmentSlug {
496
+ return true , nil
497
+ }
498
+ }
499
+ return false , nil
500
+ }
501
+
502
+ func fetchAndFormatSecretsForShell (request models.GetAllSecretsParameters , projectConfigDir string , secretOverriding bool , token * models.TokenDetails ) (models.InjectableEnvironmentResult , error ) {
444
503
if token != nil && token .Type == util .SERVICE_TOKEN_IDENTIFIER {
445
504
request .InfisicalToken = token .Token
446
505
} else if token != nil && token .Type == util .UNIVERSAL_AUTH_TOKEN_IDENTIFIER {
0 commit comments