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  }