mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
ALF-4106 (ALF-4103): AuditService REST API
- Enable/disable auditing and tests - TODO: Use .ftl to generate JSON from model git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21520 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
<bean id="auditComponent" class="org.alfresco.repo.audit.AuditComponentImpl">
|
||||
<property name="transactionService" ref="transactionService"/>
|
||||
<property name="auditDAO" ref="auditDAO"/>
|
||||
<property name="auditModelRegistry" ref="auditModel.modelRegistry"/>
|
||||
<property name="auditModelRegistry" ref="Audit"/>
|
||||
<property name="propertyValueDAO" ref="propertyValueDAO"/>
|
||||
</bean>
|
||||
|
||||
|
@@ -35,15 +35,6 @@ import org.alfresco.service.cmr.audit.AuditService.AuditQueryCallback;
|
||||
*/
|
||||
public interface AuditComponent
|
||||
{
|
||||
/**
|
||||
* Get all registered audit applications, whether active or not.
|
||||
*
|
||||
* @return Returns a set of registered audit applications
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
public Set<String> getAuditApplications();
|
||||
|
||||
/**
|
||||
* Determines whether audit is globally enabled or disabled.
|
||||
*
|
||||
@@ -53,6 +44,24 @@ public interface AuditComponent
|
||||
*/
|
||||
public boolean isAuditEnabled();
|
||||
|
||||
/**
|
||||
* Switch auditing on or off
|
||||
*
|
||||
* @param enable <tt>true</tt> to enable auditing or <tt>false</tt> to disable
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
public void setAuditEnabled(boolean enable);
|
||||
|
||||
/**
|
||||
* Get all registered audit applications, whether active or not.
|
||||
*
|
||||
* @return Returns a set of registered audit applications
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
public Set<String> getAuditApplications();
|
||||
|
||||
/**
|
||||
* Determines whether the given source path is mapped to any audit applications. Allows optimizations to be made in
|
||||
* calling components.
|
||||
@@ -81,7 +90,8 @@ public interface AuditComponent
|
||||
* data is audited.
|
||||
*
|
||||
* @param applicationName the name of the application being logged to
|
||||
* @param path the audit path to check
|
||||
* @param path the audit path to check or <tt>null</tt> to assume the
|
||||
* application's root path
|
||||
* @return Returns <tt>true</tt> if the audit path has been disabled
|
||||
*
|
||||
* @since 3.2
|
||||
@@ -97,7 +107,8 @@ public interface AuditComponent
|
||||
* If the enabled
|
||||
*
|
||||
* @param applicationName the name of the application being logged to
|
||||
* @param path the audit path to enable auditing on
|
||||
* @param path the audit path to check or <tt>null</tt> to assume the
|
||||
* application's root path
|
||||
*
|
||||
* @since 3.2
|
||||
*/
|
||||
@@ -114,7 +125,8 @@ public interface AuditComponent
|
||||
* the root path of the application, then auditing for that application is effectively disabled.
|
||||
*
|
||||
* @param applicationName the name of the application being logged to
|
||||
* @param path the audit path to enable auditing on
|
||||
* @param path the audit path to check or <tt>null</tt> to assume the
|
||||
* application's root path
|
||||
*
|
||||
* @since 3.2
|
||||
*/
|
||||
|
@@ -31,6 +31,7 @@ import org.alfresco.repo.audit.extractor.DataExtractor;
|
||||
import org.alfresco.repo.audit.generator.DataGenerator;
|
||||
import org.alfresco.repo.audit.model.AuditApplication;
|
||||
import org.alfresco.repo.audit.model.AuditModelRegistry;
|
||||
import org.alfresco.repo.audit.model.AuditModelRegistryImpl;
|
||||
import org.alfresco.repo.domain.audit.AuditDAO;
|
||||
import org.alfresco.repo.domain.propval.PropertyValueDAO;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
@@ -60,7 +61,7 @@ public class AuditComponentImpl implements AuditComponent
|
||||
{
|
||||
private static Log logger = LogFactory.getLog(AuditComponentImpl.class);
|
||||
|
||||
private AuditModelRegistry auditModelRegistry;
|
||||
private AuditModelRegistryImpl auditModelRegistry;
|
||||
private PropertyValueDAO propertyValueDAO;
|
||||
private AuditDAO auditDAO;
|
||||
private TransactionService transactionService;
|
||||
@@ -76,7 +77,7 @@ public class AuditComponentImpl implements AuditComponent
|
||||
* Set the registry holding the audit models
|
||||
* @since 3.2
|
||||
*/
|
||||
public void setAuditModelRegistry(AuditModelRegistry auditModelRegistry)
|
||||
public void setAuditModelRegistry(AuditModelRegistryImpl auditModelRegistry)
|
||||
{
|
||||
this.auditModelRegistry = auditModelRegistry;
|
||||
}
|
||||
@@ -157,6 +158,34 @@ public class AuditComponentImpl implements AuditComponent
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.2
|
||||
*/
|
||||
public boolean isAuditEnabled()
|
||||
{
|
||||
return auditModelRegistry.isAuditEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
*/
|
||||
@Override
|
||||
public void setAuditEnabled(boolean enable)
|
||||
{
|
||||
boolean alreadyEnabled = auditModelRegistry.isAuditEnabled();
|
||||
if (alreadyEnabled != enable)
|
||||
{
|
||||
// It is changing
|
||||
auditModelRegistry.stop();
|
||||
auditModelRegistry.setProperty(
|
||||
AuditModelRegistry.AUDIT_PROPERTY_AUDIT_ENABLED,
|
||||
Boolean.toString(enable).toLowerCase());
|
||||
auditModelRegistry.start();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
@@ -167,15 +196,6 @@ public class AuditComponentImpl implements AuditComponent
|
||||
return auditApps.keySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.2
|
||||
*/
|
||||
public boolean isAuditEnabled()
|
||||
{
|
||||
return auditModelRegistry.isAuditEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.2
|
||||
@@ -192,7 +212,6 @@ public class AuditComponentImpl implements AuditComponent
|
||||
public boolean isAuditPathEnabled(String applicationName, String path)
|
||||
{
|
||||
ParameterCheck.mandatory("applicationName", applicationName);
|
||||
ParameterCheck.mandatory("path", path);
|
||||
AlfrescoTransactionSupport.checkTransactionReadState(false);
|
||||
|
||||
AuditApplication application = auditModelRegistry.getAuditApplicationByName(applicationName);
|
||||
@@ -204,8 +223,16 @@ public class AuditComponentImpl implements AuditComponent
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Ensure that the path gets a valid value
|
||||
if (path == null)
|
||||
{
|
||||
path = AuditApplication.AUDIT_PATH_SEPARATOR + application.getApplicationKey();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check the path against the application
|
||||
application.checkPath(path);
|
||||
}
|
||||
|
||||
Set<String> disabledPaths = getDisabledPaths(application);
|
||||
|
||||
@@ -238,7 +265,6 @@ public class AuditComponentImpl implements AuditComponent
|
||||
public void enableAudit(String applicationName, String path)
|
||||
{
|
||||
ParameterCheck.mandatory("applicationName", applicationName);
|
||||
ParameterCheck.mandatory("path", path);
|
||||
AlfrescoTransactionSupport.checkTransactionReadState(true);
|
||||
|
||||
AuditApplication application = auditModelRegistry.getAuditApplicationByName(applicationName);
|
||||
@@ -250,8 +276,16 @@ public class AuditComponentImpl implements AuditComponent
|
||||
}
|
||||
return;
|
||||
}
|
||||
// Ensure that the path gets a valid value
|
||||
if (path == null)
|
||||
{
|
||||
path = AuditApplication.AUDIT_PATH_SEPARATOR + application.getApplicationKey();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check the path against the application
|
||||
application.checkPath(path);
|
||||
}
|
||||
|
||||
Long disabledPathsId = application.getDisabledPathsId();
|
||||
Set<String> disabledPaths = getDisabledPaths(application);
|
||||
@@ -290,7 +324,6 @@ public class AuditComponentImpl implements AuditComponent
|
||||
public void disableAudit(String applicationName, String path)
|
||||
{
|
||||
ParameterCheck.mandatory("applicationName", applicationName);
|
||||
ParameterCheck.mandatory("path", path);
|
||||
AlfrescoTransactionSupport.checkTransactionReadState(true);
|
||||
|
||||
AuditApplication application = auditModelRegistry.getAuditApplicationByName(applicationName);
|
||||
@@ -302,8 +335,16 @@ public class AuditComponentImpl implements AuditComponent
|
||||
}
|
||||
return;
|
||||
}
|
||||
// Ensure that the path gets a valid value
|
||||
if (path == null)
|
||||
{
|
||||
path = AuditApplication.AUDIT_PATH_SEPARATOR + application.getApplicationKey();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check the path against the application
|
||||
application.checkPath(path);
|
||||
}
|
||||
|
||||
Long disabledPathsId = application.getDisabledPathsId();
|
||||
Set<String> disabledPaths = getDisabledPaths(application);
|
||||
|
@@ -455,6 +455,18 @@ public class AuditComponentTest extends TestCase
|
||||
result = auditTestAction("action-01", nodeRef, parameters);
|
||||
checkAuditMaps(result, expectedInner);
|
||||
|
||||
// Disable using the root of the application by passing a null root
|
||||
auditComponent.disableAudit(APPLICATION_ACTIONS_TEST, null);
|
||||
expectedInner.clear();
|
||||
result = auditTestAction("action-01", nodeRef, parameters);
|
||||
checkAuditMaps(result, expectedInner);
|
||||
|
||||
// Enabling the root using a null root parameter should give back everything
|
||||
auditComponent.enableAudit(APPLICATION_ACTIONS_TEST, null);
|
||||
expectedInner = new HashMap<String, Serializable>(expected);
|
||||
result = auditTestAction("action-01", nodeRef, parameters);
|
||||
checkAuditMaps(result, expectedInner);
|
||||
|
||||
return null;
|
||||
}
|
||||
};
|
||||
@@ -619,7 +631,7 @@ public class AuditComponentTest extends TestCase
|
||||
@Override
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
auditService.clearAudit(applicationName);
|
||||
auditService.clearAudit(applicationName, null, null);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
@@ -43,6 +43,25 @@ public class AuditServiceImpl implements AuditService
|
||||
this.auditComponent = auditComponent;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
*/
|
||||
public boolean isAuditEnabled()
|
||||
{
|
||||
return auditComponent.isAuditEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
*/
|
||||
@Override
|
||||
public void setAuditEnabled(boolean enable)
|
||||
{
|
||||
auditComponent.setAuditEnabled(enable);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
@@ -53,22 +72,12 @@ public class AuditServiceImpl implements AuditService
|
||||
return auditComponent.getAuditApplications();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
*/
|
||||
public boolean isAuditEnabled()
|
||||
{
|
||||
return auditComponent.isAuditEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.2
|
||||
*/
|
||||
public boolean isAuditEnabled(String applicationName, String path)
|
||||
{
|
||||
// Get the root path for the application
|
||||
return auditComponent.isAuditPathEnabled(applicationName, path);
|
||||
}
|
||||
|
||||
@@ -100,6 +109,17 @@ public class AuditServiceImpl implements AuditService
|
||||
auditComponent.deleteAuditEntries(applicationName, null, now);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.4
|
||||
*/
|
||||
@Override
|
||||
public void clearAudit(String applicationName, Long fromTime, Long toTime)
|
||||
{
|
||||
toTime = (toTime == null) ? Long.valueOf(System.currentTimeMillis()) : toTime;
|
||||
auditComponent.deleteAuditEntries(applicationName, fromTime, toTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 3.3
|
||||
|
@@ -30,6 +30,10 @@ import org.alfresco.util.PathMapper;
|
||||
*/
|
||||
public interface AuditModelRegistry
|
||||
{
|
||||
/** The name of the global enablement property. */
|
||||
public static final String AUDIT_PROPERTY_AUDIT_ENABLED = "audit.enabled";
|
||||
public static final String AUDIT_SCHEMA_LOCATION = "classpath:alfresco/audit/alfresco-audit-3.2.xsd";
|
||||
|
||||
public static final String AUDIT_RESERVED_KEY_USERNAME = "username";
|
||||
public static final String AUDIT_RESERVED_KEY_SYSTEMTIME = "systemTime";
|
||||
|
||||
|
@@ -77,10 +77,6 @@ import org.xml.sax.SAXParseException;
|
||||
*/
|
||||
public class AuditModelRegistryImpl extends AbstractPropertyBackedBean implements AuditModelRegistry
|
||||
{
|
||||
/** The name of the global enablement property. */
|
||||
private static final String PROPERTY_AUDIT_ENABLED = "audit.enabled";
|
||||
private static final String AUDIT_SCHEMA_LOCATION = "classpath:alfresco/audit/alfresco-audit-3.2.xsd";
|
||||
|
||||
private static final Log logger = LogFactory.getLog(AuditModelRegistryImpl.class);
|
||||
|
||||
private String[] searchPath;
|
||||
@@ -213,7 +209,7 @@ public class AuditModelRegistryImpl extends AbstractPropertyBackedBean implement
|
||||
@Override
|
||||
public boolean isAuditEnabled()
|
||||
{
|
||||
String value = getProperty(PROPERTY_AUDIT_ENABLED);
|
||||
String value = getProperty(AUDIT_PROPERTY_AUDIT_ENABLED);
|
||||
return value != null && value.equalsIgnoreCase("true");
|
||||
}
|
||||
|
||||
@@ -226,7 +222,7 @@ public class AuditModelRegistryImpl extends AbstractPropertyBackedBean implement
|
||||
public synchronized void registerModel(URL auditModelUrl)
|
||||
{
|
||||
stop();
|
||||
setProperty(PROPERTY_AUDIT_ENABLED, "true");
|
||||
setProperty(AUDIT_PROPERTY_AUDIT_ENABLED, "true");
|
||||
getState(false).registerModel(auditModelUrl);
|
||||
}
|
||||
|
||||
@@ -255,7 +251,7 @@ public class AuditModelRegistryImpl extends AbstractPropertyBackedBean implement
|
||||
properties = new HashMap<String, Boolean>(7);
|
||||
|
||||
// Default value for global enabled property
|
||||
properties.put(PROPERTY_AUDIT_ENABLED, false);
|
||||
properties.put(AUDIT_PROPERTY_AUDIT_ENABLED, false);
|
||||
|
||||
// Let's search for config files in the appropriate places. The individual applications they contain can still
|
||||
// be enabled/disabled by the bean properties
|
||||
@@ -364,7 +360,7 @@ public class AuditModelRegistryImpl extends AbstractPropertyBackedBean implement
|
||||
auditPathMapper = new PathMapper();
|
||||
|
||||
// If we are globally disabled, skip processing the models
|
||||
Boolean enabled = properties.get(PROPERTY_AUDIT_ENABLED);
|
||||
Boolean enabled = properties.get(AUDIT_PROPERTY_AUDIT_ENABLED);
|
||||
if (enabled != null && enabled)
|
||||
{
|
||||
final RetryingTransactionCallback<Void> loadModelsCallback = new RetryingTransactionCallback<Void>()
|
||||
|
@@ -32,6 +32,22 @@ import org.alfresco.service.PublicService;
|
||||
@PublicService
|
||||
public interface AuditService
|
||||
{
|
||||
/**
|
||||
* @return Returns <tt>true</tt> if auditing is globally enabled
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
boolean isAuditEnabled();
|
||||
|
||||
/**
|
||||
* Enable or disable the global auditing state
|
||||
*
|
||||
* @param enable <tt>true</tt> to enable auditing globally or <tt>false</tt> to disable
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
void setAuditEnabled(boolean enable);
|
||||
|
||||
/**
|
||||
* Get all registered audit applications
|
||||
*
|
||||
@@ -41,13 +57,6 @@ public interface AuditService
|
||||
*/
|
||||
Set<String> getAuditApplications();
|
||||
|
||||
/**
|
||||
* @return Returns <tt>true</tt> if auditing is globally enabled
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
boolean isAuditEnabled();
|
||||
|
||||
/**
|
||||
* @param applicationName the name of the application to check
|
||||
* @param path the path to check
|
||||
@@ -83,9 +92,24 @@ public interface AuditService
|
||||
* @param applicationName the name of the application for which to remove entries
|
||||
*
|
||||
* @since 3.2
|
||||
*
|
||||
* @deprecated Use {@link #clearAudit(String, Long, Long)}
|
||||
*/
|
||||
void clearAudit(String applicationName);
|
||||
|
||||
/**
|
||||
* Remove audit entries for the given application between the time ranges. If no start
|
||||
* time is given then entries are deleted as far back as they exist. If no end time is
|
||||
* given then entries are deleted up until the current time.
|
||||
*
|
||||
* @param applicationName the name of the application for which to remove entries
|
||||
* @param fromTime the start time of entries to remove (inclusive and optional)
|
||||
* @param toTime the end time of entries to remove (exclusive and optional)
|
||||
*
|
||||
* @since 3.4
|
||||
*/
|
||||
void clearAudit(String applicationName, Long fromTime, Long toTime);
|
||||
|
||||
/**
|
||||
* The interface that will be used to give query results to the calling code.
|
||||
*
|
||||
|
Reference in New Issue
Block a user