Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support passing an ACL for S3 putObject operations #49

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.amazonaws</groupId>
<artifactId>amazon-sqs-java-extended-client-lib</artifactId>
<version>1.0.2</version>
<version>1.1.0-rc1</version>
<packaging>jar</packaging>
<name>Amazon SQS Extended Client Library for Java</name>
<description>An extension to the Amazon SQS client that enables sending and receiving messages up to 2GB via Amazon S3.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.Map.Entry;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
Expand Down Expand Up @@ -1328,12 +1331,27 @@ private String getJSONFromS3Pointer(MessageS3Pointer s3Pointer) {
return s3PointerStr;
}

private void addAcl(PutObjectRequest request) {
// Add ACLs in request if provided in configuration.
AccessControlList acl = clientConfiguration.getS3Acl();
if (null != acl) {
request.setAccessControlList(acl);
}

CannedAccessControlList cannedAcl = clientConfiguration.getS3CannedAcl();
if (null != cannedAcl) {
request.setCannedAcl(cannedAcl);
}
}

private void storeTextInS3(String s3Key, String messageContentStr, Long messageContentSize) {
InputStream messageContentStream = new ByteArrayInputStream(messageContentStr.getBytes(StandardCharsets.UTF_8));
ObjectMetadata messageContentStreamMetadata = new ObjectMetadata();
messageContentStreamMetadata.setContentLength(messageContentSize);
PutObjectRequest putObjectRequest = new PutObjectRequest(clientConfiguration.getS3BucketName(), s3Key,
messageContentStream, messageContentStreamMetadata);
addAcl(putObjectRequest); // Add any ACL policy that might been set in the config to the request.

try {
clientConfiguration.getAmazonS3Client().putObject(putObjectRequest);
} catch (AmazonServiceException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

import com.amazonaws.AmazonClientException;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.amazonaws.annotation.NotThreadSafe;
Expand All @@ -35,6 +37,9 @@ public class ExtendedClientConfiguration {
private String s3BucketName;
private boolean largePayloadSupport = false;
private boolean alwaysThroughS3 = false;
private AccessControlList acl;
private CannedAccessControlList cannedAcl;

private int messageSizeThreshold = SQSExtendedClientConstants.DEFAULT_MESSAGE_SIZE_THRESHOLD;

public ExtendedClientConfiguration() {
Expand All @@ -48,6 +53,8 @@ public ExtendedClientConfiguration(ExtendedClientConfiguration other) {
this.largePayloadSupport = other.largePayloadSupport;
this.alwaysThroughS3 = other.alwaysThroughS3;
this.messageSizeThreshold = other.messageSizeThreshold;
this.acl = other.acl;
this.cannedAcl = other.cannedAcl;
}

/**
Expand Down Expand Up @@ -214,4 +221,70 @@ public ExtendedClientConfiguration withAlwaysThroughS3(boolean alwaysThroughS3)
public boolean isAlwaysThroughS3() {
return alwaysThroughS3;
}

/**
* Sets an ACL Policy for S3 to be applied with PutObject operations.
*
* @param s3Acl
* ACL Policy to apply when putting a large object in S3
*/
public void setS3Acl(AccessControlList s3Acl) {
acl = s3Acl;
LOG.info("ACL Policy for S3 put object operations set.");
}

/**
* Sets an ACL Policy for S3 to be applied with PutObject operations.
*
* @param s3Acl
* ACL Policy to apply when putting a large object in S3
*/
public ExtendedClientConfiguration withS3ACL(AccessControlList s3Acl) {
setS3Acl(s3Acl);
return this;
}

/**
* Gets S3 ACL Policy configured
*
* @return ACL Policy configured
* S3. Default: Null.
*/
public AccessControlList getS3Acl() {
return acl;
}


/**
* Sets a Canned ACL Policy for S3 to be applied with PutObject operations.
*
* @param s3CannedAcl
* ACL Policy to apply when putting a large object in S3
*/
public void setS3CannedAcl(CannedAccessControlList s3CannedAcl) {
cannedAcl = s3CannedAcl;
LOG.info("ACL Policy for S3 put object operations set.");
}

/**
* Sets a Canned ACL Policy for S3 to be applied with PutObject operations.
*
* @param s3CannedAcl
* ACL Policy to apply when putting a large object in S3
*/
public ExtendedClientConfiguration withS3CannedACL(CannedAccessControlList s3CannedAcl) {
setS3CannedAcl(s3CannedAcl);
return this;
}

/**
* Gets S3 Canned ACL Policy configured
*
* @return ACL Canned Policy configured
* S3. Default: Null.
*/
public CannedAccessControlList getS3CannedAcl() {
return cannedAcl;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import java.util.Map;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClient;
Expand Down Expand Up @@ -224,6 +226,26 @@ public void testWhenLargeMessgaeIsSentThenAttributeWithPayloadSizeIsAdded() {
Assert.assertEquals(messageLength, (int)Integer.valueOf(attributes.get(SQSExtendedClientConstants.RESERVED_ATTRIBUTE_NAME).getStringValue()));
}

@Test
public void testACLsAreAddedToRequestIfSetInConfig() {
AccessControlList acl = new AccessControlList();
ExtendedClientConfiguration config = new ExtendedClientConfiguration()
.withLargePayloadSupportEnabled(mockS3, S3_BUCKET_NAME)
.withAlwaysThroughS3(true)
.withS3CannedACL(CannedAccessControlList.BucketOwnerFullControl)
.withS3ACL(acl);

AmazonSQS sqsExtended = spy(new AmazonSQSExtendedClient(mock(AmazonSQSClient.class), config));
SendMessageRequest messageRequest = new SendMessageRequest(SQS_QUEUE_URL, "someBody");
sqsExtended.sendMessage(messageRequest);

ArgumentCaptor<PutObjectRequest> putObjectRequestCaptor = ArgumentCaptor.forClass(PutObjectRequest.class);
verify(mockS3).putObject(putObjectRequestCaptor.capture());
PutObjectRequest captured = putObjectRequestCaptor.getValue();
Assert.assertEquals(acl, captured.getAccessControlList());
Assert.assertEquals(CannedAccessControlList.BucketOwnerFullControl, captured.getCannedAcl());

}
private String generateStringWithLength(int messageLength) {
char[] charArray = new char[messageLength];
Arrays.fill(charArray, 'x');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package com.amazon.sqs.javamessaging;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AccessControlList;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;
import junit.framework.Assert;
import org.junit.Before;
Expand Down Expand Up @@ -116,5 +118,31 @@ public void testMessageSizeThreshold() {

}

@Test
public void testS3ACL() {
ExtendedClientConfiguration extendedClientConfiguration = new ExtendedClientConfiguration();

Assert.assertNull(extendedClientConfiguration.getS3Acl());
AccessControlList acl = new AccessControlList();
extendedClientConfiguration.setS3Acl(acl);
Assert.assertEquals(acl, extendedClientConfiguration.getS3Acl());

extendedClientConfiguration = new ExtendedClientConfiguration()
.withS3ACL(acl);
Assert.assertEquals(acl, extendedClientConfiguration.getS3Acl());
}

@Test
public void testS3CannedACL() {
ExtendedClientConfiguration extendedClientConfiguration = new ExtendedClientConfiguration();

Assert.assertNull(extendedClientConfiguration.getS3Acl());
CannedAccessControlList acl = CannedAccessControlList.BucketOwnerFullControl;
extendedClientConfiguration.setS3CannedAcl(acl);
Assert.assertEquals(acl, extendedClientConfiguration.getS3CannedAcl());

extendedClientConfiguration = new ExtendedClientConfiguration()
.withS3CannedACL(acl);
Assert.assertEquals(acl, extendedClientConfiguration.getS3CannedAcl());
}
}