diff --git a/.github/workflows/release_build.yml b/.github/workflows/release_build.yml index 695b0ea24..c5fd9034f 100644 --- a/.github/workflows/release_build.yml +++ b/.github/workflows/release_build.yml @@ -13,7 +13,7 @@ permissions: jobs: goreleaser: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 with: @@ -24,6 +24,15 @@ jobs: go-version: '>=1.19.3' cache: true cache-dependency-path: cli/go.sum + - name: libssl1.1 => libssl1.0-dev for OSXCross + run: | + echo 'deb http://security.ubuntu.com/ubuntu bionic-security main' | sudo tee -a /etc/apt/sources.list + sudo apt update && apt-cache policy libssl1.0-dev + sudo apt-get install libssl1.0-dev + - name: OSXCross for CGO Support + run: | + mkdir ../../osxcross + git clone https://github.com/plentico/osxcross-target.git ../../osxcross/target - uses: goreleaser/goreleaser-action@v2 with: distribution: goreleaser diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 9ac38524b..5e94e0de6 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -7,12 +7,23 @@ # # you may remove this if you don't need go generate # - cd cli && go generate ./... builds: - - env: - - CGO_ENABLED=0 + - id: darwin-build binary: infisical - id: infisical + env: + - CGO_ENABLED=1 + - CC=/home/runner/work/osxcross/target/bin/o64-clang + - CXX=/home/runner/work/osxcross/target/bin/o64-clang++ goos: - darwin + ignore: + - goos: darwin + goarch: "386" + dir: ./cli + - id: all-other-builds + env: + - CGO_ENABLED=0 + binary: infisical + goos: - freebsd - linux - netbsd @@ -27,8 +38,6 @@ builds: - 6 - 7 ignore: - - goos: darwin - goarch: "386" - goos: windows goarch: "386" - goos: freebsd @@ -71,7 +80,7 @@ nfpms: - id: infisical package_name: infisical builds: - - infisical + - all-other-builds vendor: Infisical, Inc homepage: https://infisical.com/ maintainer: Infisical, Inc diff --git a/cli/packages/cmd/login.go b/cli/packages/cmd/login.go index 29e2c4935..9c0c22930 100644 --- a/cli/packages/cmd/login.go +++ b/cli/packages/cmd/login.go @@ -91,7 +91,9 @@ var loginCmd = &cobra.Command{ err = util.StoreUserCredsInKeyRing(userCredentialsToBeStored) if err != nil { - log.Errorln("Unable to store your credentials in system key ring") + currentVault, _ := util.GetCurrentVaultBackend() + log.Errorf("Unable to store your credentials in system vault [%s]. Rerun with flag -d to see full logs", currentVault) + log.Errorln("To trouble shoot further, read https://infisical.com/docs/cli/faq") log.Debugln(err) return } diff --git a/cli/packages/cmd/root.go b/cli/packages/cmd/root.go index 17f78b5d5..6a0bdb80c 100644 --- a/cli/packages/cmd/root.go +++ b/cli/packages/cmd/root.go @@ -15,7 +15,7 @@ var rootCmd = &cobra.Command{ Short: "Infisical CLI is used to inject environment variables into any process", Long: `Infisical is a simple, end-to-end encrypted service that enables teams to sync and manage their environment variables across their development life cycle.`, CompletionOptions: cobra.CompletionOptions{DisableDefaultCmd: true}, - Version: "0.1.12", + Version: "0.1.14", } // Execute adds all child commands to the root command and sets flags appropriately. @@ -31,8 +31,6 @@ func init() { rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") rootCmd.PersistentFlags().BoolVarP(&debugLogging, "debug", "d", false, "Enable verbose logging") rootCmd.PersistentFlags().StringVar(&util.INFISICAL_URL, "domain", "https://app.infisical.com/api", "Point the CLI to your own backend") - - rootCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) { - util.InitKeyRingInstance() - } + // rootCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) { + // } } diff --git a/cli/packages/cmd/vault.go b/cli/packages/cmd/vault.go index 8bb677682..a2b03dbec 100644 --- a/cli/packages/cmd/vault.go +++ b/cli/packages/cmd/vault.go @@ -42,7 +42,7 @@ var vaultSetCmd = &cobra.Command{ err = util.WriteConfigFile(&configFile) if err != nil { - log.Errorf("Unable to set vault to [%s] because an error occurred when saving the config file [err=%s]") + log.Errorf("Unable to set vault to [%s] because an error occurred when saving the config file [err=%s]", wantedVaultTypeName, err) return } diff --git a/cli/packages/util/common.go b/cli/packages/util/common.go index 37c881994..f3ee274b3 100644 --- a/cli/packages/util/common.go +++ b/cli/packages/util/common.go @@ -19,6 +19,7 @@ func GetHomeDir() (string, error) { return directory, err } +// write file to given path. If path does not exist throw error func WriteToFile(fileName string, dataToWrite []byte, filePerm os.FileMode) error { err := os.WriteFile(fileName, dataToWrite, filePerm) if err != nil { diff --git a/cli/packages/util/config.go b/cli/packages/util/config.go index 02e37c0a1..48bb57241 100644 --- a/cli/packages/util/config.go +++ b/cli/packages/util/config.go @@ -187,7 +187,7 @@ func GetConfigFile() (models.ConfigFile, error) { // Write a ConfigFile to disk. Raise error if unable to save the model to ask func WriteConfigFile(configFile *models.ConfigFile) error { - fullConfigFilePath, _, err := GetFullConfigFilePath() + fullConfigFilePath, fullConfigFileDirPath, err := GetFullConfigFilePath() if err != nil { return fmt.Errorf("writeConfigFile: unable to write config file because an error occurred when getting config file path [err=%s]", err) } @@ -197,8 +197,20 @@ func WriteConfigFile(configFile *models.ConfigFile) error { return fmt.Errorf("writeConfigFile: unable to write config file because an error occurred when marshalling the config file [err=%s]", err) } + // check if config folder exists and if not create it + if _, err := os.Stat(fullConfigFileDirPath); errors.Is(err, os.ErrNotExist) { + err := os.Mkdir(fullConfigFileDirPath, os.ModePerm) + if err != nil { + return err + } + } + // Create file in directory - err = WriteToFile(fullConfigFilePath, configFileMarshalled, os.ModePerm) + err = os.WriteFile(fullConfigFilePath, configFileMarshalled, os.ModePerm) + if err != nil { + return fmt.Errorf("writeConfigFile: Unable to write to file [err=%s]", err) + } + if err != nil { return fmt.Errorf("writeConfigFile: unable to write config file because an error occurred when write the config to file [err=%s]", err) diff --git a/cli/packages/util/credentials.go b/cli/packages/util/credentials.go index b83227b71..80c98fa9a 100644 --- a/cli/packages/util/credentials.go +++ b/cli/packages/util/credentials.go @@ -19,7 +19,13 @@ func StoreUserCredsInKeyRing(userCred *models.UserCredentials) error { return fmt.Errorf("StoreUserCredsInKeyRing: something went wrong when marshalling user creds [err=%s]", err) } - err = keyringInstance.Set(keyring.Item{ + // Get keyring + configuredKeyring, err := GetKeyRing() + if err != nil { + return fmt.Errorf("StoreUserCredsInKeyRing: unable to get keyring instance with [err=%s]", err) + } + + err = configuredKeyring.Set(keyring.Item{ Key: userCred.Email, Data: []byte(string(userCredMarshalled)), }) @@ -32,20 +38,26 @@ func StoreUserCredsInKeyRing(userCred *models.UserCredentials) error { } func GetUserCredsFromKeyRing(userEmail string) (credentials models.UserCredentials, err error) { - credentialsValue, err := keyringInstance.Get(userEmail) + // Get keyring + configuredKeyring, err := GetKeyRing() if err != nil { - return models.UserCredentials{}, fmt.Errorf("Unable to get key from Keyring. could not find login credentials in your Keyring. This is common if you have switched vault backend recently. If so, please login in again and retry:", err) + return models.UserCredentials{}, fmt.Errorf("GetUserCredsFromKeyRing: unable to get keyring instance with [err=%s]", err) + } + + credentialsValue, err := configuredKeyring.Get(userEmail) + if err != nil { + return models.UserCredentials{}, fmt.Errorf("GetUserCredsFromKeyRing: unable to get key from Keyring. could not find login credentials in your Keyring. This is common if you have switched vault backend recently. If so, please login in again and retry [err=%s]", err) } var userCredentials models.UserCredentials err = json.Unmarshal([]byte(credentialsValue.Data), &userCredentials) if err != nil { - return models.UserCredentials{}, fmt.Errorf("Something went wrong when unmarshalling user creds:", err) + return models.UserCredentials{}, fmt.Errorf("getUserCredsFromKeyRing: Something went wrong when unmarshalling user creds [err=%s]", err) } if err != nil { - return models.UserCredentials{}, fmt.Errorf("Unable to store user credentials", err) + return models.UserCredentials{}, fmt.Errorf("GetUserCredsFromKeyRing: Unable to store user credentials [err=%s]", err) } return userCredentials, err @@ -82,7 +94,7 @@ func IsUserLoggedIn() (hasUserLoggedIn bool, theUsersEmail string, err error) { if response.StatusCode() > 299 { log.Infoln("Login expired, please login again.") - return false, "", fmt.Errorf("Login expired, please login again.") + return false, "", fmt.Errorf("GetUserCredsFromKeyRing: Login expired, please login again.") } return true, configFile.LoggedInUserEmail, nil diff --git a/cli/packages/util/vault.go b/cli/packages/util/vault.go index 95dba04d8..03d03b360 100644 --- a/cli/packages/util/vault.go +++ b/cli/packages/util/vault.go @@ -5,14 +5,9 @@ import ( "os" "github.com/99designs/keyring" - log "github.com/sirupsen/logrus" "golang.org/x/term" ) -// Keyring instance -var keyringInstance keyring.Keyring -var keyringInstanceConfig keyring.Config - func GetCurrentVaultBackend() (keyring.BackendType, error) { configFile, err := GetConfigFile() if err != nil { @@ -20,21 +15,19 @@ func GetCurrentVaultBackend() (keyring.BackendType, error) { } if configFile.VaultBackendType == "" { - if keyring.AvailableBackends()[0] == keyring.FileBackend { - } return keyring.AvailableBackends()[0], nil } return configFile.VaultBackendType, nil } -func InitKeyRingInstance() { +func GetKeyRing() (keyring.Keyring, error) { currentVaultBackend, err := GetCurrentVaultBackend() if err != nil { - log.Infof("InitKeyRingInstance: unable to get the current vault backend, [err=%s]", err) + return nil, fmt.Errorf("GetKeyRing: unable to get the current vault backend, [err=%s]", err) } - keyringInstanceConfig = keyring.Config{ + keyringInstanceConfig := keyring.Config{ FilePasswordFunc: fileKeyringPassphrasePrompt, ServiceName: SERVICE_NAME, LibSecretCollectionName: SERVICE_NAME, @@ -51,10 +44,12 @@ func InitKeyRingInstance() { keyringInstanceConfig.AllowedBackends = []keyring.BackendType{keyring.BackendType(currentVaultBackend)} } - keyringInstance, err = keyring.Open(keyringInstanceConfig) + keyringInstance, err := keyring.Open(keyringInstanceConfig) if err != nil { - log.Errorf("InitKeyRingInstance: Unable to create instance of Keyring because of [err=%s]", err) + return nil, fmt.Errorf("GetKeyRing: Unable to create instance of Keyring because of [err=%s]", err) } + + return keyringInstance, nil } func fileKeyringPassphrasePrompt(prompt string) (string, error) { diff --git a/docs/cli/commands/vault.mdx b/docs/cli/commands/vault.mdx index 7ffec4e91..f973cb727 100644 --- a/docs/cli/commands/vault.mdx +++ b/docs/cli/commands/vault.mdx @@ -30,12 +30,10 @@ title: "infisical vault" ## Description -To ensure secure storage of your login credentials when using the CLI, Infisical saves them to a password manager if one is detected. -If a password manager is not available, your credentials are stored in an encrypted text file. +To ensure secure storage of your login credentials when using the CLI, Infisical stores login credentials securely in a system vault or encrypted text file with a passphrase known only by the user. - - - By default, the most appropriate password manager is chosen to store your login credentials. + + By default, the most appropriate vault is chosen to store your login credentials. For example, if you are on macOS, KeyChain will be automatically selected. - [macOS Keychain](https://support.apple.com/en-au/guide/keychain-access/welcome/mac) diff --git a/docs/cli/faq.mdx b/docs/cli/faq.mdx new file mode 100644 index 000000000..600386e81 --- /dev/null +++ b/docs/cli/faq.mdx @@ -0,0 +1,15 @@ +--- +title: "FAQ" +--- + +Frequently asked questions about the CLI can be found on this page. +If you can't find the answer you're looking for, please create an issue on our GitHub repository or join our Slack channel for additional support. + + +By default, the CLI will choose the most suitable store available on your system. +If you experience issues with the default store, you can switch to a different one. +If none of the available stores work for you, you can try using the `file` store type by running `infisical vault set file`, which should work in most cases. +If you are still experiencing trouble, please seek support. + +[Learn more about vault command](./commands/vault) + \ No newline at end of file diff --git a/docs/mint.json b/docs/mint.json index 57beea626..cbac56d5a 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -97,7 +97,8 @@ "cli/commands/export", "cli/commands/vault" ] - } + }, + "cli/faq" ] }, { diff --git a/frontend/components/basic/InputField.tsx b/frontend/components/basic/InputField.tsx index 46b42c15c..08afa975d 100644 --- a/frontend/components/basic/InputField.tsx +++ b/frontend/components/basic/InputField.tsx @@ -96,6 +96,7 @@ const InputField = ( /> {props.label?.includes('Password') && ( - - + {false && ( +
+ + We are experiencing minor technical difficulties. We are working on + solving it right now. Please come back in a few minutes. +
+ )} +
+

+ Need an Infisical account? +

+ + + +
+ ); } diff --git a/frontend/pages/signup.tsx b/frontend/pages/signup.tsx index a5e17a8c5..51e2e1c05 100644 --- a/frontend/pages/signup.tsx +++ b/frontend/pages/signup.tsx @@ -266,7 +266,7 @@ export default function SignUp() {

-
- {/*
+ {/*

I do not want to receive emails about Infisical and its products.

*/} @@ -296,7 +296,7 @@ export default function SignUp() { acknowledged the Privacy Policy.

-
@@ -512,35 +512,17 @@ export default function SignUp() { It contains your Secret Key which we cannot access or recover for you if you lose it. -
-
); @@ -571,7 +553,9 @@ export default function SignUp() { /> - {step == 1 ? step1 : step == 2 ? step2 : step == 3 ? step3 : step4} +
e.preventDefault()}> + {step == 1 ? step1 : step == 2 ? step2 : step == 3 ? step3 : step4} +
);