diff --git a/source/java/org/alfresco/repo/audit/AuditComponentImpl.java b/source/java/org/alfresco/repo/audit/AuditComponentImpl.java index 1a6988d7bb..23aa538ecb 100644 --- a/source/java/org/alfresco/repo/audit/AuditComponentImpl.java +++ b/source/java/org/alfresco/repo/audit/AuditComponentImpl.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -36,6 +37,7 @@ import org.alfresco.repo.audit.model.AuditModelRegistryImpl; import org.alfresco.repo.audit.model.AuditApplication.DataExtractorDefinition; import org.alfresco.repo.domain.audit.AuditDAO; import org.alfresco.repo.domain.propval.PropertyValueDAO; +import org.alfresco.repo.domain.schema.SchemaBootstrap; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.transaction.AlfrescoTransactionSupport; @@ -43,6 +45,7 @@ import org.alfresco.repo.transaction.AlfrescoTransactionSupport.TxnReadState; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.audit.AuditQueryParameters; import org.alfresco.service.cmr.audit.AuditService.AuditQueryCallback; +import org.alfresco.service.cmr.repository.MLText; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.PathMapper; import org.apache.commons.logging.Log; @@ -501,6 +504,27 @@ public class AuditComponentImpl implements AuditComponent return Collections.emptyMap(); } + // trim string audited value + for (Map.Entry entry : values.entrySet()) + { + Serializable auditValue = entry.getValue(); + // Trim strings + if (auditValue instanceof String) + { + entry.setValue(SchemaBootstrap.trimStringForTextFields((String) auditValue)); + } + else if (auditValue instanceof MLText) + { + MLText mltext = (MLText) auditValue; + Set locales = mltext.getLocales(); + for (Locale locale : locales) + { + mltext.put(locale, SchemaBootstrap.trimStringForTextFields(mltext.getValue(locale))); + } + entry.setValue(mltext); + } + } + // Log inbound values if (loggerInbound.isDebugEnabled()) { diff --git a/source/java/org/alfresco/repo/audit/AuditMethodInterceptor.java b/source/java/org/alfresco/repo/audit/AuditMethodInterceptor.java index 0777ee1d8f..e9cc98d6a7 100644 --- a/source/java/org/alfresco/repo/audit/AuditMethodInterceptor.java +++ b/source/java/org/alfresco/repo/audit/AuditMethodInterceptor.java @@ -24,7 +24,9 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.ThreadPoolExecutor; @@ -37,6 +39,7 @@ import org.alfresco.repo.domain.schema.SchemaBootstrap; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.Auditable; +import org.alfresco.service.cmr.repository.MLText; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.cmr.repository.datatype.TypeConversionException; import org.alfresco.service.transaction.TransactionService; @@ -373,6 +376,16 @@ public class AuditMethodInterceptor implements MethodInterceptor { audit = SchemaBootstrap.trimStringForTextFields((String) audit); } + // trim MLText + else if (audit instanceof MLText) + { + MLText mltext = (MLText) audit; + Set locales = mltext.getLocales(); + for (Locale locale : locales) + { + mltext.put(locale, SchemaBootstrap.trimStringForTextFields(mltext.getValue(locale))); + } + } } return audit; } diff --git a/source/test-java/org/alfresco/repo/audit/AuditComponentTest.java b/source/test-java/org/alfresco/repo/audit/AuditComponentTest.java index 6f70ddfc36..d84a1165a4 100644 --- a/source/test-java/org/alfresco/repo/audit/AuditComponentTest.java +++ b/source/test-java/org/alfresco/repo/audit/AuditComponentTest.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import junit.framework.TestCase; @@ -42,6 +43,7 @@ import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.audit.AuditQueryParameters; import org.alfresco.service.cmr.audit.AuditService; import org.alfresco.service.cmr.audit.AuditService.AuditQueryCallback; +import org.alfresco.service.cmr.repository.MLText; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; @@ -785,6 +787,43 @@ public class AuditComponentTest extends TestCase assertTrue("There should be exactly one audit entry for the API test", success); } + public void testAuditOverlimitProperties() throws Exception + { + final int OVERLIMIT_SIZE = 1500; + final RetryingTransactionCallback testCallback = new RetryingTransactionCallback() + { + public Void execute() throws Throwable + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < OVERLIMIT_SIZE; i++) + { + sb.append("a"); + } + + MLText mlTextValue = new MLText(); + mlTextValue.put(Locale.ENGLISH, sb.toString()); + + Map values = new HashMap(13); + values.put("/3.1/4.1", sb.toString()); + values.put("/3.1/4.2", mlTextValue); + + auditComponent.recordAuditValues("/test/one.one/two.one", values); + + return null; + } + }; + RunAsWork testRunAs = new RunAsWork() + { + public Void doWork() throws Exception + { + return transactionService.getRetryingTransactionHelper().doInTransaction(testCallback); + } + }; + AuthenticationUtil.runAs(testRunAs, "SomeOtherUser"); + } + + + /** * Clearn the audit log as 'admin' */