cmd/saml2alibabacloud/commands/list_roles.go (101 lines of code) (raw):

package commands import ( b64 "encoding/base64" "fmt" "log" "os" saml2alibabacloud "github.com/aliyun/saml2alibabacloud" "github.com/aliyun/saml2alibabacloud/helper/credentials" "github.com/aliyun/saml2alibabacloud/pkg/flags" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // ListRoles will list available role ARNs func ListRoles(loginFlags *flags.LoginExecFlags) error { logger := logrus.WithField("command", "list") account, err := buildIdpAccount(loginFlags) if err != nil { return errors.Wrap(err, "error building login details") } loginDetails, err := resolveLoginDetails(account, loginFlags) if err != nil { log.Printf("%+v", err) os.Exit(1) } err = loginDetails.Validate() if err != nil { return errors.Wrap(err, "error validating login details") } logger.WithField("idpAccount", account).Debug("building provider") provider, err := saml2alibabacloud.NewSAMLClient(account) if err != nil { return errors.Wrap(err, "error building IdP client") } samlAssertion, err := provider.Authenticate(loginDetails) if err != nil { return errors.Wrap(err, "error authenticating to IdP") } if samlAssertion == "" { log.Println("Response did not contain a valid SAML assertion") log.Println("Please check your username and password is correct") log.Println("To see the output follow the instructions in https://github.com/aliyun/saml2alibabacloud#debugging-issues-with-idps") os.Exit(1) } if !loginFlags.CommonFlags.DisableKeychain { err = credentials.SaveCredentials(loginDetails.URL, loginDetails.Username, loginDetails.Password) if err != nil { return errors.Wrap(err, "error storing password in keychain") } } data, err := b64.StdEncoding.DecodeString(samlAssertion) if err != nil { return errors.Wrap(err, "error decoding saml assertion") } roles, err := saml2alibabacloud.ExtractRamRoles(data) if err != nil { return errors.Wrap(err, "error parsing AlibabaCloud roles") } if len(roles) == 0 { log.Println("No roles to assume") os.Exit(1) } alibabacloudRoles, err := saml2alibabacloud.ParseRamRoles(roles) if err != nil { return errors.Wrap(err, "error parsing AlibabaCloud roles") } if err := listRoles(alibabacloudRoles, samlAssertion, loginFlags); err != nil { return errors.Wrap(err, "Failed to list roles") } return nil } func listRoles(alibabacloudRoles []*saml2alibabacloud.RamRole, samlAssertion string, loginFlags *flags.LoginExecFlags) error { if len(alibabacloudRoles) == 1 { log.Println("") log.Println("Only one role to assume. Will be automatically assumed on login") log.Println(alibabacloudRoles[0].RoleARN) return nil } else if len(alibabacloudRoles) == 0 { return errors.New("no roles available") } samlAssertionData, err := b64.StdEncoding.DecodeString(samlAssertion) if err != nil { return errors.Wrap(err, "error decoding saml assertion") } aud, err := saml2alibabacloud.ExtractDestinationURL(samlAssertionData) if err != nil { return errors.Wrap(err, "error parsing destination url") } alibabacloudAccounts, err := saml2alibabacloud.ParseAlibabaCloudAccounts(aud, samlAssertion) if err != nil { return errors.Wrap(err, "error parsing AlibabaCloud role accounts") } saml2alibabacloud.AssignPrincipals(alibabacloudRoles, alibabacloudAccounts) log.Println("") for _, account := range alibabacloudAccounts { fmt.Println(account.Name) for _, role := range account.Roles { fmt.Println(role.RoleARN) } fmt.Println("") } return nil }