Skip to content

Commit

Permalink
Correctly set AWS_SSO env variable
Browse files Browse the repository at this point in the history
We were incorrectly leaving this blank so it was being
unset in `eval` and set to an empty string in `exec`

Fixes: #251
  • Loading branch information
synfinatic committed Jan 16, 2022
1 parent 5e6d7da commit 2ffe200
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 11 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,10 @@

## [1.7.1] - Unreleased

### Bug Fixes

* `AWS_SSO` env var is now set with the `eval` and `exec` command #251

### Changes

* `flush` now flushes the STS IAM Role credentials first by default #236
Expand Down
3 changes: 2 additions & 1 deletion cmd/exec_cmd.go
Expand Up @@ -132,6 +132,7 @@ func execShellEnvs(ctx *RunContext, awssso *sso.AWSSSO, accountid int64, role, r
credsPtr := GetRoleCredentials(ctx, awssso, accountid, role)
creds := *credsPtr

ssoName, _ := ctx.Settings.GetSelectedSSOName(ctx.Cli.SSO)
shellVars := map[string]string{
"AWS_ACCESS_KEY_ID": creds.AccessKeyId,
"AWS_SECRET_ACCESS_KEY": creds.SecretAccessKey,
Expand All @@ -140,7 +141,7 @@ func execShellEnvs(ctx *RunContext, awssso *sso.AWSSSO, accountid int64, role, r
"AWS_SSO_ROLE_NAME": creds.RoleName,
"AWS_SSO_SESSION_EXPIRATION": creds.ExpireString(),
"AWS_SSO_ROLE_ARN": utils.MakeRoleARN(creds.AccountId, creds.RoleName),
"AWS_SSO": ctx.Cli.SSO,
"AWS_SSO": ssoName,
}

if len(region) > 0 {
Expand Down
29 changes: 22 additions & 7 deletions sso/settings.go
Expand Up @@ -287,18 +287,33 @@ func (s *Settings) CreatedAt() int64 {
// GetSelectedSSO returns a valid SSOConfig based on user intput, configured
// value or our hardcoded 'Default' if it exists and name is empty String
func (s *Settings) GetSelectedSSO(name string) (*SSOConfig, error) {
if c, ok := s.SSO[name]; ok {
return c, nil
n, err := s.GetSelectedSSOName(name)
if err != nil {
return &SSOConfig{}, err
}
return s.SSO[n], nil
}

// GetSelectedSSOName returns the name of the selected SSO name where
// the input is the option passed in via the CLI (should be an empty string)
// if user did not specify a value on the CLI
func (s *Settings) GetSelectedSSOName(name string) (string, error) {
if name != "" {
if _, ok := s.SSO[name]; ok {
return name, nil
}

return "", fmt.Errorf("'%s' is not a valid AWS SSO Instance", name)
}

if c, ok := s.SSO[s.DefaultSSO]; ok && s.DefaultSSO != "Default" {
return c, nil
if _, ok := s.SSO[s.DefaultSSO]; ok {
return s.DefaultSSO, nil
}

if c, ok := s.SSO["Default"]; ok && name == "" {
return c, nil
if _, ok := s.SSO["Default"]; ok {
return "Default", nil
}
return &SSOConfig{}, fmt.Errorf("No available SSOConfig Provider")
return "", fmt.Errorf("No available AWS SSO Instance")
}

// Returns the Tag name => Environment variable name
Expand Down
22 changes: 19 additions & 3 deletions sso/settings_test.go
Expand Up @@ -65,18 +65,34 @@ func (suite *SettingsTestSuite) TestGetSelectedSSO() {
t := suite.T()

sso, err := suite.settings.GetSelectedSSO("Default")
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, "https://d-754545454.awsapps.com/start", sso.StartUrl)

sso, err = suite.settings.GetSelectedSSO("Foobar")
assert.NotNil(t, err)
assert.Error(t, err)
assert.Equal(t, "", sso.StartUrl)

sso, err = suite.settings.GetSelectedSSO("")
assert.Nil(t, err)
assert.NoError(t, err)
assert.Equal(t, "https://d-754545454.awsapps.com/start", sso.StartUrl)
}

func (suite *SettingsTestSuite) TestGetSelectedSSOName() {
t := suite.T()

name, err := suite.settings.GetSelectedSSOName("Default")
assert.NoError(t, err)
assert.Equal(t, "Default", name)

name, err = suite.settings.GetSelectedSSOName("Foobar")
assert.Error(t, err)
assert.Equal(t, "", name)

name, err = suite.settings.GetSelectedSSOName("")
assert.NoError(t, err)
assert.Equal(t, "Default", name)
}

func (suite *SettingsTestSuite) TestCreatedAt() {
t := suite.T()
sso, _ := suite.settings.GetSelectedSSO("")
Expand Down

0 comments on commit 2ffe200

Please sign in to comment.