URL url = new URL(linkUrlPrefix + "/" + bucketName + "/" + RestUtils.encodeUrlString(privateKey));
assertEquals("Expected denied access (403) error", 403, ((HttpURLConnection) url
.openConnection()).getResponseCode());
// Get ACL details for private object so we can determine the account owner ID.
AccessControlList objectACL = service.getObjectAcl(bucketName, privateKey);
StorageOwner accountOwner = objectACL.getOwner();
// Create a public object.
String publicKey = "Public Object - " + System.currentTimeMillis();
object = new StorageObject(publicKey, "Public object sample text");
AccessControlList acl = buildAccessControlList();
acl.setOwner(accountOwner);
acl.grantPermission(allUsersGrantee, Permission.PERMISSION_READ);
object.setAcl(acl);
service.putObject(bucketName, object);
url = new URL(linkUrlPrefix + "/" + bucketName + "/" + RestUtils.encodeUrlString(publicKey));
assertEquals("Expected access (200)",
200, ((HttpURLConnection)url.openConnection()).getResponseCode());
// Update ACL to make private object public.
AccessControlList privateToPublicACL = service.getObjectAcl(bucketName, privateKey);
privateToPublicACL.grantPermission(allUsersGrantee, Permission.PERMISSION_READ);
object.setKey(privateKey);
object.setAcl(privateToPublicACL);
service.putObjectAcl(bucketName, object);
url = new URL(linkUrlPrefix + "/" + bucketName + "/" + RestUtils.encodeUrlString(privateKey));
assertEquals("Expected access (200)", 200, ((HttpURLConnection) url.openConnection())
.getResponseCode());
// Create a non-standard uncanned public object.
String publicKey2 = "Public Object - " + System.currentTimeMillis();
object = new StorageObject(publicKey2);
object.setAcl(privateToPublicACL); // This ACL has ALL_USERS READ permission set above.
service.putObject(bucketName, object);
url = new URL(linkUrlPrefix + "/" + bucketName + "/" + RestUtils.encodeUrlString(publicKey2));
assertEquals("Expected access (200)", 200, ((HttpURLConnection) url.openConnection())
.getResponseCode());
// Update ACL to make public object private.
AccessControlList publicToPrivateACL = service.getObjectAcl(bucketName, publicKey);
publicToPrivateACL.revokeAllPermissions(allUsersGrantee);
object.setKey(publicKey);
object.setAcl(publicToPrivateACL);
service.putObjectAcl(bucketName, object);
// TODO: Google Storage quirk: It may take some time for public object to become private again
if (TARGET_SERVICE_GS.equals(getTargetService())) {
// Confirm changes were applied on object's ACL, because we don't know
// how long to wait until the object will really become private again.
AccessControlList updatedAcl = service.getObjectAcl(bucketName, object.getKey());
assertFalse(updatedAcl.hasGranteeAndPermission(
allUsersGrantee, Permission.PERMISSION_READ));
assertEquals(0, updatedAcl.getPermissionsForGrantee(allUsersGrantee).size());
} else {
// In S3, objects are made private immediately.
url = new URL(linkUrlPrefix + "/" + bucketName + "/" + RestUtils.encodeUrlString(publicKey));
assertEquals("Expected denied access (403) error", 403, ((HttpURLConnection) url
.openConnection()).getResponseCode());