diff --git a/modules/context/context.go b/modules/context/context.go index 1fd5c51..8fe5a76 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -105,7 +105,7 @@ func InitCommand(cmd *cli.Command) *TeaContext { // override config user with env variable envLogin := GetLoginByEnvVar() if envLogin != nil { - _, err := utils.ValidateAuthenticationMethod(envLogin.URL, envLogin.Token, "", "") + _, err := utils.ValidateAuthenticationMethod(envLogin.URL, envLogin.Token, "", "", false, "", "") if err != nil { log.Fatal(err.Error()) } diff --git a/modules/interact/login.go b/modules/interact/login.go index a8a3b75..58b9002 100644 --- a/modules/interact/login.go +++ b/modules/interact/login.go @@ -86,7 +86,7 @@ func CreateLogin() error { printTitleAndContent("Name of new Login: ", name) - loginMethod, err := promptSelectV2("Login with: ", []string{"token", "oauth"}) + loginMethod, err := promptSelectV2("Login with: ", []string{"token", "ssh-key/certificate", "oauth"}) if err != nil { return err } @@ -104,7 +104,7 @@ func CreateLogin() error { printTitleAndContent("Allow Insecure connections:", strconv.FormatBool(insecure)) return auth.OAuthLoginWithOptions(name, giteaURL, insecure) - case "token": + default: // token var hasToken bool if err := huh.NewConfirm(). Title("Do you have an access token?"). @@ -154,7 +154,7 @@ func CreateLogin() error { Value(&tokenScopes). Validate(func(s []string) error { if len(s) == 0 { - return errors.New("at least one scope is required") + return errors.New("At least one scope is required") } return nil }). @@ -176,36 +176,26 @@ func CreateLogin() error { } printTitleAndContent("OTP (if applicable):", otp) } - default: - return fmt.Errorf("unknown login method: %s", loginMethod) - } - - var optSettings bool - if err := huh.NewConfirm(). - Title("Set Optional settings:"). - Value(&optSettings). - WithTheme(theme.GetTheme()). - Run(); err != nil { - return err - } - printTitleAndContent("Set Optional settings:", strconv.FormatBool(optSettings)) - - if optSettings { - pubKeys := task.ListSSHPubkey() - emptyOpt := "Auto-discovery SSH Key in ~/.ssh and ssh-agent" - pubKeys = append([]string{emptyOpt}, pubKeys...) - - sshKey, err = promptSelect("Select ssh-key: ", pubKeys, "", "", "") - if err != nil { + case "ssh-key/certificate": + if err := huh.NewInput(). + Title("SSH Key/Certificate Path (leave empty for auto-discovery in ~/.ssh and ssh-agent):"). + Value(&sshKey). + WithTheme(theme.GetTheme()). + Run(); err != nil { return err } - if sshKey == emptyOpt { - sshKey = "" - } + printTitleAndContent("SSH Key/Certificate Path (leave empty for auto-discovery in ~/.ssh and ssh-agent):", sshKey) - printTitleAndContent("SSH Key Path (leave empty for auto-discovery) in ~/.ssh and ssh-agent):", sshKey) - - if sshKey != "" { + if sshKey == "" { + pubKeys := task.ListSSHPubkey() + if len(pubKeys) == 0 { + fmt.Println("No SSH keys found in ~/.ssh or ssh-agent") + return nil + } + sshKey, err = promptSelect("Select ssh-key: ", pubKeys, "", "", "") + if err != nil { + return err + } printTitleAndContent("Selected ssh-key:", sshKey) // ssh certificate @@ -229,6 +219,27 @@ func CreateLogin() error { } } } + } + + var optSettings bool + if err := huh.NewConfirm(). + Title("Set Optional settings:"). + Value(&optSettings). + WithTheme(theme.GetTheme()). + Run(); err != nil { + return err + } + printTitleAndContent("Set Optional settings:", strconv.FormatBool(optSettings)) + + if optSettings { + if err := huh.NewInput(). + Title("SSH Key Path (leave empty for auto-discovery):"). + Value(&sshKey). + WithTheme(theme.GetTheme()). + Run(); err != nil { + return err + } + printTitleAndContent("SSH Key Path (leave empty for auto-discovery):", sshKey) if err := huh.NewConfirm(). Title("Allow Insecure connections:"). diff --git a/modules/task/login_create.go b/modules/task/login_create.go index 523caa1..8a2fbce 100644 --- a/modules/task/login_create.go +++ b/modules/task/login_create.go @@ -68,6 +68,9 @@ func CreateLogin(name, token, user, passwd, otp, scopes, sshKey, giteaURL, sshCe token, user, passwd, + sshAgent, + sshKey, + sshCertPrincipal, ) if err != nil { return err @@ -92,7 +95,7 @@ func CreateLogin(name, token, user, passwd, otp, scopes, sshKey, giteaURL, sshCe VersionCheck: versionCheck, } - if len(token) == 0 { + if len(token) == 0 && sshCertPrincipal == "" && !sshAgent && sshKey == "" { if login.Token, err = generateToken(login, user, passwd, otp, scopes); err != nil { return err } diff --git a/modules/utils/validate.go b/modules/utils/validate.go index bedf1d8..9924c2f 100644 --- a/modules/utils/validate.go +++ b/modules/utils/validate.go @@ -14,21 +14,25 @@ func ValidateAuthenticationMethod( token string, user string, passwd string, + sshAgent bool, + sshKey string, + sshCertPrincipal string, ) (*url.URL, error) { // Normalize URL serverURL, err := NormalizeURL(giteaURL) if err != nil { - return nil, fmt.Errorf("unable to parse URL: %s", err) + return nil, fmt.Errorf("Unable to parse URL: %s", err) } - // .. if we have enough information to authenticate - if len(token) == 0 && (len(user)+len(passwd)) == 0 { - return nil, fmt.Errorf("no token set") - } else if len(user) != 0 && len(passwd) == 0 { - return nil, fmt.Errorf("no password set") - } else if len(user) == 0 && len(passwd) != 0 { - return nil, fmt.Errorf("no user set") + if !sshAgent && sshCertPrincipal == "" && sshKey == "" { + // .. if we have enough information to authenticate + if len(token) == 0 && (len(user)+len(passwd)) == 0 { + return nil, fmt.Errorf("No token set") + } else if len(user) != 0 && len(passwd) == 0 { + return nil, fmt.Errorf("No password set") + } else if len(user) == 0 && len(passwd) != 0 { + return nil, fmt.Errorf("No user set") + } } - return serverURL, nil }