diff --git a/cli/packages/cmd/dynamic_secrets.go b/cli/packages/cmd/dynamic_secrets.go index 60f356185..665bfaa54 100644 --- a/cli/packages/cmd/dynamic_secrets.go +++ b/cli/packages/cmd/dynamic_secrets.go @@ -80,8 +80,9 @@ func getDynamicSecretList(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } + infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -197,7 +198,7 @@ func createDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -328,8 +329,9 @@ func renewDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } + infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -435,8 +437,9 @@ func revokeDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } + infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -541,7 +544,7 @@ func listDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } diff --git a/cli/packages/cmd/init.go b/cli/packages/cmd/init.go index e10a11c06..2ef555a82 100644 --- a/cli/packages/cmd/init.go +++ b/cli/packages/cmd/init.go @@ -46,7 +46,7 @@ var initCmd = &cobra.Command{ } if userCreds.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + userCreds = util.EstablishUserLoginSession() } httpClient, err := util.GetRestyClientWithCustomHeaders() diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index fdee3e7c0..4b3465d8f 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -237,7 +237,7 @@ var secretsSetCmd = &cobra.Command{ } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } secretOperations, err = util.SetRawSecrets(processedArgs, secretType, environmentName, secretsPath, projectId, &models.TokenDetails{ @@ -325,7 +325,7 @@ var secretsDeleteCmd = &cobra.Command{ } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } httpClient.SetAuthToken(loggedInUserDetails.UserCredentials.JTWToken) diff --git a/cli/packages/cmd/ssh.go b/cli/packages/cmd/ssh.go index 7f74d8ee6..4315989bd 100644 --- a/cli/packages/cmd/ssh.go +++ b/cli/packages/cmd/ssh.go @@ -184,7 +184,7 @@ func issueCredentials(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -417,7 +417,7 @@ func signKey(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -612,7 +612,7 @@ func sshConnect(cmd *cobra.Command, args []string) { if err != nil { util.HandleError(err, "Unable to parse flag") } - + var infisicalToken string if token != nil && (token.Type == util.SERVICE_TOKEN_IDENTIFIER || token.Type == util.UNIVERSAL_AUTH_TOKEN_IDENTIFIER) { @@ -626,7 +626,7 @@ func sshConnect(cmd *cobra.Command, args []string) { } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -640,7 +640,7 @@ func sshConnect(cmd *cobra.Command, args []string) { if err != nil { util.HandleError(err, "Unable to parse flag") } - + hostname, _ := cmd.Flags().GetString("hostname") loginUser, _ := cmd.Flags().GetString("login-user") @@ -858,7 +858,7 @@ func sshConnect(cmd *cobra.Command, args []string) { err = sshCmd.Run() if err != nil { util.HandleError(err, "SSH connection failed") - } + } } func sshAddHost(cmd *cobra.Command, args []string) { @@ -879,7 +879,7 @@ func sshAddHost(cmd *cobra.Command, args []string) { util.HandleError(err, "Unable to authenticate") } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login]") + loggedInUserDetails = util.EstablishUserLoginSession() } infisicalToken = loggedInUserDetails.UserCredentials.JTWToken } @@ -904,7 +904,7 @@ func sshAddHost(cmd *cobra.Command, args []string) { if err != nil { util.HandleError(err, "Unable to parse --alias flag") } - + // if alias == "" { // util.PrintErrorMessageAndExit("You must provide --alias") // } @@ -937,7 +937,7 @@ func sshAddHost(cmd *cobra.Command, args []string) { if configureSshd && (!writeUserCaToFile || !writeHostCertToFile) { util.PrintErrorMessageAndExit("--configure-sshd requires both --write-user-ca-to-file and --write-host-cert-to-file to also be set") } - + // Pre-check for file overwrites before proceeding if writeUserCaToFile { if strings.HasPrefix(userCaOutFilePath, "~") { diff --git a/cli/packages/cmd/tokens.go b/cli/packages/cmd/tokens.go index 386a7eda5..a2e445239 100644 --- a/cli/packages/cmd/tokens.go +++ b/cli/packages/cmd/tokens.go @@ -47,7 +47,7 @@ var tokensCreateCmd = &cobra.Command{ } if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } tokenOnly, err := cmd.Flags().GetBool("token-only") diff --git a/cli/packages/cmd/user.go b/cli/packages/cmd/user.go index 2879e4ccb..6c7d54d46 100644 --- a/cli/packages/cmd/user.go +++ b/cli/packages/cmd/user.go @@ -111,8 +111,9 @@ var userGetTokenCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails(true) if loggedInUserDetails.LoginExpired { - util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = util.EstablishUserLoginSession() } + if err != nil { util.HandleError(err, "[infisical user get token]: Unable to get logged in user token") } diff --git a/cli/packages/util/auth.go b/cli/packages/util/auth.go index cdcd7b50a..b54bde45b 100644 --- a/cli/packages/util/auth.go +++ b/cli/packages/util/auth.go @@ -1,5 +1,13 @@ package util +import ( + "fmt" + "os" + "os/exec" + + "github.com/rs/zerolog/log" +) + type AuthStrategyType string var AuthStrategy = struct { @@ -43,3 +51,36 @@ func IsAuthMethodValid(authMethod string, allowUserAuth bool) (isValid bool, str } return false, "" } + +// EstablishUserLoginSession handles the login flow to either create a new session or restore an expired one. +// It returns fresh user details if login is successful. +func EstablishUserLoginSession() LoggedInUserDetails { + log.Info().Msg("No valid login session found, triggering login flow") + + exePath, err := os.Executable() + if err != nil { + PrintErrorMessageAndExit(fmt.Sprintf("Failed to determine executable path: %v", err)) + } + + // Spawn infisical login command + loginCmd := exec.Command(exePath, "login", "--silent") + loginCmd.Stdin = os.Stdin + loginCmd.Stdout = os.Stdout + loginCmd.Stderr = os.Stderr + + err = loginCmd.Run() + if err != nil { + PrintErrorMessageAndExit(fmt.Sprintf("Failed to automatically trigger login flow. Please run [infisical login] manually to login.")) + } + + loggedInUserDetails, err := GetCurrentLoggedInUserDetails(true) + if err != nil { + PrintErrorMessageAndExit("You must be logged in to run this command. To login, run [infisical login]") + } + + if loggedInUserDetails.LoginExpired { + PrintErrorMessageAndExit("Your login session has expired. Please run [infisical login]") + } + + return loggedInUserDetails +} diff --git a/cli/packages/util/folders.go b/cli/packages/util/folders.go index 6bba05842..412f29ac3 100644 --- a/cli/packages/util/folders.go +++ b/cli/packages/util/folders.go @@ -25,7 +25,7 @@ func GetAllFolders(params models.GetAllFoldersParameters) ([]models.SingleFolder } if loggedInUserDetails.LoginExpired { - PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = EstablishUserLoginSession() } workspaceFile, err := GetWorkSpaceFromFile() @@ -194,7 +194,7 @@ func CreateFolder(params models.CreateFolderParameters) (models.SingleFolder, er } if loggedInUserDetails.LoginExpired { - PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = EstablishUserLoginSession() } params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken @@ -244,7 +244,7 @@ func DeleteFolder(params models.DeleteFolderParameters) ([]models.SingleFolder, } if loggedInUserDetails.LoginExpired { - PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = EstablishUserLoginSession() } params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken diff --git a/cli/packages/util/helper.go b/cli/packages/util/helper.go index 346122a64..153a5a281 100644 --- a/cli/packages/util/helper.go +++ b/cli/packages/util/helper.go @@ -174,7 +174,7 @@ func RequireLogin() { configFile, _ := GetConfigFile() if configFile.LoggedInUserEmail == "" { - PrintErrorMessageAndExit("You must be logged in to run this command. To login, run [infisical login]") + EstablishUserLoginSession() } } diff --git a/cli/packages/util/secrets.go b/cli/packages/util/secrets.go index 0693db509..0ee3eaa72 100644 --- a/cli/packages/util/secrets.go +++ b/cli/packages/util/secrets.go @@ -273,7 +273,7 @@ func GetAllEnvironmentVariables(params models.GetAllSecretsParameters, projectCo } if isConnected && loggedInUserDetails.LoginExpired { - PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") + loggedInUserDetails = EstablishUserLoginSession() } var infisicalDotJson models.WorkspaceConfigFile