7
7
8
8
//! Credentials Provider for external process
9
9
10
- use crate :: json_credentials:: { json_parse_loop, InvalidJsonCredentials , RefreshableCredentials } ;
10
+ use crate :: json_credentials:: { json_parse_loop, InvalidJsonCredentials } ;
11
11
use crate :: sensitive_command:: CommandWithSensitiveArgs ;
12
12
use aws_credential_types:: provider:: { self , error:: CredentialsError , future, ProvideCredentials } ;
13
13
use aws_credential_types:: Credentials ;
@@ -120,25 +120,12 @@ impl CredentialProcessProvider {
120
120
) )
121
121
} ) ?;
122
122
123
- match parse_credential_process_json_credentials ( output) {
124
- Ok ( RefreshableCredentials {
125
- access_key_id,
126
- secret_access_key,
127
- session_token,
128
- expiration,
129
- ..
130
- } ) => Ok ( Credentials :: new (
131
- access_key_id,
132
- secret_access_key,
133
- Some ( session_token. to_string ( ) ) ,
134
- expiration. into ( ) ,
135
- "CredentialProcess" ,
136
- ) ) ,
137
- Err ( invalid) => Err ( CredentialsError :: provider_error ( format ! (
123
+ parse_credential_process_json_credentials ( output) . map_err ( |invalid| {
124
+ CredentialsError :: provider_error ( format ! (
138
125
"Error retrieving credentials from external process, could not parse response: {}" ,
139
126
invalid
140
- ) ) ) ,
141
- }
127
+ ) )
128
+ } )
142
129
}
143
130
}
144
131
@@ -149,7 +136,7 @@ impl CredentialProcessProvider {
149
136
/// Keys are case insensitive.
150
137
pub ( crate ) fn parse_credential_process_json_credentials (
151
138
credentials_response : & str ,
152
- ) -> Result < RefreshableCredentials < ' _ > , InvalidJsonCredentials > {
139
+ ) -> Result < Credentials , InvalidJsonCredentials > {
153
140
let mut version = None ;
154
141
let mut access_key_id = None ;
155
142
let mut secret_access_key = None ;
@@ -206,25 +193,32 @@ pub(crate) fn parse_credential_process_json_credentials(
206
193
let access_key_id = access_key_id. ok_or ( InvalidJsonCredentials :: MissingField ( "AccessKeyId" ) ) ?;
207
194
let secret_access_key =
208
195
secret_access_key. ok_or ( InvalidJsonCredentials :: MissingField ( "SecretAccessKey" ) ) ?;
209
- let session_token = session_token. ok_or ( InvalidJsonCredentials :: MissingField ( "Token" ) ) ?;
210
- let expiration = expiration. ok_or ( InvalidJsonCredentials :: MissingField ( "Expiration" ) ) ?;
211
- let expiration =
212
- SystemTime :: try_from ( OffsetDateTime :: parse ( & expiration, & Rfc3339 ) . map_err ( |err| {
196
+ let expiration = expiration. map ( parse_expiration) . transpose ( ) ?;
197
+ if expiration. is_none ( ) {
198
+ tracing:: debug!( "no expiration provided for credentials provider credentials. these credentials will never be refreshed." )
199
+ }
200
+ Ok ( Credentials :: new (
201
+ access_key_id,
202
+ secret_access_key,
203
+ session_token. map ( |tok| tok. to_string ( ) ) ,
204
+ expiration,
205
+ "CredentialProcess" ,
206
+ ) )
207
+ }
208
+
209
+ fn parse_expiration ( expiration : impl AsRef < str > ) -> Result < SystemTime , InvalidJsonCredentials > {
210
+ SystemTime :: try_from (
211
+ OffsetDateTime :: parse ( expiration. as_ref ( ) , & Rfc3339 ) . map_err ( |err| {
213
212
InvalidJsonCredentials :: InvalidField {
214
213
field : "Expiration" ,
215
214
err : err. into ( ) ,
216
215
}
217
- } ) ?)
218
- . map_err ( |_| {
219
- InvalidJsonCredentials :: Other (
220
- "credential expiration time cannot be represented by a DateTime" . into ( ) ,
221
- )
222
- } ) ?;
223
- Ok ( RefreshableCredentials {
224
- access_key_id,
225
- secret_access_key,
226
- session_token,
227
- expiration,
216
+ } ) ?,
217
+ )
218
+ . map_err ( |_| {
219
+ InvalidJsonCredentials :: Other (
220
+ "credential expiration time cannot be represented by a DateTime" . into ( ) ,
221
+ )
228
222
} )
229
223
}
230
224
@@ -258,6 +252,18 @@ mod test {
258
252
) ;
259
253
}
260
254
255
+ #[ tokio:: test]
256
+ async fn test_credential_process_no_expiry ( ) {
257
+ let provider = CredentialProcessProvider :: new ( String :: from (
258
+ r#"echo '{ "Version": 1, "AccessKeyId": "ASIARTESTID", "SecretAccessKey": "TESTSECRETKEY" }'"# ,
259
+ ) ) ;
260
+ let creds = provider. provide_credentials ( ) . await . expect ( "valid creds" ) ;
261
+ assert_eq ! ( creds. access_key_id( ) , "ASIARTESTID" ) ;
262
+ assert_eq ! ( creds. secret_access_key( ) , "TESTSECRETKEY" ) ;
263
+ assert_eq ! ( creds. session_token( ) , None ) ;
264
+ assert_eq ! ( creds. expiry( ) , None ) ;
265
+ }
266
+
261
267
#[ tokio:: test]
262
268
async fn credentials_process_timeouts ( ) {
263
269
let provider = CredentialProcessProvider :: new ( String :: from ( "sleep 1000" ) ) ;
0 commit comments