github.com/versent/saml2aws@v2.17.0+incompatible/cmd/saml2aws/commands/configure.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path"
     7  
     8  	"github.com/pkg/errors"
     9  	"github.com/versent/saml2aws"
    10  	"github.com/versent/saml2aws/helper/credentials"
    11  	"github.com/versent/saml2aws/pkg/cfg"
    12  	"github.com/versent/saml2aws/pkg/flags"
    13  	"github.com/versent/saml2aws/pkg/prompter"
    14  	"github.com/versent/saml2aws/pkg/provider/onelogin"
    15  )
    16  
    17  // OneLoginOAuthPath is the path used to generate OAuth token in order to access OneLogin's API.
    18  const OneLoginOAuthPath = "/auth/oauth2/v2/token"
    19  
    20  // Configure configure account profiles
    21  func Configure(configFlags *flags.CommonFlags) error {
    22  
    23  	idpAccountName := configFlags.IdpAccount
    24  
    25  	// pass in alternative location of saml2aws config file, if set.
    26  	cfgm, err := cfg.NewConfigManager(configFlags.ConfigFile)
    27  	if err != nil {
    28  		return errors.Wrap(err, "failed to load configuration")
    29  	}
    30  
    31  	account, err := cfgm.LoadIDPAccount(idpAccountName)
    32  	if err != nil {
    33  		return errors.Wrap(err, "failed to load idp account")
    34  	}
    35  
    36  	// update username and hostname if supplied
    37  	flags.ApplyFlagOverrides(configFlags, account)
    38  
    39  	// do we need to prompt for values now?
    40  	if !configFlags.SkipPrompt {
    41  		err = saml2aws.PromptForConfigurationDetails(account)
    42  		if err != nil {
    43  			return errors.Wrap(err, "failed to input configuration")
    44  		}
    45  
    46  		if credentials.SupportsStorage() {
    47  			if err := storeCredentials(configFlags, account); err != nil {
    48  				return err
    49  			}
    50  		}
    51  	}
    52  
    53  	err = cfgm.SaveIDPAccount(idpAccountName, account)
    54  	if err != nil {
    55  		return errors.Wrap(err, "failed to save configuration")
    56  	}
    57  
    58  	fmt.Println("")
    59  	fmt.Println(account)
    60  	fmt.Println("")
    61  	fmt.Printf("Configuration saved for IDP account: %s\n", idpAccountName)
    62  
    63  	return nil
    64  }
    65  
    66  func storeCredentials(configFlags *flags.CommonFlags, account *cfg.IDPAccount) error {
    67  
    68  	if configFlags.Password != "" {
    69  		if err := credentials.SaveCredentials(account.URL, account.Username, configFlags.Password); err != nil {
    70  			return errors.Wrap(err, "error storing password in keychain")
    71  		}
    72  	} else {
    73  		password := prompter.Password("Password")
    74  		if password != "" {
    75  			if confirmPassword := prompter.Password("Confirm"); confirmPassword == password {
    76  				if err := credentials.SaveCredentials(account.URL, account.Username, password); err != nil {
    77  					return errors.Wrap(err, "error storing password in keychain")
    78  				}
    79  			} else {
    80  				fmt.Println("Passwords did not match")
    81  				os.Exit(1)
    82  			}
    83  		} else {
    84  			fmt.Println("No password supplied")
    85  		}
    86  	}
    87  	if account.Provider == onelogin.ProviderName {
    88  		if configFlags.ClientID == "" || configFlags.ClientSecret == "" {
    89  			fmt.Println("OneLogin provider requires --client_id and --client_secret flags to be set.")
    90  			os.Exit(1)
    91  		}
    92  		if err := credentials.SaveCredentials(path.Join(account.URL, OneLoginOAuthPath), configFlags.ClientID, configFlags.ClientSecret); err != nil {
    93  			return errors.Wrap(err, "error storing client_id and client_secret in keychain")
    94  		}
    95  	}
    96  	return nil
    97  }