From c8b7aa3a2d4545dae11fc79e700b8b167ec08c66 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 3 Sep 2013 05:10:11 +0000 Subject: [PATCH] RM-886: Audit Log. Filters are applied only on displayed entries. RM-870: Audit UI layout is incorrect RM-889: Audit cannot be filtered by property values after rename file RM-838: Searching for audit logs by event doesn't work for some event types git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@54809 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../audit/RecordsManagementAuditService.java | 28 +-- .../RecordsManagementAuditServiceImpl.java | 172 +++++++++++------- 2 files changed, 103 insertions(+), 97 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java index 5911839c4a..ff22298610 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java @@ -37,33 +37,7 @@ public interface RecordsManagementAuditService extends RecordsManagementAuditSer { public enum ReportFormat { HTML, JSON } - public static final String RM_AUDIT_EVENT_LOGIN_SUCCESS = "Login.Success"; - public static final String RM_AUDIT_EVENT_LOGIN_FAILURE = "Login.Failure"; - - public static final String RM_AUDIT_APPLICATION_NAME = "RM"; - public static final String RM_AUDIT_PATH_ROOT = "/RM"; - public static final String RM_AUDIT_SNIPPET_EVENT = "/event"; - public static final String RM_AUDIT_SNIPPET_PERSON = "/person"; - public static final String RM_AUDIT_SNIPPET_NAME = "/name"; - public static final String RM_AUDIT_SNIPPET_NODE = "/node"; - public static final String RM_AUDIT_SNIPPET_CHANGES = "/changes"; - public static final String RM_AUDIT_SNIPPET_BEFORE = "/before"; - public static final String RM_AUDIT_SNIPPET_AFTER = "/after"; - - public static final String RM_AUDIT_DATA_PERSON_FULLNAME = "/RM/event/person/fullName"; - public static final String RM_AUDIT_DATA_PERSON_ROLES = "/RM/event/person/roles"; - public static final String RM_AUDIT_DATA_EVENT_NAME = "/RM/event/name/value"; - public static final String RM_AUDIT_DATA_NODE_NODEREF = "/RM/event/node/noderef"; - public static final String RM_AUDIT_DATA_NODE_NAME = "/RM/event/node/name"; - public static final String RM_AUDIT_DATA_NODE_TYPE = "/RM/event/node/type"; - public static final String RM_AUDIT_DATA_NODE_IDENTIFIER = "/RM/event/node/identifier"; - public static final String RM_AUDIT_DATA_NODE_NAMEPATH = "/RM/event/node/namePath"; - public static final String RM_AUDIT_DATA_NODE_CHANGES_BEFORE = "/RM/event/node/changes/before/value"; - public static final String RM_AUDIT_DATA_NODE_CHANGES_AFTER = "/RM/event/node/changes/after/value"; - - public static final String RM_AUDIT_DATA_LOGIN_USERNAME = "/RM/login/args/userName/value"; - public static final String RM_AUDIT_DATA_LOGIN_FULLNAME = "/RM/login/no-error/fullName"; - public static final String RM_AUDIT_DATA_LOGIN_ERROR = "/RM/login/error/value"; + /** * Retrieves a list of audit events. diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java index c7118789e8..d8218b0595 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java @@ -97,6 +97,34 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean private static Log logger = LogFactory.getLog(RecordsManagementAuditServiceImpl.class); private static final String KEY_RM_AUDIT_NODE_RECORDS = "RMAUditNodeRecords"; + + protected static final String RM_AUDIT_EVENT_LOGIN_SUCCESS = "Login.Success"; + protected static final String RM_AUDIT_EVENT_LOGIN_FAILURE = "Login.Failure"; + + protected static final String RM_AUDIT_APPLICATION_NAME = "RM"; + protected static final String RM_AUDIT_PATH_ROOT = "/RM"; + protected static final String RM_AUDIT_SNIPPET_EVENT = "/event"; + protected static final String RM_AUDIT_SNIPPET_PERSON = "/person"; + protected static final String RM_AUDIT_SNIPPET_NAME = "/name"; + protected static final String RM_AUDIT_SNIPPET_NODE = "/node"; + protected static final String RM_AUDIT_SNIPPET_CHANGES = "/changes"; + protected static final String RM_AUDIT_SNIPPET_BEFORE = "/before"; + protected static final String RM_AUDIT_SNIPPET_AFTER = "/after"; + + protected static final String RM_AUDIT_DATA_PERSON_FULLNAME = "/RM/event/person/fullName"; + protected static final String RM_AUDIT_DATA_PERSON_ROLES = "/RM/event/person/roles"; + protected static final String RM_AUDIT_DATA_EVENT_NAME = "/RM/event/name/value"; + protected static final String RM_AUDIT_DATA_NODE_NODEREF = "/RM/event/node/noderef"; + protected static final String RM_AUDIT_DATA_NODE_NAME = "/RM/event/node/name"; + protected static final String RM_AUDIT_DATA_NODE_TYPE = "/RM/event/node/type"; + protected static final String RM_AUDIT_DATA_NODE_IDENTIFIER = "/RM/event/node/identifier"; + protected static final String RM_AUDIT_DATA_NODE_NAMEPATH = "/RM/event/node/namePath"; + protected static final String RM_AUDIT_DATA_NODE_CHANGES_BEFORE = "/RM/event/node/changes/before/value"; + protected static final String RM_AUDIT_DATA_NODE_CHANGES_AFTER = "/RM/event/node/changes/after/value"; + + protected static final String RM_AUDIT_DATA_LOGIN_USERNAME = "/RM/login/args/userName/value"; + protected static final String RM_AUDIT_DATA_LOGIN_FULLNAME = "/RM/login/no-error/fullName"; + protected static final String RM_AUDIT_DATA_LOGIN_ERROR = "/RM/login/error/value"; protected static final String AUDIT_TRAIL_FILE_PREFIX = "audit_"; protected static final String AUDIT_TRAIL_JSON_FILE_SUFFIX = ".json"; @@ -283,8 +311,8 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean // TODO use file plan to scope audit log return auditService.isAuditEnabled( - RecordsManagementAuditService.RM_AUDIT_APPLICATION_NAME, - RecordsManagementAuditService.RM_AUDIT_PATH_ROOT); + RM_AUDIT_APPLICATION_NAME, + RM_AUDIT_PATH_ROOT); } /** @@ -296,8 +324,8 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean // TODO use file plan to scope audit log auditService.enableAudit( - RecordsManagementAuditService.RM_AUDIT_APPLICATION_NAME, - RecordsManagementAuditService.RM_AUDIT_PATH_ROOT); + RM_AUDIT_APPLICATION_NAME, + RM_AUDIT_PATH_ROOT); if (logger.isInfoEnabled()) { @@ -318,8 +346,8 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean auditEvent(filePlan, AUDIT_EVENT_STOP, null, null, true); auditService.disableAudit( - RecordsManagementAuditService.RM_AUDIT_APPLICATION_NAME, - RecordsManagementAuditService.RM_AUDIT_PATH_ROOT); + RM_AUDIT_APPLICATION_NAME, + RM_AUDIT_PATH_ROOT); if (logger.isInfoEnabled()) { @@ -336,7 +364,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean ParameterCheck.mandatory("filePlan", filePlan); // TODO use file plan to scope audit log - auditService.clearAudit(RecordsManagementAuditService.RM_AUDIT_APPLICATION_NAME, null, null); + auditService.clearAudit(RM_AUDIT_APPLICATION_NAME, null, null); if (logger.isInfoEnabled()) { logger.debug("Records Management audit log has been cleared"); @@ -398,7 +426,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean if (immediate == true) { Map auditMap = buildAuditMap(nodeRef, eventName, before, after); - auditComponent.recordAuditValues(RecordsManagementAuditService.RM_AUDIT_PATH_ROOT, auditMap); + auditComponent.recordAuditValues(RM_AUDIT_PATH_ROOT, auditMap); } else { @@ -428,16 +456,16 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean Map auditMap = new HashMap(13); auditMap.put( AuditApplication.buildPath( - RecordsManagementAuditService.RM_AUDIT_SNIPPET_EVENT, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_NAME), + RM_AUDIT_SNIPPET_EVENT, + RM_AUDIT_SNIPPET_NAME), eventName); if (nodeRef != null) { auditMap.put( AuditApplication.buildPath( - RecordsManagementAuditService.RM_AUDIT_SNIPPET_EVENT, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_NODE), + RM_AUDIT_SNIPPET_EVENT, + RM_AUDIT_SNIPPET_NODE), nodeRef); } @@ -445,17 +473,17 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean Pair, Map> deltaPair = PropertyMap.getBeforeAndAfterMapsForChanges(propertiesBefore, propertiesAfter); auditMap.put( AuditApplication.buildPath( - RecordsManagementAuditService.RM_AUDIT_SNIPPET_EVENT, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_NODE, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_CHANGES, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_BEFORE), + RM_AUDIT_SNIPPET_EVENT, + RM_AUDIT_SNIPPET_NODE, + RM_AUDIT_SNIPPET_CHANGES, + RM_AUDIT_SNIPPET_BEFORE), (Serializable) deltaPair.getFirst()); auditMap.put( AuditApplication.buildPath( - RecordsManagementAuditService.RM_AUDIT_SNIPPET_EVENT, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_NODE, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_CHANGES, - RecordsManagementAuditService.RM_AUDIT_SNIPPET_AFTER), + RM_AUDIT_SNIPPET_EVENT, + RM_AUDIT_SNIPPET_NODE, + RM_AUDIT_SNIPPET_CHANGES, + RM_AUDIT_SNIPPET_AFTER), (Serializable) deltaPair.getSecond()); return auditMap; @@ -529,7 +557,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean { logger.debug("RM Audit: Auditing values: \n" + auditMap); } - auditMap = auditComponent.recordAuditValues(RecordsManagementAuditService.RM_AUDIT_PATH_ROOT, auditMap); + auditMap = auditComponent.recordAuditValues(RM_AUDIT_PATH_ROOT, auditMap); if (auditMap.isEmpty()) { if (logger.isDebugEnabled()) @@ -676,7 +704,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean Map beforeProperties = null; Map afterProperties = null; - if (values.containsKey(RecordsManagementAuditService.RM_AUDIT_DATA_EVENT_NAME)) + if (values.containsKey(RM_AUDIT_DATA_EVENT_NAME)) { // This data is /RM/event/... eventName = (String) values.get(RM_AUDIT_DATA_EVENT_NAME); @@ -698,18 +726,18 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean nodeType = (typeDef != null) ? typeDef.getTitle(dictionaryService) : null; } } - else if (values.containsKey(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_USERNAME)) + else if (values.containsKey(RM_AUDIT_DATA_LOGIN_USERNAME)) { - user = (String) values.get(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_USERNAME); - if (values.containsKey(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_ERROR)) + user = (String) values.get(RM_AUDIT_DATA_LOGIN_USERNAME); + if (values.containsKey(RM_AUDIT_DATA_LOGIN_ERROR)) { - eventName = RecordsManagementAuditService.RM_AUDIT_EVENT_LOGIN_FAILURE; + eventName = RM_AUDIT_EVENT_LOGIN_FAILURE; fullName = user; // The user didn't log in } else { - eventName = RecordsManagementAuditService.RM_AUDIT_EVENT_LOGIN_SUCCESS; - fullName = (String) values.get(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_FULLNAME); + eventName = RM_AUDIT_EVENT_LOGIN_SUCCESS; + fullName = (String) values.get(RM_AUDIT_DATA_LOGIN_FULLNAME); } } else @@ -723,21 +751,21 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean return true; } - // filter out events if set - if (params.getEvent() != null && - params.getEvent().endsWith(eventName) == false) - { - // skip it - return true; - } - - - if (params.getProperty() != null && - getChangedProperties(beforeProperties, afterProperties).contains(params.getProperty()) == false) - { - // skip it - return false; - } +// // filter out events if set +// if (params.getEvent() != null && +// params.getEvent().endsWith(eventName) == false) +// { +// // skip it +// return true; +// } +// +// +// if (params.getProperty() != null && +// getChangedProperties(beforeProperties, afterProperties).contains(params.getProperty()) == false) +// { +// // skip it +// return false; +// } // TODO: Refactor this to use the builder pattern RecordsManagementAuditEntry entry = new RecordsManagementAuditEntry( @@ -771,31 +799,31 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean return true; } - private List getChangedProperties(Map beforeProperties, Map afterProperties) - { - List changedProperties = new ArrayList(21); - - if (beforeProperties != null && afterProperties != null) - { - // add all the properties present before the audited action - for (QName valuePropName : beforeProperties.keySet()) - { - changedProperties.add(valuePropName); - } - - // add all the properties present after the audited action that - // have not already been added - for (QName valuePropName : afterProperties.keySet()) - { - if (!beforeProperties.containsKey(valuePropName)) - { - changedProperties.add(valuePropName); - } - } - } - - return changedProperties; - } +// private List getChangedProperties(Map beforeProperties, Map afterProperties) +// { +// List changedProperties = new ArrayList(21); +// +// if (beforeProperties != null && afterProperties != null) +// { +// // add all the properties present before the audited action +// for (QName valuePropName : beforeProperties.keySet()) +// { +// changedProperties.add(valuePropName); +// } +// +// // add all the properties present after the audited action that +// // have not already been added +// for (QName valuePropName : afterProperties.keySet()) +// { +// if (!beforeProperties.containsKey(valuePropName)) +// { +// changedProperties.add(valuePropName); +// } +// } +// } +// +// return changedProperties; +// } private void writeEntryToFile(RecordsManagementAuditEntry entry) { @@ -854,13 +882,17 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean // Build audit query parameters AuditQueryParameters auditQueryParams = new AuditQueryParameters(); auditQueryParams.setForward(forward); - auditQueryParams.setApplicationName(RecordsManagementAuditService.RM_AUDIT_APPLICATION_NAME); + auditQueryParams.setApplicationName(RM_AUDIT_APPLICATION_NAME); auditQueryParams.setUser(user); auditQueryParams.setFromTime(fromTime); auditQueryParams.setToTime(toTime); if (nodeRef != null) { - auditQueryParams.addSearchKey(RecordsManagementAuditService.RM_AUDIT_DATA_NODE_NODEREF, nodeRef); + auditQueryParams.addSearchKey(RM_AUDIT_DATA_NODE_NODEREF, nodeRef); + } + else if (params.getEvent() != null) + { + auditQueryParams.addSearchKey(RM_AUDIT_DATA_EVENT_NAME, params.getEvent()); } // Get audit entries auditService.auditQuery(callback, auditQueryParams, maxEntries);