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 fb0d1d53d RANGER-4448: updated GDS CRUD APIs to return appropriate 
status code on failure
fb0d1d53d is described below

commit fb0d1d53dec11ea54e8e780e10e60ad78b081d68
Author: prashant <[email protected]>
AuthorDate: Fri Jan 5 14:49:52 2024 +0530

    RANGER-4448: updated GDS CRUD APIs to return appropriate status code on 
failure
    
    Signed-off-by: Madhan Neethiraj <[email protected]>
---
 .../ranger/plugin/errors/ValidationErrorCode.java  |  2 +-
 .../org/apache/ranger/common/RESTErrorUtil.java    | 21 ++++++-
 .../apache/ranger/db/XXGdsSharedResourceDao.java   | 17 +++++
 .../main/java/org/apache/ranger/rest/GdsREST.java  |  4 ++
 .../validation/RangerGdsValidationDBProvider.java  |  6 ++
 .../RangerGdsValidationDataProvider.java           |  3 +
 .../ranger/validation/RangerGdsValidator.java      | 72 +++++++++++++++++++++-
 .../main/resources/META-INF/jpa_named_queries.xml  |  7 +++
 8 files changed, 128 insertions(+), 4 deletions(-)

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 03de8e023..38b302ee9 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
@@ -163,7 +163,7 @@ public enum ValidationErrorCode {
     GDS_VALIDATION_ERR_INVALID_STATUS_CHANGE(4125, "invalid status change from 
[{0}] to [{1}]"),
     GDS_VALIDATION_ERR_UPDATE_IMMUTABLE_FIELD(4126, "[{0}] can't be updated"),
     GDS_VALIDATION_ERR_DATASET_IN_PROJECT_ID_NOT_FOUND(4127, 
"Dataset-in-project with ID [{0}] does not exist"),
-
+    GDS_VALIDATION_ERR_SHARED_RESOURCE_CONFLICT(4128, "Shared resource with 
resources [{0}] already exists for data share [{1}]"),
     ;
 
 
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/RESTErrorUtil.java 
b/security-admin/src/main/java/org/apache/ranger/common/RESTErrorUtil.java
index 4aaf36442..ed3ed5eca 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/RESTErrorUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/RESTErrorUtil.java
@@ -22,6 +22,7 @@
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
@@ -130,7 +131,25 @@ public class RESTErrorUtil {
                return restException;
        }
 
-       
+       public WebApplicationException create403RESTException(VXResponse 
gjResponse) {
+               gjResponse.setStatusCode(VXResponse.STATUS_ERROR);
+               
gjResponse.setMessageList(Collections.singletonList(MessageEnums.OPER_NO_PERMISSION.getMessage()));
+
+               Response                errorResponse = 
Response.status(javax.servlet.http.HttpServletResponse.SC_FORBIDDEN).entity(gjResponse).build();
+               WebApplicationException restException = new 
WebApplicationException(errorResponse);
+
+               restException.fillInStackTrace();
+
+               if (logger.isInfoEnabled()) {
+                       UserSessionBase userSession = 
ContextUtil.getCurrentUserSession();
+                       String          loginId     = (userSession != null) ? 
userSession.getLoginId() : null;
+
+                       logger.info("Request failed. loginId=" + loginId + ", 
logMessage=" + gjResponse.getMsgDesc(), restException);
+               }
+
+               return restException;
+       }
+
        public WebApplicationException createGrantRevokeRESTException(String 
logMessage) {
                RESTResponse resp = new RESTResponse();
                resp.setMsgDesc(logMessage);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXGdsSharedResourceDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXGdsSharedResourceDao.java
index d3bd4d65b..c7acd81a2 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/XXGdsSharedResourceDao.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXGdsSharedResourceDao.java
@@ -130,4 +130,21 @@ public class XXGdsSharedResourceDao extends 
BaseDao<XXGdsSharedResource> {
 
                return ret;
        }
+
+       public Long getIdByDataShareIdAndResourceSignature(Long dataShareId, 
String resourceSignature) {
+               Long ret = null;
+
+               if (dataShareId != null && resourceSignature != null) {
+                       try {
+                               ret = getEntityManager()
+                                               
.createNamedQuery("XXGdsSharedResource.getIdByDataShareIdAndResourceSignature", 
Long.class)
+                                               .setParameter("dataShareId", 
dataShareId).setParameter("resourceSignature", resourceSignature)
+                                               .getSingleResult();
+                       } catch (NoResultException e) {
+                               LOG.debug("getIdByDataShareIdAndName({}, {}): 
", dataShareId, resourceSignature, e);
+                       }
+               }
+
+               return ret;
+       }
 }
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index eadcf0707..b1a00533e 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -222,6 +222,7 @@ public class GdsREST {
 
     @DELETE
     @Path("/dataset/{id}")
+    @Produces({ "application/json" })
     @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.DELETE_DATASET + "\")")
     public void deleteDataset(@PathParam("id") Long datasetId, @Context 
HttpServletRequest request) {
         LOG.debug("==> deleteDataset({})", datasetId);
@@ -580,6 +581,7 @@ public class GdsREST {
 
     @DELETE
     @Path("/project/{id}")
+    @Produces({ "application/json" })
     @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.DELETE_PROJECT + "\")")
     public void deleteProject(@PathParam("id") Long projectId, @Context 
HttpServletRequest request) {
         LOG.debug("==> deleteProject({})", projectId);
@@ -904,6 +906,7 @@ public class GdsREST {
 
     @DELETE
     @Path("/datashare/{id}")
+    @Produces({ "application/json" })
     @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.DELETE_DATA_SHARE + "\")")
     public void deleteDataShare(@PathParam("id") Long dataShareId, @Context 
HttpServletRequest request) {
         LOG.debug("==> GdsREST.deleteDataShare({})", dataShareId);
@@ -1094,6 +1097,7 @@ public class GdsREST {
 
     @DELETE
     @Path("/resource/{id}")
+    @Produces({ "application/json" })
     @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.REMOVE_SHARED_RESOURCE + "\")")
     public void removeSharedResource(@PathParam("id") Long resourceId) {
         LOG.debug("==> GdsREST.removeSharedResource({})", resourceId);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
index da41daaaa..30d231797 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
@@ -27,6 +27,7 @@ import org.apache.ranger.entity.*;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataShare;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataset;
 import org.apache.ranger.plugin.model.RangerGds.RangerProject;
+import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.util.RangerRoles;
 import org.apache.ranger.plugin.util.RangerRolesUtil;
@@ -231,6 +232,11 @@ public class RangerGdsValidationDBProvider extends 
RangerGdsValidationDataProvid
         return ret;
     }
 
+    public Long getSharedResourceId(Long dataShareId, 
RangerPolicyResourceSignature signature) {
+               Long ret = 
daoMgr.getXXGdsSharedResource().getIdByDataShareIdAndResourceSignature(dataShareId,
 signature.getSignature());
+
+               return ret;
+    }
 
     private RangerRolesUtil initGetRolesUtil() {
         RangerRolesUtil ret              = this.rolesUtil;
diff --git 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
index ab74e90e4..2c8721e1e 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
@@ -18,6 +18,7 @@
 package org.apache.ranger.validation;
 
 
+import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataShare;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataset;
 import org.apache.ranger.plugin.model.RangerGds.RangerProject;
@@ -67,4 +68,6 @@ public abstract class RangerGdsValidationDataProvider {
     public abstract RangerDataShare getDataShare(Long id);
 
     public abstract Long getSharedResourceId(Long dataShareId, String name);
+
+    public abstract Long getSharedResourceId(Long dataShareId, 
RangerPolicyResourceSignature signature);
 }
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 c5a3f38ff..27e7cc143 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
@@ -36,7 +36,9 @@ import org.apache.ranger.plugin.model.RangerGds.RangerProject;
 import org.apache.ranger.plugin.model.RangerGds.RangerSharedResource;
 import org.apache.ranger.plugin.model.RangerGds.RangerTagDataMaskInfo;
 import 
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemDataMaskInfo;
+import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
 import org.apache.ranger.plugin.model.validation.ValidationFailureDetails;
+import org.apache.ranger.view.VXResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -87,6 +89,16 @@ public class RangerGdsValidator {
         } else {
             validateDatasetAdmin(existing, result);
             validateAcl(dataset.getAcl(), "acl", result);
+
+            boolean renamed = !StringUtils.equalsIgnoreCase(dataset.getName(), 
existing.getName());
+
+            if (renamed) {
+                Long existingDatasetNameId = 
dataProvider.getDatasetId(dataset.getName());
+
+                if (existingDatasetNameId != null) {
+                    result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATASET_NAME_CONFLICT,
 "name", dataset.getName(), existingDatasetNameId));
+                }
+            }
         }
 
         if (!result.isSuccess()) {
@@ -143,6 +155,16 @@ public class RangerGdsValidator {
         } else {
             validateProjectAdmin(existing, result);
             validateAcl(project.getAcl(), "acl", result);
+
+            boolean renamed = !StringUtils.equalsIgnoreCase(project.getName(), 
existing.getName());
+
+            if (renamed) {
+                Long existingProjectNameId = 
dataProvider.getProjectId(project.getName());
+
+                if (existingProjectNameId != null) {
+                    result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_PROJECT_NAME_CONFLICT,
 "name", project.getName(), existingProjectNameId));
+                }
+            }
         }
 
         if (!result.isSuccess()) {
@@ -205,6 +227,16 @@ public class RangerGdsValidator {
             validateAcl(dataShare.getAcl(), "acl", result);
             validateAccessTypes(dataShare.getService(), "defaultAccessTypes", 
dataShare.getDefaultAccessTypes(), result);
             validateMaskTypes(dataShare.getService(), "defaultTagMasks", 
dataShare.getDefaultTagMasks(), result);
+
+            boolean renamed = 
!StringUtils.equalsIgnoreCase(dataShare.getName(), existing.getName());
+
+            if (renamed) {
+                Long existingDataShareNameId = 
dataProvider.getDataShareId(dataShare.getName());
+
+                if (existingDataShareNameId != null) {
+                    result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_NAME_CONFLICT,
 "name", dataShare.getName(), existingDataShareNameId));
+                }
+            }
         }
 
         if (!result.isSuccess()) {
@@ -246,7 +278,15 @@ public class RangerGdsValidator {
             if (existing != null) {
                 result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_SHARED_RESOURCE_NAME_CONFLICT,
 "name", resource.getName(), dataShare.getName(), existing));
             } else {
-                               
validateSharedResourceCreateAndUpdate(dataShare, result);
+                validateSharedResourceCreateAndUpdate(dataShare, result);
+
+                if (result.isSuccess()) {
+                    existing = 
dataProvider.getSharedResourceId(resource.getDataShareId(), new 
RangerPolicyResourceSignature(resource));
+
+                    if (existing != null) {
+                        result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_SHARED_RESOURCE_CONFLICT,
 "resource", resource.getResource(), dataShare.getName()));
+                    }
+                }
             }
         }
 
@@ -270,7 +310,27 @@ public class RangerGdsValidator {
             if (dataShare == null) {
                 result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_DATA_SHARE_ID_NOT_FOUND,
 "dataShareId", resource.getDataShareId()));
             } else {
-                               
validateSharedResourceCreateAndUpdate(dataShare, result);
+                validateSharedResourceCreateAndUpdate(dataShare, result);
+
+                if (result.isSuccess()) {
+                    boolean renamed = 
!StringUtils.equalsIgnoreCase(resource.getName(), existing.getName());
+
+                    if (renamed) {
+                        Long existingSharedResourceNameId = 
dataProvider.getSharedResourceId(resource.getDataShareId(), resource.getName());
+
+                        if (existingSharedResourceNameId != null) {
+                            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_SHARED_RESOURCE_NAME_CONFLICT,
 "name", resource.getName(), dataShare.getName(), existing));
+                        }
+                    }
+
+                    if (result.isSuccess()) {
+                        Long existingSharedResourceNameId = 
dataProvider.getSharedResourceId(resource.getDataShareId(),new 
RangerPolicyResourceSignature(resource));
+
+                        if (existingSharedResourceNameId != null && 
!existingSharedResourceNameId.equals(existing.getId())) {
+                            result.addValidationFailure(new 
ValidationFailureDetails(ValidationErrorCode.GDS_VALIDATION_ERR_SHARED_RESOURCE_CONFLICT,
 "resource", resource.getResource(), dataShare.getName()));
+                        }
+                    }
+                }
             }
         }
 
@@ -1031,5 +1091,13 @@ public class RangerGdsValidator {
         public void throwRESTException() {
             throw 
restErrorUtil.createRESTException(validationFailures.toString(), 
MessageEnums.INVALID_INPUT_DATA);
         }
+
+        public void throwREST403Exception() {
+            VXResponse gjResponse = new VXResponse();
+
+            gjResponse.setMsgDesc(validationFailures.toString());
+
+            throw restErrorUtil.create403RESTException(gjResponse);
+        }
     }
 }
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml 
b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 0502512eb..ae6788bac 100755
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -2260,6 +2260,13 @@
                </query>
        </named-query>
 
+       <named-query 
name="XXGdsSharedResource.getIdByDataShareIdAndResourceSignature">
+                       <query>select obj.id from XXGdsSharedResource obj
+                               where obj.dataShareId = :dataShareId
+                                 and obj.resourceSignature = :resourceSignature
+                       </query>
+       </named-query>
+
        <named-query name="XXGdsDataShareInDataset.findByGuid">
                <query>select obj from XXGdsDataShareInDataset obj where 
obj.guid = :guid</query>
        </named-query>

Reply via email to