diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java index 687d5dace3c6..febad17a092a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAddAclRequest.java @@ -28,11 +28,19 @@ import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; +import org.apache.hadoop.ozone.om.request.util.ObjectParser; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; +import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; +import org.apache.hadoop.ozone.om.request.validation.RequestProcessingPhase; +import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.security.acl.OzoneObj; import org.apache.hadoop.ozone.security.acl.OzoneObjInfo; import org.apache.hadoop.util.Time; @@ -147,5 +155,38 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, return super.validateAndUpdateCache(ozoneManager, trxnLogIndex, omDoubleBufferHelper); } + + /** + * Validates Add ACL requests. + * We do not want to allow older clients to create add ACL requests + * for keys that are present in buckets which use non LEGACY layouts. + * + * @param req - the request to validate + * @param ctx - the validation context + * @return the validated request + * @throws OMException if the request is invalid + */ + @RequestFeatureValidator( + conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + processingPhase = RequestProcessingPhase.PRE_PROCESS, + requestType = Type.AddAcl + ) + public static OMRequest blockAddAclWithBucketLayoutFromOldClient( + OMRequest req, ValidationContext ctx) throws IOException { + if (req.getAddAclRequest().hasObj()) { + OzoneObj obj = OzoneObjInfo.fromProtobuf(req.getAddAclRequest().getObj()); + String path = obj.getPath(); + + ObjectParser objectParser = new ObjectParser(path, + OzoneManagerProtocolProtos.OzoneObj.ObjectType.KEY); + + String volume = objectParser.getVolume(); + String bucket = objectParser.getBucket(); + + BucketLayout bucketLayout = ctx.getBucketLayout(volume, bucket); + bucketLayout.validateSupportedOperation(); + } + return req; + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java index 9d2153c08abe..a97a076cde7e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyRemoveAclRequest.java @@ -28,11 +28,19 @@ import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; +import org.apache.hadoop.ozone.om.request.util.ObjectParser; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; +import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; +import org.apache.hadoop.ozone.om.request.validation.RequestProcessingPhase; +import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.security.acl.OzoneObj; import org.apache.hadoop.ozone.security.acl.OzoneObjInfo; import org.apache.hadoop.util.Time; @@ -149,5 +157,38 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, omDoubleBufferHelper); } + /** + * Validates Add ACL requests. + * We do not want to allow older clients to create remove ACL requests + * for keys that are present in buckets which use non LEGACY layouts. + * + * @param req - the request to validate + * @param ctx - the validation context + * @return the validated request + * @throws OMException if the request is invalid + */ + @RequestFeatureValidator( + conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + processingPhase = RequestProcessingPhase.PRE_PROCESS, + requestType = Type.RemoveAcl + ) + public static OMRequest blockRemoveAclWithBucketLayoutFromOldClient( + OMRequest req, ValidationContext ctx) throws IOException { + if (req.getRemoveAclRequest().hasObj()) { + OzoneObj obj = + OzoneObjInfo.fromProtobuf(req.getRemoveAclRequest().getObj()); + String path = obj.getPath(); + + ObjectParser objectParser = new ObjectParser(path, + OzoneManagerProtocolProtos.OzoneObj.ObjectType.KEY); + + String volume = objectParser.getVolume(); + String bucket = objectParser.getBucket(); + + BucketLayout bucketLayout = ctx.getBucketLayout(volume, bucket); + bucketLayout.validateSupportedOperation(); + } + return req; + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java index 9c4e35d8b02e..be8935f867cd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeySetAclRequest.java @@ -28,12 +28,20 @@ import org.apache.hadoop.ozone.audit.AuditLogger; import org.apache.hadoop.ozone.audit.OMAction; import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.OzoneAclUtil; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; +import org.apache.hadoop.ozone.om.request.util.ObjectParser; import org.apache.hadoop.ozone.om.request.util.OmResponseUtil; +import org.apache.hadoop.ozone.om.request.validation.RequestFeatureValidator; +import org.apache.hadoop.ozone.om.request.validation.RequestProcessingPhase; +import org.apache.hadoop.ozone.om.request.validation.ValidationCondition; +import org.apache.hadoop.ozone.om.request.validation.ValidationContext; import org.apache.hadoop.ozone.om.response.key.acl.OMKeyAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.hadoop.ozone.security.acl.OzoneObj; import org.apache.hadoop.ozone.security.acl.OzoneObjInfo; import org.apache.hadoop.util.Time; @@ -145,5 +153,38 @@ public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, omDoubleBufferHelper); } + /** + * Validates Add ACL requests. + * We do not want to allow older clients to create set ACL requests + * for keys that are present in buckets which use non LEGACY layouts. + * + * @param req - the request to validate + * @param ctx - the validation context + * @return the validated request + * @throws OMException if the request is invalid + */ + @RequestFeatureValidator( + conditions = ValidationCondition.OLDER_CLIENT_REQUESTS, + processingPhase = RequestProcessingPhase.PRE_PROCESS, + requestType = Type.SetAcl + ) + public static OMRequest blockSetAclWithBucketLayoutFromOldClient( + OMRequest req, ValidationContext ctx) throws IOException { + if (req.getSetAclRequest().hasObj()) { + OzoneObj obj = + OzoneObjInfo.fromProtobuf(req.getSetAclRequest().getObj()); + String path = obj.getPath(); + + ObjectParser objectParser = new ObjectParser(path, + OzoneManagerProtocolProtos.OzoneObj.ObjectType.KEY); + + String volume = objectParser.getVolume(); + String bucket = objectParser.getBucket(); + + BucketLayout bucketLayout = ctx.getBucketLayout(volume, bucket); + bucketLayout.validateSupportedOperation(); + } + return req; + } }