Skip to content

Commit 6280ba4

Browse files
authored
fix(EnhancedClient): Correctly Identify Index attributes (#254)
1 parent 746a208 commit 6280ba4

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

DynamoDbEncryption/runtimes/java/src/main/java/software/amazon/cryptography/dbencryptionsdk/dynamodb/enhancedclient/DynamoDbEnhancedClientEncryption.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package software.amazon.cryptography.dbencryptionsdk.dynamodb.enhancedclient;
22

3+
import java.util.*;
4+
import java.util.stream.Collectors;
5+
6+
import software.amazon.awssdk.enhanced.dynamodb.IndexMetadata;
7+
import software.amazon.awssdk.enhanced.dynamodb.KeyAttributeMetadata;
8+
import software.amazon.awssdk.enhanced.dynamodb.TableMetadata;
9+
310
import software.amazon.cryptography.dbencryptionsdk.dynamodb.model.DynamoDbTablesEncryptionConfig;
411
import software.amazon.cryptography.dbencryptionsdk.dynamodb.model.DynamoDbEncryptionException;
512
import software.amazon.cryptography.dbencryptionsdk.dynamodb.model.DynamoDbTableEncryptionConfig;
613
import software.amazon.cryptography.dbencryptionsdk.structuredencryption.model.CryptoAction;
714
import software.amazon.cryptography.dbencryptionsdk.dynamodb.DynamoDbEncryptionInterceptor;
815

9-
import java.util.*;
10-
import java.util.stream.Collectors;
11-
1216
import static software.amazon.cryptography.dbencryptionsdk.dynamodb.enhancedclient.DoNothingTag.CUSTOM_DDB_ENCRYPTION_DO_NOTHING_PREFIX;
1317
import static software.amazon.cryptography.dbencryptionsdk.dynamodb.enhancedclient.SignOnlyTag.CUSTOM_DDB_ENCRYPTION_SIGN_ONLY_PREFIX;
1418

@@ -27,12 +31,33 @@ public static DynamoDbEncryptionInterceptor CreateDynamoDbEncryptionInterceptor(
2731
.build();
2832
}
2933

34+
private static Set<String> attributeNamesUsedInIndices(
35+
final TableMetadata tableMetadata
36+
) {
37+
Set<String> partitionAttributeNames = tableMetadata.indices().stream()
38+
.map(IndexMetadata::partitionKey)
39+
.filter(Optional::isPresent)
40+
.map(Optional::get)
41+
.map(KeyAttributeMetadata::name)
42+
.collect(Collectors.toSet());
43+
Set<String> sortAttributeNames = tableMetadata.indices().stream()
44+
.map(IndexMetadata::sortKey)
45+
.filter(Optional::isPresent)
46+
.map(Optional::get)
47+
.map(KeyAttributeMetadata::name)
48+
.collect(Collectors.toSet());
49+
Set<String> allIndexAttributes = new HashSet<>();
50+
allIndexAttributes.addAll(partitionAttributeNames);
51+
allIndexAttributes.addAll(sortAttributeNames);
52+
return allIndexAttributes;
53+
}
54+
3055
private static DynamoDbTableEncryptionConfig getTableConfig(DynamoDbEnhancedTableEncryptionConfig configWithSchema) {
3156
Map<String, CryptoAction> actions = new HashMap<>();
3257

3358
Set<String> signOnlyAttributes = configWithSchema.schemaOnEncrypt().tableMetadata().customMetadataObject(CUSTOM_DDB_ENCRYPTION_SIGN_ONLY_PREFIX, Set.class).orElseGet(HashSet::new);
3459
Set<String> doNothingAttributes = configWithSchema.schemaOnEncrypt().tableMetadata().customMetadataObject(CUSTOM_DDB_ENCRYPTION_DO_NOTHING_PREFIX, Set.class).orElseGet(HashSet::new);
35-
Set<String> keyAttributes = configWithSchema.schemaOnEncrypt().tableMetadata().keyAttributes().stream().map(val -> val.name()).collect(Collectors.toSet());
60+
Set<String> keyAttributes = attributeNamesUsedInIndices(configWithSchema.schemaOnEncrypt().tableMetadata());
3661

3762
if (!Collections.disjoint(keyAttributes, doNothingAttributes)) {
3863
throw DynamoDbEncryptionException.builder()

0 commit comments

Comments
 (0)