Skip to content

Commit 9b582eb

Browse files
committed
Credentials: handling of nullable fields
1 parent 1173333 commit 9b582eb

2 files changed

Lines changed: 47 additions & 17 deletions

File tree

packages/amplify_foundation/amplify_foundation_dart_bridge/lib/src/v2_credentials_provider_bridge.dart

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,28 @@ class V2CredentialsProviderBridge implements v3.AWSCredentialsProvider {
3030
@override
3131
Future<v3.AWSCredentials> resolve() async {
3232
final creds = await _v2Provider.retrieve();
33-
if (creds.sessionToken != null) {
33+
final sessionToken = creds.sessionToken;
34+
final expiration = creds.expiration;
35+
36+
if (sessionToken != null && expiration == null) {
37+
throw StateError(
38+
'Credentials with a session token must include an expiration, '
39+
'but expiration was null.',
40+
);
41+
}
42+
if (sessionToken == null && expiration != null) {
43+
throw StateError(
44+
'Credentials with an expiration must include a session token, '
45+
'but session token was null.',
46+
);
47+
}
48+
49+
if (sessionToken != null && expiration != null) {
3450
return v3.TemporaryCredentials(
3551
creds.accessKeyId,
3652
creds.secretAccessKey,
37-
creds.sessionToken!,
38-
creds.expiration ?? DateTime.now().add(const Duration(hours: 1)),
53+
sessionToken,
54+
expiration,
3955
);
4056
}
4157
return v3.StaticCredentials(creds.accessKeyId, creds.secretAccessKey);

packages/amplify_foundation/amplify_foundation_dart_bridge/test/v2_credentials_provider_bridge_test.dart

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,35 @@ void main() {
4141
expect(temp.expiration, equals(expiration));
4242
});
4343

44-
test('defaults expiration to 1 hour when not provided', () async {
45-
const v2Creds = v2.AWSCredentials(
46-
'accessKey',
47-
'secretKey',
48-
'sessionToken',
49-
);
50-
const v2Provider = v2.AWSCredentialsProvider(v2Creds);
51-
const bridge = V2CredentialsProviderBridge(v2Provider);
44+
test(
45+
'throws when session token is present but expiration is null',
46+
() async {
47+
const v2Creds = v2.AWSCredentials(
48+
'accessKey',
49+
'secretKey',
50+
'sessionToken',
51+
);
52+
const v2Provider = v2.AWSCredentialsProvider(v2Creds);
53+
const bridge = V2CredentialsProviderBridge(v2Provider);
5254

53-
final before = DateTime.now().add(const Duration(minutes: 59));
54-
final v3Creds = await bridge.resolve() as v3.TemporaryCredentials;
55-
final after = DateTime.now().add(const Duration(hours: 1, minutes: 1));
55+
expect(bridge.resolve(), throwsStateError);
56+
},
57+
);
5658

57-
expect(v3Creds.expiration.isAfter(before), isTrue);
58-
expect(v3Creds.expiration.isBefore(after), isTrue);
59-
});
59+
test(
60+
'throws when expiration is present but session token is null',
61+
() async {
62+
final v2Creds = v2.AWSCredentials(
63+
'accessKey',
64+
'secretKey',
65+
null,
66+
DateTime.now().add(const Duration(hours: 1)),
67+
);
68+
final v2Provider = v2.AWSCredentialsProvider(v2Creds);
69+
final bridge = V2CredentialsProviderBridge(v2Provider);
70+
71+
expect(bridge.resolve(), throwsStateError);
72+
},
73+
);
6074
});
6175
}

0 commit comments

Comments
 (0)