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 2021/07/02 10:01:10 UTC

[syncope] branch 2_1_X updated (1d66d86 -> 746c3f3)

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

ilgrosso pushed a change to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git.


    from 1d66d86  adding parenthesis to perform the correct query while searching by plainAttrValue
     new 4620489  Upgrading JDBC Drivers
     new d5d90dc  Fixing Elasticsearch with Regexp queries by escaping special chars
     new 746c3f3  Clearing up interactions across Remediation, Audit and Delegation

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../syncope/core/logic/LogicInvocationHandler.java | 22 +++----
 .../syncope/core/logic/RemediationLogic.java       | 76 +++++++---------------
 .../persistence/jpa/dao/JPARemediationDAO.java     |  4 +-
 .../provisioning/java/job/AfterHandlingJob.java    |  9 ++-
 .../provisioning/java/job/SetUMembershipsJob.java  |  3 +
 .../java/pushpull/SchedulingPullActions.java       |  7 +-
 .../jpa/dao/ElasticsearchAnySearchDAO.java         | 17 ++++-
 pom.xml                                            |  4 +-
 8 files changed, 68 insertions(+), 74 deletions(-)

[syncope] 03/03: Clearing up interactions across Remediation, Audit and Delegation

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 746c3f3ad595a473345c2f488e572d0e62c0090b
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Jul 2 10:00:10 2021 +0200

    Clearing up interactions across Remediation, Audit and Delegation
---
 .../syncope/core/logic/LogicInvocationHandler.java | 22 +++----
 .../syncope/core/logic/RemediationLogic.java       | 76 +++++++---------------
 .../persistence/jpa/dao/JPARemediationDAO.java     |  4 +-
 .../provisioning/java/job/AfterHandlingJob.java    |  9 ++-
 .../provisioning/java/job/SetUMembershipsJob.java  |  3 +
 .../java/pushpull/SchedulingPullActions.java       |  7 +-
 6 files changed, 50 insertions(+), 71 deletions(-)

diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
index f1d4fd0..809a333 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LogicInvocationHandler.java
@@ -20,14 +20,11 @@ package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
 import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.core.provisioning.api.AuditManager;
 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
 import org.apache.syncope.core.provisioning.api.event.AfterHandlingEvent;
-import org.apache.syncope.core.provisioning.java.job.AfterHandlingJob;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
@@ -36,7 +33,6 @@ import org.aspectj.lang.reflect.MethodSignature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
 @Aspect
 public class LogicInvocationHandler {
@@ -49,9 +45,6 @@ public class LogicInvocationHandler {
     @Autowired
     private AuditManager auditManager;
 
-    @Autowired
-    private SchedulerFactoryBean scheduler;
-
     @Around("execution(* org.apache.syncope.core.logic.AbstractLogic+.*(..))")
     public Object around(final ProceedingJoinPoint joinPoint) throws Throwable {
         Class<?> clazz = joinPoint.getTarget().getClass();
@@ -99,8 +92,7 @@ public class LogicInvocationHandler {
             throw t;
         } finally {
             if (notificationsAvailable || auditRequested) {
-                Map<String, Object> jobMap = new HashMap<>();
-                jobMap.put(AfterHandlingEvent.JOBMAP_KEY, new AfterHandlingEvent(
+                AfterHandlingEvent afterHandlingEvent = new AfterHandlingEvent(
                         AuthContextUtils.getWho(),
                         AuditElements.EventCategoryType.LOGIC,
                         category,
@@ -109,8 +101,16 @@ public class LogicInvocationHandler {
                         condition,
                         before,
                         output,
-                        input));
-                AfterHandlingJob.schedule(scheduler, jobMap);
+                        input);
+                AuthContextUtils.execWithAuthContext(AuthContextUtils.getDomain(), () -> {
+                    try {
+                        notificationManager.createTasks(afterHandlingEvent);
+                        auditManager.audit(afterHandlingEvent);
+                    } catch (Throwable t) {
+                        LOG.error("While managing Audit and Notifications", t);
+                    }
+                    return null;
+                });
             }
         }
     }
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
index 986da0d..9b593e4 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -46,7 +47,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 @Component
-public class RemediationLogic extends AbstractTransactionalLogic<RemediationTO> {
+public class RemediationLogic extends AbstractLogic<RemediationTO> {
 
     @Autowired
     private UserLogic userLogic;
@@ -81,111 +82,80 @@ public class RemediationLogic extends AbstractTransactionalLogic<RemediationTO>
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_READ + "')")
     @Transactional(readOnly = true)
     public RemediationTO read(final String key) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
+        Remediation remediation = Optional.ofNullable(remediationDAO.find(key)).
+                orElseThrow(() -> new NotFoundException(key));
 
         return binder.getRemediationTO(remediation);
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_DELETE + "')")
+    @Transactional
     public void delete(final String key) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
+        Optional.ofNullable(remediationDAO.find(key)).
+                orElseThrow(() -> new NotFoundException(key));
 
-            throw new NotFoundException(key);
-        }
-
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_REMEDY + "')")
     public ProvisioningResult<?> remedy(final String key, final AnyTO anyTO, final boolean nullPriorityAsync) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
-
         ProvisioningResult<?> result;
-        switch (remediation.getAnyType().getKind()) {
-            case USER:
-            default:
+        switch (read(key).getAnyType()) {
+            case "USER":
                 result = userLogic.create((UserTO) anyTO, true, nullPriorityAsync);
                 break;
 
-            case GROUP:
+            case "GROUP":
                 result = groupLogic.create((GroupTO) anyTO, nullPriorityAsync);
                 break;
 
-            case ANY_OBJECT:
+            default:
                 result = anyObjectLogic.create((AnyObjectTO) anyTO, nullPriorityAsync);
         }
 
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
 
         return result;
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_REMEDY + "')")
     public ProvisioningResult<?> remedy(final String key, final AnyPatch anyPatch, final boolean nullPriorityAsync) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
-
         ProvisioningResult<?> result;
-        switch (remediation.getAnyType().getKind()) {
-            case USER:
-            default:
+        switch (read(key).getAnyType()) {
+            case "USER":
                 result = userLogic.update((UserPatch) anyPatch, nullPriorityAsync);
                 break;
 
-            case GROUP:
+            case "GROUP":
                 result = groupLogic.update((GroupPatch) anyPatch, nullPriorityAsync);
                 break;
 
-            case ANY_OBJECT:
+            default:
                 result = anyObjectLogic.update((AnyObjectPatch) anyPatch, nullPriorityAsync);
         }
 
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
 
         return result;
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REMEDIATION_REMEDY + "')")
     public ProvisioningResult<?> remedy(final String key, final String anyKey, final boolean nullPriorityAsync) {
-        Remediation remediation = remediationDAO.find(key);
-        if (remediation == null) {
-            LOG.error("Could not find remediation '" + key + "'");
-
-            throw new NotFoundException(key);
-        }
-
         ProvisioningResult<?> result;
-        switch (remediation.getAnyType().getKind()) {
-            case USER:
-            default:
+        switch (read(key).getAnyType()) {
+            case "USER":
                 result = userLogic.delete(anyKey, nullPriorityAsync);
                 break;
 
-            case GROUP:
+            case "GROUP":
                 result = groupLogic.delete(anyKey, nullPriorityAsync);
                 break;
 
-            case ANY_OBJECT:
+            default:
                 result = anyObjectLogic.delete(anyKey, nullPriorityAsync);
         }
 
-        remediationDAO.delete(remediation);
+        remediationDAO.delete(key);
 
         return result;
     }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
index c0309b3..f8aefa1 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
@@ -29,11 +29,13 @@ import org.apache.syncope.core.persistence.api.entity.Remediation;
 import org.apache.syncope.core.persistence.api.entity.task.PullTask;
 import org.apache.syncope.core.persistence.jpa.entity.JPARemediation;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ReflectionUtils;
 
 @Repository
 public class JPARemediationDAO extends AbstractDAO<Remediation> implements RemediationDAO {
 
+    @Transactional(readOnly = true)
     @Override
     public Remediation find(final String key) {
         return entityManager().find(JPARemediation.class, key);
@@ -122,6 +124,7 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
         entityManager().remove(remediation);
     }
 
+    @Transactional
     @Override
     public void delete(final String key) {
         Remediation remediation = find(key);
@@ -131,5 +134,4 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
 
         delete(remediation);
     }
-
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java
index 82f6d42..8bc0180 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AfterHandlingJob.java
@@ -31,6 +31,7 @@ import org.quartz.JobBuilder;
 import org.quartz.JobDataMap;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
+import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
@@ -53,18 +54,18 @@ public class AfterHandlingJob extends AbstractInterruptableJob {
         @SuppressWarnings("unchecked")
         AfterHandlingJob jobInstance = (AfterHandlingJob) ApplicationContextProvider.getBeanFactory().
                 createBean(AfterHandlingJob.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
-        String jobName = AfterHandlingJob.class.getName() + SecureRandomUtils.generateRandomUUID();
+        String jobName = AfterHandlingJob.class.getSimpleName() + SecureRandomUtils.generateRandomUUID();
 
         jobMap.put(JobManager.DOMAIN_KEY, AuthContextUtils.getDomain());
 
         ApplicationContextProvider.getBeanFactory().registerSingleton(jobName, jobInstance);
 
         JobBuilder jobDetailBuilder = JobBuilder.newJob(AfterHandlingJob.class).
-                withIdentity(jobName).
+                withIdentity(jobName, Scheduler.DEFAULT_GROUP).
                 usingJobData(new JobDataMap(jobMap));
 
         TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().
-                withIdentity(JobNamer.getTriggerName(jobName)).
+                withIdentity(JobNamer.getTriggerName(jobName), Scheduler.DEFAULT_GROUP).
                 startNow();
 
         try {
@@ -93,6 +94,8 @@ public class AfterHandlingJob extends AbstractInterruptableJob {
                     });
         } catch (RuntimeException e) {
             throw new JobExecutionException("While handling notification / audit events", e);
+        } finally {
+            ApplicationContextProvider.getBeanFactory().destroySingleton(context.getJobDetail().getKey().getName());
         }
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java
index 993c999..b8efd00 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SetUMembershipsJob.java
@@ -27,6 +27,7 @@ import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.job.JobManager;
+import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -115,6 +116,8 @@ public class SetUMembershipsJob extends AbstractInterruptableJob {
         } catch (RuntimeException e) {
             LOG.error("While setting memberships", e);
             throw new JobExecutionException("While executing memberships", e);
+        } finally {
+            ApplicationContextProvider.getBeanFactory().destroySingleton(context.getJobDetail().getKey().getName());
         }
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java
index c7b0bea..cdf4483 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/SchedulingPullActions.java
@@ -29,6 +29,7 @@ import org.quartz.Job;
 import org.quartz.JobBuilder;
 import org.quartz.JobDataMap;
 import org.quartz.JobExecutionException;
+import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
@@ -52,18 +53,18 @@ public abstract class SchedulingPullActions implements PullActions {
         @SuppressWarnings("unchecked")
         T jobInstance = (T) ApplicationContextProvider.getBeanFactory().
                 createBean(reference, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
-        String jobName = getClass().getName() + SecureRandomUtils.generateRandomUUID();
+        String jobName = getClass().getSimpleName() + SecureRandomUtils.generateRandomUUID();
 
         jobMap.put(JobManager.DOMAIN_KEY, AuthContextUtils.getDomain());
 
         ApplicationContextProvider.getBeanFactory().registerSingleton(jobName, jobInstance);
 
         JobBuilder jobDetailBuilder = JobBuilder.newJob(reference).
-                withIdentity(jobName).
+                withIdentity(jobName, Scheduler.DEFAULT_GROUP).
                 usingJobData(new JobDataMap(jobMap));
 
         TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().
-                withIdentity(JobNamer.getTriggerName(jobName)).
+                withIdentity(JobNamer.getTriggerName(jobName), Scheduler.DEFAULT_GROUP).
                 startNow();
 
         try {

[syncope] 01/03: Upgrading JDBC Drivers

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4620489bdcd1d5cc5fba361c88108fabf27c367c
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Jun 30 16:24:50 2021 +0200

    Upgrading JDBC Drivers
---
 pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8c73453..f0e90e1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -540,9 +540,9 @@ under the License.
     <docker.mysql.version>8.0</docker.mysql.version>
     <docker.mariadb.version>10.6</docker.mariadb.version>
 
-    <jdbc.postgresql.version>42.2.19</jdbc.postgresql.version>
+    <jdbc.postgresql.version>42.2.22</jdbc.postgresql.version>
     <jdbc.mysql.version>8.0.22</jdbc.mysql.version>
-    <jdbc.mariadb.version>2.7.2</jdbc.mariadb.version>
+    <jdbc.mariadb.version>2.7.3</jdbc.mariadb.version>
     <jdbc.mssql.version>9.2.1.jre</jdbc.mssql.version>
 
     <adminUser>admin</adminUser>

[syncope] 02/03: Fixing Elasticsearch with Regexp queries by escaping special chars

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d5d90dcca8ca0c9fd7301505dad03d29ed4b7943
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Jul 1 14:35:34 2021 +0200

    Fixing Elasticsearch with Regexp queries by escaping special chars
---
 .../persistence/jpa/dao/ElasticsearchAnySearchDAO.java  | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
index 05551ea..f5894c8 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
@@ -84,6 +84,21 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
 
     protected static final QueryBuilder MATCH_ALL_QUERY_BUILDER = new MatchAllQueryBuilder();
 
+    protected static final char[] ELASTICSEARCH_REGEX_CHARS = new char[] {
+        '.', '?', '+', '*', '|', '{', '}', '[', ']', '(', ')', '"', '\\' };
+
+    protected static String escapeForLikeRegex(final char c) {
+        StringBuilder output = new StringBuilder();
+
+        if (ArrayUtils.contains(ELASTICSEARCH_REGEX_CHARS, c)) {
+            output.append('\\');
+        }
+
+        output.append(c);
+
+        return output.toString();
+    }
+
     @Autowired
     protected RestHighLevelClient client;
 
@@ -464,7 +479,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                                 append(Character.toUpperCase(c)).
                                 append(']');
                     } else {
-                        output.append(c);
+                        output.append(escapeForLikeRegex(c));
                     }
                 }
                 builder = QueryBuilders.regexpQuery(schema.getKey(), output.toString());