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 }