diff --git a/cli/go.mod b/cli/go.mod index 86b7df377..b8f5aa20e 100644 --- a/cli/go.mod +++ b/cli/go.mod @@ -22,7 +22,7 @@ require ( github.com/spf13/viper v1.8.1 github.com/stretchr/testify v1.8.1 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d - golang.org/x/term v0.9.0 + golang.org/x/term v0.11.0 ) require ( @@ -31,6 +31,7 @@ require ( github.com/chzyer/readline v1.5.1 // indirect github.com/danieljoos/wincred v1.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-openapi/errors v0.20.2 // indirect github.com/go-openapi/strfmt v0.21.3 // indirect @@ -41,6 +42,7 @@ require ( github.com/mattn/go-colorable v0.1.9 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/mtibben/percent v0.2.1 // indirect github.com/muesli/mango v0.1.0 // indirect github.com/muesli/mango-pflag v0.1.0 // indirect github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0 // indirect @@ -56,9 +58,8 @@ require ( go.mongodb.org/mongo-driver v1.10.0 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.9.0 // indirect + golang.org/x/sys v0.11.0 // indirect golang.org/x/text v0.7.0 // indirect - gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -73,3 +74,5 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/zalando/go-keyring v0.2.3 ) + +replace github.com/zalando/go-keyring => github.com/Infisical/go-keyring v1.0.1 diff --git a/cli/go.sum b/cli/go.sum index f35e9988d..114125554 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -39,6 +39,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Infisical/go-keyring v1.0.1 h1:E8XpqoT0H1G9C1kgxU+NeReXOeobmH7LbBHNpcOI380= +github.com/Infisical/go-keyring v1.0.1/go.mod h1:LWOnn/sw9FxDW/0VY+jHFAfOFEe03xmwBVSfJnBowto= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -77,6 +79,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -251,6 +255,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a h1:jlDOeO5TU0pYlbc/y6PFguab5IjANI0Knrpg3u/ton4= github.com/muesli/ansi v0.0.0-20221106050444-61f0cd9a192a/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI= @@ -348,8 +354,6 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms= -github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= @@ -524,11 +528,11 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/cli/internal/keyringwrapper.go b/cli/internal/keyringwrapper.go deleted file mode 100644 index de4eb317d..000000000 --- a/cli/internal/keyringwrapper.go +++ /dev/null @@ -1,68 +0,0 @@ -package keyringwrapper - -import ( - "time" - - "github.com/zalando/go-keyring" -) - -const MAIN_KEYRING_SERVICE = "infisical-cli" - -type TimeoutError struct { - message string -} - -func (e *TimeoutError) Error() string { - return e.message -} - -func Set(key, value string) error { - ch := make(chan error, 1) - go func() { - defer close(ch) - ch <- keyring.Set(MAIN_KEYRING_SERVICE, key, value) - }() - select { - case err := <-ch: - return err - case <-time.After(3 * time.Second): - return &TimeoutError{"timeout while trying to set secret in keyring"} - } -} - -func Get(key string) (string, error) { - ch := make(chan struct { - val string - err error - }, 1) - - go func() { - defer close(ch) - val, err := keyring.Get(MAIN_KEYRING_SERVICE, key) - ch <- struct { - val string - err error - }{val, err} - }() - - select { - case res := <-ch: - return res.val, res.err - case <-time.After(3 * time.Second): - return "", &TimeoutError{"timeout while trying to get secret from keyring"} - } -} - -func Delete(key string) error { - ch := make(chan error, 1) - go func() { - defer close(ch) - ch <- keyring.Delete(MAIN_KEYRING_SERVICE, key) - }() - select { - case err := <-ch: - return err - case <-time.After(3 * time.Second): - return &TimeoutError{"timeout while trying to delete secret from keyring"} - } -} diff --git a/cli/packages/cmd/login.go b/cli/packages/cmd/login.go index a2daf90dd..66d251dc9 100644 --- a/cli/packages/cmd/login.go +++ b/cli/packages/cmd/login.go @@ -107,7 +107,7 @@ var loginCmd = &cobra.Command{ //call browser login function if !interactiveLogin { - fmt.Printf("\nLogging in via browser... Hit '%s' to cancel\n", QUIT_BROWSER_LOGIN) + fmt.Println("Logging in via browser... To login via interactive mode run [infisical login -i]") userCredentialsToBeStored, err = browserCliLogin() if err != nil { //default to cli login on error @@ -540,7 +540,12 @@ func browserCliLogin() (models.UserCredentials, error) { quit := make(chan bool) //terminal state - var oldState term.State + oldState, err := term.GetState(int(os.Stdin.Fd())) + if err != nil { + return models.UserCredentials{}, err + } + + defer restoreTerminal(oldState) //create handler c := cors.New(cors.Options{ @@ -553,29 +558,25 @@ func browserCliLogin() (models.UserCredentials, error) { corsHandler := c.Handler(browserLoginHandler(success, failure)) log.Debug().Msgf("Callback server listening on port %d", callbackPort) - go quitBrowserLogin(quit, &oldState) + go http.Serve(listener, corsHandler) for { select { case loginResponse := <-success: - err = closeListener(&listener) - restoreTerminal(&oldState) + _ = closeListener(&listener) return loginResponse, nil - case err = <-failure: + case <-failure: err = closeListener(&listener) - restoreTerminal(&oldState) return models.UserCredentials{}, err - case _ = <-timeout: - err = closeListener(&listener) - restoreTerminal(&oldState) + case <-timeout: + _ = closeListener(&listener) return models.UserCredentials{}, errors.New("server timeout") - case _ = <-quit: + case <-quit: return models.UserCredentials{}, errors.New("quitting browser login, defaulting to cli...") - } } } @@ -584,25 +585,24 @@ func restoreTerminal(oldState *term.State) { term.Restore(int(os.Stdin.Fd()), oldState) } -// listens to 'q' input on terminal and -// sends 'true' to 'quit' channel -func quitBrowserLogin(quit chan bool, oState *term.State) { - // - oldState, err := term.MakeRaw(int(os.Stdin.Fd())) - if err != nil { - return - } - *oState = *oldState - defer restoreTerminal(oldState) - b := make([]byte, 1) - for { - _, _ = os.Stdin.Read(b) - if string(b) == QUIT_BROWSER_LOGIN { - quit <- true - break - } - } -} +// // listens to 'q' input on terminal and +// // sends 'true' to 'quit' channel +// func quitBrowserLogin(quit chan bool, oState *term.State) { +// oldState, err := term.MakeRaw(int(os.Stdin.Fd())) +// if err != nil { +// return +// } +// *oState = *oldState +// defer restoreTerminal(oldState) +// b := make([]byte, 1) +// for { +// _, _ = os.Stdin.Read(b) +// if string(b) == QUIT_BROWSER_LOGIN { +// quit <- true +// break +// } +// } +// } func closeListener(listener *net.Listener) error { err := (*listener).Close() diff --git a/cli/packages/cmd/reset.go b/cli/packages/cmd/reset.go index 9ea1f36bb..dcc8cebe4 100644 --- a/cli/packages/cmd/reset.go +++ b/cli/packages/cmd/reset.go @@ -18,6 +18,12 @@ var resetCmd = &cobra.Command{ Example: "infisical reset", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { + // delete keyring item of current logged in user + configFile, _ := util.GetConfigFile() + + // delete from keyring + util.DeleteValueInKeyring(configFile.LoggedInUserEmail) + // delete config _, pathToDir, err := util.GetFullConfigFilePath() if err != nil { diff --git a/cli/packages/cmd/vault.go b/cli/packages/cmd/vault.go new file mode 100644 index 000000000..01bee147b --- /dev/null +++ b/cli/packages/cmd/vault.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2023 Infisical Inc. +*/ +package cmd + +import ( + "fmt" + "strings" + + "github.com/Infisical/infisical-merge/packages/util" + "github.com/posthog/posthog-go" + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" +) + +var AvailableVaultsAndDescriptions = []string{"auto (automatically select native vault on system)", "file (encrypted file vault)"} +var AvailableVaults = []string{"auto", "file"} + +var vaultSetCmd = &cobra.Command{ + Example: `infisical vault set pass`, + Use: "set [vault-name]", + Short: "Used to set the vault backend to store your login details securely at rest", + DisableFlagsInUseLine: true, + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + wantedVaultTypeName := args[0] + currentVaultBackend, err := util.GetCurrentVaultBackend() + if err != nil { + log.Error().Msgf("Unable to set vault to [%s] because of [err=%s]", wantedVaultTypeName, err) + return + } + + if wantedVaultTypeName == string(currentVaultBackend) { + log.Error().Msgf("You are already on vault backend [%s]", currentVaultBackend) + return + } + + if wantedVaultTypeName == "auto" || wantedVaultTypeName == "file" { + configFile, err := util.GetConfigFile() + if err != nil { + log.Error().Msgf("Unable to set vault to [%s] because of [err=%s]", wantedVaultTypeName, err) + return + } + + configFile.VaultBackendType = wantedVaultTypeName // save selected vault + configFile.LoggedInUserEmail = "" // reset the logged in user to prompt them to re login + + err = util.WriteConfigFile(&configFile) + if err != nil { + log.Error().Msgf("Unable to set vault to [%s] because an error occurred when saving the config file [err=%s]", wantedVaultTypeName, err) + return + } + + fmt.Printf("\nSuccessfully, switched vault backend from [%s] to [%s]. Please login in again to store your login details in the new vault with [infisical login]\n", currentVaultBackend, wantedVaultTypeName) + + Telemetry.CaptureEvent("cli-command:vault set", posthog.NewProperties().Set("currentVault", currentVaultBackend).Set("wantedVault", wantedVaultTypeName).Set("version", util.CLI_VERSION)) + } 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, ", ")) + } + }, +} + +// 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() { + vaultCmd.AddCommand(vaultSetCmd) + rootCmd.AddCommand(vaultCmd) +} diff --git a/cli/packages/models/cli.go b/cli/packages/models/cli.go index d71981876..8e012a86f 100644 --- a/cli/packages/models/cli.go +++ b/cli/packages/models/cli.go @@ -12,6 +12,7 @@ type ConfigFile struct { LoggedInUserEmail string `json:"loggedInUserEmail"` LoggedInUserDomain string `json:"LoggedInUserDomain,omitempty"` LoggedInUsers []LoggedInUser `json:"loggedInUsers,omitempty"` + VaultBackendType string `json:"vaultBackendType,omitempty"` } type LoggedInUser struct { diff --git a/cli/packages/util/config.go b/cli/packages/util/config.go index 37d522efb..842544d77 100644 --- a/cli/packages/util/config.go +++ b/cli/packages/util/config.go @@ -53,6 +53,7 @@ func WriteInitalConfig(userCredentials *models.UserCredentials) error { LoggedInUserEmail: userCredentials.Email, LoggedInUserDomain: config.INFISICAL_URL, LoggedInUsers: existingConfigFile.LoggedInUsers, + VaultBackendType: existingConfigFile.VaultBackendType, } configFileMarshalled, err := json.Marshal(configFile) diff --git a/cli/packages/util/credentials.go b/cli/packages/util/credentials.go index 718cc4831..af63aa917 100644 --- a/cli/packages/util/credentials.go +++ b/cli/packages/util/credentials.go @@ -6,7 +6,6 @@ import ( "fmt" "strings" - keyringwrapper "github.com/Infisical/infisical-merge/internal" "github.com/Infisical/infisical-merge/packages/api" "github.com/Infisical/infisical-merge/packages/config" "github.com/Infisical/infisical-merge/packages/models" @@ -26,7 +25,7 @@ func StoreUserCredsInKeyRing(userCred *models.UserCredentials) error { return fmt.Errorf("StoreUserCredsInKeyRing: something went wrong when marshalling user creds [err=%s]", err) } - err = keyringwrapper.Set(userCred.Email, string(userCredMarshalled)) + err = SetValueInKeyring(userCred.Email, string(userCredMarshalled)) if err != nil { return fmt.Errorf("StoreUserCredsInKeyRing: unable to store user credentials because [err=%s]", err) } @@ -35,7 +34,7 @@ func StoreUserCredsInKeyRing(userCred *models.UserCredentials) error { } func GetUserCredsFromKeyRing(userEmail string) (credentials models.UserCredentials, err error) { - credentialsValue, err := keyringwrapper.Get(userEmail) + credentialsValue, err := GetValueInKeyring(userEmail) if err != nil { if err == keyring.ErrUnsupportedPlatform { return models.UserCredentials{}, errors.New("your OS does not support keyring. Consider using a service token https://infisical.com/docs/documentation/platform/token") diff --git a/cli/packages/util/keyringwrapper.go b/cli/packages/util/keyringwrapper.go new file mode 100644 index 000000000..3bf2dd6c4 --- /dev/null +++ b/cli/packages/util/keyringwrapper.go @@ -0,0 +1,42 @@ +package util + +import ( + "github.com/zalando/go-keyring" +) + +const MAIN_KEYRING_SERVICE = "infisical-cli" + +type TimeoutError struct { + message string +} + +func (e *TimeoutError) Error() string { + return e.message +} + +func SetValueInKeyring(key, value string) error { + currentVaultBackend, err := GetCurrentVaultBackend() + if err != nil { + PrintErrorAndExit(1, err, "Unable to get current vault. Tip: run [infisical rest] then try again") + } + + return keyring.Set(currentVaultBackend, MAIN_KEYRING_SERVICE, key, value) +} + +func GetValueInKeyring(key string) (string, error) { + currentVaultBackend, err := GetCurrentVaultBackend() + if err != nil { + PrintErrorAndExit(1, err, "Unable to get current vault. Tip: run [infisical rest] then try again") + } + + return keyring.Get(currentVaultBackend, MAIN_KEYRING_SERVICE, key) +} + +func DeleteValueInKeyring(key string) error { + currentVaultBackend, err := GetCurrentVaultBackend() + if err != nil { + return err + } + + return keyring.Delete(currentVaultBackend, MAIN_KEYRING_SERVICE, key) +} diff --git a/cli/packages/util/vault.go b/cli/packages/util/vault.go new file mode 100644 index 000000000..14d6d10d9 --- /dev/null +++ b/cli/packages/util/vault.go @@ -0,0 +1,22 @@ +package util + +import ( + "fmt" +) + +func GetCurrentVaultBackend() (string, error) { + configFile, err := GetConfigFile() + if err != nil { + return "", fmt.Errorf("getCurrentVaultBackend: unable to get config file [err=%s]", err) + } + + if configFile.VaultBackendType == "" { + return "auto", nil + } + + if configFile.VaultBackendType != "auto" && configFile.VaultBackendType != "file" { + return "auto", nil + } + + return configFile.VaultBackendType, nil +}