Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud)

63067: Merged V4.2-BUG-FIX (4.2.2) to HEAD-BUG-FIX (Cloud/4.3)
      62765: MNT-10611: Merged DEV to V4.2-BUG-FIX (4.2.2)
         62735: MNT-10611: Exception generated in .AccessAuditor. when audited String values bigger than 1024 characters (non-MySQL)
            - Trim String and MLtext audit values to not exceed system.maximumStringLength. Add unit test for case.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@64255 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis
2014-03-14 15:33:55 +00:00
parent 7448f6cf69
commit 467ffadf06
3 changed files with 76 additions and 0 deletions

View File

@@ -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<String, Serializable> 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<Locale> locales = mltext.getLocales();
for (Locale locale : locales)
{
mltext.put(locale, SchemaBootstrap.trimStringForTextFields(mltext.getValue(locale)));
}
entry.setValue(mltext);
}
}
// Log inbound values
if (loggerInbound.isDebugEnabled())
{

View File

@@ -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<Locale> locales = mltext.getLocales();
for (Locale locale : locales)
{
mltext.put(locale, SchemaBootstrap.trimStringForTextFields(mltext.getValue(locale)));
}
}
}
return audit;
}

View File

@@ -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<Void> testCallback = new RetryingTransactionCallback<Void>()
{
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<String, Serializable> values = new HashMap<String, Serializable>(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<Void> testRunAs = new RunAsWork<Void>()
{
public Void doWork() throws Exception
{
return transactionService.getRetryingTransactionHelper().doInTransaction(testCallback);
}
};
AuthenticationUtil.runAs(testRunAs, "SomeOtherUser");
}
/**
* Clearn the audit log as 'admin'
*/