From 206ff79de4ebb373cd953703c937351f64bcc8d4 Mon Sep 17 00:00:00 2001 From: Sachin Karve Date: Wed, 10 Jul 2024 21:17:48 -0700 Subject: [PATCH 1/4] adding a defaultCredentialsProvider for AWS --- .../java/com/meta/cp4m/S3PreProcessor.java | 30 +++++++++++-------- .../com/meta/cp4m/S3PreProcessorConfig.java | 14 ++++----- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/meta/cp4m/S3PreProcessor.java b/src/main/java/com/meta/cp4m/S3PreProcessor.java index 6f1b267..8e8a07f 100644 --- a/src/main/java/com/meta/cp4m/S3PreProcessor.java +++ b/src/main/java/com/meta/cp4m/S3PreProcessor.java @@ -12,10 +12,14 @@ import com.meta.cp4m.message.Payload; import com.meta.cp4m.message.ThreadState; import java.time.Instant; +import java.util.Objects; + import org.checkerframework.checker.nullness.qual.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.AwsSessionCredentials; +import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.regions.Region; @@ -29,24 +33,26 @@ public class S3PreProcessor implements PreProcessor { private final String region; private final String bucket; private final @Nullable String textMessageAddition; - private final StaticCredentialsProvider credentialsProvider; + private @Nullable StaticCredentialsProvider staticCredentialsProvider; public S3PreProcessor( - String awsAccessKeyID, - String awsSecretAccessKey, - String region, - String bucket, - @Nullable String textMessageAddition) { + String awsAccessKeyID, + String awsSecretAccessKey, + String region, + String bucket, + @Nullable String textMessageAddition) { this.awsAccessKeyID = awsAccessKeyID; this.awsSecretAccessKey = awsSecretAccessKey; this.region = region; this.bucket = bucket; this.textMessageAddition = textMessageAddition; + this.staticCredentialsProvider = null; - AwsSessionCredentials sessionCredentials = - AwsSessionCredentials.create(this.awsAccessKeyID, this.awsSecretAccessKey, ""); - - this.credentialsProvider = StaticCredentialsProvider.create(sessionCredentials); + if (!this.awsAccessKeyID.isEmpty() && !this.awsSecretAccessKey.isEmpty()) { + AwsSessionCredentials sessionCredentials = + AwsSessionCredentials.create(this.awsAccessKeyID, this.awsSecretAccessKey, ""); + staticCredentialsProvider = StaticCredentialsProvider.create(sessionCredentials); + } } @Override @@ -75,11 +81,11 @@ public ThreadState run(ThreadState in) { public void sendRequest(byte[] media, String senderID, String extension) { String key = senderID + '_' + Instant.now().toEpochMilli() + '.' + extension; - + AwsCredentialsProvider credentialsProvider = Objects.requireNonNullElse(this.staticCredentialsProvider, DefaultCredentialsProvider.create()); try (S3Client s3Client = S3Client.builder() .region(Region.of(this.region)) - .credentialsProvider(this.credentialsProvider) + .credentialsProvider(credentialsProvider) .build()) { PutObjectRequest request = diff --git a/src/main/java/com/meta/cp4m/S3PreProcessorConfig.java b/src/main/java/com/meta/cp4m/S3PreProcessorConfig.java index 2888711..c754b4c 100644 --- a/src/main/java/com/meta/cp4m/S3PreProcessorConfig.java +++ b/src/main/java/com/meta/cp4m/S3PreProcessorConfig.java @@ -18,8 +18,8 @@ public record S3PreProcessorConfig( String name, - String awsAccessKeyId, - String awsSecretAccessKey, + @Nullable String awsAccessKeyId, + @Nullable String awsSecretAccessKey, String region, String bucket, @Nullable String textMessageAddition) @@ -30,8 +30,8 @@ public record S3PreProcessorConfig( @JsonCreator public S3PreProcessorConfig( @JsonProperty("name") String name, - @JsonProperty("aws_access_key_id") String awsAccessKeyId, - @JsonProperty("aws_secret_access_key") String awsSecretAccessKey, + @JsonProperty("aws_access_key_id") @Nullable String awsAccessKeyId, + @JsonProperty("aws_secret_access_key") @Nullable String awsSecretAccessKey, @JsonProperty("region") String region, @JsonProperty("bucket") String bucket, @JsonProperty("text_message_addition") @Nullable String textMessageAddition) { @@ -41,10 +41,8 @@ public S3PreProcessorConfig( "bucket does not match the aws region format(kebab case) or is empty"); this.name = Objects.requireNonNull(name, "name is a required parameter"); - this.awsAccessKeyId = - Objects.requireNonNull(awsAccessKeyId, "aws access key is a required parameter"); - this.awsSecretAccessKey = - Objects.requireNonNull(awsSecretAccessKey, "aws secret access key is a required parameter"); + this.awsAccessKeyId = Objects.requireNonNullElse(awsAccessKeyId, ""); + this.awsSecretAccessKey = Objects.requireNonNullElse(awsSecretAccessKey, ""); this.region = Objects.requireNonNull(region, "region is a required parameter"); this.bucket = Objects.requireNonNull(bucket, "bucket is a required parameter"); this.textMessageAddition = textMessageAddition; From 0600a94936de876f89fee7b7cb80c62e6fa59940 Mon Sep 17 00:00:00 2001 From: Sachin Karve Date: Thu, 11 Jul 2024 13:31:31 -0700 Subject: [PATCH 2/4] moving creds generation to constructor + assigning staticCredentialsProvider in a way the variable can be static --- src/main/java/com/meta/cp4m/S3PreProcessor.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/meta/cp4m/S3PreProcessor.java b/src/main/java/com/meta/cp4m/S3PreProcessor.java index 8e8a07f..648e1e3 100644 --- a/src/main/java/com/meta/cp4m/S3PreProcessor.java +++ b/src/main/java/com/meta/cp4m/S3PreProcessor.java @@ -33,7 +33,7 @@ public class S3PreProcessor implements PreProcessor { private final String region; private final String bucket; private final @Nullable String textMessageAddition; - private @Nullable StaticCredentialsProvider staticCredentialsProvider; + private final AwsCredentialsProvider credentials; public S3PreProcessor( String awsAccessKeyID, @@ -46,13 +46,17 @@ public S3PreProcessor( this.region = region; this.bucket = bucket; this.textMessageAddition = textMessageAddition; - this.staticCredentialsProvider = null; + @Nullable StaticCredentialsProvider staticCredentialsProvider; if (!this.awsAccessKeyID.isEmpty() && !this.awsSecretAccessKey.isEmpty()) { AwsSessionCredentials sessionCredentials = AwsSessionCredentials.create(this.awsAccessKeyID, this.awsSecretAccessKey, ""); staticCredentialsProvider = StaticCredentialsProvider.create(sessionCredentials); + } else { + staticCredentialsProvider = null; } + + this.credentials = Objects.requireNonNullElse(staticCredentialsProvider, DefaultCredentialsProvider.create()); } @Override @@ -60,10 +64,10 @@ public ThreadState run(ThreadState in) { switch (in.tail().payload()) { case Payload.Image i -> { - this.sendRequest(i.value(), in.userId().toString(), i.extension()); + this.sendRequest(i.value(), in.userId().toString(), i.extension(), this.credentials); } case Payload.Document i -> { - this.sendRequest(i.value(), in.userId().toString(), i.extension()); + this.sendRequest(i.value(), in.userId().toString(), i.extension(), this.credentials); } default -> { return in; @@ -79,13 +83,12 @@ public ThreadState run(ThreadState in) { Identifier.random())); // TODO: remove last message } - public void sendRequest(byte[] media, String senderID, String extension) { + public void sendRequest(byte[] media, String senderID, String extension, AwsCredentialsProvider credentials) { String key = senderID + '_' + Instant.now().toEpochMilli() + '.' + extension; - AwsCredentialsProvider credentialsProvider = Objects.requireNonNullElse(this.staticCredentialsProvider, DefaultCredentialsProvider.create()); try (S3Client s3Client = S3Client.builder() .region(Region.of(this.region)) - .credentialsProvider(credentialsProvider) + .credentialsProvider(credentials) .build()) { PutObjectRequest request = From 19703a8039e92dc4fe80fd6829a0237f5653db68 Mon Sep 17 00:00:00 2001 From: Sachin Karve Date: Thu, 11 Jul 2024 13:35:57 -0700 Subject: [PATCH 3/4] updating StaticCredentialsProvider variable name to StaticCredentials for clarity --- src/main/java/com/meta/cp4m/S3PreProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/meta/cp4m/S3PreProcessor.java b/src/main/java/com/meta/cp4m/S3PreProcessor.java index 648e1e3..b54e278 100644 --- a/src/main/java/com/meta/cp4m/S3PreProcessor.java +++ b/src/main/java/com/meta/cp4m/S3PreProcessor.java @@ -47,16 +47,16 @@ public S3PreProcessor( this.bucket = bucket; this.textMessageAddition = textMessageAddition; - @Nullable StaticCredentialsProvider staticCredentialsProvider; + @Nullable StaticCredentialsProvider staticCredentials; if (!this.awsAccessKeyID.isEmpty() && !this.awsSecretAccessKey.isEmpty()) { AwsSessionCredentials sessionCredentials = AwsSessionCredentials.create(this.awsAccessKeyID, this.awsSecretAccessKey, ""); - staticCredentialsProvider = StaticCredentialsProvider.create(sessionCredentials); + staticCredentials = StaticCredentialsProvider.create(sessionCredentials); } else { - staticCredentialsProvider = null; + staticCredentials = null; } - this.credentials = Objects.requireNonNullElse(staticCredentialsProvider, DefaultCredentialsProvider.create()); + this.credentials = Objects.requireNonNullElse(staticCredentials, DefaultCredentialsProvider.create()); } @Override From 0e486abd3d66ac0c5382426f22ed46be179ca0b2 Mon Sep 17 00:00:00 2001 From: Sachin Karve Date: Thu, 11 Jul 2024 13:43:25 -0700 Subject: [PATCH 4/4] optimize sendRequest call parameters --- src/main/java/com/meta/cp4m/S3PreProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/meta/cp4m/S3PreProcessor.java b/src/main/java/com/meta/cp4m/S3PreProcessor.java index b54e278..e997595 100644 --- a/src/main/java/com/meta/cp4m/S3PreProcessor.java +++ b/src/main/java/com/meta/cp4m/S3PreProcessor.java @@ -64,10 +64,10 @@ public ThreadState run(ThreadState in) { switch (in.tail().payload()) { case Payload.Image i -> { - this.sendRequest(i.value(), in.userId().toString(), i.extension(), this.credentials); + this.sendRequest(i.value(), in.userId().toString(), i.extension()); } case Payload.Document i -> { - this.sendRequest(i.value(), in.userId().toString(), i.extension(), this.credentials); + this.sendRequest(i.value(), in.userId().toString(), i.extension()); } default -> { return in; @@ -83,12 +83,12 @@ public ThreadState run(ThreadState in) { Identifier.random())); // TODO: remove last message } - public void sendRequest(byte[] media, String senderID, String extension, AwsCredentialsProvider credentials) { + public void sendRequest(byte[] media, String senderID, String extension) { String key = senderID + '_' + Instant.now().toEpochMilli() + '.' + extension; try (S3Client s3Client = S3Client.builder() .region(Region.of(this.region)) - .credentialsProvider(credentials) + .credentialsProvider(this.credentials) .build()) { PutObjectRequest request =