Skip to content

Commit

Permalink
feature: added offline support for infisical export
Browse files Browse the repository at this point in the history
  • Loading branch information
sheensantoscapadngan committed May 1, 2024
1 parent a1e8f45 commit 88a4fb8
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 50 deletions.
75 changes: 49 additions & 26 deletions cli/packages/cmd/export.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 != "" {
Expand All @@ -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
}

Expand All @@ -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 len(secrets) == 0 {
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)
}
if secretOverriding {
secrets = util.OverrideSecrets(secrets, util.SECRET_TYPE_PERSONAL)
} else {
secrets = util.OverrideSecrets(secrets, util.SECRET_TYPE_SHARED)
}

var output string
if shouldExpandSecrets {
if shouldExpandSecrets {

authParams := models.ExpandSecretsAuthentication{}
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 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.ExpandSecrets(secrets, authParams, "")
}
secrets = util.FilterSecretsByTag(secrets, tagSlugs)
secrets = util.SortSecretsByKeys(secrets)

if isUserSession {
util.WriteBackupSecrets(infisicalDotJson.WorkspaceId, environmentName, userBackupSecretsEncryptionKey, secrets)
}
}
secrets = util.FilterSecretsByTag(secrets, tagSlugs)
secrets = util.SortSecretsByKeys(secrets)

output, err = formatEnvs(secrets, format)
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))
},
}
Expand Down
13 changes: 1 addition & 12 deletions cli/packages/cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,6 @@ var runCmd = &cobra.Command{
util.HandleError(err)
}

isConnected := util.CheckIsConnectedToInfisicalAPI()

if projectConfigDir == "" {
projectConfig, err := util.GetWorkSpaceFromFile()
if err != nil {
Expand All @@ -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 {
Expand Down
13 changes: 1 addition & 12 deletions cli/packages/cmd/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,25 +105,14 @@ var secretsCmd = &cobra.Command{
util.HandleError(err)
}

isConnected := util.CheckIsConnectedToInfisicalAPI()

projectConfig, err := util.GetWorkSpaceFromFile()
if err != nil {
util.HandleError(err)
}

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 {
Expand Down
18 changes: 18 additions & 0 deletions cli/packages/util/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 88a4fb8

Please sign in to comment.