From 88a4fb84e66c5a68d7e6c9819f59c48713a060a5 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 2 May 2024 03:21:20 +0800 Subject: [PATCH] feature: added offline support for infisical export --- cli/packages/cmd/export.go | 83 +++++++++++++++++++++++------------- cli/packages/cmd/run.go | 13 +----- cli/packages/cmd/secrets.go | 13 +----- cli/packages/util/secrets.go | 18 ++++++++ 4 files changed, 73 insertions(+), 54 deletions(-) diff --git a/cli/packages/cmd/export.go b/cli/packages/cmd/export.go index 983c19255..271509b0c 100644 --- a/cli/packages/cmd/export.go +++ b/cli/packages/cmd/export.go @@ -93,10 +93,33 @@ var exportCmd = &cobra.Command{ IncludeImport: includeImports, } + + var secrets []models.SingleEnvironmentVariable + var isUserSession bool + var infisicalDotJson models.WorkspaceConfigFile + var userBackupSecretsEncryptionKey []byte + var loggedInUserDetails util.LoggedInUserDetails + if token != nil && token.Type == util.SERVICE_TOKEN_IDENTIFIER { request.InfisicalToken = token.Token } else if token != nil && token.Type == util.UNIVERSAL_AUTH_TOKEN_IDENTIFIER { request.UniversalAuthAccessToken = token.Token + } else { + isUserSession = true + loggedInUserDetails, err = util.GetCurrentLoggedInUserDetails() + if err != nil { + util.HandleError(err) + } + + projectConfig, err := util.GetWorkSpaceFromFile() + if err != nil { + util.HandleError(err) + } + + infisicalDotJson = projectConfig + + userBackupSecretsEncryptionKey = []byte(loggedInUserDetails.UserCredentials.PrivateKey)[0:32] + secrets = util.GetBackupSecretsIfDisconnected(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey) } if templatePath != "" { @@ -109,10 +132,6 @@ var exportCmd = &cobra.Command{ accessToken = token.Token } else { log.Debug().Msg("GetAllEnvironmentVariables: Trying to fetch secrets using logged in details") - loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails() - if err != nil { - util.HandleError(err) - } accessToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -124,40 +143,44 @@ var exportCmd = &cobra.Command{ return } - secrets, err := util.GetAllEnvironmentVariables(request, "") - if err != nil { - util.HandleError(err, "Unable to fetch secrets") - } - - if secretOverriding { - secrets = util.OverrideSecrets(secrets, util.SECRET_TYPE_PERSONAL) - } else { - secrets = util.OverrideSecrets(secrets, util.SECRET_TYPE_SHARED) - } - - var output string - if shouldExpandSecrets { - - authParams := models.ExpandSecretsAuthentication{} - - if token != nil && token.Type == util.SERVICE_TOKEN_IDENTIFIER { - authParams.InfisicalToken = token.Token - } else if token != nil && token.Type == util.UNIVERSAL_AUTH_TOKEN_IDENTIFIER { - authParams.UniversalAuthAccessToken = token.Token + if len(secrets) == 0 { + secrets, err = util.GetAllEnvironmentVariables(request, "") + if err != nil { + util.HandleError(err, "Unable to fetch secrets") } - secrets = util.ExpandSecrets(secrets, authParams, "") - } - secrets = util.FilterSecretsByTag(secrets, tagSlugs) - secrets = util.SortSecretsByKeys(secrets) + if secretOverriding { + secrets = util.OverrideSecrets(secrets, util.SECRET_TYPE_PERSONAL) + } else { + secrets = util.OverrideSecrets(secrets, util.SECRET_TYPE_SHARED) + } - output, err = formatEnvs(secrets, format) + if shouldExpandSecrets { + + authParams := models.ExpandSecretsAuthentication{} + + if token != nil && token.Type == util.SERVICE_TOKEN_IDENTIFIER { + authParams.InfisicalToken = token.Token + } else if token != nil && token.Type == util.UNIVERSAL_AUTH_TOKEN_IDENTIFIER { + authParams.UniversalAuthAccessToken = token.Token + } + + secrets = util.ExpandSecrets(secrets, authParams, "") + } + secrets = util.FilterSecretsByTag(secrets, tagSlugs) + secrets = util.SortSecretsByKeys(secrets) + + if isUserSession { + util.WriteBackupSecrets(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey, secrets) + } + } + + output, err := formatEnvs(secrets, format) if err != nil { util.HandleError(err) } fmt.Print(output) - // Telemetry.CaptureEvent("cli-command:export", posthog.NewProperties().Set("secretsCount", len(secrets)).Set("version", util.CLI_VERSION)) }, } diff --git a/cli/packages/cmd/run.go b/cli/packages/cmd/run.go index 58088f5d3..0770a8556 100644 --- a/cli/packages/cmd/run.go +++ b/cli/packages/cmd/run.go @@ -133,8 +133,6 @@ var runCmd = &cobra.Command{ util.HandleError(err) } - isConnected := util.CheckIsConnectedToInfisicalAPI() - if projectConfigDir == "" { projectConfig, err := util.GetWorkSpaceFromFile() if err != nil { @@ -152,16 +150,7 @@ var runCmd = &cobra.Command{ } userBackupSecretsEncryptionKey = []byte(loggedInUserDetails.UserCredentials.PrivateKey)[0:32] - - if !isConnected { - secrets, err = util.ReadBackupSecrets(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey) - if err != nil { - util.HandleError(err) - } - if len(secrets) > 0 { - util.PrintWarning("Unable to fetch latest secret(s) due to connection error, serving secrets from last successful fetch. For more info, run with --debug") - } - } + secrets = util.GetBackupSecretsIfDisconnected(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey) } if len(secrets) == 0 { diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index 0a800580f..cd31d05e9 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -105,8 +105,6 @@ var secretsCmd = &cobra.Command{ util.HandleError(err) } - isConnected := util.CheckIsConnectedToInfisicalAPI() - projectConfig, err := util.GetWorkSpaceFromFile() if err != nil { util.HandleError(err) @@ -114,16 +112,7 @@ var secretsCmd = &cobra.Command{ infisicalDotJson = projectConfig userBackupSecretsEncryptionKey = []byte(loggedInUserDetails.UserCredentials.PrivateKey)[0:32] - - if !isConnected { - secrets, err = util.ReadBackupSecrets(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey) - if err != nil { - util.HandleError(err) - } - if len(secrets) > 0 { - util.PrintWarning("Unable to fetch latest secret(s) due to connection error, serving secrets from last successful fetch. For more info, run with --debug") - } - } + secrets = util.GetBackupSecretsIfDisconnected(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey) } if len(secrets) == 0 { diff --git a/cli/packages/util/secrets.go b/cli/packages/util/secrets.go index 2e9b0ffd2..e97dda9b0 100644 --- a/cli/packages/util/secrets.go +++ b/cli/packages/util/secrets.go @@ -426,6 +426,24 @@ func getSecretsByKeys(secrets []models.SingleEnvironmentVariable) map[string]mod return secretMapByName } +func GetBackupSecretsIfDisconnected(workspaceId string, environment string, encryptionKey []byte) ([]models.SingleEnvironmentVariable) { + isConnected := CheckIsConnectedToInfisicalAPI() + + if !isConnected { + secrets, err := ReadBackupSecrets(workspaceId, environment, encryptionKey) + if err != nil { + HandleError(err) + } + if len(secrets) > 0 { + PrintWarning("Unable to fetch latest secret(s) due to connection error, serving secrets from last successful fetch. For more info, run with --debug") + } + + return secrets + } + + return nil +} + func ExpandSecrets(secrets []models.SingleEnvironmentVariable, auth models.ExpandSecretsAuthentication, projectConfigPathDir string) []models.SingleEnvironmentVariable { expandedSecs := make(map[string]string) interpolatedSecs := make(map[string]string)