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 5aecd131e RANGER-4471: generate trxLog for dataset, project, dataShare, sharedResource 5aecd131e is described below commit 5aecd131e57a22d02c6e16cb283697d04e9e5dbf Author: Madhan Neethiraj <mad...@apache.org> AuthorDate: Tue Oct 10 14:08:50 2023 -0700 RANGER-4471: generate trxLog for dataset, project, dataShare, sharedResource --- .../java/org/apache/ranger/biz/GdsDBStore.java | 38 ++-- .../ranger/service/RangerGdsBaseModelService.java | 148 ++++++++++++++- .../RangerGdsDataShareInDatasetService.java | 11 +- .../ranger/service/RangerGdsDataShareService.java | 14 +- .../service/RangerGdsDatasetInProjectService.java | 11 +- .../ranger/service/RangerGdsDatasetService.java | 8 +- .../ranger/service/RangerGdsProjectService.java | 8 +- .../service/RangerGdsSharedResourceService.java | 15 +- .../main/webapp/react-webapp/src/utils/XAEnums.js | 48 +++++ .../src/views/AuditEvent/AdminLogs.jsx | 6 + .../AdminLogs/DataShareInDatasetLogs.jsx | 205 +++++++++++++++++++++ .../views/AuditEvent/AdminLogs/DataShareLogs.jsx | 205 +++++++++++++++++++++ .../AuditEvent/AdminLogs/DatasetInProjectLogs.jsx | 205 +++++++++++++++++++++ .../src/views/AuditEvent/AdminLogs/DatasetLogs.jsx | 205 +++++++++++++++++++++ .../src/views/AuditEvent/AdminLogs/ProjectLogs.jsx | 205 +++++++++++++++++++++ .../AuditEvent/AdminLogs/SharedResourceLogs.jsx | 205 +++++++++++++++++++++ .../src/views/AuditEvent/OperationAdminModal.jsx | 42 +++++ 17 files changed, 1552 insertions(+), 27 deletions(-) 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 9feb978ef..4d2a9cc8f 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 @@ -195,7 +195,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDataset ret = datasetService.create(dataset); - datasetService.createObjectHistory(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); + datasetService.onObjectChange(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET); @@ -220,7 +220,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDataset ret = datasetService.update(dataset); - datasetService.createObjectHistory(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + datasetService.onObjectChange(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET); @@ -252,7 +252,7 @@ public class GdsDBStore extends AbstractGdsStore { deleteDatasetPolicies(existing); datasetService.delete(existing); - datasetService.createObjectHistory(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); + datasetService.onObjectChange(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET); } @@ -486,7 +486,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerProject ret = projectService.create(project); - projectService.createObjectHistory(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); + projectService.onObjectChange(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_PROJECT); @@ -511,7 +511,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerProject ret = projectService.update(project); - projectService.createObjectHistory(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + projectService.onObjectChange(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_PROJECT); @@ -538,7 +538,7 @@ public class GdsDBStore extends AbstractGdsStore { deleteProjectPolicies(existing); projectService.delete(existing); - projectService.createObjectHistory(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); + projectService.onObjectChange(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_PROJECT); } @@ -782,7 +782,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDataShare ret = dataShareService.create(dataShare); - dataShareService.createObjectHistory(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); + dataShareService.onObjectChange(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE); @@ -807,7 +807,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDataShare ret = dataShareService.update(dataShare); - dataShareService.createObjectHistory(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + dataShareService.onObjectChange(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE); @@ -838,7 +838,7 @@ public class GdsDBStore extends AbstractGdsStore { if (existing != null) { dataShareService.delete(existing); - dataShareService.createObjectHistory(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); + dataShareService.onObjectChange(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE); } @@ -890,7 +890,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerSharedResource ret = sharedResourceService.create(resource); - sharedResourceService.createObjectHistory(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); + sharedResourceService.onObjectChange(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); LOG.debug("<== addSharedResource({}): ret={}", resource, ret); @@ -913,7 +913,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerSharedResource ret = sharedResourceService.update(resource); - sharedResourceService.createObjectHistory(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + sharedResourceService.onObjectChange(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); LOG.debug("<== updateSharedResource({}): ret={}", resource, ret); @@ -938,7 +938,7 @@ public class GdsDBStore extends AbstractGdsStore { if (existing != null) { sharedResourceService.delete(existing); - sharedResourceService.createObjectHistory(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); + sharedResourceService.onObjectChange(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); } LOG.debug("<== removeSharedResource({})", sharedResourceId); @@ -997,7 +997,7 @@ public class GdsDBStore extends AbstractGdsStore { } if (includeResource) { - sharedResources.add(sharedResource);; + sharedResources.add(sharedResource); } } @@ -1039,7 +1039,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDataShareInDataset ret = dataShareInDatasetService.create(dataShareInDataset); - dataShareInDatasetService.createObjectHistory(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); + dataShareInDatasetService.onObjectChange(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); LOG.debug("<== addDataShareInDataset({}): ret={}", dataShareInDataset, ret); @@ -1058,7 +1058,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDataShareInDataset ret = dataShareInDatasetService.update(dataShareInDataset); - dataShareInDatasetService.createObjectHistory(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + dataShareInDatasetService.onObjectChange(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); LOG.debug("<== updateDataShareInDataset({}): ret={}", dataShareInDataset, ret); @@ -1075,7 +1075,7 @@ public class GdsDBStore extends AbstractGdsStore { dataShareInDatasetService.delete(existing); - dataShareInDatasetService.createObjectHistory(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); + dataShareInDatasetService.onObjectChange(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); LOG.debug("<== removeDataShareInDataset({})", dataShareInDatasetId); } @@ -1135,7 +1135,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDatasetInProject ret = datasetInProjectService.create(datasetInProject); - datasetInProjectService.createObjectHistory(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); + datasetInProjectService.onObjectChange(ret, null, RangerServiceService.OPERATION_CREATE_CONTEXT); LOG.debug("<== addDatasetInProject({}): ret={}", datasetInProject, ret); @@ -1154,7 +1154,7 @@ public class GdsDBStore extends AbstractGdsStore { RangerDatasetInProject ret = datasetInProjectService.update(datasetInProject); - datasetInProjectService.createObjectHistory(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); + datasetInProjectService.onObjectChange(ret, existing, RangerServiceService.OPERATION_UPDATE_CONTEXT); LOG.debug("<== updateDatasetInProject({}): ret={}", datasetInProject, ret); @@ -1171,7 +1171,7 @@ public class GdsDBStore extends AbstractGdsStore { datasetInProjectService.delete(existing); - datasetInProjectService.createObjectHistory(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); + datasetInProjectService.onObjectChange(null, existing, RangerServiceService.OPERATION_DELETE_CONTEXT); LOG.debug("<== removeDatasetInProject({})", datasetInProjectId); } diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java index bee32c596..e7c54385f 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsBaseModelService.java @@ -17,20 +17,48 @@ package org.apache.ranger.service; +import org.apache.commons.lang3.StringUtils; +import org.apache.ranger.biz.RangerBizUtil; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.entity.XXDBBase; +import org.apache.ranger.entity.XXTrxLog; import org.apache.ranger.plugin.model.RangerGds.GdsShareStatus; import org.apache.ranger.plugin.model.RangerGds.RangerGdsBaseModelObject; +import org.apache.ranger.plugin.util.JsonUtilsV2; import org.apache.ranger.view.VXMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import java.io.Serializable; +import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; public abstract class RangerGdsBaseModelService<T extends XXDBBase, V extends RangerGdsBaseModelObject> extends RangerBaseModelService<T, V> { + private static final Logger LOG = LoggerFactory.getLogger(RangerGdsBaseModelService.class); + @Autowired RangerDataHistService dataHistService; - public void createObjectHistory(V current, V former, int action) { + @Autowired + RangerBizUtil bizUtil; + + protected final Map<String, VTrxLogAttr> trxLogAttrs = new HashMap<>(); + private final int classType; + + protected RangerGdsBaseModelService(int classType) { + this.classType = classType; + + trxLogAttrs.put("description", new VTrxLogAttr("description", "Description", false)); + trxLogAttrs.put("options", new VTrxLogAttr("options", "Options", false)); + trxLogAttrs.put("additionalInfo", new VTrxLogAttr("additionalInfo", "Additional info", false)); + } + + public void onObjectChange(V current, V former, int action) { switch (action) { case RangerServiceService.OPERATION_CREATE_CONTEXT: dataHistService.createObjectDataHistory(current, RangerDataHistService.ACTION_CREATE); @@ -41,9 +69,17 @@ public abstract class RangerGdsBaseModelService<T extends XXDBBase, V extends Ra break; case RangerServiceService.OPERATION_DELETE_CONTEXT: - dataHistService.createObjectDataHistory(current == null ? former : current, RangerDataHistService.ACTION_DELETE); + if (current == null) { + current = former; + } + + dataHistService.createObjectDataHistory(current, RangerDataHistService.ACTION_DELETE); break; } + + if (current != null && (former != null || action != OPERATION_UPDATE_CONTEXT) && action != 0) { + createTransactionLog(current, former, action); + } } public static List<VXMessage> getOrCreateMessageList(List<VXMessage> msgList) { @@ -67,4 +103,112 @@ public abstract class RangerGdsBaseModelService<T extends XXDBBase, V extends Ra return ret; } + + private void createTransactionLog(V obj, V oldObj, int action) { + List<XXTrxLog> trxLogs = new ArrayList<>(); + String objName = getObjectName(obj); + + for (Field field : obj.getClass().getDeclaredFields()) { + if (!trxLogAttrs.containsKey(field.getName())) { + continue; + } + + XXTrxLog xTrxLog = processFieldToCreateTrxLog(field, objName, obj, oldObj, action); + + if (xTrxLog != null) { + trxLogs.add(xTrxLog); + } + } + + for (Field field : obj.getClass().getSuperclass().getDeclaredFields()) { + if (!trxLogAttrs.containsKey(field.getName())) { + continue; + } + + XXTrxLog xTrx = processFieldToCreateTrxLog(field, objName, obj, oldObj, action); + + if (xTrx != null) { + trxLogs.add(xTrx); + } + } + + bizUtil.createTrxLog(trxLogs); + } + + private String getObjectName(V obj) { + try { + Field nameField = obj.getClass().getDeclaredField("name"); + + nameField.setAccessible(true); + + return Objects.toString(nameField.get(obj)); + } catch (NoSuchFieldException | IllegalAccessException excp) { + // ignore + return null; + } + } + + private XXTrxLog processFieldToCreateTrxLog(Field field, String objName, V obj, V oldObj, int action) { + field.setAccessible(true); + + String actionString = ""; + String attrName = null; + String prevValue = null; + String newValue = null; + String fieldName = field.getName(); + + try { + VTrxLogAttr vTrxLogAttr = trxLogAttrs.get(fieldName); + String value = toString(field.get(obj)); + + attrName = vTrxLogAttr.getAttribUserFriendlyName(); + + if (action == OPERATION_CREATE_CONTEXT) { + actionString = "create"; + + if (StringUtils.isNotBlank(value)) { + newValue = value; + } + } else if (action == OPERATION_DELETE_CONTEXT) { + actionString = "delete"; + prevValue = value; + } else if (action == OPERATION_UPDATE_CONTEXT) { + actionString = "update"; + prevValue = toString(field.get(oldObj)); + newValue = value; + } + } catch (IllegalArgumentException | IllegalAccessException e) { + LOG.error("Process field to create trx log failure.", e); + } + + XXTrxLog ret = null; + + if (!StringUtils.equals(prevValue, newValue)) { + ret = new XXTrxLog(); + + ret.setAction(actionString); + ret.setAttributeName(attrName); + ret.setPreviousValue(prevValue); + ret.setNewValue(newValue); + ret.setObjectClassType(classType); + ret.setObjectId(obj.getId()); + ret.setObjectName(objName); + } + + return ret; + } + + private String toString(Object obj) { + if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof Serializable) { + try { + return JsonUtilsV2.objToJson((Serializable) obj); + } catch (Exception excp) { + // ignore + } + } + + return Objects.toString(obj); + } } diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java index 4a6963fa4..569509d66 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java @@ -21,10 +21,12 @@ package org.apache.ranger.service; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ranger.authorization.utils.JsonUtils; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.GUIDUtil; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.db.XXPortalUserDao; import org.apache.ranger.entity.XXGdsDataShare; import org.apache.ranger.entity.XXGdsDataShareInDataset; @@ -57,7 +59,7 @@ public class RangerGdsDataShareInDatasetService extends RangerGdsBaseModelServic XXPortalUserDao xxPortalUserDao; public RangerGdsDataShareInDatasetService() { - super(); + super(AppConstants.CLASS_TYPE_GDS_DATA_SHARE_IN_DATASET); searchFields.add(new SearchField(SearchFilter.DATA_SHARE_IN_DATASET_ID, "obj.id", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField(SearchFilter.GUID , "obj.guid", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); @@ -70,6 +72,13 @@ public class RangerGdsDataShareInDatasetService extends RangerGdsBaseModelServic sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime")); sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); sortFields.add(new SortField(SearchFilter.DATA_SHARE_IN_DATASET_ID, "obj.id", true, SortField.SORT_ORDER.ASC)); + + trxLogAttrs.put("dataShareId", new VTrxLogAttr("dataShareId", "DataShare ID", false)); + trxLogAttrs.put("datasetId", new VTrxLogAttr("datasetId", "Dataset ID", false)); + trxLogAttrs.put("status", new VTrxLogAttr("status", "Status", true)); + trxLogAttrs.put("validitySchedule", new VTrxLogAttr("validitySchedule", "Validity Schedule", false)); + trxLogAttrs.put("profiles", new VTrxLogAttr("profiles", "Profiles", false)); + trxLogAttrs.put("approver", new VTrxLogAttr("approver", "Approver", false)); } @Override diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java index 36897c111..6a93e44dc 100755 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareService.java @@ -21,10 +21,12 @@ package org.apache.ranger.service; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ranger.authorization.utils.JsonUtils; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.GUIDUtil; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.entity.XXGdsDataShare; import org.apache.ranger.entity.XXSecurityZone; import org.apache.ranger.entity.XXService; @@ -53,7 +55,7 @@ public class RangerGdsDataShareService extends RangerGdsBaseModelService<XXGdsDa GUIDUtil guidUtil; public RangerGdsDataShareService() { - super(); + super(AppConstants.CLASS_TYPE_GDS_DATA_SHARE); searchFields.add(new SearchField(SearchFilter.DATA_SHARE_NAME, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField(SearchFilter.DATA_SHARE_NAME_PARTIAL, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL)); @@ -77,6 +79,16 @@ public class RangerGdsDataShareService extends RangerGdsBaseModelService<XXGdsDa sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); sortFields.add(new SortField(SearchFilter.DATA_SHARE_ID, "obj.id", true, SortField.SORT_ORDER.ASC)); sortFields.add(new SortField(SearchFilter.DATA_SHARE_NAME, "obj.name")); + + + trxLogAttrs.put("name", new VTrxLogAttr("name", "Name", false)); + trxLogAttrs.put("acl", new VTrxLogAttr("acl", "ACL", false)); + trxLogAttrs.put("service", new VTrxLogAttr("service", "Service name", false)); + trxLogAttrs.put("zone", new VTrxLogAttr("zone", "Zone name", false)); + trxLogAttrs.put("conditionExpr", new VTrxLogAttr("conditionExpr", "Condition expression", false)); + trxLogAttrs.put("defaultAccessTypes", new VTrxLogAttr("defaultAccessTypes", "Default access types", false)); + trxLogAttrs.put("defaultTagMasks", new VTrxLogAttr("defaultTagMasks", "Default tag masks", false)); + trxLogAttrs.put("termsOfUse", new VTrxLogAttr("termsOfUse", "Terms of use", false)); } @Override diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java index 5954183b7..d62040175 100644 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetInProjectService.java @@ -21,10 +21,12 @@ package org.apache.ranger.service; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ranger.authorization.utils.JsonUtils; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.GUIDUtil; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.db.XXPortalUserDao; import org.apache.ranger.entity.XXGdsProject; import org.apache.ranger.entity.XXGdsDatasetInProject; @@ -57,7 +59,7 @@ public class RangerGdsDatasetInProjectService extends RangerGdsBaseModelService< XXPortalUserDao xxPortalUserDao; public RangerGdsDatasetInProjectService() { - super(); + super(AppConstants.CLASS_TYPE_GDS_DATASET_IN_PROJECT); searchFields.add(new SearchField(SearchFilter.DATASET_IN_PROJECT_ID, "obj.id", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField(SearchFilter.GUID , "obj.guid", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); @@ -70,6 +72,13 @@ public class RangerGdsDatasetInProjectService extends RangerGdsBaseModelService< sortFields.add(new SortField(SearchFilter.CREATE_TIME, "obj.createTime")); sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); sortFields.add(new SortField(SearchFilter.DATASET_IN_PROJECT_ID, "obj.id", true, SortField.SORT_ORDER.ASC)); + + trxLogAttrs.put("datasetId", new VTrxLogAttr("datasetId", "Dataset ID", false)); + trxLogAttrs.put("projectId", new VTrxLogAttr("projectId", "Project ID", false)); + trxLogAttrs.put("status", new VTrxLogAttr("status", "Status", true)); + trxLogAttrs.put("validitySchedule", new VTrxLogAttr("validitySchedule", "Validity Schedule", false)); + trxLogAttrs.put("profiles", new VTrxLogAttr("profiles", "Profiles", false)); + trxLogAttrs.put("approver", new VTrxLogAttr("approver", "Approver", false)); } @Override diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java index d5e2e52bd..072889f1d 100755 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDatasetService.java @@ -21,10 +21,12 @@ package org.apache.ranger.service; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ranger.authorization.utils.JsonUtils; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.GUIDUtil; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.entity.*; import org.apache.ranger.plugin.model.RangerGds; import org.apache.ranger.plugin.model.RangerGds.RangerDataset; @@ -49,7 +51,7 @@ public class RangerGdsDatasetService extends RangerGdsBaseModelService<XXGdsData GUIDUtil guidUtil; public RangerGdsDatasetService() { - super(); + super(AppConstants.CLASS_TYPE_GDS_DATASET); searchFields.add(new SearchField(SearchFilter.DATASET_NAME, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL)); @@ -77,6 +79,10 @@ public class RangerGdsDatasetService extends RangerGdsBaseModelService<XXGdsData sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); sortFields.add(new SortField(SearchFilter.DATASET_ID, "obj.id", true, SortField.SORT_ORDER.ASC)); sortFields.add(new SortField(SearchFilter.DATASET_NAME, "obj.name")); + + trxLogAttrs.put("name", new VTrxLogAttr("name", "Name", false)); + trxLogAttrs.put("acl", new VTrxLogAttr("acl", "ACL", false)); + trxLogAttrs.put("termsOfUse", new VTrxLogAttr("termsOfUse", "Terms of use", false)); } @Override diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java index f800c90b0..4ccb063fe 100755 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsProjectService.java @@ -21,10 +21,12 @@ package org.apache.ranger.service; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ranger.authorization.utils.JsonUtils; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.GUIDUtil; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.entity.XXGdsProject; import org.apache.ranger.plugin.model.RangerGds; import org.apache.ranger.plugin.model.RangerGds.RangerProject; @@ -49,7 +51,7 @@ public class RangerGdsProjectService extends RangerGdsBaseModelService<XXGdsProj GUIDUtil guidUtil; public RangerGdsProjectService() { - super(); + super(AppConstants.CLASS_TYPE_GDS_PROJECT); searchFields.add(new SearchField(SearchFilter.PROJECT_NAME, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField(SearchFilter.PROJECT_NAME_PARTIAL, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL)); @@ -73,6 +75,10 @@ public class RangerGdsProjectService extends RangerGdsBaseModelService<XXGdsProj sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); sortFields.add(new SortField(SearchFilter.PROJECT_ID, "obj.id", true, SortField.SORT_ORDER.ASC)); sortFields.add(new SortField(SearchFilter.PROJECT_NAME, "obj.name")); + + trxLogAttrs.put("name", new VTrxLogAttr("name", "Name", false)); + trxLogAttrs.put("acl", new VTrxLogAttr("acl", "ACL", false)); + trxLogAttrs.put("termsOfUse", new VTrxLogAttr("termsOfUse", "Terms of use", false)); } @Override diff --git a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java index 0a11d4f1d..2d2830c07 100755 --- a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java +++ b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsSharedResourceService.java @@ -22,9 +22,11 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ranger.authorization.utils.JsonUtils; import org.apache.ranger.common.GUIDUtil; +import org.apache.ranger.common.AppConstants; import org.apache.ranger.common.MessageEnums; import org.apache.ranger.common.SearchField; import org.apache.ranger.common.SortField; +import org.apache.ranger.common.view.VTrxLogAttr; import org.apache.ranger.entity.XXGdsDataShare; import org.apache.ranger.entity.XXGdsSharedResource; import org.apache.ranger.plugin.model.RangerGds.RangerSharedResource; @@ -52,7 +54,7 @@ public class RangerGdsSharedResourceService extends RangerGdsBaseModelService<XX GUIDUtil guidUtil; public RangerGdsSharedResourceService() { - super(); + super(AppConstants.CLASS_TYPE_GDS_SHARED_RESOURCE); searchFields.add(new SearchField(SearchFilter.SHARED_RESOURCE_NAME, "obj.name", SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL)); searchFields.add(new SearchField(SearchFilter.SHARED_RESOURCE_ID, "obj.id", SearchField.DATA_TYPE.INTEGER, SearchField.SEARCH_TYPE.FULL)); @@ -75,6 +77,17 @@ public class RangerGdsSharedResourceService extends RangerGdsBaseModelService<XX sortFields.add(new SortField(SearchFilter.UPDATE_TIME, "obj.updateTime")); sortFields.add(new SortField(SearchFilter.SHARED_RESOURCE_ID, "obj.id", true, SortField.SORT_ORDER.ASC)); sortFields.add(new SortField(SearchFilter.SHARED_RESOURCE_NAME, "obj.name")); + + trxLogAttrs.put("name", new VTrxLogAttr("name", "Name", false)); + trxLogAttrs.put("dataShareId", new VTrxLogAttr("dataShareId", "DataShare ID", false)); + trxLogAttrs.put("resource", new VTrxLogAttr("resource", "Resource", false)); + trxLogAttrs.put("subResource", new VTrxLogAttr("subResource", "Subresource", false)); + trxLogAttrs.put("subResourceType", new VTrxLogAttr("subResourceType", "Subresource Type", false)); + trxLogAttrs.put("conditionExpr", new VTrxLogAttr("conditionExpr", "Condition expression", false)); + trxLogAttrs.put("accessTypes", new VTrxLogAttr("accessTypes", "Access types", false)); + trxLogAttrs.put("rowFilter", new VTrxLogAttr("rowFilter", "Row filter", false)); + trxLogAttrs.put("subResourceMasks", new VTrxLogAttr("subResourceMasks", "Subresource Masks", false)); + trxLogAttrs.put("profiles", new VTrxLogAttr("profiles", "Profiles", false)); } @Override diff --git a/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js b/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js index 3313e538c..e8463ab3b 100755 --- a/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js +++ b/security-admin/src/main/webapp/react-webapp/src/utils/XAEnums.js @@ -360,6 +360,54 @@ export const ClassTypes = { modelName: "VXRole", type: "vXRole", tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_ROLE" + }, + CLASS_TYPE_RANGER_DATASET: { + value: 1062, + label: "Ranger Dataset", + rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATASET", + modelName: "RangerDataset", + type: "vDataset", + tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATASET" + }, + CLASS_TYPE_RANGER_PROJECT: { + value: 1063, + label: "Ranger Project", + rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_PROJECT", + modelName: "RangerProject", + type: "vProject", + tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_PROJECT" + }, + CLASS_TYPE_RANGER_DATA_SHARE: { + value: 1064, + label: "Ranger Data Share", + rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE", + modelName: "RangerDataShare", + type: "vDataShare", + tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATA_SHARE" + }, + CLASS_TYPE_RANGER_SHARED_RESOURCE: { + value: 1065, + label: "Ranger Shared Resource", + rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE", + modelName: "RangerSharedResource", + type: "vSharedResource", + tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_SHARED_RESOURCE" + }, + CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET: { + value: 1066, + label: "Ranger DataShare in Dataset", + rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET", + modelName: "RangerDataShareInDataset", + type: "vDataShareInDataset", + tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET" + }, + CLASS_TYPE_RANGER_DATASET_IN_PROJECT: { + value: 1067, + label: "Ranger Dataset in Project", + rbkey: "xa.enum.ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT", + modelName: "RangerDatasetInProject", + type: "vDatasetInProject", + tt: "lbl.ClassTypes_CLASS_TYPE_RANGER_DATASET_IN_PROJECT" } }; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx index 6575dae24..a59d09fb6 100644 --- a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs.jsx @@ -398,6 +398,12 @@ function Admin() { { value: "1056", label: "Ranger Security Zone" }, { value: "1030", label: "Ranger Service" }, { value: "1003", label: "Ranger User" }, + { value: "1062", label: "Ranger Dataset" }, + { value: "1063", label: "Ranger Project" }, + { value: "1064", label: "Ranger Data Share" }, + { value: "1065", label: "Ranger Shared Resource" }, + { value: "1066", label: "Ranger Data Share in Dataset" }, + { value: "1067", label: "Ranger Dataset in Project" }, { value: "2", label: "User Profile" } ]; } diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareInDatasetLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareInDatasetLogs.jsx new file mode 100644 index 000000000..61d7bcbf9 --- /dev/null +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareInDatasetLogs.jsx @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Table, Badge } from "react-bootstrap"; +import dateFormat from "dateformat"; +import { ClassTypes } from "../../../utils/XAEnums"; +import { isEmpty } from "lodash"; + +export const DataShareInDatasetLogs = ({ data, reportdata }) => { + const { objectName, objectClassType, createDate, owner, action } = data; + + const updateDataShareInDatasetOldNew = (userDetails) => { + var tablerow = []; + + const getfilteredoldval = (oldvals) => { + return !isEmpty(oldvals) ? oldvals : "--"; + }; + + const getfilterednewval = (newvals) => { + return !isEmpty(newvals) ? newvals : "--"; + }; + + userDetails.map((val) => { + return tablerow.push( + <> + <tr key={val.id}> + <td className="table-warning">{val.attributeName}</td> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + <td className="table-warning"> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + isEmpty(val.newValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="danger"> + {getfilteredoldval(val.previousValue)} + </Badge> + </h6> + ) : ( + getfilteredoldval(val.previousValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + {val && val.newValue && !isEmpty(val.newValue) ? ( + <td className="table-warning"> + {val && val.newValue && !isEmpty(val.newValue) ? ( + isEmpty(val.previousValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="success"> + {getfilterednewval(val.newValue)} + </Badge> + </h6> + ) : ( + getfilterednewval(val.newValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + </tr> + </> + ); + }); + + return tablerow; + }; + return ( + <div> + {/* CREATE */} + {action == "create" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner}</div> + <h5 className="bold wrap-header m-t-sm">DataShareInDataset Detail:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + + <th>New Value</th> + </tr> + </thead> + + {reportdata.map((dataShareInDataset) => { + return ( + <tbody> + <tr key={dataShareInDataset.id}> + <td className="table-warning">{dataShareInDataset.attributeName}</td> + + <td className="table-warning"> + {!isEmpty(dataShareInDataset.newValue) ? dataShareInDataset.newValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + + {/* UPDATE */} + + {action == "update" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && ( + <div> + <div className="row"> + <div className="col-md-6"> + <div className="font-weight-bolder">Name: {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Updated By: {owner}</div> + </div> + <div className="col-md-6 text-right"> + <div className="bg-success legend"></div> {" Added "} + <div className="bg-danger legend"></div> {" Deleted "} + </div> + </div> + <br /> + <h5 className="bold wrap-header m-t-sm">DataShareInDataset Detail:</h5> + + <Table className="table table-bordered table-striped w-75 "> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + <th>New Value</th> + </tr> + </thead> + + <tbody>{updateDataShareInDatasetOldNew(reportdata)}</tbody> + </Table> + </div> + )} + {/* DELETE */} + {action == "delete" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India + Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner} </div> + <div className="font-weight-bolder">Deleted By: {owner} </div> + <br /> + <h5 className="bold wrap-header m-t-sm">DataShareInDataset Details:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + </tr> + </thead> + {reportdata.map((dataShareInDataset) => { + return ( + <tbody> + <tr> + <td className="table-warning">{dataShareInDataset.attributeName}</td> + <td className="table-warning"> + {!isEmpty(dataShareInDataset.previousValue) ? dataShareInDataset.previousValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + </div> + ); +}; + +export default DataShareInDatasetLogs; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareLogs.jsx new file mode 100644 index 000000000..b35c0f4bf --- /dev/null +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DataShareLogs.jsx @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Table, Badge } from "react-bootstrap"; +import dateFormat from "dateformat"; +import { ClassTypes } from "../../../utils/XAEnums"; +import { isEmpty } from "lodash"; + +export const DataShareLogs = ({ data, reportdata }) => { + const { objectName, objectClassType, createDate, owner, action } = data; + + const updateDataShareOldNew = (userDetails) => { + var tablerow = []; + + const getfilteredoldval = (oldvals) => { + return !isEmpty(oldvals) ? oldvals : "--"; + }; + + const getfilterednewval = (newvals) => { + return !isEmpty(newvals) ? newvals : "--"; + }; + + userDetails.map((val) => { + return tablerow.push( + <> + <tr key={val.id}> + <td className="table-warning">{val.attributeName}</td> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + <td className="table-warning"> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + isEmpty(val.newValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="danger"> + {getfilteredoldval(val.previousValue)} + </Badge> + </h6> + ) : ( + getfilteredoldval(val.previousValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + {val && val.newValue && !isEmpty(val.newValue) ? ( + <td className="table-warning"> + {val && val.newValue && !isEmpty(val.newValue) ? ( + isEmpty(val.previousValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="success"> + {getfilterednewval(val.newValue)} + </Badge> + </h6> + ) : ( + getfilterednewval(val.newValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + </tr> + </> + ); + }); + + return tablerow; + }; + return ( + <div> + {/* CREATE */} + {action == "create" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner}</div> + <h5 className="bold wrap-header m-t-sm">DataShare Detail:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + + <th>New Value</th> + </tr> + </thead> + + {reportdata.map((dataShare) => { + return ( + <tbody> + <tr key={dataShare.id}> + <td className="table-warning">{dataShare.attributeName}</td> + + <td className="table-warning"> + {!isEmpty(dataShare.newValue) ? dataShare.newValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + + {/* UPDATE */} + + {action == "update" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && ( + <div> + <div className="row"> + <div className="col-md-6"> + <div className="font-weight-bolder">Name: {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Updated By: {owner}</div> + </div> + <div className="col-md-6 text-right"> + <div className="bg-success legend"></div> {" Added "} + <div className="bg-danger legend"></div> {" Deleted "} + </div> + </div> + <br /> + <h5 className="bold wrap-header m-t-sm">DataShare Detail:</h5> + + <Table className="table table-bordered table-striped w-75 "> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + <th>New Value</th> + </tr> + </thead> + + <tbody>{updateDataShareOldNew(reportdata)}</tbody> + </Table> + </div> + )} + {/* DELETE */} + {action == "delete" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India + Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner} </div> + <div className="font-weight-bolder">Deleted By: {owner} </div> + <br /> + <h5 className="bold wrap-header m-t-sm">DataShare Details:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + </tr> + </thead> + {reportdata.map((dataShare) => { + return ( + <tbody> + <tr> + <td className="table-warning">{dataShare.attributeName}</td> + <td className="table-warning"> + {!isEmpty(dataShare.previousValue) ? dataShare.previousValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + </div> + ); +}; + +export default DataShareLogs; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetInProjectLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetInProjectLogs.jsx new file mode 100644 index 000000000..5714ece8d --- /dev/null +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetInProjectLogs.jsx @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Table, Badge } from "react-bootstrap"; +import dateFormat from "dateformat"; +import { ClassTypes } from "../../../utils/XAEnums"; +import { isEmpty } from "lodash"; + +export const DatasetInProjectLogs = ({ data, reportdata }) => { + const { objectName, objectClassType, createDate, owner, action } = data; + + const updateDatasetInProjectOldNew = (userDetails) => { + var tablerow = []; + + const getfilteredoldval = (oldvals) => { + return !isEmpty(oldvals) ? oldvals : "--"; + }; + + const getfilterednewval = (newvals) => { + return !isEmpty(newvals) ? newvals : "--"; + }; + + userDetails.map((val) => { + return tablerow.push( + <> + <tr key={val.id}> + <td className="table-warning">{val.attributeName}</td> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + <td className="table-warning"> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + isEmpty(val.newValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="danger"> + {getfilteredoldval(val.previousValue)} + </Badge> + </h6> + ) : ( + getfilteredoldval(val.previousValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + {val && val.newValue && !isEmpty(val.newValue) ? ( + <td className="table-warning"> + {val && val.newValue && !isEmpty(val.newValue) ? ( + isEmpty(val.previousValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="success"> + {getfilterednewval(val.newValue)} + </Badge> + </h6> + ) : ( + getfilterednewval(val.newValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + </tr> + </> + ); + }); + + return tablerow; + }; + return ( + <div> + {/* CREATE */} + {action == "create" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner}</div> + <h5 className="bold wrap-header m-t-sm">DatasetInProject Detail:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + + <th>New Value</th> + </tr> + </thead> + + {reportdata.map((datasetInProject) => { + return ( + <tbody> + <tr key={datasetInProject.id}> + <td className="table-warning">{datasetInProject.attributeName}</td> + + <td className="table-warning"> + {!isEmpty(datasetInProject.newValue) ? datasetInProject.newValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + + {/* UPDATE */} + + {action == "update" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && ( + <div> + <div className="row"> + <div className="col-md-6"> + <div className="font-weight-bolder">Name: {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Updated By: {owner}</div> + </div> + <div className="col-md-6 text-right"> + <div className="bg-success legend"></div> {" Added "} + <div className="bg-danger legend"></div> {" Deleted "} + </div> + </div> + <br /> + <h5 className="bold wrap-header m-t-sm">DatasetInProject Detail:</h5> + + <Table className="table table-bordered table-striped w-75 "> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + <th>New Value</th> + </tr> + </thead> + + <tbody>{updateDatasetInProjectOldNew(reportdata)}</tbody> + </Table> + </div> + )} + {/* DELETE */} + {action == "delete" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India + Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner} </div> + <div className="font-weight-bolder">Deleted By: {owner} </div> + <br /> + <h5 className="bold wrap-header m-t-sm">DatasetInProject Details:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + </tr> + </thead> + {reportdata.map((datasetInProject) => { + return ( + <tbody> + <tr> + <td className="table-warning">{datasetInProject.attributeName}</td> + <td className="table-warning"> + {!isEmpty(datasetInProject.previousValue) ? datasetInProject.previousValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + </div> + ); +}; + +export default DatasetInProjectLogs; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetLogs.jsx new file mode 100644 index 000000000..3194f728a --- /dev/null +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/DatasetLogs.jsx @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Table, Badge } from "react-bootstrap"; +import dateFormat from "dateformat"; +import { ClassTypes } from "../../../utils/XAEnums"; +import { isEmpty } from "lodash"; + +export const DatasetLogs = ({ data, reportdata }) => { + const { objectName, objectClassType, createDate, owner, action } = data; + + const updateDatasetOldNew = (userDetails) => { + var tablerow = []; + + const getfilteredoldval = (oldvals) => { + return !isEmpty(oldvals) ? oldvals : "--"; + }; + + const getfilterednewval = (newvals) => { + return !isEmpty(newvals) ? newvals : "--"; + }; + + userDetails.map((val) => { + return tablerow.push( + <> + <tr key={val.id}> + <td className="table-warning">{val.attributeName}</td> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + <td className="table-warning"> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + isEmpty(val.newValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="danger"> + {getfilteredoldval(val.previousValue)} + </Badge> + </h6> + ) : ( + getfilteredoldval(val.previousValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + {val && val.newValue && !isEmpty(val.newValue) ? ( + <td className="table-warning"> + {val && val.newValue && !isEmpty(val.newValue) ? ( + isEmpty(val.previousValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="success"> + {getfilterednewval(val.newValue)} + </Badge> + </h6> + ) : ( + getfilterednewval(val.newValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + </tr> + </> + ); + }); + + return tablerow; + }; + return ( + <div> + {/* CREATE */} + {action == "create" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner}</div> + <h5 className="bold wrap-header m-t-sm">Dataset Detail:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + + <th>New Value</th> + </tr> + </thead> + + {reportdata.map((dataset) => { + return ( + <tbody> + <tr key={dataset.id}> + <td className="table-warning">{dataset.attributeName}</td> + + <td className="table-warning"> + {!isEmpty(dataset.newValue) ? dataset.newValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + + {/* UPDATE */} + + {action == "update" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && ( + <div> + <div className="row"> + <div className="col-md-6"> + <div className="font-weight-bolder">Name: {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Updated By: {owner}</div> + </div> + <div className="col-md-6 text-right"> + <div className="bg-success legend"></div> {" Added "} + <div className="bg-danger legend"></div> {" Deleted "} + </div> + </div> + <br /> + <h5 className="bold wrap-header m-t-sm">Dataset Detail:</h5> + + <Table className="table table-bordered table-striped w-75 "> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + <th>New Value</th> + </tr> + </thead> + + <tbody>{updateDatasetOldNew(reportdata)}</tbody> + </Table> + </div> + )} + {/* DELETE */} + {action == "delete" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India + Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner} </div> + <div className="font-weight-bolder">Deleted By: {owner} </div> + <br /> + <h5 className="bold wrap-header m-t-sm">Dataset Details:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + </tr> + </thead> + {reportdata.map((dataset) => { + return ( + <tbody> + <tr> + <td className="table-warning">{dataset.attributeName}</td> + <td className="table-warning"> + {!isEmpty(dataset.previousValue) ? dataset.previousValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + </div> + ); +}; + +export default DatasetLogs; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/ProjectLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/ProjectLogs.jsx new file mode 100644 index 000000000..dd13b4e73 --- /dev/null +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/ProjectLogs.jsx @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Table, Badge } from "react-bootstrap"; +import dateFormat from "dateformat"; +import { ClassTypes } from "../../../utils/XAEnums"; +import { isEmpty } from "lodash"; + +export const ProjectLogs = ({ data, reportdata }) => { + const { objectName, objectClassType, createDate, owner, action } = data; + + const updateProjectOldNew = (userDetails) => { + var tablerow = []; + + const getfilteredoldval = (oldvals) => { + return !isEmpty(oldvals) ? oldvals : "--"; + }; + + const getfilterednewval = (newvals) => { + return !isEmpty(newvals) ? newvals : "--"; + }; + + userDetails.map((val) => { + return tablerow.push( + <> + <tr key={val.id}> + <td className="table-warning">{val.attributeName}</td> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + <td className="table-warning"> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + isEmpty(val.newValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="danger"> + {getfilteredoldval(val.previousValue)} + </Badge> + </h6> + ) : ( + getfilteredoldval(val.previousValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + {val && val.newValue && !isEmpty(val.newValue) ? ( + <td className="table-warning"> + {val && val.newValue && !isEmpty(val.newValue) ? ( + isEmpty(val.previousValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="success"> + {getfilterednewval(val.newValue)} + </Badge> + </h6> + ) : ( + getfilterednewval(val.newValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + </tr> + </> + ); + }); + + return tablerow; + }; + return ( + <div> + {/* CREATE */} + {action == "create" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner}</div> + <h5 className="bold wrap-header m-t-sm">Project Detail:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + + <th>New Value</th> + </tr> + </thead> + + {reportdata.map((project) => { + return ( + <tbody> + <tr key={project.id}> + <td className="table-warning">{project.attributeName}</td> + + <td className="table-warning"> + {!isEmpty(project.newValue) ? project.newValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + + {/* UPDATE */} + + {action == "update" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && ( + <div> + <div className="row"> + <div className="col-md-6"> + <div className="font-weight-bolder">Name: {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Updated By: {owner}</div> + </div> + <div className="col-md-6 text-right"> + <div className="bg-success legend"></div> {" Added "} + <div className="bg-danger legend"></div> {" Deleted "} + </div> + </div> + <br /> + <h5 className="bold wrap-header m-t-sm">Project Detail:</h5> + + <Table className="table table-bordered table-striped w-75 "> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + <th>New Value</th> + </tr> + </thead> + + <tbody>{updateProjectOldNew(reportdata)}</tbody> + </Table> + </div> + )} + {/* DELETE */} + {action == "delete" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India + Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner} </div> + <div className="font-weight-bolder">Deleted By: {owner} </div> + <br /> + <h5 className="bold wrap-header m-t-sm">Project Details:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + </tr> + </thead> + {reportdata.map((project) => { + return ( + <tbody> + <tr> + <td className="table-warning">{project.attributeName}</td> + <td className="table-warning"> + {!isEmpty(project.previousValue) ? project.previousValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + </div> + ); +}; + +export default ProjectLogs; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/SharedResourceLogs.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/SharedResourceLogs.jsx new file mode 100644 index 000000000..7243c9f1d --- /dev/null +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/AdminLogs/SharedResourceLogs.jsx @@ -0,0 +1,205 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Table, Badge } from "react-bootstrap"; +import dateFormat from "dateformat"; +import { ClassTypes } from "../../../utils/XAEnums"; +import { isEmpty } from "lodash"; + +export const SharedResourceLogs = ({ data, reportdata }) => { + const { objectName, objectClassType, createDate, owner, action } = data; + + const updateSharedResourceOldNew = (userDetails) => { + var tablerow = []; + + const getfilteredoldval = (oldvals) => { + return !isEmpty(oldvals) ? oldvals : "--"; + }; + + const getfilterednewval = (newvals) => { + return !isEmpty(newvals) ? newvals : "--"; + }; + + userDetails.map((val) => { + return tablerow.push( + <> + <tr key={val.id}> + <td className="table-warning">{val.attributeName}</td> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + <td className="table-warning"> + {val && val.previousValue && !isEmpty(val.previousValue) ? ( + isEmpty(val.newValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="danger"> + {getfilteredoldval(val.previousValue)} + </Badge> + </h6> + ) : ( + getfilteredoldval(val.previousValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + {val && val.newValue && !isEmpty(val.newValue) ? ( + <td className="table-warning"> + {val && val.newValue && !isEmpty(val.newValue) ? ( + isEmpty(val.previousValue) ? ( + <h6> + <Badge className="d-inline mr-1" variant="success"> + {getfilterednewval(val.newValue)} + </Badge> + </h6> + ) : ( + getfilterednewval(val.newValue) + ) + ) : ( + "--" + )} + </td> + ) : ( + <td>{"--"}</td> + )} + </tr> + </> + ); + }); + + return tablerow; + }; + return ( + <div> + {/* CREATE */} + {action == "create" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner}</div> + <h5 className="bold wrap-header m-t-sm">SharedResource Detail:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + + <th>New Value</th> + </tr> + </thead> + + {reportdata.map((sharedResource) => { + return ( + <tbody> + <tr key={sharedResource.id}> + <td className="table-warning">{sharedResource.attributeName}</td> + + <td className="table-warning"> + {!isEmpty(sharedResource.newValue) ? sharedResource.newValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + + {/* UPDATE */} + + {action == "update" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value && ( + <div> + <div className="row"> + <div className="col-md-6"> + <div className="font-weight-bolder">Name: {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} + India Standard Time + </div> + <div className="font-weight-bolder">Updated By: {owner}</div> + </div> + <div className="col-md-6 text-right"> + <div className="bg-success legend"></div> {" Added "} + <div className="bg-danger legend"></div> {" Deleted "} + </div> + </div> + <br /> + <h5 className="bold wrap-header m-t-sm">SharedResource Detail:</h5> + + <Table className="table table-bordered table-striped w-75 "> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + <th>New Value</th> + </tr> + </thead> + + <tbody>{updateSharedResourceOldNew(reportdata)}</tbody> + </Table> + </div> + )} + {/* DELETE */} + {action == "delete" && + objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value && ( + <div> + <div className="font-weight-bolder">Name : {objectName}</div> + <div className="font-weight-bolder"> + Date: {dateFormat(createDate, "mm/dd/yyyy hh:MM:ss TT ")} India + Standard Time + </div> + <div className="font-weight-bolder">Created By: {owner} </div> + <div className="font-weight-bolder">Deleted By: {owner} </div> + <br /> + <h5 className="bold wrap-header m-t-sm">SharedResource Details:</h5> + + <Table className="table table-striped table-bordered w-50"> + <thead className="thead-light"> + <tr> + <th>Fields</th> + <th>Old Value</th> + </tr> + </thead> + {reportdata.map((sharedResource) => { + return ( + <tbody> + <tr> + <td className="table-warning">{sharedResource.attributeName}</td> + <td className="table-warning"> + {!isEmpty(sharedResource.previousValue) ? sharedResource.previousValue : "--"} + </td> + </tr> + </tbody> + ); + })} + </Table> + </div> + )} + </div> + ); +}; + +export default SharedResourceLogs; diff --git a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx index 0d30e3224..a99c4f27b 100644 --- a/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx +++ b/security-admin/src/main/webapp/react-webapp/src/views/AuditEvent/OperationAdminModal.jsx @@ -29,6 +29,12 @@ import ServiceLogs from "./AdminLogs/ServiceLogs"; import PolicyLogs from "./AdminLogs/PolicyLogs"; import PasswordLogs from "./AdminLogs/PasswordLogs"; import UserprofileLogs from "./AdminLogs/UserprofileLogs"; +import DatasetLogs from "./AdminLogs/DatasetLogs"; +import ProjectLogs from "./AdminLogs/ProjectLogs"; +import DataShareLogs from "./AdminLogs/DataShareLogs"; +import SharedResourceLogs from "./AdminLogs/SharedResourceLogs"; +import DataShareInDatasetLogs from "./AdminLogs/DataShareInDatasetLogs"; +import DatasetInProjectLogs from "./AdminLogs/DatasetInProjectLogs"; import { ModalLoader } from "../../components/CommonComponents"; export const OperationAdminModal = ({ onHide, show, data = {} }) => { @@ -116,6 +122,42 @@ export const OperationAdminModal = ({ onHide, show, data = {} }) => { {objectClassType == ClassTypes.CLASS_TYPE_PASSWORD_CHANGE.value && ( <PasswordLogs reportdata={reportdata} data={data} /> )} + + {/* DATASET */} + + {objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET.value && ( + <DatasetLogs reportdata={reportdata} data={data} /> + )} + + {/* PROJECT */} + + {objectClassType == ClassTypes.CLASS_TYPE_RANGER_PROJECT.value && ( + <ProjectLogs reportdata={reportdata} data={data} /> + )} + + {/* DATA_SHARE */} + + {objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE.value && ( + <DataShareLogs reportdata={reportdata} data={data} /> + )} + + {/* SHARED_RESOURCE */} + + {objectClassType == ClassTypes.CLASS_TYPE_RANGER_SHARED_RESOURCE.value && ( + <SharedResourceLogs reportdata={reportdata} data={data} /> + )} + + {/* DATA_SHARE_IN_DATASET */} + + {objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATA_SHARE_IN_DATASET.value && ( + <DataShareInDatasetLogs reportdata={reportdata} data={data} /> + )} + + {/* DATASET_IN_PROJECT */} + + {objectClassType == ClassTypes.CLASS_TYPE_RANGER_DATASET_IN_PROJECT.value && ( + <DatasetInProjectLogs reportdata={reportdata} data={data} /> + )} </div> )} </Modal.Body>