From 5cee125be1ef3a874f1c3db3b437d999e5e9ddae Mon Sep 17 00:00:00 2001 From: Benjamin Farley Date: Wed, 17 Mar 2021 15:24:29 -0600 Subject: [PATCH 1/2] fix: Update user agent string to correctly reflect version --- sdk1/pom.xml | 7 +++++++ .../providers/DirectKmsMaterialProvider.java | 18 +++++++++++++++--- sdk1/src/main/resources/project.properties | 1 + .../DirectKmsMaterialProviderTest.java | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 sdk1/src/main/resources/project.properties diff --git a/sdk1/pom.xml b/sdk1/pom.xml index 2c0aa5f9..8620ff72 100644 --- a/sdk1/pom.xml +++ b/sdk1/pom.xml @@ -272,6 +272,13 @@ + + + src/main/resources + true + + + org.apache.maven.plugins diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java index bee842ba..be5ef7bc 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java @@ -34,11 +34,13 @@ import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; import java.nio.ByteBuffer; import java.security.NoSuchAlgorithmException; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import static com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.WrappedRawMaterials.CONTENT_KEY_ALGORITHM; import static com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.WrappedRawMaterials.ENVELOPE_KEY; @@ -53,9 +55,8 @@ * @see KMS Encryption Context */ public class DirectKmsMaterialProvider implements EncryptionMaterialsProvider { - private static final String VERSION_STRING = "1.0"; - private static final String USER_AGENT = DirectKmsMaterialProvider.class.getName() - + "/" + VERSION_STRING + "/" + VersionInfoUtils.getVersion(); + static final String USER_AGENT_PREFIX = "DynamodbEncryptionSdkJava/"; + private static final String USER_AGENT = USER_AGENT_PREFIX + loadVersion(); private static final String COVERED_ATTR_CTX_KEY = "aws-kms-ec-attr"; private static final String SIGNING_KEY_ALGORITHM = "amzn-ddb-sig-alg"; private static final String TABLE_NAME_EC_KEY = "*aws-kms-table*"; @@ -77,6 +78,17 @@ public class DirectKmsMaterialProvider implements EncryptionMaterialsProvider { private final int sigKeyLength; private final String sigKeyDesc; + private static String loadVersion() { + try { + final Properties properties = new Properties(); + properties.load(DirectKmsMaterialProvider.class.getClassLoader() + .getResourceAsStream("project.properties")); + return properties.getProperty("foo"); + } catch (final IOException ex) { + return "unknown"; + } + } + public DirectKmsMaterialProvider(AWSKMS kms) { this(kms, null); } diff --git a/sdk1/src/main/resources/project.properties b/sdk1/src/main/resources/project.properties new file mode 100644 index 00000000..defbd482 --- /dev/null +++ b/sdk1/src/main/resources/project.properties @@ -0,0 +1 @@ +version=${project.version} diff --git a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProviderTest.java b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProviderTest.java index 8eb71f73..de4b60b5 100644 --- a/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProviderTest.java +++ b/sdk1/src/test/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProviderTest.java @@ -12,6 +12,7 @@ */ package com.amazonaws.services.dynamodbv2.datamodeling.encryption.providers; +import com.amazonaws.RequestClientOptions; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.EncryptionContext; import com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.DecryptionMaterials; @@ -337,6 +338,19 @@ public GenerateDataKeyResult generateDataKey(GenerateDataKeyRequest r) { assertTrue(gdkCalled.get()); } + @Test + public void userAgentIsAdded() { + AWSKMS kmsSpy = new FakeKMS() { + @Override + public GenerateDataKeyResult generateDataKey(GenerateDataKeyRequest r) { + assertTrue(r.getRequestClientOptions().getClientMarker(RequestClientOptions.Marker.USER_AGENT) + .contains(DirectKmsMaterialProvider.USER_AGENT_PREFIX)); + return super.generateDataKey(r); + } + }; + new DirectKmsMaterialProvider(kmsSpy, keyId).getEncryptionMaterials(ctx); + } + private static class ExtendedKmsMaterialProvider extends DirectKmsMaterialProvider { private final String encryptionKeyIdAttributeName; From a20414d7a47b224cb13bce89f913f467503a53c8 Mon Sep 17 00:00:00 2001 From: Benjamin Farley Date: Thu, 18 Mar 2021 09:35:58 -0600 Subject: [PATCH 2/2] Move loadVersion to shared location --- .../providers/DirectKmsMaterialProvider.java | 15 +-------------- .../dynamodbv2/datamodeling/internal/Utils.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java index be5ef7bc..a655fa86 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/DirectKmsMaterialProvider.java @@ -30,21 +30,19 @@ import com.amazonaws.services.kms.model.GenerateDataKeyRequest; import com.amazonaws.services.kms.model.GenerateDataKeyResult; import com.amazonaws.util.StringUtils; -import com.amazonaws.util.VersionInfoUtils; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; -import java.io.IOException; import java.nio.ByteBuffer; import java.security.NoSuchAlgorithmException; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Properties; import static com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.WrappedRawMaterials.CONTENT_KEY_ALGORITHM; import static com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.WrappedRawMaterials.ENVELOPE_KEY; import static com.amazonaws.services.dynamodbv2.datamodeling.encryption.materials.WrappedRawMaterials.KEY_WRAPPING_ALGORITHM; +import static com.amazonaws.services.dynamodbv2.datamodeling.internal.Utils.loadVersion; /** * Generates a unique data key for each record in DynamoDB and protects that key @@ -78,17 +76,6 @@ public class DirectKmsMaterialProvider implements EncryptionMaterialsProvider { private final int sigKeyLength; private final String sigKeyDesc; - private static String loadVersion() { - try { - final Properties properties = new Properties(); - properties.load(DirectKmsMaterialProvider.class.getClassLoader() - .getResourceAsStream("project.properties")); - return properties.getProperty("foo"); - } catch (final IOException ex) { - return "unknown"; - } - } - public DirectKmsMaterialProvider(AWSKMS kms) { this(kms, null); } diff --git a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java index 5ee04895..86e6604a 100644 --- a/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java +++ b/sdk1/src/main/java/com/amazonaws/services/dynamodbv2/datamodeling/internal/Utils.java @@ -14,7 +14,9 @@ */ package com.amazonaws.services.dynamodbv2.datamodeling.internal; +import java.io.IOException; import java.security.SecureRandom; +import java.util.Properties; public class Utils { private static final ThreadLocal RND = new ThreadLocal() { @@ -47,4 +49,18 @@ public static V checkNotNull(final V ref, final String errMsg) { return ref; } } + + /* + * Loads the version of the library + */ + public static String loadVersion() { + try { + final Properties properties = new Properties(); + properties.load(ClassLoader.getSystemResourceAsStream("project.properties")); + return properties.getProperty("version"); + } catch (final IOException ex) { + return "unknown"; + } + } + }