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

madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/RANGER-3923 by this push:
     new 6dd92b6fa RANGER-4541: fixed validation of DataShareInDataset and 
DatasetInProject status update and delete
6dd92b6fa is described below

commit 6dd92b6faa2bd9315e776a7bb355e235007ec0a5
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Wed Nov 22 23:17:18 2023 -0800

    RANGER-4541: fixed validation of DataShareInDataset and DatasetInProject 
status update and delete
---
 .../ranger/validation/RangerGdsValidator.java      | 365 +++++++++++++--------
 1 file changed, 235 insertions(+), 130 deletions(-)

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 d0a1142f6..178c8f0e2 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
@@ -305,34 +305,34 @@ public class RangerGdsValidator {
         LOG.debug("<== validateDelete(resourceId={}, existing={})", 
resourceId, existing);
     }
 
-    public void validateCreate(RangerDataShareInDataset dshInDataset) {
-        LOG.debug("==> validateCreate(dshInDataset={})", dshInDataset);
+    public void validateCreate(RangerDataShareInDataset dshid) {
+        LOG.debug("==> validateCreate(dshid={})", dshid);
 
         ValidationResult result    = new ValidationResult();
-        RangerDataShare  dataShare = 
dataProvider.getDataShare(dshInDataset.getDataShareId());
-        RangerDataset    dataset   = 
dataProvider.getDataset(dshInDataset.getDatasetId());
+        RangerDataShare  dataShare = 
dataProvider.getDataShare(dshid.getDataShareId());
+        RangerDataset    dataset   = 
dataProvider.getDataset(dshid.getDatasetId());
 
         if (dataShare == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_ID_NOT_FOUND,
 "dataShareId", dshInDataset.getDataShareId()));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_ID_NOT_FOUND,
 "dataShareId", dshid.getDataShareId()));
         }
 
         if (dataset == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", dshInDataset.getDatasetId()));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", dshid.getDatasetId()));
         }
 
         if (dataShare != null && dataset != null && 
!dataProvider.isAdminUser()) {
             if (!dataProvider.isServiceAdmin(dataShare.getService()) && 
!dataProvider.isZoneAdmin(dataShare.getZone())) {
-                validateAdmin(dataProvider.getCurrentUserLoginId(), 
"datashare", dataShare.getName(), dataShare.getAcl(), result);
+                validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataShare", dataShare.getName(), dataShare.getAcl(), result);
             }
 
-            switch (dshInDataset.getStatus()) {
+            switch (dshid.getStatus()) {
                 case GRANTED:
                 case DENIED:
-                    validateAdmin(dataProvider.getCurrentUserLoginId(), 
"datashare", dataShare.getName(), dataShare.getAcl(), result);
+                    validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataShare", dataShare.getName(), dataShare.getAcl(), result);
                 break;
 
                 case ACTIVE:
-                    validateAdmin(dataProvider.getCurrentUserLoginId(), 
"datashare", dataShare.getName(), dataShare.getAcl(), result);
+                    validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataShare", dataShare.getName(), dataShare.getAcl(), result);
                     validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataset", dataset.getName(), dataset.getAcl(), result);
                 break;
 
@@ -347,16 +347,16 @@ public class RangerGdsValidator {
             result.throwRESTException();
         }
 
-        LOG.debug("<== validateCreate(dshInDataset={})", dshInDataset);
+        LOG.debug("<== validateCreate(dshid={})", dshid);
     }
 
-    public void validateUpdate(RangerDataShareInDataset dshInDataset, 
RangerDataShareInDataset existing) {
-        LOG.debug("==> validateUpdate(dshInDataset={}, existing={})", 
dshInDataset, existing);
+    public void validateUpdate(RangerDataShareInDataset dshid, 
RangerDataShareInDataset existing) {
+        LOG.debug("==> validateUpdate(dshid={}, existing={})", dshid, 
existing);
 
         ValidationResult result = new ValidationResult();
 
         if (existing == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_IN_DATASET_ID_NOT_FOUND,
 "id", dshInDataset.getId()));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_IN_DATASET_ID_NOT_FOUND,
 "id", dshid.getId()));
         } else {
             RangerDataShare dataShare = 
dataProvider.getDataShare(existing.getDataShareId());
             RangerDataset   dataset   = 
dataProvider.getDataset(existing.getDatasetId());
@@ -369,66 +369,43 @@ public class RangerGdsValidator {
                 result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", existing.getDatasetId()));
             }
 
-            if (!Objects.equals(dshInDataset.getDataShareId(), 
existing.getDataShareId())) {
+            if (!Objects.equals(dshid.getDataShareId(), 
existing.getDataShareId())) {
                 result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_UPDATE_IMMUTABLE_FIELD,
 "dataShareId"));
 
                 dataShare = null;
             }
 
-            if (!Objects.equals(dshInDataset.getDatasetId(), 
existing.getDatasetId())) {
+            if (!Objects.equals(dshid.getDatasetId(), 
existing.getDatasetId())) {
                 result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_UPDATE_IMMUTABLE_FIELD,
 "datasetId"));
 
                 dataset = null;
             }
 
             if (dataShare != null && dataset != null && 
!dataProvider.isAdminUser()) {
-                boolean requireDataShareAdmin = false;
-                boolean requireDatasetAdmin   = false;
-
-                if (!Objects.equals(existing.getStatus(), 
dshInDataset.getStatus())) {
-                    switch (existing.getStatus()) {
-                        case NONE:
-                            if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.REQUESTED) {
-                                requireDatasetAdmin = true;
-                            } else if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.GRANTED || dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.DENIED) {
-                                requireDataShareAdmin = true;
-                            } else if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.ACTIVE) {
-                                result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_INVALID_STATUS_CHANGE,
 "status", existing.getStatus(), dshInDataset.getStatus()));
-                            }
-                            break;
-
-                        case REQUESTED:
-                            if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.NONE) {
-                                requireDatasetAdmin = true;
-                            } else if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.GRANTED || dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.DENIED) {
-                                requireDataShareAdmin = true;
-                            } else if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.ACTIVE) {
-                                result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_INVALID_STATUS_CHANGE,
 "status", existing.getStatus(), dshInDataset.getStatus()));
-                            }
-                            break;
+                if (!Objects.equals(existing.getStatus(), dshid.getStatus())) {
+                    boolean requireDataShareAdmin = 
needsSharedObjectAdmin(existing.getStatus(), dshid.getStatus());
+                    boolean requireDatasetAdmin   = 
needsReceivingObjectAdmin(existing.getStatus(), dshid.getStatus());
 
-                        case GRANTED:
-                            if (dshInDataset.getStatus() == 
RangerGds.GdsShareStatus.ACTIVE) {
-                                requireDatasetAdmin = true;
-                            }
-                            break;
+                    if (requireDataShareAdmin) {
+                        if 
(!dataProvider.isServiceAdmin(dataShare.getService()) && 
!dataProvider.isZoneAdmin(dataShare.getZone())) {
+                            
validateAdmin(dataProvider.getCurrentUserLoginId(), "dataShare", 
dataShare.getName(), dataShare.getAcl(), result);
+                        }
+                    }
 
-                        case ACTIVE:
-                        case DENIED:
-                        default:
-                            break;
+                    if (requireDatasetAdmin) {
+                        validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataset", dataset.getName(), dataset.getAcl(), result);
                     }
 
-                    if (requireDataShareAdmin) {
-                        if (!dataProvider.isAdminUser() && 
!dataProvider.isServiceAdmin(dataShare.getService()) && 
!dataProvider.isZoneAdmin(dataShare.getZone())) {
-                            
validateAdmin(dataProvider.getCurrentUserLoginId(), "datashare", 
dataShare.getName(), dataShare.getAcl(), result);
-                        }
-                    } else if (requireDatasetAdmin) {
-                        if (!dataProvider.isAdminUser()) {
-                            
validateAdmin(dataProvider.getCurrentUserLoginId(), "dataset", 
dataset.getName(), dataset.getAcl(), result);
+                    if (!requireDataShareAdmin && !requireDatasetAdmin){ // 
must be either a dataShare admin or a dataset admin
+                        String  userName  = 
dataProvider.getCurrentUserLoginId();
+                        boolean isAllowed = isAdmin(userName, 
dataShare.getAcl()) ||
+                                            
dataProvider.isServiceAdmin(dataShare.getService()) ||
+                                            
dataProvider.isZoneAdmin(dataShare.getZone()) ||
+                                            isAdmin(userName, 
dataset.getAcl());
+
+                        if (!isAllowed) {
+                            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_INVALID_STATUS_CHANGE,
 "status", existing.getStatus(), dshid.getStatus()));
                         }
-                    } else { // must be either a dataset admin or a datashare 
admin
-                        // TODO:
                     }
                 }
             }
@@ -438,16 +415,16 @@ public class RangerGdsValidator {
             result.throwRESTException();
         }
 
-        LOG.debug("<== validateUpdate(dshInDataset={}, existing={})", 
dshInDataset, existing);
+        LOG.debug("<== validateUpdate(dshid={}, existing={})", dshid, 
existing);
     }
 
-    public void validateDelete(Long dshInDatasetId, RangerDataShareInDataset 
existing) {
-        LOG.debug("==> validateDelete(dshInDatasetId={}, existing={})", 
dshInDatasetId, existing);
+    public void validateDelete(Long dshidId, RangerDataShareInDataset 
existing) {
+        LOG.debug("==> validateDelete(dshidId={}, existing={})", dshidId, 
existing);
 
         ValidationResult result = new ValidationResult();
 
         if (existing == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_IN_DATASET_ID_NOT_FOUND,
 "id", dshInDatasetId));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_IN_DATASET_ID_NOT_FOUND,
 "id", dshidId));
         } else {
             RangerDataShare dataShare = 
dataProvider.getDataShare(existing.getDataShareId());
             RangerDataset   dataset   = 
dataProvider.getDataset(existing.getDatasetId());
@@ -460,8 +437,16 @@ public class RangerGdsValidator {
                 result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", existing.getDatasetId()));
             }
 
-            if (dataShare != null && dataset != null) {
-                // TODO: must be either a dataset admin or datashare admin
+            if (dataShare != null && dataset != null && 
!dataProvider.isAdminUser()) {  // must be either a dataset admin or a 
dataShare admin
+                String  userName  = dataProvider.getCurrentUserLoginId();
+                boolean isAllowed = isAdmin(userName, dataShare.getAcl()) ||
+                                    
dataProvider.isServiceAdmin(dataShare.getService()) ||
+                                    
dataProvider.isZoneAdmin(dataShare.getZone()) ||
+                                    isAdmin(userName, dataset.getAcl());
+
+                if (!isAllowed) {
+                    result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_NOT_ADMIN, 
null, userName, "dataShareInDataset", "dataShare (name=" + dataShare.getName() 
+ ") or dataset (name=" + dataset.getName() + ")"));
+                }
             }
         }
 
@@ -469,26 +454,26 @@ public class RangerGdsValidator {
             result.throwRESTException();
         }
 
-        LOG.debug("<== validateDelete(dshInDatasetId={}, existing={})", 
dshInDatasetId, existing);
+        LOG.debug("<== validateDelete(dshidId={}, existing={})", dshidId, 
existing);
     }
 
-    public void validateCreate(RangerDatasetInProject dsInProject) {
-        LOG.debug("==> validateCreate(dsInProject={})", dsInProject);
+    public void validateCreate(RangerDatasetInProject dip) {
+        LOG.debug("==> validateCreate(dip={})", dip);
 
         ValidationResult result  = new ValidationResult();
-        RangerDataset    dataset = 
dataProvider.getDataset(dsInProject.getDatasetId());
-        RangerProject    project = 
dataProvider.getProject(dsInProject.getProjectId());
+        RangerDataset    dataset = dataProvider.getDataset(dip.getDatasetId());
+        RangerProject    project = dataProvider.getProject(dip.getProjectId());
 
         if (dataset == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", dsInProject.getDatasetId()));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", dip.getDatasetId()));
         }
 
         if (project == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_ID_NOT_FOUND,
 "projectId", dsInProject.getProjectId()));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_ID_NOT_FOUND,
 "projectId", dip.getProjectId()));
         }
 
         if (dataset != null && project != null && !dataProvider.isAdminUser()) 
{
-            switch (dsInProject.getStatus()) {
+            switch (dip.getStatus()) {
                 case GRANTED:
                 case DENIED:
                     validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataset", dataset.getName(), dataset.getAcl(), result);
@@ -510,42 +495,79 @@ public class RangerGdsValidator {
             result.throwRESTException();
         }
 
-        LOG.debug("<== validateCreate(dsInProject={})", dsInProject);
+        LOG.debug("<== validateCreate(dip={})", dip);
     }
 
-    public void validateUpdate(RangerDatasetInProject dsInProject, 
RangerDatasetInProject existing) {
-        LOG.debug("==> validateUpdate(dsInProject={}, existing={})", 
dsInProject, existing);
+    public void validateUpdate(RangerDatasetInProject dip, 
RangerDatasetInProject existing) {
+        LOG.debug("==> validateUpdate(dip={}, existing={})", dip, existing);
 
         ValidationResult result  = new ValidationResult();
-        RangerDataset    dataset = 
dataProvider.getDataset(dsInProject.getDatasetId());
-        RangerProject    project = 
dataProvider.getProject(dsInProject.getProjectId());
 
-        if (dataset == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", dsInProject.getDatasetId()));
-        }
+        if (existing == null) {
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_IN_PROJECT_ID_NOT_FOUND,
 "id", dip.getId()));
+        } else {
+            RangerDataset dataset = 
dataProvider.getDataset(existing.getDatasetId());
+            RangerProject project = 
dataProvider.getProject(existing.getProjectId());
 
-        if (project == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_ID_NOT_FOUND,
 "projectId", dsInProject.getProjectId()));
-        }
+            if (dataset == null) {
+                result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_ID_NOT_FOUND,
 "datasetId", existing.getDatasetId()));
+            }
 
-        if (dataset != null && project != null && !dataProvider.isAdminUser()) 
{
-            // TODO:
+            if (project == null) {
+                result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_ID_NOT_FOUND,
 "projectId", existing.getProjectId()));
+            }
+
+            if (!Objects.equals(dip.getDatasetId(), existing.getDatasetId())) {
+                result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_UPDATE_IMMUTABLE_FIELD,
 "datasetId"));
+
+                dataset = null;
+            }
+
+            if (!Objects.equals(dip.getProjectId(), existing.getProjectId())) {
+                result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_UPDATE_IMMUTABLE_FIELD,
 "projectId"));
+
+                project = null;
+            }
+
+            if (dataset != null && project != null && 
!dataProvider.isAdminUser()) {
+                if (!Objects.equals(existing.getStatus(), dip.getStatus())) {
+                    boolean requireDatasetAdmin = 
needsSharedObjectAdmin(existing.getStatus(), dip.getStatus());
+                    boolean requireProjectAdmin = 
needsReceivingObjectAdmin(existing.getStatus(), dip.getStatus());
+
+                    if (requireDatasetAdmin) {
+                        validateAdmin(dataProvider.getCurrentUserLoginId(), 
"dataset", dataset.getName(), dataset.getAcl(), result);
+                    }
+
+                    if (requireProjectAdmin) {
+                        validateAdmin(dataProvider.getCurrentUserLoginId(), 
"project", project.getName(), project.getAcl(), result);
+                    }
+
+                    if (!requireDatasetAdmin && !requireProjectAdmin){ // must 
be either a dataset admin or a project admin
+                        String  userName  = 
dataProvider.getCurrentUserLoginId();
+                        boolean isAllowed = isAdmin(userName, 
dataset.getAcl()) || isAdmin(userName, project.getAcl());
+
+                        if (!isAllowed) {
+                            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_INVALID_STATUS_CHANGE,
 "status", existing.getStatus(), dip.getStatus()));
+                        }
+                    }
+                }
+            }
         }
 
         if (!result.isSuccess()) {
             result.throwRESTException();
         }
 
-        LOG.debug("<== validateUpdate(dsInProject={}, existing={})", 
dsInProject, existing);
+        LOG.debug("<== validateUpdate(dip={}, existing={})", dip, existing);
     }
 
-    public void validateDelete(Long dsInProjectId, RangerDatasetInProject 
existing) {
-        LOG.debug("==> validateDelete(dsInProjectId={}, existing={})", 
dsInProjectId, existing);
+    public void validateDelete(Long dipId, RangerDatasetInProject existing) {
+        LOG.debug("==> validateDelete(dipId={}, existing={})", dipId, 
existing);
 
         ValidationResult result = new ValidationResult();
 
         if (existing == null) {
-            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_IN_PROJECT_ID_NOT_FOUND,
 "id", dsInProjectId));
+            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_IN_PROJECT_ID_NOT_FOUND,
 "id", dipId));
         } else {
             RangerDataset dataset = 
dataProvider.getDataset(existing.getDatasetId());
             RangerProject project = 
dataProvider.getProject(existing.getProjectId());
@@ -559,7 +581,12 @@ public class RangerGdsValidator {
             }
 
             if (dataset != null && project != null && 
!dataProvider.isAdminUser()) {
-                // TODO: must be either a dataset admin or project admin
+                String  userName  = dataProvider.getCurrentUserLoginId();
+                boolean isAllowed = isAdmin(userName, dataset.getAcl()) || 
isAdmin(userName, project.getAcl());
+
+                if (!isAllowed) {
+                    result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_NOT_ADMIN, 
null, userName, "datasetInProject", "dataset (name=" + dataset.getName() + ") 
or project (name=" + project.getName() + ")"));
+                }
             }
         }
 
@@ -567,7 +594,7 @@ public class RangerGdsValidator {
             result.throwRESTException();
         }
 
-        LOG.debug("<== validateDelete(dsInProjectId={}, existing={})", 
dsInProjectId, existing);
+        LOG.debug("<== validateDelete(dipId={}, existing={})", dipId, 
existing);
     }
 
     public GdsPermission getGdsPermissionForUser(RangerGds.RangerGdsObjectACL 
acl, String user) {
@@ -740,45 +767,7 @@ public class RangerGdsValidator {
     }
 
     private void validateAdmin(String userName, String objType, String 
objName, RangerGdsObjectACL acl, ValidationResult result) {
-        boolean isAdmin = false;
-
-        if (acl != null) {
-            if (MapUtils.isNotEmpty(acl.getUsers())) {
-                isAdmin = isAllowed(acl.getUsers().get(userName), 
GdsPermission.ADMIN);
-            }
-
-            if (!isAdmin && MapUtils.isNotEmpty(acl.getGroups())) {
-                isAdmin = 
isAllowed(acl.getGroups().get(RangerConstants.GROUP_PUBLIC), 
GdsPermission.ADMIN);
-
-                if (!isAdmin) {
-                    Set<String> userGroups = 
dataProvider.getGroupsForUser(userName);
-
-                    if (userGroups != null) {
-                        for (String userGroup : userGroups) {
-                            isAdmin = 
isAllowed(acl.getGroups().get(userGroup), GdsPermission.ADMIN);
-
-                            if (isAdmin) {
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (!isAdmin && MapUtils.isNotEmpty(acl.getRoles())) {
-                Set<String> userRoles  = 
dataProvider.getRolesForUser(userName);
-
-                if (userRoles != null) {
-                    for (String userRole : userRoles) {
-                        isAdmin = isAllowed(acl.getRoles().get(userRole), 
GdsPermission.ADMIN);
-
-                        if (isAdmin) {
-                            break;
-                        }
-                    }
-                }
-            }
-        }
+        boolean isAdmin = isAdmin(userName, acl);
 
         if (!isAdmin) {
             result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_NOT_ADMIN, 
null, userName, objType, objName));
@@ -842,6 +831,50 @@ public class RangerGdsValidator {
         }
     }
 
+    private boolean isAdmin(String userName, RangerGdsObjectACL acl) {
+        boolean ret = false;
+
+        if (acl != null) {
+            if (MapUtils.isNotEmpty(acl.getUsers())) {
+                ret = isAllowed(acl.getUsers().get(userName), 
GdsPermission.ADMIN);
+            }
+
+            if (!ret && MapUtils.isNotEmpty(acl.getGroups())) {
+                ret = 
isAllowed(acl.getGroups().get(RangerConstants.GROUP_PUBLIC), 
GdsPermission.ADMIN);
+
+                if (!ret) {
+                    Set<String> userGroups = 
dataProvider.getGroupsForUser(userName);
+
+                    if (userGroups != null) {
+                        for (String userGroup : userGroups) {
+                            ret = isAllowed(acl.getGroups().get(userGroup), 
GdsPermission.ADMIN);
+
+                            if (ret) {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (!ret && MapUtils.isNotEmpty(acl.getRoles())) {
+                Set<String> userRoles  = 
dataProvider.getRolesForUser(userName);
+
+                if (userRoles != null) {
+                    for (String userRole : userRoles) {
+                        ret = isAllowed(acl.getRoles().get(userRole), 
GdsPermission.ADMIN);
+
+                        if (ret) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        return ret;
+    }
+
     private boolean isAllowed(GdsPermission hasPermission, GdsPermission 
accessPermission) {
         final boolean ret;
 
@@ -899,6 +932,78 @@ public class RangerGdsValidator {
         return ret;
     }
 
+    // Shared object:
+    //   DataShareInDataset => dataShare
+    //   DatasetInProject   => dataset
+    private static boolean needsSharedObjectAdmin(GdsShareStatus existing, 
GdsShareStatus updated) {
+        boolean ret = false;
+
+        if (!Objects.equals(existing, updated)) {
+            switch (existing) {
+                case NONE:
+                case REQUESTED:
+                    ret = (updated == GdsShareStatus.GRANTED) ||
+                            (updated == GdsShareStatus.DENIED) ||
+                            (updated == GdsShareStatus.ACTIVE); // implicit 
approval
+
+                    break;
+
+                case GRANTED:
+                    ret = (updated == GdsShareStatus.DENIED);
+                    break;
+
+                case DENIED:
+                    ret = (updated == GdsShareStatus.GRANTED) ||
+                            (updated == GdsShareStatus.ACTIVE); // implicit 
approval
+                    break;
+
+                case ACTIVE:
+                    ret = (updated == GdsShareStatus.GRANTED) ||
+                            (updated == GdsShareStatus.DENIED);
+                    break;
+            }
+
+        }
+
+        return ret;
+    }
+
+    // Receiving object:
+    //   DataShareInDataset => dataset
+    //   DatasetInProject   => project
+    private static boolean needsReceivingObjectAdmin(GdsShareStatus existing, 
GdsShareStatus updated) {
+        boolean ret = false;
+
+        if (!Objects.equals(existing, updated)) {
+            switch (existing) {
+                case NONE:
+                    ret = (updated == GdsShareStatus.REQUESTED) ||
+                          (updated == GdsShareStatus.ACTIVE);
+                break;
+
+                case REQUESTED:
+                    ret = (updated == GdsShareStatus.NONE) ||
+                          (updated == GdsShareStatus.ACTIVE);
+                break;
+
+                case GRANTED:
+                case DENIED:
+                    ret = (updated == GdsShareStatus.NONE) ||
+                          (updated == GdsShareStatus.REQUESTED) ||
+                          (updated == GdsShareStatus.ACTIVE);
+                break;
+
+                case ACTIVE:
+                    ret = (updated == GdsShareStatus.NONE) ||
+                          (updated == GdsShareStatus.REQUESTED);
+                break;
+            }
+
+        }
+
+        return ret;
+    }
+
     public class ValidationResult {
         private final List<ValidationFailureDetails> validationFailures = new 
ArrayList<>();
 

Reply via email to