in hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java [570:666]
public Response putAcl(String bucketName, HttpHeaders httpHeaders,
InputStream body) throws IOException, OS3Exception {
long startNanos = Time.monotonicNowNanos();
String grantReads = httpHeaders.getHeaderString(S3Acl.GRANT_READ);
String grantWrites = httpHeaders.getHeaderString(S3Acl.GRANT_WRITE);
String grantReadACP = httpHeaders.getHeaderString(S3Acl.GRANT_READ_CAP);
String grantWriteACP = httpHeaders.getHeaderString(S3Acl.GRANT_WRITE_CAP);
String grantFull = httpHeaders.getHeaderString(S3Acl.GRANT_FULL_CONTROL);
try {
OzoneBucket bucket = getBucket(bucketName);
OzoneVolume volume = getVolume();
List<OzoneAcl> ozoneAclListOnBucket = new ArrayList<>();
List<OzoneAcl> ozoneAclListOnVolume = new ArrayList<>();
if (grantReads == null && grantWrites == null && grantReadACP == null
&& grantWriteACP == null && grantFull == null) {
S3BucketAcl putBucketAclRequest =
new PutBucketAclRequestUnmarshaller().readFrom(body);
// Handle grants in body
ozoneAclListOnBucket.addAll(
S3Acl.s3AclToOzoneNativeAclOnBucket(putBucketAclRequest));
ozoneAclListOnVolume.addAll(
S3Acl.s3AclToOzoneNativeAclOnVolume(putBucketAclRequest));
} else {
// Handle grants in headers
if (grantReads != null) {
ozoneAclListOnBucket.addAll(getAndConvertAclOnBucket(grantReads,
S3Acl.ACLType.READ.getValue()));
ozoneAclListOnVolume.addAll(getAndConvertAclOnVolume(grantReads,
S3Acl.ACLType.READ.getValue()));
}
if (grantWrites != null) {
ozoneAclListOnBucket.addAll(getAndConvertAclOnBucket(grantWrites,
S3Acl.ACLType.WRITE.getValue()));
ozoneAclListOnVolume.addAll(getAndConvertAclOnVolume(grantWrites,
S3Acl.ACLType.WRITE.getValue()));
}
if (grantReadACP != null) {
ozoneAclListOnBucket.addAll(getAndConvertAclOnBucket(grantReadACP,
S3Acl.ACLType.READ_ACP.getValue()));
ozoneAclListOnVolume.addAll(getAndConvertAclOnVolume(grantReadACP,
S3Acl.ACLType.READ_ACP.getValue()));
}
if (grantWriteACP != null) {
ozoneAclListOnBucket.addAll(getAndConvertAclOnBucket(grantWriteACP,
S3Acl.ACLType.WRITE_ACP.getValue()));
ozoneAclListOnVolume.addAll(getAndConvertAclOnVolume(grantWriteACP,
S3Acl.ACLType.WRITE_ACP.getValue()));
}
if (grantFull != null) {
ozoneAclListOnBucket.addAll(getAndConvertAclOnBucket(grantFull,
S3Acl.ACLType.FULL_CONTROL.getValue()));
ozoneAclListOnVolume.addAll(getAndConvertAclOnVolume(grantFull,
S3Acl.ACLType.FULL_CONTROL.getValue()));
}
}
// A put request will reset all previous ACLs on bucket
bucket.setAcl(ozoneAclListOnBucket);
// A put request will reset input user/group's permission on volume
List<OzoneAcl> acls = bucket.getAcls();
List<OzoneAcl> aclsToRemoveOnVolume = new ArrayList<>();
List<OzoneAcl> currentAclsOnVolume = volume.getAcls();
// Remove input user/group's permission from Volume first
if (!currentAclsOnVolume.isEmpty()) {
for (OzoneAcl acl : acls) {
if (acl.getAclScope() == ACCESS) {
aclsToRemoveOnVolume.addAll(OzoneAclUtil.filterAclList(
acl.getName(), acl.getType(), currentAclsOnVolume));
}
}
for (OzoneAcl acl : aclsToRemoveOnVolume) {
volume.removeAcl(acl);
}
}
// Add new permission on Volume
for (OzoneAcl acl : ozoneAclListOnVolume) {
volume.addAcl(acl);
}
} catch (OMException exception) {
getMetrics().updatePutAclFailureStats(startNanos);
auditWriteFailure(S3GAction.PUT_ACL, exception);
if (exception.getResult() == ResultCodes.BUCKET_NOT_FOUND) {
throw newError(S3ErrorTable.NO_SUCH_BUCKET, bucketName, exception);
} else if (isAccessDenied(exception)) {
throw newError(S3ErrorTable.ACCESS_DENIED, bucketName, exception);
}
throw exception;
} catch (OS3Exception ex) {
getMetrics().updatePutAclFailureStats(startNanos);
throw ex;
}
getMetrics().updatePutAclSuccessStats(startNanos);
return Response.status(HttpStatus.SC_OK).build();
}