This is an automated email from the ASF dual-hosted git repository.

rmani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 6988b3157 RANGER-5000: Add validations to ensure that the policy items 
are properly formed during dataset policy creation / edit
6988b3157 is described below

commit 6988b315790a61180a341677fc732523c63ca8bd
Author: Radhika Kundam <[email protected]>
AuthorDate: Wed Nov 20 14:51:09 2024 -0800

    RANGER-5000: Add validations to ensure that the policy items are properly 
formed during dataset policy creation / edit
    
    Signed-off-by: Ramesh Mani <[email protected]>
---
 .../ranger/plugin/errors/ValidationErrorCode.java  |  1 +
 .../java/org/apache/ranger/biz/GdsDBStore.java     |  1 +
 .../ranger/validation/RangerGdsValidator.java      | 56 ++++++++++++++++++++++
 3 files changed, 58 insertions(+)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
index 13a362437..2753001c8 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/errors/ValidationErrorCode.java
@@ -109,6 +109,7 @@ public enum ValidationErrorCode {
     POLICY_VALIDATION_ERR_NULL_POLICY_ITEM_ROLE(3055, "policy items role was 
null"),
     POLICY_VALIDATION_ERR_DUPLICATE_VALUES_FOR_RESOURCE(3056, "Values for the 
resource={0} contained a duplicate value={1}. Ensure all values for a resource 
are unique"),
     POLICY_VALIDATION_ERR_INVALID_SERVICE_TYPE(4009," Invalid service type 
[{0}] provided for service [{1}]"),
+    POLICY_VALIDATION_ERR_NULL_POLICY_ITEM_ACCESS_TYPE(4010, "policy items 
access object has empty or null values for type"),
 
     // SECURITY_ZONE Validations
     SECURITY_ZONE_VALIDATION_ERR_UNSUPPORTED_ACTION(3034, "Internal error: 
unsupported action[{0}]; isValid() is only supported for DELETE"),
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
index 768192e84..11983a272 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -1826,6 +1826,7 @@ public class GdsDBStore extends AbstractGdsStore {
     }
 
     private void prepareDatasetPolicy(RangerDataset dataset, RangerPolicy 
policy) {
+        validator.validateCreateOrUpdate(policy);
         policy.setName("DATASET: " + dataset.getName() + 
GDS_POLICY_NAME_TIMESTAMP_SEP + System.currentTimeMillis());
         policy.setDescription("Policy for dataset: " + dataset.getName());
         policy.setServiceType(EMBEDDED_SERVICEDEF_GDS_NAME);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
index 627056bfd..4ee7b97ab 100755
--- 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
@@ -35,6 +35,8 @@ import 
org.apache.ranger.plugin.model.RangerGds.RangerGdsMaskInfo;
 import org.apache.ranger.plugin.model.RangerGds.RangerGdsObjectACL;
 import org.apache.ranger.plugin.model.RangerGds.RangerProject;
 import org.apache.ranger.plugin.model.RangerGds.RangerSharedResource;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
 import 
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemDataMaskInfo;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
 import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
@@ -688,6 +690,23 @@ public class RangerGdsValidator {
         LOG.debug("<== validateDelete(dipId={}, existing={})", dipId, 
existing);
     }
 
+    public void validateCreateOrUpdate(RangerPolicy policy) {
+        LOG.debug("==> validateCreateOrUpdate(policy={})", policy);
+        if (policy == null || 
CollectionUtils.isEmpty(policy.getPolicyItems())) {
+            return;
+        }
+
+        ValidationResult result   = new ValidationResult();
+        List<RangerPolicyItem> policyItems = policy.getPolicyItems();
+
+        validatePolicyItems(policyItems, result);
+
+        if (!result.isSuccess()) {
+            result.throwRESTException();
+        }
+        LOG.debug("<== validateCreateOrUpdate(policy={})", policy);
+    }
+
     public GdsPermission getGdsPermissionForUser(RangerGds.RangerGdsObjectACL 
acl, String user) {
         if (dataProvider.isAdminUser()) {
             return GdsPermission.ADMIN;
@@ -838,6 +857,43 @@ public class RangerGdsValidator {
         }
     }
 
+    private void validatePolicyItems(List<RangerPolicyItem> policyItems, 
ValidationResult result) {
+        if (CollectionUtils.isEmpty(policyItems)) {
+            return;
+        }
+
+        for (RangerPolicyItem policyItem : policyItems) {
+            if (policyItem == null) {
+                addValidationFailure(result, 
ValidationErrorCode.POLICY_VALIDATION_ERR_NULL_POLICY_ITEM);
+                continue;
+            }
+
+            boolean hasNoPrincipals = 
CollectionUtils.isEmpty(policyItem.getUsers()) && 
CollectionUtils.isEmpty(policyItem.getGroups()) && 
CollectionUtils.isEmpty(policyItem.getRoles());
+            boolean hasInvalidUsers = policyItem.getUsers() != null && 
policyItem.getUsers().stream().anyMatch(StringUtils::isBlank);
+            boolean hasInvalidGroups = policyItem.getGroups() != null && 
policyItem.getGroups().stream().anyMatch(StringUtils::isBlank);
+            boolean hasInvalidRoles = policyItem.getRoles() != null && 
policyItem.getRoles().stream().anyMatch(StringUtils::isBlank);
+
+            if (hasNoPrincipals || hasInvalidUsers || hasInvalidGroups || 
hasInvalidRoles) {
+                addValidationFailure(result, 
ValidationErrorCode.POLICY_VALIDATION_ERR_MISSING_USER_AND_GROUPS);
+            }
+
+            if (CollectionUtils.isEmpty(policyItem.getAccesses()) || 
policyItem.getAccesses().contains(null)) {
+                addValidationFailure(result, 
ValidationErrorCode.POLICY_VALIDATION_ERR_NULL_POLICY_ITEM_ACCESS);
+                continue;
+            }
+
+            boolean hasInvalidAccesses = 
policyItem.getAccesses().stream().anyMatch(itemAccess -> 
StringUtils.isBlank(itemAccess.getType()));
+
+            if (hasInvalidAccesses) {
+                addValidationFailure(result, 
ValidationErrorCode.POLICY_VALIDATION_ERR_NULL_POLICY_ITEM_ACCESS_TYPE);
+            }
+        }
+    }
+
+    private void addValidationFailure(ValidationResult result, 
ValidationErrorCode errorCode) {
+        result.addValidationFailure(new ValidationFailureDetails(errorCode, 
"policy items"));
+    }
+
     private void validateAcl(RangerGdsObjectACL acl, String fieldName, 
ValidationResult result) {
         if (acl != null) {
             if (MapUtils.isNotEmpty(acl.getUsers())) {

Reply via email to