aws-sdk-core 3.104.0 → 3.105.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/aws-sdk-core.rb +5 -3
- data/lib/aws-sdk-core/credential_provider_chain.rb +19 -0
- data/lib/aws-sdk-core/ecs_credentials.rb +3 -4
- data/lib/aws-sdk-core/errors.rb +3 -0
- data/lib/aws-sdk-core/instance_profile_credentials.rb +3 -4
- data/lib/aws-sdk-core/json.rb +1 -1
- data/lib/aws-sdk-core/param_validator.rb +23 -4
- data/lib/aws-sdk-core/plugins/api_key.rb +1 -1
- data/lib/aws-sdk-core/plugins/credentials_configuration.rb +22 -7
- data/lib/aws-sdk-core/process_credentials.rb +2 -2
- data/lib/aws-sdk-core/rest/response/headers.rb +1 -2
- data/lib/aws-sdk-core/shared_config.rb +32 -0
- data/lib/aws-sdk-core/sso_credentials.rb +116 -0
- data/lib/aws-sdk-core/stubbing/protocols/rest.rb +1 -1
- data/lib/aws-sdk-sso.rb +52 -0
- data/lib/aws-sdk-sso/client.rb +548 -0
- data/lib/aws-sdk-sso/client_api.rb +190 -0
- data/lib/aws-sdk-sso/customizations.rb +1 -0
- data/lib/aws-sdk-sso/errors.rb +102 -0
- data/lib/aws-sdk-sso/plugins/content_type.rb +25 -0
- data/lib/aws-sdk-sso/resource.rb +26 -0
- data/lib/aws-sdk-sso/types.rb +352 -0
- data/lib/aws-sdk-sts.rb +2 -2
- data/lib/aws-sdk-sts/client.rb +23 -8
- data/lib/seahorse/client/net_http/connection_pool.rb +3 -4
- data/lib/seahorse/client/plugins/request_callback.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8c1b16aa96c3d7072aebb8d050d1ef7ebd252f8830b6113f86787e5db08ad65
|
4
|
+
data.tar.gz: 7044562082f62c1a3c635a358f920ed120353fbd0625e7377e2dd0c16538a248
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c1d2546c9d2cb8ec8d6545339d5a6ce25afff4dfde771ab9c211e9e11a52d0f5badce17d495ab15211d0a8d39fa8cfd5f9de89b76240d149b2b7da6b307fb1c
|
7
|
+
data.tar.gz: 90522abd2e2839712d101baaccdcf42017063b6d7b8412eb2625b1e751faa8fa0b3c1fc06a547fd92b798fe55f85d5135b24900136fcc8d64fce42ad8bb3c79c
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.105.0
|
data/lib/aws-sdk-core.rb
CHANGED
@@ -18,9 +18,9 @@ require_relative 'aws-sdk-core/ecs_credentials'
|
|
18
18
|
require_relative 'aws-sdk-core/instance_profile_credentials'
|
19
19
|
require_relative 'aws-sdk-core/shared_credentials'
|
20
20
|
require_relative 'aws-sdk-core/process_credentials'
|
21
|
+
require_relative 'aws-sdk-core/sso_credentials'
|
21
22
|
|
22
23
|
# client modules
|
23
|
-
|
24
24
|
require_relative 'aws-sdk-core/client_stubs'
|
25
25
|
require_relative 'aws-sdk-core/async_client_stubs'
|
26
26
|
require_relative 'aws-sdk-core/eager_loader'
|
@@ -86,10 +86,12 @@ require_relative 'aws-sdk-core/client_side_monitoring/publisher'
|
|
86
86
|
require_relative 'aws-sdk-core/arn'
|
87
87
|
require_relative 'aws-sdk-core/arn_parser'
|
88
88
|
|
89
|
-
# aws-sdk-sts is
|
90
|
-
|
89
|
+
# aws-sdk-sts is included to support Aws::AssumeRoleCredentials
|
91
90
|
require 'aws-sdk-sts'
|
92
91
|
|
92
|
+
# aws-sdk-sso is included to support Aws::SSOCredentials
|
93
|
+
require 'aws-sdk-sso'
|
94
|
+
|
93
95
|
module Aws
|
94
96
|
|
95
97
|
CORE_GEM_VERSION = File.read(File.expand_path('../../VERSION', __FILE__)).strip
|
@@ -22,11 +22,13 @@ module Aws
|
|
22
22
|
[
|
23
23
|
[:static_credentials, {}],
|
24
24
|
[:static_profile_assume_role_web_identity_credentials, {}],
|
25
|
+
[:static_profile_sso_credentials, {}],
|
25
26
|
[:static_profile_assume_role_credentials, {}],
|
26
27
|
[:static_profile_credentials, {}],
|
27
28
|
[:static_profile_process_credentials, {}],
|
28
29
|
[:env_credentials, {}],
|
29
30
|
[:assume_role_web_identity_credentials, {}],
|
31
|
+
[:sso_credentials, {}],
|
30
32
|
[:assume_role_credentials, {}],
|
31
33
|
[:shared_credentials, {}],
|
32
34
|
[:process_credentials, {}],
|
@@ -57,6 +59,14 @@ module Aws
|
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
62
|
+
def static_profile_sso_credentials(options)
|
63
|
+
if Aws.shared_config.config_enabled? && options[:config] && options[:config].profile
|
64
|
+
Aws.shared_config.sso_credentials_from_config(
|
65
|
+
profile: options[:config].profile
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
60
70
|
def static_profile_assume_role_credentials(options)
|
61
71
|
if Aws.shared_config.config_enabled? && options[:config] && options[:config].profile
|
62
72
|
assume_role_with_profile(options, options[:config].profile)
|
@@ -115,6 +125,15 @@ module Aws
|
|
115
125
|
nil
|
116
126
|
end
|
117
127
|
|
128
|
+
def sso_credentials(options)
|
129
|
+
profile_name = determine_profile_name(options)
|
130
|
+
if Aws.shared_config.config_enabled?
|
131
|
+
Aws.shared_config.sso_credentials_from_config(profile: profile_name)
|
132
|
+
end
|
133
|
+
rescue Errors::NoSuchProfileError
|
134
|
+
nil
|
135
|
+
end
|
136
|
+
|
118
137
|
def assume_role_credentials(options)
|
119
138
|
if Aws.shared_config.config_enabled?
|
120
139
|
assume_role_with_profile(options, determine_profile_name(options))
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'json'
|
4
3
|
require 'time'
|
5
4
|
require 'net/http'
|
6
5
|
|
@@ -81,8 +80,8 @@ module Aws
|
|
81
80
|
# service is responding but is returning invalid JSON documents
|
82
81
|
# in response to the GET profile credentials call.
|
83
82
|
begin
|
84
|
-
retry_errors([
|
85
|
-
c =
|
83
|
+
retry_errors([Aws::Json::ParseError, StandardError], max_retries: 3) do
|
84
|
+
c = Aws::Json.load(get_credentials.to_s)
|
86
85
|
@credentials = Credentials.new(
|
87
86
|
c['AccessKeyId'],
|
88
87
|
c['SecretAccessKey'],
|
@@ -90,7 +89,7 @@ module Aws
|
|
90
89
|
)
|
91
90
|
@expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
|
92
91
|
end
|
93
|
-
rescue
|
92
|
+
rescue Aws::Json::ParseError
|
94
93
|
raise Aws::Errors::MetadataParserError.new
|
95
94
|
end
|
96
95
|
end
|
data/lib/aws-sdk-core/errors.rb
CHANGED
@@ -207,6 +207,9 @@ module Aws
|
|
207
207
|
# payload with either invalid version number or malformed contents
|
208
208
|
class InvalidProcessCredentialsPayload < RuntimeError; end
|
209
209
|
|
210
|
+
# Raised when SSO Credentials are invalid
|
211
|
+
class InvalidSSOCredentials < RuntimeError; end
|
212
|
+
|
210
213
|
# Raised when a client is constructed and region is not specified.
|
211
214
|
class MissingRegionError < ArgumentError
|
212
215
|
def initialize(*args)
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'json'
|
4
3
|
require 'time'
|
5
4
|
require 'net/http'
|
6
5
|
|
@@ -92,8 +91,8 @@ module Aws
|
|
92
91
|
# service is responding but is returning invalid JSON documents
|
93
92
|
# in response to the GET profile credentials call.
|
94
93
|
begin
|
95
|
-
retry_errors([
|
96
|
-
c =
|
94
|
+
retry_errors([Aws::Json::ParseError, StandardError], max_retries: 3) do
|
95
|
+
c = Aws::Json.load(get_credentials.to_s)
|
97
96
|
@credentials = Credentials.new(
|
98
97
|
c['AccessKeyId'],
|
99
98
|
c['SecretAccessKey'],
|
@@ -101,7 +100,7 @@ module Aws
|
|
101
100
|
)
|
102
101
|
@expiration = c['Expiration'] ? Time.iso8601(c['Expiration']) : nil
|
103
102
|
end
|
104
|
-
rescue
|
103
|
+
rescue Aws::Json::ParseError
|
105
104
|
raise Aws::Errors::MetadataParserError
|
106
105
|
end
|
107
106
|
end
|
data/lib/aws-sdk-core/json.rb
CHANGED
@@ -143,8 +143,22 @@ module Aws
|
|
143
143
|
errors << expected_got(context, "true or false", value)
|
144
144
|
end
|
145
145
|
when BlobShape
|
146
|
-
unless value.is_a?(String)
|
147
|
-
|
146
|
+
unless value.is_a?(String)
|
147
|
+
if streaming_input?(ref)
|
148
|
+
unless io_like?(value, _require_size = false)
|
149
|
+
errors << expected_got(
|
150
|
+
context,
|
151
|
+
"a String or IO like object that supports read and rewind",
|
152
|
+
value
|
153
|
+
)
|
154
|
+
end
|
155
|
+
elsif !io_like?(value, _require_size = true)
|
156
|
+
errors << expected_got(
|
157
|
+
context,
|
158
|
+
"a String or IO like object that supports read, rewind, and size",
|
159
|
+
value
|
160
|
+
)
|
161
|
+
end
|
148
162
|
end
|
149
163
|
else
|
150
164
|
raise "unhandled shape type: #{ref.shape.class.name}"
|
@@ -167,8 +181,13 @@ module Aws
|
|
167
181
|
end
|
168
182
|
end
|
169
183
|
|
170
|
-
def io_like?(value)
|
171
|
-
value.respond_to?(:read) && value.respond_to?(:rewind)
|
184
|
+
def io_like?(value, require_size = true)
|
185
|
+
value.respond_to?(:read) && value.respond_to?(:rewind) &&
|
186
|
+
(!require_size || value.respond_to?(:size))
|
187
|
+
end
|
188
|
+
|
189
|
+
def streaming_input?(ref)
|
190
|
+
(ref["streaming"] || ref.shape["streaming"])
|
172
191
|
end
|
173
192
|
|
174
193
|
def error_messages(errors)
|
@@ -23,7 +23,7 @@ When provided, `x-api-key` header will be injected with the value provided.
|
|
23
23
|
class OptionHandler < Seahorse::Client::Handler
|
24
24
|
def call(context)
|
25
25
|
if context.operation.require_apikey
|
26
|
-
if context.params.is_a?(Hash)
|
26
|
+
if context.params.is_a?(Hash) && context.params[:api_key]
|
27
27
|
api_key = context.params.delete(:api_key)
|
28
28
|
end
|
29
29
|
api_key = context.config.api_key if api_key.nil?
|
@@ -30,13 +30,28 @@ following classes:
|
|
30
30
|
* `Aws::Credentials` - Used for configuring static, non-refreshing
|
31
31
|
credentials.
|
32
32
|
|
33
|
+
* `Aws::SharedCredentials` - Used for loading static credentials from a
|
34
|
+
shared file, such as `~/.aws/config`.
|
35
|
+
|
36
|
+
* `Aws::AssumeRoleCredentials` - Used when you need to assume a role.
|
37
|
+
|
38
|
+
* `Aws::AssumeRoleWebIdentityCredentials` - Used when you need to
|
39
|
+
assume a role after providing credentials via the web.
|
40
|
+
|
41
|
+
* `Aws::SSOCredentials` - Used for loading credentials from AWS SSO using an
|
42
|
+
access token generated from `aws login`.
|
43
|
+
|
44
|
+
* `Aws::ProcessCredentials` - Used for loading credentials from a
|
45
|
+
process that outputs to stdout.
|
46
|
+
|
33
47
|
* `Aws::InstanceProfileCredentials` - Used for loading credentials
|
34
48
|
from an EC2 IMDS on an EC2 instance.
|
35
49
|
|
36
|
-
* `Aws::
|
37
|
-
|
50
|
+
* `Aws::ECSCredentials` - Used for loading credentials from
|
51
|
+
instances running in ECS.
|
38
52
|
|
39
|
-
* `Aws::
|
53
|
+
* `Aws::CognitoIdentityCredentials` - Used for loading credentials
|
54
|
+
from the Cognito Identity service.
|
40
55
|
|
41
56
|
When `:credentials` are not configured directly, the following
|
42
57
|
locations will be searched for credentials:
|
@@ -46,10 +61,10 @@ locations will be searched for credentials:
|
|
46
61
|
* ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']
|
47
62
|
* `~/.aws/credentials`
|
48
63
|
* `~/.aws/config`
|
49
|
-
* EC2 IMDS instance profile - When used by default, the timeouts
|
50
|
-
very aggressive. Construct and pass an instance of
|
51
|
-
`Aws::InstanceProfileCredentails`
|
52
|
-
timeouts.
|
64
|
+
* EC2/ECS IMDS instance profile - When used by default, the timeouts
|
65
|
+
are very aggressive. Construct and pass an instance of
|
66
|
+
`Aws::InstanceProfileCredentails` or `Aws::ECSCredentials` to
|
67
|
+
enable retries and extended timeouts.
|
53
68
|
DOCS
|
54
69
|
) do |config|
|
55
70
|
CredentialProviderChain.new(config).resolve
|
@@ -42,8 +42,8 @@ module Aws
|
|
42
42
|
|
43
43
|
if process_status.success?
|
44
44
|
begin
|
45
|
-
creds_json =
|
46
|
-
rescue
|
45
|
+
creds_json = Aws::Json.load(raw_out)
|
46
|
+
rescue Aws::Json::ParseError
|
47
47
|
raise Errors::InvalidProcessCredentialsPayload.new("Invalid JSON response")
|
48
48
|
end
|
49
49
|
payload_version = creds_json['Version']
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require 'time'
|
4
4
|
require 'base64'
|
5
|
-
require 'json'
|
6
5
|
|
7
6
|
module Aws
|
8
7
|
module Rest
|
@@ -68,7 +67,7 @@ module Aws
|
|
68
67
|
end
|
69
68
|
|
70
69
|
def extract_json_trait(value)
|
71
|
-
|
70
|
+
Aws::Json.load(Base64.decode64(value))
|
72
71
|
end
|
73
72
|
|
74
73
|
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module Aws
|
4
4
|
# @api private
|
5
5
|
class SharedConfig
|
6
|
+
SSO_PROFILE_KEYS = %w[sso_start_url sso_region sso_account_id sso_role_name].freeze
|
7
|
+
|
6
8
|
# @return [String]
|
7
9
|
attr_reader :credentials_path
|
8
10
|
|
@@ -135,6 +137,18 @@ module Aws
|
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
140
|
+
# Attempts to load from shared config or shared credentials file.
|
141
|
+
# Will always attempt first to load from the shared credentials
|
142
|
+
# file, if present.
|
143
|
+
def sso_credentials_from_config(opts = {})
|
144
|
+
p = opts[:profile] || @profile_name
|
145
|
+
credentials = sso_credentials_from_profile(@parsed_credentials, p)
|
146
|
+
if @parsed_config
|
147
|
+
credentials ||= sso_credentials_from_profile(@parsed_config, p)
|
148
|
+
end
|
149
|
+
credentials
|
150
|
+
end
|
151
|
+
|
138
152
|
# Add an accessor method (similar to attr_reader) to return a configuration value
|
139
153
|
# Uses the get_config_value below to control where
|
140
154
|
# values are loaded from
|
@@ -237,6 +251,8 @@ module Aws
|
|
237
251
|
provider.credentials if provider.credentials.set?
|
238
252
|
elsif (provider = assume_role_process_credentials_from_config(profile))
|
239
253
|
provider.credentials if provider.credentials.set?
|
254
|
+
elsif (provider = sso_credentials_from_config(profile: profile))
|
255
|
+
provider.credentials if provider.credentials.set?
|
240
256
|
end
|
241
257
|
end
|
242
258
|
|
@@ -273,6 +289,22 @@ module Aws
|
|
273
289
|
end
|
274
290
|
end
|
275
291
|
|
292
|
+
# If any of the sso_ profile values are present, attempt to construct
|
293
|
+
# SSOCredentials
|
294
|
+
def sso_credentials_from_profile(cfg, profile)
|
295
|
+
if @parsed_config &&
|
296
|
+
(prof_config = cfg[profile]) &&
|
297
|
+
!(prof_config.keys & SSO_PROFILE_KEYS).empty?
|
298
|
+
|
299
|
+
SSOCredentials.new(
|
300
|
+
sso_start_url: prof_config['sso_start_url'],
|
301
|
+
sso_region: prof_config['sso_region'],
|
302
|
+
sso_account_id: prof_config['sso_account_id'],
|
303
|
+
sso_role_name: prof_config['sso_role_name']
|
304
|
+
)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
276
308
|
def credentials_from_profile(prof_config)
|
277
309
|
creds = Credentials.new(
|
278
310
|
prof_config['aws_access_key_id'],
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
# An auto-refreshing credential provider that works by assuming a
|
5
|
+
# role via {Aws::SSO::Client#get_role_credentials} using a cached access
|
6
|
+
# token. This class does NOT implement the SSO login token flow - tokens
|
7
|
+
# must generated and refreshed separately by running `aws login` with the
|
8
|
+
# correct profile.
|
9
|
+
#
|
10
|
+
# For more background on AWS SSO see the official
|
11
|
+
# [what is SSO](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html]
|
12
|
+
# page.
|
13
|
+
#
|
14
|
+
# ## Refreshing Credentials from SSO
|
15
|
+
#
|
16
|
+
# The `SSOCredentials` will auto-refresh the AWS credentials from SSO. In
|
17
|
+
# addition to AWS credentials expiring after a given amount of time, the
|
18
|
+
# access token generated and cached from `aws login` will also expire.
|
19
|
+
# Once this token expires, it will not be usable to refresh AWS credentials,
|
20
|
+
# and another token will be needed. The SDK does not manage refreshing of
|
21
|
+
# the token value, but this can be done by running `aws login` with the
|
22
|
+
# correct profile.
|
23
|
+
class SSOCredentials
|
24
|
+
|
25
|
+
include CredentialProvider
|
26
|
+
include RefreshingCredentials
|
27
|
+
|
28
|
+
SSO_REQUIRED_OPTS = [:sso_account_id, :sso_region, :sso_role_name, :sso_start_url].freeze
|
29
|
+
|
30
|
+
SSO_LOGIN_GUIDANCE = 'The SSO session associated with this profile has '\
|
31
|
+
'expired or is otherwise invalid. To refresh this SSO session run '\
|
32
|
+
'aws sso login with the corresponding profile.'.freeze
|
33
|
+
|
34
|
+
# @option options [required, String] :sso_account_id The AWS account ID
|
35
|
+
# that temporary AWS credentials will be resolved for
|
36
|
+
#
|
37
|
+
# @option options [required, String] :sso_region The AWS region where the
|
38
|
+
# SSO directory for the given sso_start_url is hosted.
|
39
|
+
#
|
40
|
+
# @option options [required, String] :sso_role_name The corresponding
|
41
|
+
# IAM role in the AWS account that temporary AWS credentials
|
42
|
+
# will be resolved for.
|
43
|
+
#
|
44
|
+
# @option options [required, String] :sso_start_url The start URL is
|
45
|
+
# provided by the SSO service via the console and is the URL used to
|
46
|
+
# login to the SSO directory. This is also sometimes referred to as
|
47
|
+
# the "User Portal URL"
|
48
|
+
|
49
|
+
# @option options [SSO::Client] :client Optional `SSO::Client`. If not
|
50
|
+
# provided, a client will be constructed.
|
51
|
+
def initialize(options = {})
|
52
|
+
|
53
|
+
missing_keys = SSO_REQUIRED_OPTS.select { |k| options[k].nil? }
|
54
|
+
unless missing_keys.empty?
|
55
|
+
raise ArgumentError, "Missing required keys: #{missing_keys}"
|
56
|
+
end
|
57
|
+
|
58
|
+
@sso_start_url = options.delete(:sso_start_url)
|
59
|
+
@sso_region = options.delete(:sso_region)
|
60
|
+
@sso_role_name = options.delete(:sso_role_name)
|
61
|
+
@sso_account_id = options.delete(:sso_account_id)
|
62
|
+
|
63
|
+
# validate we can read the token file
|
64
|
+
read_cached_token
|
65
|
+
|
66
|
+
options[:region] = @sso_region
|
67
|
+
options[:credentials] = nil
|
68
|
+
@client = options[:client] || SSO::Client.new(options)
|
69
|
+
super
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [STS::Client]
|
73
|
+
attr_reader :client
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def read_cached_token
|
78
|
+
cached_token = Json.load(File.read(sso_cache_file))
|
79
|
+
# validation
|
80
|
+
unless cached_token['accessToken'] && cached_token['expiresAt']
|
81
|
+
raise ArgumentError, 'Missing required field(s)'
|
82
|
+
end
|
83
|
+
expires_at = DateTime.parse(cached_token['expiresAt'])
|
84
|
+
if expires_at < DateTime.now
|
85
|
+
raise ArgumentError, 'Cached SSO Token is expired.'
|
86
|
+
end
|
87
|
+
cached_token
|
88
|
+
rescue Aws::Json::ParseError, ArgumentError
|
89
|
+
raise Errors::InvalidSSOCredentials, SSO_LOGIN_GUIDANCE
|
90
|
+
end
|
91
|
+
|
92
|
+
def refresh
|
93
|
+
cached_token = read_cached_token
|
94
|
+
c = @client.get_role_credentials(
|
95
|
+
account_id: @sso_account_id,
|
96
|
+
role_name: @sso_role_name,
|
97
|
+
access_token: cached_token['accessToken']
|
98
|
+
).role_credentials
|
99
|
+
|
100
|
+
@credentials = Credentials.new(
|
101
|
+
c.access_key_id,
|
102
|
+
c.secret_access_key,
|
103
|
+
c.session_token
|
104
|
+
)
|
105
|
+
@expiration = c.expiration
|
106
|
+
end
|
107
|
+
|
108
|
+
def sso_cache_file
|
109
|
+
start_url_sha1 = OpenSSL::Digest::SHA1.hexdigest(@sso_start_url.encode('utf-8'))
|
110
|
+
File.join(Dir.home, '.aws', 'sso', 'cache', "#{start_url_sha1}.json")
|
111
|
+
rescue ArgumentError
|
112
|
+
# Dir.home raises ArgumentError when ENV['home'] is not set
|
113
|
+
raise ArgumentError, "Unable to load sso_cache_file: ENV['HOME'] is not set."
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|