389 389 | fn from(val: Credentials) -> Self {
|
390 390 | let expiry = val.expiry();
|
391 391 | let mut builder = if let Some(account_id) = val.account_id() {
|
392 392 | Identity::builder().property(account_id.clone())
|
393 393 | } else {
|
394 394 | Identity::builder()
|
395 395 | };
|
396 396 |
|
397 397 | builder.set_expiration(expiry);
|
398 398 |
|
399 - | if let Some(features) = val.get_property::<Vec<AwsCredentialFeature>>().cloned() {
|
399 + | let features = val.get_property::<Vec<AwsCredentialFeature>>().cloned();
|
400 + | let has_account_id = val.account_id().is_some();
|
401 + |
|
402 + | if features.is_some() || has_account_id {
|
400 403 | let mut layer = Layer::new("IdentityResolutionFeatureIdTracking");
|
404 + | if let Some(features) = features {
|
401 405 | for feat in features {
|
402 406 | layer.store_append(feat);
|
403 407 | }
|
408 + | }
|
409 + | if has_account_id {
|
410 + | layer.store_append(AwsCredentialFeature::ResolvedAccountId);
|
411 + | }
|
404 412 | builder.set_property(layer.freeze());
|
405 413 | }
|
406 414 |
|
407 415 | builder.data(val).build().expect("set required fields")
|
408 416 | }
|
409 417 | }
|
410 418 |
|
411 419 | #[cfg(test)]
|
412 420 | mod test {
|
413 421 | use crate::Credentials;
|
414 422 | use std::time::{Duration, UNIX_EPOCH};
|
415 423 |
|
416 - | #[cfg(feature = "test-util")]
|
417 - | use crate::credential_feature::AwsCredentialFeature;
|
418 - |
|
419 424 | #[test]
|
420 425 | fn debug_impl() {
|
421 426 | let creds = Credentials::new(
|
422 427 | "akid",
|
423 428 | "secret",
|
424 429 | Some("token".into()),
|
425 430 | Some(UNIX_EPOCH + Duration::from_secs(1234567890)),
|
426 431 | "debug tester",
|
427 432 | );
|
428 433 | assert_eq!(
|
429 434 | format!("{:?}", creds),
|
430 435 | r#"Credentials { provider_name: "debug tester", access_key_id: "akid", secret_access_key: "** redacted **", expires_after: "2009-02-13T23:31:30Z" }"#
|
431 436 | );
|
432 437 |
|
433 438 | // with account ID
|
434 439 | let creds = Credentials::builder()
|
435 440 | .access_key_id("akid")
|
436 441 | .secret_access_key("secret")
|
437 442 | .session_token("token")
|
438 443 | .expiry(UNIX_EPOCH + Duration::from_secs(1234567890))
|
439 444 | .account_id("012345678901")
|
440 445 | .provider_name("debug tester")
|
441 446 | .build();
|
442 447 | assert_eq!(
|
443 448 | format!("{:?}", creds),
|
444 449 | r#"Credentials { provider_name: "debug tester", access_key_id: "akid", secret_access_key: "** redacted **", expires_after: "2009-02-13T23:31:30Z", account_id: "012345678901" }"#
|
445 450 | );
|
446 451 | }
|
447 452 |
|
448 453 | #[cfg(feature = "test-util")]
|
449 454 | #[test]
|
450 455 | fn equality_ignores_properties() {
|
451 456 | #[derive(Clone, Debug)]
|
452 457 | struct Foo;
|
453 458 | let mut creds1 = Credentials::for_tests_with_session_token();
|
454 - | creds1.set_property(AwsCredentialFeature::CredentialsCode);
|
459 + | creds1.set_property(crate::credential_feature::AwsCredentialFeature::CredentialsCode);
|
455 460 |
|
456 461 | let mut creds2 = Credentials::for_tests_with_session_token();
|
457 462 | creds2.set_property(Foo);
|
458 463 |
|
459 464 | assert_eq!(creds1, creds2)
|
460 465 | }
|
461 466 |
|
462 467 | #[cfg(feature = "test-util")]
|
463 468 | #[test]
|
464 469 | fn identity_inherits_feature_properties() {
|
470 + | use crate::credential_feature::AwsCredentialFeature;
|
465 471 | use aws_smithy_runtime_api::client::identity::Identity;
|
466 472 | use aws_smithy_types::config_bag::FrozenLayer;
|
467 473 |
|
468 474 | let mut creds = Credentials::for_tests_with_session_token();
|
469 475 | let mut feature_props = vec![
|
470 476 | AwsCredentialFeature::CredentialsCode,
|
471 477 | AwsCredentialFeature::CredentialsStsSessionToken,
|
472 478 | ];
|
473 479 | creds.set_property(feature_props.clone());
|
474 480 |
|
475 481 | let identity = Identity::from(creds);
|
476 482 |
|
477 483 | let maybe_props = identity
|
478 484 | .property::<FrozenLayer>()
|
479 485 | .unwrap()
|
480 486 | .load::<AwsCredentialFeature>()
|
481 487 | .cloned()
|
482 488 | .collect::<Vec<AwsCredentialFeature>>();
|
483 489 |
|
484 490 | // The props get reversed when being popped out of the StoreAppend
|
485 491 | feature_props.reverse();
|
486 492 | assert_eq!(maybe_props, feature_props)
|
487 493 | }
|
494 + |
|
495 + | #[cfg(feature = "test-util")]
|
496 + | #[test]
|
497 + | fn from_credentials_adds_resolved_account_id_feature() {
|
498 + | use crate::credential_feature::AwsCredentialFeature;
|
499 + | use aws_smithy_runtime_api::client::identity::Identity;
|
500 + | use aws_smithy_types::config_bag::FrozenLayer;
|
501 + |
|
502 + | let creds = Credentials::builder()
|
503 + | .access_key_id("test")
|
504 + | .secret_access_key("test")
|
505 + | .account_id("123456789012")
|
506 + | .provider_name("test")
|
507 + | .build();
|
508 + |
|
509 + | let identity = Identity::from(creds);
|
510 + |
|
511 + | let layer = identity.property::<FrozenLayer>().unwrap();
|
512 + | let features = layer
|
513 + | .load::<AwsCredentialFeature>()
|
514 + | .cloned()
|
515 + | .collect::<Vec<_>>();
|
516 + | assert!(features.contains(&AwsCredentialFeature::ResolvedAccountId));
|
517 + | }
|
488 518 | }
|