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

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


The following commit(s) were added to refs/heads/4_1_X by this push:
     new 9d2f338f38 Run Jobs and Reports as the calling User (#1495)
9d2f338f38 is described below

commit 9d2f338f3829e3dc804c04c50b25823ab542457c
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Mon Aug 17 18:55:31 2026 +0200

    Run Jobs and Reports as the calling User (#1495)
---
 .../org/apache/syncope/core/logic/GroupLogic.java  |  6 ++-
 .../org/apache/syncope/core/logic/MfaLogic.java    | 25 +++++++----
 .../apache/syncope/core/logic/ReportLogicTest.java |  4 +-
 .../provisioning/api/job/JobExecutionContext.java  | 51 ++++++----------------
 .../java/job/AbstractSchedTaskJobDelegate.java     | 10 ++---
 .../provisioning/java/job/AfterHandlingJob.java    |  6 +--
 .../provisioning/java/job/DefaultJobManager.java   | 16 +++----
 .../java/job/ExpiredAccessTokenCleanup.java        |  2 +-
 .../provisioning/java/job/ExpiredBatchCleanup.java |  2 +-
 .../job/GroupMemberProvisionTaskJobDelegate.java   | 13 +++---
 .../syncope/core/provisioning/java/job/Job.java    | 14 +++---
 .../core/provisioning/java/job/LiveSyncJob.java    |  4 +-
 .../provisioning/java/job/MacroJobDelegate.java    | 18 ++++----
 .../java/job/SyncopeTaskScheduler.java             |  2 +-
 .../core/provisioning/java/job/TaskJob.java        | 25 ++++++++---
 .../java/job/notification/NotificationJob.java     |  5 +--
 .../java/job/report/AbstractReportJobDelegate.java |  2 +-
 .../provisioning/java/job/report/ReportJob.java    | 30 ++++++++-----
 .../PriorityPropagationTaskExecutor.java           | 24 +++++-----
 .../java/pushpull/AbstractPullExecutor.java        |  2 +-
 .../java/pushpull/LiveSyncJobDelegate.java         | 31 ++++++-------
 .../java/pushpull/PullJobDelegate.java             | 35 +++++++--------
 .../java/pushpull/PushJobDelegate.java             | 11 ++---
 .../java/job/SyncopeTaskSchedulerTest.java         |  2 +-
 .../core/spring/security/AuthContextUtils.java     | 27 ++++++------
 .../syncope/core/starter/actuate/JobEndpoint.java  |  6 +--
 .../java/job/ElasticsearchReindex.java             |  2 +-
 .../core/provisioning/java/job/OpenFGAReinit.java  |  2 +-
 .../provisioning/java/job/OpenSearchReindex.java   |  2 +-
 .../core/reference/SampleReportJobDelegate.java    |  4 +-
 .../fit/core/reference/TestSampleJobDelegate.java  |  4 +-
 31 files changed, 195 insertions(+), 192 deletions(-)

diff --git 
a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java 
b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
index c97cf15e0c..52123c7c62 100644
--- 
a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
+++ 
b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -397,12 +398,13 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, 
GroupCR, GroupUR> impl
     @Transactional
     @Override
     public ExecTO provisionMembers(final String key, final ProvisionAction 
action) {
-        Group group = groupDAO.findById(key).orElseThrow(() -> new 
NotFoundException("Group " + key));
+        Group group = Optional.ofNullable(groupDAO.authFind(key)).
+                orElseThrow(() -> new NotFoundException("Group " + key));
 
         Implementation jobDelegate = implementationDAO.findById(
                 GroupMemberProvisionTaskJobDelegate.class.getSimpleName()).
                 orElseThrow(() -> new NotFoundException(
-                "Implementation " + 
GroupMemberProvisionTaskJobDelegate.class.getSimpleName()));
+                        "Implementation " + 
GroupMemberProvisionTaskJobDelegate.class.getSimpleName()));
 
         String name = (action == ProvisionAction.DEPROVISION ? "de" : "")
                 + "provision members of group " + group.getName();
diff --git 
a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/MfaLogic.java 
b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/MfaLogic.java
index 85524cbb2c..1e03bf1344 100644
--- 
a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/MfaLogic.java
+++ 
b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/MfaLogic.java
@@ -32,6 +32,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.common.keymaster.client.api.KeymasterException;
 import org.apache.syncope.common.keymaster.client.api.model.Domain;
@@ -46,6 +47,7 @@ import org.apache.syncope.common.lib.types.MfaCheck;
 import org.apache.syncope.core.persistence.api.EncryptorManager;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.api.utils.RealmUtils;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -195,19 +197,24 @@ public class MfaLogic extends AbstractLogic<EntityTO> {
 
     @PreAuthorize("hasRole('" + IdRepoEntitlement.USER_UPDATE + "')")
     public void dismiss(final String username) {
-        String realm = 
AuthContextUtils.callAsAdmin(AuthContextUtils.getDomain(),
-                () -> userDAO.findByUsername(username).
-                        orElseThrow(() -> new NotFoundException("User " + 
username)).
-                        getRealm().getFullPath());
+        Pair<String, String> data = AuthContextUtils.callAsAdmin(
+                AuthContextUtils.getDomain(),
+                () -> {
+                    User user = userDAO.findByUsername(username).
+                            orElseThrow(() -> new NotFoundException("User " + 
username));
+                    return Pair.of(user.getKey(), 
user.getRealm().getFullPath());
+                });
 
         Set<String> authRealms = RealmUtils.getEffective(
-                
AuthContextUtils.getAuthorizations().get(IdRepoEntitlement.USER_UPDATE), realm);
+                
AuthContextUtils.getAuthorizations().get(IdRepoEntitlement.USER_UPDATE), 
data.getRight());
 
-        AuthContextUtils.callAs(
+        AuthContextUtils.runAsAdmin(
                 AuthContextUtils.getDomain(),
-                AuthContextUtils.getUsername(),
-                authRealms,
-                () -> userDAO.findKey(username)).orElseThrow(() -> new 
NotFoundException("User " + username));
+                () -> userDAO.securityChecks(
+                        authRealms,
+                        data.getLeft(),
+                        data.getRight(),
+                        List.of()));
 
         doDismiss(username);
     }
diff --git 
a/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/ReportLogicTest.java
 
b/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/ReportLogicTest.java
index ff9234a5f6..b11f276116 100644
--- 
a/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/ReportLogicTest.java
+++ 
b/core/idrepo/logic/src/test/java/org/apache/syncope/core/logic/ReportLogicTest.java
@@ -111,8 +111,8 @@ public class ReportLogicTest extends AbstractTest {
         assertTrue(report.getExecutions().isEmpty());
 
         JobExecutionContext ctx = mock(JobExecutionContext.class);
-        when(ctx.getExecutor()).thenReturn("test");
-        when(ctx.isDryRun()).thenReturn(false);
+        when(ctx.executor()).thenReturn("test");
+        when(ctx.dryRun()).thenReturn(false);
 
         ReportJobDelegate delegate =
                 
ApplicationContextProvider.getBeanFactory().createBean(TestReportJobDelegate.class);
diff --git 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/job/JobExecutionContext.java
 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/job/JobExecutionContext.java
index f8af53230f..98478c2446 100644
--- 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/job/JobExecutionContext.java
+++ 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/job/JobExecutionContext.java
@@ -21,42 +21,19 @@ package org.apache.syncope.core.provisioning.api.job;
 import java.util.HashMap;
 import java.util.Map;
 
-public class JobExecutionContext {
-
-    private final String domain;
-
-    private final String jobName;
-
-    private final String executor;
-
-    private final boolean dryRun;
-
-    private final Map<String, Object> data = new HashMap<>();
-
-    public JobExecutionContext(final String domain, final String jobName, 
final String executor, final boolean dryRun) {
-        this.domain = domain;
-        this.jobName = jobName;
-        this.executor = executor;
-        this.dryRun = dryRun;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public String getJobName() {
-        return jobName;
-    }
-
-    public String getExecutor() {
-        return executor;
-    }
-
-    public boolean isDryRun() {
-        return dryRun;
-    }
-
-    public Map<String, Object> getData() {
-        return data;
+public record JobExecutionContext(
+        String domain,
+        String jobName,
+        String executor,
+        boolean dryRun,
+        Map<String, Object> data) {
+
+    public JobExecutionContext(
+            final String domain,
+            final String jobName,
+            final String executor,
+            final boolean dryRun) {
+
+        this(domain, jobName, executor, dryRun, new HashMap<>());
     }
 }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
index 5028c59f07..138a577709 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/AbstractSchedTaskJobDelegate.java
@@ -91,8 +91,6 @@ public abstract class AbstractSchedTaskJobDelegate<T extends 
SchedTask> implemen
 
     protected boolean manageOperationId;
 
-    protected String executor;
-
     protected void setStatus(final String status) {
         publisher.publishEvent(new JobStatusEvent(
                 this, AuthContextUtils.getDomain(), JobNamer.getJobName(task), 
status));
@@ -115,15 +113,13 @@ public abstract class AbstractSchedTaskJobDelegate<T 
extends SchedTask> implemen
                     MDC.put(Job.OPERATION_ID, 
SecureRandomUtils.generateRandomUUID().toString());
                     return true;
                 });
-
-        executor = Optional.ofNullable(context.getExecutor()).orElseGet(() -> 
securityProperties.getAdminUser());
     }
 
     protected TaskExec<SchedTask> initExecution() {
         TaskExec<SchedTask> execution = 
taskUtilsFactory.getInstance(taskType).newTaskExec();
         execution.setStart(OffsetDateTime.now());
         execution.setTask(task);
-        execution.setExecutor(executor);
+        execution.setExecutor(AuthContextUtils.getUsername());
 
         return execution;
     }
@@ -144,7 +140,7 @@ public abstract class AbstractSchedTaskJobDelegate<T 
extends SchedTask> implemen
         task = taskDAO.save(task);
 
         notificationManager.createTasks(
-                executor,
+                AuthContextUtils.getUsername(),
                 OpEvent.CategoryType.TASK,
                 this.getClass().getSimpleName(),
                 null,
@@ -155,7 +151,7 @@ public abstract class AbstractSchedTaskJobDelegate<T 
extends SchedTask> implemen
 
         auditManager.audit(
                 AuthContextUtils.getDomain(),
-                executor,
+                AuthContextUtils.getUsername(),
                 OpEvent.CategoryType.TASK,
                 task.getClass().getSimpleName(),
                 null,
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 e9705396ef..9dbb640185 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
@@ -50,7 +50,7 @@ public class AfterHandlingJob extends Job {
                 AfterHandlingJob.class.getSimpleName() + "_" + 
SecureRandomUtils.generateRandomUUID(),
                 AuthContextUtils.getWho(),
                 false);
-        context.getData().putAll(jobMap);
+        context.data().putAll(jobMap);
 
         try {
             AfterHandlingJob job = 
ApplicationContextProvider.getBeanFactory().createBean(AfterHandlingJob.class);
@@ -75,14 +75,14 @@ public class AfterHandlingJob extends Job {
     @Override
     protected void execute(final JobExecutionContext context) throws 
JobExecutionException {
         Optional<AfterHandlingEvent> event = Optional.ofNullable(
-                
context.getData().get(AfterHandlingEvent.JOBMAP_KEY)).map(AfterHandlingEvent.class::cast);
+                
context.data().get(AfterHandlingEvent.JOBMAP_KEY)).map(AfterHandlingEvent.class::cast);
         if (event.isEmpty()) {
             LOG.debug("No event to process, aborting");
             return;
         }
 
         try {
-            AuthContextUtils.runAsAdmin(context.getDomain(), () -> {
+            AuthContextUtils.runAsAdmin(context.domain(), () -> {
                 notificationManager.createTasks(event.get());
                 auditManager.audit(event.get());
             });
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/DefaultJobManager.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/DefaultJobManager.java
index 2dacb8e6dc..6602c88d19 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/DefaultJobManager.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/DefaultJobManager.java
@@ -118,8 +118,8 @@ public class DefaultJobManager implements JobManager, 
SyncopeCoreLoader {
             final String cronExpression,
             final OffsetDateTime startAt) {
 
-        if (isRunning(context.getJobName())) {
-            LOG.debug("Job {} already running, cancel", context.getJobName());
+        if (isRunning(context.jobName())) {
+            LOG.debug("Job {} already running, cancel", context.jobName());
             return;
         }
 
@@ -176,10 +176,10 @@ public class DefaultJobManager implements JobManager, 
SyncopeCoreLoader {
                 JobNamer.getJobName(task),
                 executor,
                 dryRun);
-        context.getData().put(JobManager.TASK_TYPE, type);
-        context.getData().put(JobManager.TASK_KEY, task.getKey());
-        context.getData().put(JobManager.DELEGATE_IMPLEMENTATION, 
jobDelegate.getKey());
-        context.getData().putAll(jobData);
+        context.data().put(JobManager.TASK_TYPE, type);
+        context.data().put(JobManager.TASK_KEY, task.getKey());
+        context.data().put(JobManager.DELEGATE_IMPLEMENTATION, 
jobDelegate.getKey());
+        context.data().putAll(jobData);
 
         registerJob(
                 context,
@@ -239,8 +239,8 @@ public class DefaultJobManager implements JobManager, 
SyncopeCoreLoader {
                 JobNamer.getJobName(report),
                 executor,
                 dryRun);
-        context.getData().put(JobManager.REPORT_KEY, report.getKey());
-        context.getData().put(JobManager.DELEGATE_IMPLEMENTATION, 
report.getJobDelegate().getKey());
+        context.data().put(JobManager.REPORT_KEY, report.getKey());
+        context.data().put(JobManager.DELEGATE_IMPLEMENTATION, 
report.getJobDelegate().getKey());
 
         registerJob(
                 context,
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
index b93a508be7..600ce79ff0 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredAccessTokenCleanup.java
@@ -31,7 +31,7 @@ public class ExpiredAccessTokenCleanup extends 
AbstractSchedTaskJobDelegate<Sche
 
     @Override
     protected String doExecute(final JobExecutionContext context) {
-        if (!context.isDryRun()) {
+        if (!context.dryRun()) {
             int deleted = accessTokenDAO.deleteExpired(OffsetDateTime.now());
             LOG.debug("Successfully deleted {} expired access tokens", 
deleted);
         }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredBatchCleanup.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredBatchCleanup.java
index 44d8d652cf..669ddbfcb7 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredBatchCleanup.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ExpiredBatchCleanup.java
@@ -30,7 +30,7 @@ public class ExpiredBatchCleanup extends 
AbstractSchedTaskJobDelegate<SchedTask>
 
     @Override
     protected String doExecute(final JobExecutionContext context) {
-        if (!context.isDryRun()) {
+        if (!context.dryRun()) {
             long deleted = batchDAO.deleteExpired();
             LOG.debug("Successfully deleted {} expired batch requests", 
deleted);
         }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/GroupMemberProvisionTaskJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/GroupMemberProvisionTaskJobDelegate.java
index 9d16216347..76b64f0d1a 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/GroupMemberProvisionTaskJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/GroupMemberProvisionTaskJobDelegate.java
@@ -42,6 +42,7 @@ import 
org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.job.JobExecutionContext;
 import org.apache.syncope.core.provisioning.api.job.JobExecutionException;
 import org.apache.syncope.core.provisioning.api.job.StoppableJobDelegate;
+import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
@@ -89,8 +90,8 @@ public class GroupMemberProvisionTaskJobDelegate
             final JobExecutionContext context)
             throws JobExecutionException {
 
-        groupKey = (String) context.getData().get(GROUP_KEY_JOBDETAIL_KEY);
-        action = (ProvisionAction) context.getData().get(ACTION_JOBDETAIL_KEY);
+        groupKey = (String) context.data().get(GROUP_KEY_JOBDETAIL_KEY);
+        action = (ProvisionAction) context.data().get(ACTION_JOBDETAIL_KEY);
 
         super.execute(taskType, taskKey, context);
     }
@@ -143,9 +144,9 @@ public class GroupMemberProvisionTaskJobDelegate
 
                 List<PropagationStatus> statuses = action == 
ProvisionAction.DEPROVISION
                         ? userProvisioningManager.deprovision(
-                                user.getKey(), gResources, false, executor)
+                                user.getKey(), gResources, false, 
AuthContextUtils.getUsername())
                         : userProvisioningManager.provision(
-                                user.getKey(), true, null, gResources, false, 
executor);
+                                user.getKey(), true, null, gResources, false, 
AuthContextUtils.getUsername());
                 for (PropagationStatus propagationStatus : statuses) {
                     result.append("User ").append(user.getKey()).append('\t').
                             append("Resource 
").append(propagationStatus.getResource()).append('\t').
@@ -192,9 +193,9 @@ public class GroupMemberProvisionTaskJobDelegate
 
                 List<PropagationStatus> statuses = action == 
ProvisionAction.DEPROVISION
                         ? anyObjectProvisioningManager.deprovision(
-                                anyObject.getKey(), gResources, false, 
executor)
+                                anyObject.getKey(), gResources, false, 
AuthContextUtils.getUsername())
                         : anyObjectProvisioningManager.provision(
-                                anyObject.getKey(), gResources, false, 
executor);
+                                anyObject.getKey(), gResources, false, 
AuthContextUtils.getUsername());
 
                 for (PropagationStatus propagationStatus : statuses) {
                     result.append(anyObject.getType().getKey()).append(' ').
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/Job.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/Job.java
index 8304df1dde..f45c8737d0 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/Job.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/Job.java
@@ -62,25 +62,25 @@ public abstract class Job implements Runnable {
 
         boolean locked = false;
         try {
-            locked = AuthContextUtils.callAsAdmin(context.getDomain(), () -> 
jobStatusDAO.lock(context.getJobName()));
+            locked = AuthContextUtils.callAsAdmin(context.domain(), () -> 
jobStatusDAO.lock(context.jobName()));
         } catch (Exception e) {
-            LOG.debug("While attempting to lock job {}", context.getJobName(), 
e);
+            LOG.debug("While attempting to lock job {}", context.jobName(), e);
         }
         if (!locked) {
-            LOG.debug("Could not lock job {}, skipping execution", 
context.getJobName());
+            LOG.debug("Could not lock job {}, skipping execution", 
context.jobName());
             return;
         }
 
-        LOG.debug("Job {} locked, starting execution", context.getJobName());
+        LOG.debug("Job {} locked, starting execution", context.jobName());
 
         try {
             execute(context);
         } catch (JobExecutionException e) {
-            LOG.error("While executing job {}", context.getJobName(), e);
+            LOG.error("While executing job {}", context.jobName(), e);
         } finally {
-            LOG.debug("Job {} execution completed", context.getJobName());
+            LOG.debug("Job {} execution completed", context.jobName());
 
-            AuthContextUtils.runAsAdmin(context.getDomain(), () -> 
jobStatusDAO.unlock(context.getJobName()));
+            AuthContextUtils.runAsAdmin(context.domain(), () -> 
jobStatusDAO.unlock(context.jobName()));
         }
     }
 }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/LiveSyncJob.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/LiveSyncJob.java
index 5a64eda427..a0503ce2d2 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/LiveSyncJob.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/LiveSyncJob.java
@@ -44,12 +44,12 @@ public class LiveSyncJob extends TaskJob {
     protected void delegate(final JobExecutionContext context, final String 
taskKey)
             throws ClassNotFoundException, JobExecutionException {
 
-        String implKey = (String) 
context.getData().get(JobManager.DELEGATE_IMPLEMENTATION);
+        String implKey = (String) 
context.data().get(JobManager.DELEGATE_IMPLEMENTATION);
         Implementation impl = implementationDAO.findById(implKey).orElse(null);
         if (impl == null) {
             LOG.error("Could not find Implementation '{}', aborting", implKey);
         } else {
-            delegate = ImplementationManager.build(context.getDomain(), impl);
+            delegate = ImplementationManager.build(context.domain(), impl);
             delegate.execute(
                     TaskType.LIVE_SYNC,
                     taskKey,
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
index ba2e801c4f..427f8fc068 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/MacroJobDelegate.java
@@ -101,8 +101,8 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> im
         Set<String> missingFormProperties = 
task.getFormPropertyDefs().stream().
                 filter(FormPropertyDef::isRequired).
                 map(fpd -> Pair.of(
-                fpd.getName(),
-                macroTaskForm.getProperty(fpd.getName()).map(p -> p.getValue() 
!= null))).
+                        fpd.getName(),
+                        macroTaskForm.getProperty(fpd.getName()).map(p -> 
p.getValue() != null))).
                 filter(pair -> pair.getRight().isEmpty()).
                 map(Pair::getLeft).
                 collect(Collectors.toSet());
@@ -274,7 +274,7 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> im
         } else {
             try {
                 actions = Optional.of(ImplementationManager.build(
-                        context.getDomain(),
+                        context.domain(),
                         task.getMacroActions(),
                         () -> 
perContextActions.get(task.getMacroActions().getKey()),
                         instance -> 
perContextActions.put(task.getMacroActions().getKey(), instance)));
@@ -285,19 +285,19 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> im
 
         StringBuilder output = new StringBuilder();
 
-        SyncopeForm macroTaskForm = (SyncopeForm) 
context.getData().get(MACRO_TASK_FORM_JOBDETAIL_KEY);
+        SyncopeForm macroTaskForm = (SyncopeForm) 
context.data().get(MACRO_TASK_FORM_JOBDETAIL_KEY);
         Optional<JexlContext> jexlContext = check(macroTaskForm, actions, 
output);
 
         Map<String, Serializable> ctx = new HashMap<>();
 
-        actions.filter(a -> !context.isDryRun()).ifPresent(a -> 
a.beforeAll(ctx));
+        actions.filter(a -> !context.dryRun()).ifPresent(a -> 
a.beforeAll(ctx));
 
         List<Pair<Command<CommandArgs>, CommandArgs>> commands = new 
ArrayList<>();
         for (MacroTaskCommand command : task.getCommands()) {
             Command<CommandArgs> runnable;
             try {
                 runnable = (Command<CommandArgs>) ImplementationManager.build(
-                        context.getDomain(),
+                        context.domain(),
                         command.getCommand(),
                         () -> 
perContextCommands.get(command.getCommand().getKey()),
                         instance -> 
perContextCommands.put(command.getCommand().getKey(), instance));
@@ -308,7 +308,7 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> im
             CommandArgs args;
             if (command.getArgs() == null) {
                 try {
-                    args = 
ImplementationManager.emptyArgs(context.getDomain(), command.getCommand());
+                    args = ImplementationManager.emptyArgs(context.domain(), 
command.getCommand());
                 } catch (Exception e) {
                     throw new JobExecutionException("While getting empty args 
from " + command.getKey(), e);
                 }
@@ -342,8 +342,8 @@ public class MacroJobDelegate extends 
AbstractSchedTaskJobDelegate<MacroTask> im
             commands.add(Pair.of(runnable, args));
         }
 
-        run(commands, actions, ctx, output, context.isDryRun());
-        return actions.filter(a -> !context.isDryRun()).map(a -> 
a.afterAll(ctx, output)).orElse(output).toString();
+        run(commands, actions, ctx, output, context.dryRun());
+        return actions.filter(a -> !context.dryRun()).map(a -> a.afterAll(ctx, 
output)).orElse(output).toString();
     }
 
     @Override
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskScheduler.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskScheduler.java
index 51382daabd..652e76b82b 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskScheduler.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskScheduler.java
@@ -61,7 +61,7 @@ public class SyncopeTaskScheduler {
     }
 
     protected void register(final Job job, final ScheduledFuture<?> instant, 
final ScheduledFuture<?> cron) {
-        Key key = new Key(job.getContext().getDomain(), 
job.getContext().getJobName());
+        Key key = new Key(job.getContext().domain(), 
job.getContext().jobName());
 
         stop(key, instant == null ? List.of(Value::cron) : 
List.of(Value::instant));
         AuthContextUtils.runAsAdmin(key.domain(), () -> 
jobStatusDAO.unlock(key.job()));
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
index 0a78a73684..7d4423c79d 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/TaskJob.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.job;
 
+import java.util.Set;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.DomainHolder;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
@@ -28,6 +29,8 @@ import 
org.apache.syncope.core.provisioning.api.job.JobManager;
 import org.apache.syncope.core.provisioning.api.job.SchedTaskJobDelegate;
 import org.apache.syncope.core.spring.implementation.ImplementationManager;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
+import org.apache.syncope.core.spring.security.AuthDataAccessor;
+import org.apache.syncope.core.spring.security.SyncopeGrantedAuthority;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +55,9 @@ public class TaskJob extends Job {
     @Autowired
     protected ImplementationDAO implementationDAO;
 
+    @Autowired
+    protected AuthDataAccessor authDataAccessor;
+
     private SchedTaskJobDelegate delegate;
 
     @Override
@@ -62,14 +68,14 @@ public class TaskJob extends Job {
     protected void delegate(final JobExecutionContext context, final String 
taskKey)
             throws ClassNotFoundException, JobExecutionException {
 
-        String implKey = (String) 
context.getData().get(JobManager.DELEGATE_IMPLEMENTATION);
+        String implKey = (String) 
context.data().get(JobManager.DELEGATE_IMPLEMENTATION);
         Implementation impl = implementationDAO.findById(implKey).orElse(null);
         if (impl == null) {
             LOG.error("Could not find Implementation '{}', aborting", implKey);
         } else {
-            delegate = ImplementationManager.build(context.getDomain(), impl);
+            delegate = ImplementationManager.build(context.domain(), impl);
             delegate.execute(
-                    (TaskType) context.getData().get(JobManager.TASK_TYPE),
+                    (TaskType) context.data().get(JobManager.TASK_TYPE),
                     taskKey,
                     context);
         }
@@ -77,16 +83,21 @@ public class TaskJob extends Job {
 
     @Override
     protected void execute(final JobExecutionContext context) throws 
JobExecutionException {
-        if (!domainHolder.getDomains().containsKey(context.getDomain())) {
-            LOG.debug("Domain {} not found, skipping", context.getDomain());
+        if (!domainHolder.getDomains().containsKey(context.domain())) {
+            LOG.debug("Domain {} not found, skipping", context.domain());
             return;
         }
 
-        String taskKey = (String) context.getData().get(JobManager.TASK_KEY);
+        String taskKey = (String) context.data().get(JobManager.TASK_KEY);
         try {
-            AuthContextUtils.runAsAdmin(context.getDomain(), () -> {
+            Set<SyncopeGrantedAuthority> authorities = 
AuthContextUtils.callAsAdmin(
+                    context.domain(),
+                    () -> authDataAccessor.getAuthorities(context.executor(), 
null));
+
+            AuthContextUtils.callAs(context.domain(), context.executor(), 
authorities, () -> {
                 try {
                     delegate(context, taskKey);
+                    return null;
                 } catch (Exception e) {
                     if (e instanceof RuntimeException re) {
                         throw re;
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/notification/NotificationJob.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/notification/NotificationJob.java
index 54210ce8f8..40cf719142 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/notification/NotificationJob.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/notification/NotificationJob.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.provisioning.java.job.notification;
 
-import java.util.Optional;
 import org.apache.syncope.core.persistence.api.DomainHolder;
 import org.apache.syncope.core.provisioning.api.job.JobExecutionContext;
 import org.apache.syncope.core.provisioning.api.job.JobExecutionException;
@@ -71,12 +70,12 @@ public class NotificationJob extends Job {
     @Override
     protected void execute(final JobExecutionContext context) throws 
JobExecutionException {
         LOG.debug("Waking up...");
-        String executor = 
Optional.ofNullable(context.getExecutor()).orElseGet(securityProperties::getAdminUser);
+
         for (String domain : domainHolder.getDomains().keySet()) {
             try {
                 AuthContextUtils.runAsAdmin(domain, () -> {
                     try {
-                        delegate.execute(executor);
+                        delegate.execute(securityProperties.getAdminUser());
                     } catch (Exception e) {
                         LOG.error("While sending out notifications", e);
                         throw new RuntimeException(e);
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AbstractReportJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AbstractReportJobDelegate.java
index a378def165..0c52938687 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AbstractReportJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AbstractReportJobDelegate.java
@@ -118,7 +118,7 @@ public abstract class AbstractReportJobDelegate implements 
ReportJobDelegate, St
             return;
         }
 
-        String executor = 
Optional.ofNullable(context.getExecutor()).orElseGet(() -> 
securityProperties.getAdminUser());
+        String executor = Optional.ofNullable(context.executor()).orElseGet(() 
-> securityProperties.getAdminUser());
         ReportExec execution = entityFactory.newEntity(ReportExec.class);
         execution.setStart(OffsetDateTime.now());
         execution.setReport(report);
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReportJob.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReportJob.java
index f6932af1b0..b23bdc2f91 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReportJob.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReportJob.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.provisioning.java.job.report;
 
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.syncope.core.persistence.api.DomainHolder;
 import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
@@ -30,6 +31,8 @@ import 
org.apache.syncope.core.provisioning.api.job.report.ReportJobDelegate;
 import org.apache.syncope.core.provisioning.java.job.Job;
 import org.apache.syncope.core.spring.implementation.ImplementationManager;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
+import org.apache.syncope.core.spring.security.AuthDataAccessor;
+import org.apache.syncope.core.spring.security.SyncopeGrantedAuthority;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,10 +57,13 @@ public class ReportJob extends Job {
     private final Map<String, ReportJobDelegate> perContextReportJobDelegates 
= new ConcurrentHashMap<>();
 
     @Autowired
-    private ImplementationDAO implementationDAO;
+    private DomainHolder<?> domainHolder;
 
     @Autowired
-    private DomainHolder<?> domainHolder;
+    protected ImplementationDAO implementationDAO;
+
+    @Autowired
+    protected AuthDataAccessor authDataAccessor;
 
     private ReportJobDelegate delegate;
 
@@ -69,34 +75,38 @@ public class ReportJob extends Job {
     protected void delegate(final JobExecutionContext context, final String 
reportKey)
             throws ClassNotFoundException, JobExecutionException {
 
-        String implKey = (String) 
context.getData().get(JobManager.DELEGATE_IMPLEMENTATION);
+        String implKey = (String) 
context.data().get(JobManager.DELEGATE_IMPLEMENTATION);
         Implementation impl = implementationDAO.findById(implKey).orElse(null);
         if (impl == null) {
             LOG.error("Could not find Implementation '{}', aborting", implKey);
         } else {
             delegate = ImplementationManager.buildReportJobDelegate(
-                    context.getDomain(),
+                    context.domain(),
                     impl,
                     () -> perContextReportJobDelegates.get(impl.getKey()),
                     instance -> 
perContextReportJobDelegates.put(impl.getKey(), instance)).
-                    orElseThrow(() -> new IllegalArgumentException(
-                    "Could not instantiate " + impl.getBody()));
+                    orElseThrow(() -> new IllegalArgumentException("Could not 
instantiate " + impl.getBody()));
             delegate.execute(reportKey, context);
         }
     }
 
     @Override
     protected void execute(final JobExecutionContext context) throws 
JobExecutionException {
-        if (!domainHolder.getDomains().containsKey(context.getDomain())) {
-            LOG.debug("Domain {} not found, skipping", context.getDomain());
+        if (!domainHolder.getDomains().containsKey(context.domain())) {
+            LOG.debug("Domain {} not found, skipping", context.domain());
             return;
         }
 
-        String reportKey = (String) 
context.getData().get(JobManager.REPORT_KEY);
+        String reportKey = (String) context.data().get(JobManager.REPORT_KEY);
         try {
-            AuthContextUtils.runAsAdmin(context.getDomain(), () -> {
+            Set<SyncopeGrantedAuthority> authorities = 
AuthContextUtils.callAsAdmin(
+                    context.domain(),
+                    () -> authDataAccessor.getAuthorities(context.executor(), 
null));
+
+            AuthContextUtils.callAs(context.domain(), context.executor(), 
authorities, () -> {
                 try {
                     delegate(context, reportKey);
+                    return null;
                 } catch (Exception e) {
                     if (e instanceof RuntimeException re) {
                         throw re;
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
index 94ea5cdbcf..a938611aa4 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
@@ -23,12 +23,10 @@ import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
-import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletionService;
 import java.util.concurrent.ExecutorCompletionService;
 import java.util.concurrent.Future;
-import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.types.ExecStatus;
 import 
org.apache.syncope.core.persistence.api.attrvalue.PlainAttrValidationManager;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
@@ -51,8 +49,6 @@ import 
org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
 
 /**
  * Sorts the tasks to be executed according to related
@@ -108,19 +104,19 @@ public class PriorityPropagationTaskExecutor extends 
AbstractPropagationTaskExec
     protected Callable<TaskExec<PropagationTask>> newPropagationTaskCallable(
             final PropagationTaskInfo taskInfo, final PropagationReporter 
reporter, final String executor) {
 
-        String domain = AuthContextUtils.getDomain();
-        Set<String> authorities = 
SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream().
-                
map(GrantedAuthority::getAuthority).collect(Collectors.toSet());
+        return () -> AuthContextUtils.callAs(
+                AuthContextUtils.getDomain(),
+                executor,
+                AuthContextUtils.getAuthorities(),
+                () -> {
+                    LOG.debug("Execution started for {}", taskInfo);
 
-        return () -> AuthContextUtils.callAs(domain, executor, authorities, () 
-> {
-            LOG.debug("Execution started for {}", taskInfo);
+                    TaskExec<PropagationTask> execution = 
this.execute(taskInfo, reporter, executor);
 
-            TaskExec<PropagationTask> execution = this.execute(taskInfo, 
reporter, executor);
+                    LOG.debug("Execution completed for {} with results {}", 
taskInfo, execution);
 
-            LOG.debug("Execution completed for {} with results {}", taskInfo, 
execution);
-
-            return execution;
-        });
+                    return execution;
+                });
     }
 
     protected boolean failed(
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullExecutor.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullExecutor.java
index c123d818b1..62f812db7a 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullExecutor.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullExecutor.java
@@ -121,7 +121,7 @@ abstract class AbstractPullExecutor<T extends 
ProvisioningTask<T>>
 
         super.init(taskType, taskKey, context);
 
-        provisionSorter = getProvisionSorter(context.getDomain(), task);
+        provisionSorter = getProvisionSorter(context.domain(), task);
 
         latestSyncTokens.clear();
     }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LiveSyncJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LiveSyncJobDelegate.java
index 0e05150ac5..77f5394afc 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LiveSyncJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LiveSyncJobDelegate.java
@@ -59,6 +59,7 @@ import org.apache.syncope.core.provisioning.java.job.TaskJob;
 import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 import org.apache.syncope.core.spring.implementation.ImplementationManager;
+import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.OperationOptions;
 import org.identityconnectors.framework.common.objects.OperationOptionsBuilder;
@@ -103,9 +104,9 @@ public class LiveSyncJobDelegate
 
         Implementation impl = 
Optional.ofNullable(task.getLiveSyncDeltaMapper()).
                 orElseThrow(() -> new JobExecutionException(
-                "No " + LiveSyncDeltaMapper.class.getSimpleName() + " 
provided, aborting"));
+                        "No " + LiveSyncDeltaMapper.class.getSimpleName() + " 
provided, aborting"));
         try {
-            mapper = ImplementationManager.build(context.getDomain(), impl);
+            mapper = ImplementationManager.build(context.domain(), impl);
         } catch (Exception e) {
             throw new JobExecutionException(
                     "Could not build " + 
IdMImplementationType.LIVE_SYNC_DELTA_MAPPER + " " + impl.getKey(), e);
@@ -140,9 +141,9 @@ public class LiveSyncJobDelegate
                 Optional.ofNullable(task.getResource().getInboundPolicy()).
                         map(InboundPolicy::getConflictResolutionAction).
                         orElse(ConflictResolutionAction.IGNORE),
-                getInboundActions(context.getDomain(), task.getActions()),
-                executor,
-                context.isDryRun()) {
+                getInboundActions(context.domain(), task.getActions()),
+                AuthContextUtils.getUsername(),
+                context.dryRun()) {
 
             @Override
             public String getContext() {
@@ -181,7 +182,7 @@ public class LiveSyncJobDelegate
 
             Optional.ofNullable(orgUnit.getSyncToken()).
                     ifPresent(syncToken -> setLatestSyncToken(
-                    orgUnit.getObjectClass(), 
ConnObjectUtils.toSyncToken(syncToken)));
+                            orgUnit.getObjectClass(), 
ConnObjectUtils.toSyncToken(syncToken)));
         }
 
         // ...then provisions for any types
@@ -233,7 +234,7 @@ public class LiveSyncJobDelegate
 
             Optional.ofNullable(provision.getSyncToken()).
                     ifPresent(syncToken -> setLatestSyncToken(
-                    provision.getObjectClass(), 
ConnObjectUtils.toSyncToken(syncToken)));
+                            provision.getObjectClass(), 
ConnObjectUtils.toSyncToken(syncToken)));
         }
 
         setStatus("Initialization completed");
@@ -287,7 +288,7 @@ public class LiveSyncJobDelegate
                 OperationOptions options = Optional.ofNullable(
                         
latestSyncTokens.get(info.objectClass().getObjectClassValue())).
                         map(syncToken -> new 
OperationOptionsBuilder(info.options()).
-                        
setPagedResultsCookie(syncToken.getValue().toString()).build()).
+                                
setPagedResultsCookie(syncToken.getValue().toString()).build()).
                         orElseGet(() -> info.options());
 
                 profile.getConnector().livesync(
@@ -313,14 +314,14 @@ public class LiveSyncJobDelegate
                     AnyUtils anyUtils = 
anyUtilsFactory.getInstance(info.anyTypeKind());
                     profile.getResults().stream().
                             filter(r -> r.getUidValue() != null && r.getKey() 
!= null
-                            && r.getOperation() == ResourceOperation.CREATE
-                            && 
r.getAnyType().equals(info.provision().getAnyType())).
+                                    && r.getOperation() == 
ResourceOperation.CREATE
+                                    && 
r.getAnyType().equals(info.provision().getAnyType())).
                             forEach(r -> liveSyncTaskSaver.addAttr(
-                            anyUtils,
-                            validator,
-                            r.getKey(),
-                            info.uidOnCreate(),
-                            r.getUidValue()));
+                                    anyUtils,
+                                    validator,
+                                    r.getKey(),
+                                    info.uidOnCreate(),
+                                    r.getUidValue()));
                 }
             });
 
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
index f0ab389bbe..19fc2ba225 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
@@ -44,6 +44,7 @@ import 
org.apache.syncope.core.provisioning.api.pushpull.SyncopePullResultHandle
 import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 import org.apache.syncope.core.spring.implementation.ImplementationManager;
+import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.OperationOptions;
 
@@ -78,9 +79,9 @@ public class PullJobDelegate
                 Optional.ofNullable(task.getResource().getInboundPolicy()).
                         map(InboundPolicy::getConflictResolutionAction).
                         orElse(ConflictResolutionAction.IGNORE),
-                getInboundActions(context.getDomain(), task.getActions()),
-                executor,
-                context.isDryRun());
+                getInboundActions(context.domain(), task.getActions()),
+                AuthContextUtils.getUsername(),
+                context.dryRun());
 
         dispatcher = buildDispatcher();
     }
@@ -120,7 +121,7 @@ public class PullJobDelegate
             try {
                 switch (task.getPullMode()) {
                     case INCREMENTAL:
-                        if (!context.isDryRun()) {
+                        if (!context.dryRun()) {
                             setLatestSyncToken(
                                     orgUnit.getObjectClass(),
                                     
ConnObjectUtils.toSyncToken(orgUnit.getSyncToken()));
@@ -132,7 +133,7 @@ public class PullJobDelegate
                                 dispatcher,
                                 options);
 
-                        if (!context.isDryRun()) {
+                        if (!context.dryRun()) {
                             orgUnit.setSyncToken(
                                     
ConnObjectUtils.toString(latestSyncTokens.get(orgUnit.getObjectClass())));
                             resourceDAO.save(task.getResource());
@@ -142,7 +143,7 @@ public class PullJobDelegate
                     case FILTERED_RECONCILIATION:
                         connector.filteredReconciliation(
                                 new ObjectClass(orgUnit.getObjectClass()),
-                                getReconFilterBuilder(context.getDomain(), 
task),
+                                getReconFilterBuilder(context.domain(), task),
                                 dispatcher,
                                 options);
                         break;
@@ -198,7 +199,7 @@ public class PullJobDelegate
 
                 switch (task.getPullMode()) {
                     case INCREMENTAL:
-                        if (!context.isDryRun()) {
+                        if (!context.dryRun()) {
                             setLatestSyncToken(
                                     provision.getObjectClass(),
                                     
ConnObjectUtils.toSyncToken(provision.getSyncToken()));
@@ -210,14 +211,14 @@ public class PullJobDelegate
                                 dispatcher,
                                 options);
 
-                        if (!context.isDryRun()) {
+                        if (!context.dryRun()) {
                             setSyncTokens = true;
                         }
                         break;
 
                     case FILTERED_RECONCILIATION:
                         connector.filteredReconciliation(new 
ObjectClass(provision.getObjectClass()),
-                                getReconFilterBuilder(context.getDomain(), 
task),
+                                getReconFilterBuilder(context.domain(), task),
                                 dispatcher,
                                 options);
                         break;
@@ -257,14 +258,14 @@ public class PullJobDelegate
                     AnyUtils anyUtils = 
anyUtilsFactory.getInstance(anyType.getKind());
                     profile.getResults().stream().
                             filter(result -> result.getUidValue() != null && 
result.getKey() != null
-                            && result.getOperation() == 
ResourceOperation.CREATE
-                            && 
result.getAnyType().equals(provision.getAnyType())).
+                                    && result.getOperation() == 
ResourceOperation.CREATE
+                                    && 
result.getAnyType().equals(provision.getAnyType())).
                             forEach(result -> anyUtils.addAttr(
-                            validator,
-                            result.getKey(),
-                            
plainSchemaDAO.findById(provision.getUidOnCreate()).orElseThrow(
-                                    () -> new NotFoundException("PlainSchema " 
+ provision.getUidOnCreate())),
-                            result.getUidValue()));
+                                    validator,
+                                    result.getKey(),
+                                    
plainSchemaDAO.findById(provision.getUidOnCreate()).orElseThrow(
+                                            () -> new 
NotFoundException("PlainSchema " + provision.getUidOnCreate())),
+                                    result.getUidValue()));
                 } catch (Throwable t) {
                     LOG.error("While setting UID on create", t);
                 }
@@ -287,7 +288,7 @@ public class PullJobDelegate
 
         setStatus("Pull done");
 
-        String result = createReport(profile.getResults(), task.getResource(), 
context.isDryRun());
+        String result = createReport(profile.getResults(), task.getResource(), 
context.dryRun());
         LOG.debug("Pull result: {}", result);
         return result;
     }
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
index fe0c2c266d..6f60b26493 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
@@ -56,6 +56,7 @@ import 
org.apache.syncope.core.provisioning.api.pushpull.SyncopePushExecutor;
 import 
org.apache.syncope.core.provisioning.api.pushpull.SyncopePushResultHandler;
 import org.apache.syncope.core.provisioning.api.pushpull.UserPushResultHandler;
 import org.apache.syncope.core.spring.implementation.ImplementationManager;
+import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.data.domain.PageRequest;
@@ -171,9 +172,9 @@ public class PushJobDelegate
                 Optional.ofNullable(task.getResource().getPushPolicy()).
                         map(PushPolicy::getConflictResolutionAction).
                         orElse(ConflictResolutionAction.IGNORE),
-                getPushActions(context.getDomain(), task.getActions()),
-                executor,
-                context.isDryRun());
+                getPushActions(context.domain(), task.getActions()),
+                AuthContextUtils.getUsername(),
+                context.dryRun());
     }
 
     @Override
@@ -227,7 +228,7 @@ public class PushJobDelegate
         }
 
         // ...then provisions for any types
-        ProvisionSorter provisionSorter = 
getProvisionSorter(context.getDomain(), task);
+        ProvisionSorter provisionSorter = getProvisionSorter(context.domain(), 
task);
 
         for (Provision provision : task.getResource().getProvisions().stream().
                 filter(provision -> provision.getMapping() != 
null).sorted(provisionSorter).
@@ -290,7 +291,7 @@ public class PushJobDelegate
 
         setStatus("Push done");
 
-        String result = createReport(profile.getResults(), task.getResource(), 
context.isDryRun());
+        String result = createReport(profile.getResults(), task.getResource(), 
context.dryRun());
         LOG.debug("Push result: {}", result);
         return result;
     }
diff --git 
a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskSchedulerTest.java
 
b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskSchedulerTest.java
index c637754d7c..cd7f057f79 100644
--- 
a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskSchedulerTest.java
+++ 
b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/job/SyncopeTaskSchedulerTest.java
@@ -79,7 +79,7 @@ public class SyncopeTaskSchedulerTest extends AbstractTest {
 
         scheduler.schedule(job, Instant.now().plusSeconds(5));
 
-        assertTrue(scheduler.getNextTrigger(AuthContextUtils.getDomain(), 
job.getContext().getJobName()).isPresent());
+        assertTrue(scheduler.getNextTrigger(AuthContextUtils.getDomain(), 
job.getContext().jobName()).isPresent());
 
         await().atMost(10, TimeUnit.SECONDS).pollInterval(1, 
TimeUnit.SECONDS).until(() -> VALUE.get() == 1);
     }
diff --git 
a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
 
b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
index 84be715471..3e6bd7b02b 100644
--- 
a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
+++ 
b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
@@ -81,19 +81,20 @@ public final class AuthContextUtils {
     public static Set<SyncopeGrantedAuthority> getAuthorities() {
         return 
Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).
                 map(authentication -> authentication.getAuthorities().stream().
-                filter(SyncopeGrantedAuthority.class::isInstance).
-                map(SyncopeGrantedAuthority.class::cast).
-                collect(Collectors.toSet())).
-            orElseGet(Set::of);
+                        filter(SyncopeGrantedAuthority.class::isInstance).
+                        map(SyncopeGrantedAuthority.class::cast).
+                        collect(Collectors.toSet())).
+                orElseGet(Set::of);
     }
 
     public static Map<String, Set<String>> getAuthorizations() {
         return 
Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).
                 map(authentication -> authentication.getAuthorities().stream().
-                filter(SyncopeGrantedAuthority.class::isInstance).
-                map(SyncopeGrantedAuthority.class::cast).
-                
collect(Collectors.toMap(SyncopeGrantedAuthority::getAuthority, 
SyncopeGrantedAuthority::getRealms))).
-            orElseGet(Map::of);
+                        filter(SyncopeGrantedAuthority.class::isInstance).
+                        map(SyncopeGrantedAuthority.class::cast).
+                        
collect(Collectors.toMap(SyncopeGrantedAuthority::getAuthority,
+                                SyncopeGrantedAuthority::getRealms))).
+                orElseGet(Map::of);
     }
 
     public static String getDomain() {
@@ -129,12 +130,9 @@ public final class AuthContextUtils {
     public static <T> T callAs(
             final String domain,
             final String username,
-            final Collection<String> entitlements,
+            final Collection<? extends GrantedAuthority> authorities,
             final Callable<T> callable) {
 
-        List<GrantedAuthority> authorities = entitlements.stream().
-                map(entitlement -> new SyncopeGrantedAuthority(entitlement, 
SyncopeConstants.ROOT_REALM)).
-                collect(Collectors.toList());
         UsernamePasswordAuthenticationToken asAuth = new 
UsernamePasswordAuthenticationToken(
                 new User(username, PLACEHOLDER_PWD, authorities), 
PLACEHOLDER_PWD, authorities);
         asAuth.setDetails(new SyncopeAuthenticationDetails(domain, 
getDelegatedBy().orElse(null)));
@@ -144,10 +142,13 @@ public final class AuthContextUtils {
 
     public static <T> T callAsAdmin(final String domain, final Callable<T> 
callable) {
         SecurityProperties properties = 
ApplicationContextProvider.getBeanFactory().getBean(SecurityProperties.class);
+        List<SyncopeGrantedAuthority> authorities = 
EntitlementsHolder.getInstance().getValues().stream().
+                map(entitlement -> new SyncopeGrantedAuthority(entitlement, 
SyncopeConstants.ROOT_REALM)).
+                toList();
         return callAs(
                 domain,
                 properties.getAdminUser(),
-                EntitlementsHolder.getInstance().getValues(),
+                authorities,
                 callable);
     }
 
diff --git 
a/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/JobEndpoint.java
 
b/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/JobEndpoint.java
index 9f1f44ec74..dd67aad896 100644
--- 
a/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/JobEndpoint.java
+++ 
b/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/JobEndpoint.java
@@ -59,9 +59,9 @@ public class JobEndpoint {
             Map<String, Object> job = new HashMap<>();
             jobs.put(k.job(), job);
 
-            job.put("executor", v.job().getContext().getExecutor());
-            job.put("dryRun", v.job().getContext().isDryRun());
-            job.put("context", v.job().getContext().getData());
+            job.put("executor", v.job().getContext().executor());
+            job.put("dryRun", v.job().getContext().dryRun());
+            job.put("context", v.job().getContext().data());
 
             v.instant().ifPresent(f -> job.put("delay (seconds)", 
f.getDelay(TimeUnit.SECONDS)));
 
diff --git 
a/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
 
b/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
index ea43e7d027..73b0ae4926 100644
--- 
a/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
+++ 
b/ext/elasticsearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/ElasticsearchReindex.java
@@ -270,7 +270,7 @@ public class ElasticsearchReindex extends 
AbstractSchedTaskJobDelegate<SchedTask
 
     @Override
     protected String doExecute(final JobExecutionContext context) throws 
JobExecutionException {
-        if (!context.isDryRun()) {
+        if (!context.dryRun()) {
             setStatus("Start rebuilding indexes");
 
             try {
diff --git 
a/ext/openfga/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenFGAReinit.java
 
b/ext/openfga/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenFGAReinit.java
index c8f890cc93..c528e8e410 100644
--- 
a/ext/openfga/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenFGAReinit.java
+++ 
b/ext/openfga/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenFGAReinit.java
@@ -74,7 +74,7 @@ public class OpenFGAReinit extends 
AbstractSchedTaskJobDelegate<SchedTask> {
 
     @Override
     protected String doExecute(final JobExecutionContext context) throws 
JobExecutionException {
-        if (!context.isDryRun()) {
+        if (!context.dryRun()) {
             setStatus("Start rebuilding OpenFGA authorization model and 
tuples");
 
             try {
diff --git 
a/ext/opensearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenSearchReindex.java
 
b/ext/opensearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenSearchReindex.java
index ea543f773b..6b6062ec16 100644
--- 
a/ext/opensearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenSearchReindex.java
+++ 
b/ext/opensearch/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/OpenSearchReindex.java
@@ -270,7 +270,7 @@ public class OpenSearchReindex extends 
AbstractSchedTaskJobDelegate<SchedTask> {
 
     @Override
     protected String doExecute(final JobExecutionContext context) throws 
JobExecutionException {
-        if (!context.isDryRun()) {
+        if (!context.dryRun()) {
             setStatus("Start rebuilding indexes");
 
             try {
diff --git 
a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SampleReportJobDelegate.java
 
b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SampleReportJobDelegate.java
index 84c1093310..063cb62040 100644
--- 
a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SampleReportJobDelegate.java
+++ 
b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/SampleReportJobDelegate.java
@@ -115,7 +115,7 @@ public class SampleReportJobDelegate extends 
AbstractReportJobDelegate {
             final OutputStream os,
             final JobExecutionContext context) throws JobExecutionException {
 
-        if (!context.isDryRun()) {
+        if (!context.dryRun()) {
             try {
                 switch (report.getMimeType()) {
                     case MediaType.APPLICATION_PDF_VALUE:
@@ -133,7 +133,7 @@ public class SampleReportJobDelegate extends 
AbstractReportJobDelegate {
             }
         }
 
-        return (context.isDryRun()
+        return (context.dryRun()
                 ? "DRY "
                 : "") + "RUNNING";
     }
diff --git 
a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSampleJobDelegate.java
 
b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSampleJobDelegate.java
index fe6dadf671..0ac8e4c295 100644
--- 
a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSampleJobDelegate.java
+++ 
b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestSampleJobDelegate.java
@@ -41,11 +41,11 @@ public class TestSampleJobDelegate extends 
AbstractSchedTaskJobDelegate<SchedTas
             }
         }
 
-        LOG.info("TestSampleJob {} running [SchedTask {}]", (context.isDryRun()
+        LOG.info("TestSampleJob {} running [SchedTask {}]", (context.dryRun()
                 ? "dry "
                 : ""), task.getKey());
 
-        return (context.isDryRun()
+        return (context.dryRun()
                 ? "DRY "
                 : "") + "RUNNING";
     }

Reply via email to