github.com/versent/saml2aws@v2.17.0+incompatible/input.go (about) 1 package saml2aws 2 3 import ( 4 "fmt" 5 "sort" 6 7 "github.com/pkg/errors" 8 "github.com/versent/saml2aws/pkg/cfg" 9 "github.com/versent/saml2aws/pkg/creds" 10 "github.com/versent/saml2aws/pkg/prompter" 11 ) 12 13 // PromptForConfigurationDetails prompt the user to present their hostname, username and mfa 14 func PromptForConfigurationDetails(idpAccount *cfg.IDPAccount) error { 15 16 providers := MFAsByProvider.Names() 17 18 var err error 19 20 idpAccount.Provider, err = prompter.ChooseWithDefault("Please choose a provider:", idpAccount.Provider, providers) 21 if err != nil { 22 return errors.Wrap(err, "error selecting provider file") 23 } 24 25 mfas := MFAsByProvider.Mfas(idpAccount.Provider) 26 27 // only prompt for MFA if there is more than one option 28 if len(mfas) > 1 { 29 idpAccount.MFA, err = prompter.ChooseWithDefault("Please choose an MFA", idpAccount.MFA, mfas) 30 if err != nil { 31 return errors.Wrap(err, "error selecting provider file") 32 } 33 34 } else { 35 idpAccount.MFA = mfas[0] 36 } 37 38 idpAccount.Profile = prompter.String("AWS Profile", idpAccount.Profile) 39 40 idpAccount.URL = prompter.String("URL", idpAccount.URL) 41 idpAccount.Username = prompter.String("Username", idpAccount.Username) 42 43 switch idpAccount.Provider { 44 case "OneLogin": 45 idpAccount.AppID = prompter.String("App ID", idpAccount.AppID) 46 fmt.Println("") 47 idpAccount.Subdomain = prompter.String("Subdomain", idpAccount.Subdomain) 48 fmt.Println("") 49 case "F5APM": 50 idpAccount.ResourceID = prompter.String("Resource ID", idpAccount.ResourceID) 51 case "AzureAD": 52 idpAccount.AppID = prompter.String("App ID", idpAccount.AppID) 53 fmt.Println("") 54 } 55 56 return nil 57 } 58 59 // PromptForLoginDetails prompt the user to present their username, password 60 func PromptForLoginDetails(loginDetails *creds.LoginDetails, provider string) error { 61 62 fmt.Println("To use saved password just hit enter.") 63 64 loginDetails.Username = prompter.String("Username", loginDetails.Username) 65 66 if enteredPassword := prompter.Password("Password"); enteredPassword != "" { 67 loginDetails.Password = enteredPassword 68 } 69 fmt.Println("") 70 if provider == "OneLogin" { 71 if enteredClientID := prompter.Password("Client ID"); enteredClientID != "" { 72 loginDetails.ClientID = enteredClientID 73 } 74 fmt.Println("") 75 if enteredCientSecret := prompter.Password("Client Secret"); enteredCientSecret != "" { 76 loginDetails.ClientSecret = enteredCientSecret 77 } 78 fmt.Println("") 79 } 80 81 return nil 82 } 83 84 // PromptForAWSRoleSelection present a list of roles to the user for selection 85 func PromptForAWSRoleSelection(accounts []*AWSAccount) (*AWSRole, error) { 86 87 roles := map[string]*AWSRole{} 88 var roleOptions []string 89 90 for _, account := range accounts { 91 for _, role := range account.Roles { 92 name := fmt.Sprintf("%s / %s", account.Name, role.Name) 93 roles[name] = role 94 roleOptions = append(roleOptions, name) 95 } 96 } 97 98 sort.Strings(roleOptions) 99 100 selectedRole, err := prompter.ChooseWithDefault("Please choose the role", "", roleOptions) 101 if err != nil { 102 return nil, errors.Wrap(err, "Role selection failed") 103 } 104 105 return roles[selectedRole], nil 106 }