You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2019/03/12 11:58:21 UTC

[syncope] branch master updated: [SYNCOPE-1446] Do not apply transactions to audit table

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 480ea47  [SYNCOPE-1446] Do not apply transactions to audit table
480ea47 is described below

commit 480ea47befd1b651b373658960bd0beee9f6a9d7
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Mar 12 11:23:07 2019 +0100

    [SYNCOPE-1446] Do not apply transactions to audit table
---
 .../syncope/core/logic/init/LoggerLoader.java      |  4 +-
 .../provisioning/java/DefaultAuditManager.java     |  3 +
 .../org/apache/syncope/fit/core/LoggerITCase.java  | 80 ++++++++++++++++++++++
 3 files changed, 85 insertions(+), 2 deletions(-)

diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
index 2903a10..77ded77 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
@@ -95,8 +95,8 @@ public class LoggerLoader implements SyncopeCoreLoader {
         Appender appender = ctx.getConfiguration().getAppender("audit_for_" + domain);
         if (appender == null) {
             appender = JdbcAppender.newBuilder().
-                    withName("audit_for_" + domain).
-                    withIgnoreExceptions(false).
+                    setName("audit_for_" + domain).
+                    setIgnoreExceptions(false).
                     setConnectionSource(new DataSourceConnectionSource(domain, datasource)).
                     setBufferSize(0).
                     setTableName("SYNCOPEAUDIT").
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
index 8a309d0..3d44e35 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAuditManager.java
@@ -30,6 +30,7 @@ import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional(readOnly = true)
@@ -72,6 +73,7 @@ public class DefaultAuditManager implements AuditManager {
         return auditRequested;
     }
 
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
     @Override
     public void audit(final AfterHandlingEvent event) {
         audit(
@@ -86,6 +88,7 @@ public class DefaultAuditManager implements AuditManager {
                 event.getInput());
     }
 
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
     @Override
     public void audit(
             final String who,
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
index e6f4a14..fe19fef 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
@@ -45,6 +45,7 @@ import org.apache.syncope.common.lib.log.LogStatement;
 import org.apache.syncope.common.lib.log.LoggerTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ConnPoolConfTO;
+import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.AuditElements;
@@ -52,7 +53,9 @@ import org.apache.syncope.common.lib.types.AuditElements.EventCategoryType;
 import org.apache.syncope.common.lib.types.AuditLoggerName;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 import org.apache.syncope.common.lib.types.LoggerType;
+import org.apache.syncope.common.lib.types.MatchingRule;
 import org.apache.syncope.common.lib.types.ResourceOperation;
+import org.apache.syncope.common.lib.types.UnmatchingRule;
 import org.apache.syncope.common.rest.api.LoggerWrapper;
 import org.apache.syncope.core.logic.ConnectorLogic;
 import org.apache.syncope.core.logic.ReportLogic;
@@ -370,4 +373,81 @@ public class LoggerITCase extends AbstractITCase {
         assertNotNull(userLogic);
         assertEquals(1, userLogic.getEvents().stream().filter(event -> "create".equals(event)).count());
     }
+
+    @Test
+    public void issueSYNCOPE1446() {
+        AuditLoggerName createSuccess = new AuditLoggerName(
+                AuditElements.EventCategoryType.PROPAGATION,
+                AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+                RESOURCE_NAME_DBSCRIPTED,
+                "create",
+                AuditElements.Result.SUCCESS);
+        AuditLoggerName createFailure = new AuditLoggerName(
+                AuditElements.EventCategoryType.PROPAGATION,
+                AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+                RESOURCE_NAME_DBSCRIPTED,
+                "create",
+                AuditElements.Result.FAILURE);
+        AuditLoggerName updateSuccess = new AuditLoggerName(
+                AuditElements.EventCategoryType.PROPAGATION,
+                AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+                RESOURCE_NAME_DBSCRIPTED,
+                "update",
+                AuditElements.Result.SUCCESS);
+        AuditLoggerName updateFailure = new AuditLoggerName(
+                AuditElements.EventCategoryType.PROPAGATION,
+                AnyTypeKind.ANY_OBJECT.name().toLowerCase(),
+                RESOURCE_NAME_DBSCRIPTED,
+                "update",
+                AuditElements.Result.FAILURE);
+        try {
+            // 1. setup audit for propagation
+            LoggerTO loggerTO = new LoggerTO();
+            loggerTO.setKey(createSuccess.toLoggerName());
+            loggerTO.setLevel(LoggerLevel.DEBUG);
+            loggerService.update(LoggerType.AUDIT, loggerTO);
+
+            loggerTO.setKey(createFailure.toLoggerName());
+            loggerService.update(LoggerType.AUDIT, loggerTO);
+
+            loggerTO.setKey(updateSuccess.toLoggerName());
+            loggerService.update(LoggerType.AUDIT, loggerTO);
+
+            loggerTO.setKey(updateFailure.toLoggerName());
+            loggerService.update(LoggerType.AUDIT, loggerTO);
+
+            // 2. push on resource
+            PushTaskTO pushTask = new PushTaskTO();
+            pushTask.setPerformCreate(true);
+            pushTask.setPerformUpdate(true);
+            pushTask.setUnmatchingRule(UnmatchingRule.PROVISION);
+            pushTask.setMatchingRule(MatchingRule.UPDATE);
+            reconciliationService.push(
+                    AnyTypeKind.ANY_OBJECT, "fc6dbc3a-6c07-4965-8781-921e7401a4a5", RESOURCE_NAME_DBSCRIPTED, pushTask);
+        } catch (Exception e) {
+            LOG.error("Unexpected exception", e);
+            fail(e.getMessage());
+        } finally {
+            try {
+                loggerService.delete(LoggerType.AUDIT, createSuccess.toLoggerName());
+            } catch (Exception e) {
+                // ignore
+            }
+            try {
+                loggerService.delete(LoggerType.AUDIT, createFailure.toLoggerName());
+            } catch (Exception e) {
+                // ignore
+            }
+            try {
+                loggerService.delete(LoggerType.AUDIT, updateSuccess.toLoggerName());
+            } catch (Exception e) {
+                // ignore
+            }
+            try {
+                loggerService.delete(LoggerType.AUDIT, updateFailure.toLoggerName());
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
 }