feat(cli): set persistent file vault password

This commit is contained in:
Daniel Hougaard
2024-07-26 22:47:37 +02:00
parent c3038e3ca1
commit e619cfa313
+105 -47
View File
@@ -9,28 +9,100 @@ import (
"strings" "strings"
"github.com/Infisical/infisical-merge/packages/util" "github.com/Infisical/infisical-merge/packages/util"
"github.com/manifoldco/promptui"
"github.com/posthog/posthog-go" "github.com/posthog/posthog-go"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var AvailableVaultsAndDescriptions = []string{"auto (automatically select native vault on system)", "file (encrypted file vault)"} type VaultBackendType struct {
var AvailableVaults = []string{"auto", "file"} Name string
Description string
}
var vaultSetPassphraseCmd = &cobra.Command{ var AvailableVaults = []VaultBackendType{
Example: `infisical vault set-passphrase [your-passphrase]`, {
Use: "set-passphrase [your-passphrase]", Name: "auto",
Short: "Used to set the passphrase for the file vault", Description: "automatically select native vault on system",
},
{
Name: "file",
Description: "encrypted file vault",
},
}
var vaultSetCmd = &cobra.Command{
Example: `infisical vault set [file|auto] [option]`,
Use: "set [file|auto] [option]",
Short: "Used to set the type of vault backend to store your login details securely at rest",
Long: "Used to set the type of vault backend to store your login details securely at rest",
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if len(args) != 1 {
log.Error().Msgf("Please provide a passphrase to set for the file vault") if len(args) >= 2 {
vaultType := args[0]
option := args[1]
// Todo, add more vault types / configurations
if vaultType != util.VAULT_BACKEND_FILE_MODE {
log.Error().Msgf("No configuration options are available for vault type [%s]\n", vaultType)
return return
} }
passphrase := args[0] switch option {
case "passphrase":
{
passphrasePrompt := promptui.Prompt{
Label: "File vault passphrase",
}
passphrase, err := passphrasePrompt.Run()
if err != nil {
log.Error().Msgf("Unable to set passphrase for file vault because of [err=%s]", err)
return
}
if passphrase == "" || len(passphrase) < 8 {
log.Error().Msgf("Passphrase must be at least 8 characters long")
return
}
setFileVaultPassphrase(passphrase)
}
default:
log.Error().Msgf("Unknown option [%s] for vault set command", option)
}
return
}
fmt.Printf("Warning: This command has been deprecated. Please use 'infisical vault use [file|auto]' to select which vault to use.\n")
selectVaultTypeCmd(cmd, args)
},
}
var vaultUseCmd = &cobra.Command{
Example: `infisical vault use [file|auto]`,
Use: "use [file|auto]",
Short: "Used to set the type of vault backend to store your login details securely at rest",
DisableFlagsInUseLine: true,
Args: cobra.MinimumNArgs(1),
Run: selectVaultTypeCmd,
}
// runCmd represents the run command
var vaultCmd = &cobra.Command{
Use: "vault",
Short: "Used to manage where your Infisical login token is saved on your machine",
DisableFlagsInUseLine: true,
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
printAvailableVaultBackends()
},
}
func setFileVaultPassphrase(passphrase string) {
configFile, err := util.GetConfigFile() configFile, err := util.GetConfigFile()
if err != nil { if err != nil {
log.Error().Msgf("Unable to set passphrase for file vault because of [err=%s]", err) log.Error().Msgf("Unable to set passphrase for file vault because of [err=%s]", err)
@@ -53,16 +125,25 @@ var vaultSetPassphraseCmd = &cobra.Command{
} }
fmt.Printf("\nSuccessfully, set passphrase for file vault. You can now store your login details securely at rest\n") fmt.Printf("\nSuccessfully, set passphrase for file vault. You can now store your login details securely at rest\n")
},
} }
var vaultSetCmd = &cobra.Command{ func printAvailableVaultBackends() {
Example: `infisical vault set [file|auto]`, fmt.Printf("Vaults are used to securely store your login details locally. Available vaults:")
Use: "set [file|auto]", for _, vaultType := range AvailableVaults {
Short: "Used to set the type of vault backend to store your login details securely at rest", fmt.Printf("\n- %s (%s)", vaultType.Name, vaultType.Description)
DisableFlagsInUseLine: true, }
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) { currentVaultBackend, err := util.GetCurrentVaultBackend()
if err != nil {
log.Error().Msgf("printAvailableVaultBackends: unable to print the available vault backend because of error [err=%s]", err)
}
Telemetry.CaptureEvent("cli-command:vault", posthog.NewProperties().Set("currentVault", currentVaultBackend).Set("version", util.CLI_VERSION))
fmt.Printf("\n\nYou are currently using [%s] vault to store your login credentials\n", string(currentVaultBackend))
}
func selectVaultTypeCmd(cmd *cobra.Command, args []string) {
wantedVaultTypeName := args[0] wantedVaultTypeName := args[0]
currentVaultBackend, err := util.GetCurrentVaultBackend() currentVaultBackend, err := util.GetCurrentVaultBackend()
if err != nil { if err != nil {
@@ -75,7 +156,7 @@ var vaultSetCmd = &cobra.Command{
return return
} }
if wantedVaultTypeName == "auto" || wantedVaultTypeName == "file" { if wantedVaultTypeName == util.VAULT_BACKEND_AUTO_MODE || wantedVaultTypeName == util.VAULT_BACKEND_FILE_MODE {
configFile, err := util.GetConfigFile() configFile, err := util.GetConfigFile()
if err != nil { if err != nil {
log.Error().Msgf("Unable to set vault to [%s] because of [err=%s]", wantedVaultTypeName, err) log.Error().Msgf("Unable to set vault to [%s] because of [err=%s]", wantedVaultTypeName, err)
@@ -95,40 +176,17 @@ var vaultSetCmd = &cobra.Command{
Telemetry.CaptureEvent("cli-command:vault set", posthog.NewProperties().Set("currentVault", currentVaultBackend).Set("wantedVault", wantedVaultTypeName).Set("version", util.CLI_VERSION)) Telemetry.CaptureEvent("cli-command:vault set", posthog.NewProperties().Set("currentVault", currentVaultBackend).Set("wantedVault", wantedVaultTypeName).Set("version", util.CLI_VERSION))
} else { } else {
log.Error().Msgf("The requested vault type [%s] is not available on this system. Only the following vault backends are available for you system: %s", wantedVaultTypeName, strings.Join(AvailableVaults, ", ")) var availableVaultsNames []string
for _, vault := range AvailableVaults {
availableVaultsNames = append(availableVaultsNames, vault.Name)
} }
}, log.Error().Msgf("The requested vault type [%s] is not available on this system. Only the following vault backends are available for you system: %s", wantedVaultTypeName, strings.Join(availableVaultsNames, ", "))
} }
// runCmd represents the run command
var vaultCmd = &cobra.Command{
Use: "vault",
Short: "Used to manage where your Infisical login token is saved on your machine",
DisableFlagsInUseLine: true,
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
printAvailableVaultBackends()
},
}
func printAvailableVaultBackends() {
fmt.Printf("Vaults are used to securely store your login details locally. Available vaults:")
for _, backend := range AvailableVaultsAndDescriptions {
fmt.Printf("\n- %s", backend)
}
currentVaultBackend, err := util.GetCurrentVaultBackend()
if err != nil {
log.Error().Msgf("printAvailableVaultBackends: unable to print the available vault backend because of error [err=%s]", err)
}
Telemetry.CaptureEvent("cli-command:vault", posthog.NewProperties().Set("currentVault", currentVaultBackend).Set("version", util.CLI_VERSION))
fmt.Printf("\n\nYou are currently using [%s] vault to store your login credentials\n", string(currentVaultBackend))
} }
func init() { func init() {
vaultCmd.AddCommand(vaultSetCmd) vaultCmd.AddCommand(vaultSetCmd)
vaultCmd.AddCommand(vaultSetPassphraseCmd) vaultCmd.AddCommand(vaultUseCmd)
rootCmd.AddCommand(vaultCmd) rootCmd.AddCommand(vaultCmd)
} }