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 2020/03/30 15:46:26 UTC
[syncope] branch master updated (f2aebe0 -> ed22a4f)
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git.
from f2aebe0 http://www.apache.org/dist -> https://downloads.apache.org
new 592c886 [SYNCOPE-1465] Console support
new bede478 Upgrading checkstyle
new ed22a4f [SYNCOPE-1466] Added creationContext and lastChangeContext to metadata
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:
.../client/console/audit/AuditHistoryDetails.java | 8 +-
.../syncope/client/console/pages/Realms.java | 7 +-
.../console/tasks/ExecutionsDirectoryPanel.java | 3 +
.../console/wizards/any/AnnotatedBeanPanel.java | 37 +++--
.../console/wizards/any/AnnotatedBeanPanel.html | 28 +++-
.../wizards/any/AnnotatedBeanPanel.properties | 6 +-
.../any/AnnotatedBeanPanel_fr_CA.properties | 8 +-
.../wizards/any/AnnotatedBeanPanel_it.properties | 2 +
.../wizards/any/AnnotatedBeanPanel_ja.properties | 2 +
.../any/AnnotatedBeanPanel_pt_BR.properties | 2 +
.../wizards/any/AnnotatedBeanPanel_ru.properties | 10 +-
.../common/lib/jaxb/XmlEntityTOAdapter.java | 1 -
.../common/lib/to/AbstractAnnotatedBean.java | 153 ---------------------
.../org/apache/syncope/common/lib/to/AnyTO.java | 98 ++++++++++++-
.../syncope/core/logic/AbstractAnyLogic.java | 2 +
.../apache/syncope/core/logic/AnyObjectLogic.java | 18 ++-
.../org/apache/syncope/core/logic/GroupLogic.java | 20 +--
.../org/apache/syncope/core/logic/TaskLogic.java | 8 +-
.../org/apache/syncope/core/logic/UserLogic.java | 37 +++--
.../syncope/core/rest/cxf/AddETagFilter.java | 12 +-
.../persistence/api/entity/AnnotatedEntity.java | 40 ------
.../syncope/core/persistence/api/entity/Any.java | 27 +++-
.../api/entity/task/ProvisioningTask.java | 1 -
.../jpa/entity/AbstractAnnotatedEntity.java | 112 ---------------
.../core/persistence/jpa/entity/AbstractAny.java | 101 +++++++++++++-
.../persistence/jpa/entity/AbstractPlainAttr.java | 2 -
.../jpa/entity/AbstractSysInfoListener.java | 47 -------
.../jpa/entity/AnnotatedEntityListener.java | 32 -----
.../persistence/jpa/entity/PlainAttrListener.java | 35 -----
.../entity/EntityValidationListener.java | 4 +-
.../core/persistence/jpa/outer/UserTest.java | 24 ----
.../api/AnyObjectProvisioningManager.java | 9 +-
.../provisioning/api/GroupProvisioningManager.java | 7 +-
.../core/provisioning/api/ProvisioningManager.java | 20 +--
.../provisioning/api/UserProvisioningManager.java | 40 ++++--
.../api/pushpull/ProvisioningProfile.java | 10 ++
.../java/DefaultAnyObjectProvisioningManager.java | 76 ++++++----
.../java/DefaultGroupProvisioningManager.java | 78 +++++++----
.../java/DefaultUserProvisioningManager.java | 142 +++++++++++--------
.../java/data/AnyObjectDataBinderImpl.java | 12 +-
.../java/data/GroupDataBinderImpl.java | 5 +-
.../provisioning/java/data/UserDataBinderImpl.java | 23 ++--
.../java/job/AbstractSchedTaskJobDelegate.java | 14 +-
.../java/job/ExpiredAccessTokenCleanup.java | 3 +-
.../provisioning/java/job/ExpiredBatchCleanup.java | 2 +-
.../job/GroupMemberProvisionTaskJobDelegate.java | 20 +--
.../provisioning/java/job/SetUMembershipsJob.java | 13 +-
.../java/job/notification/NotificationJob.java | 8 +-
.../provisioning/java/job/report/ReportJob.java | 28 ++--
.../pushpull/AbstractProvisioningJobDelegate.java | 9 +-
.../java/pushpull/AbstractPullResultHandler.java | 4 +-
.../pushpull/AbstractSyncopeResultHandler.java | 5 +
.../DefaultAnyObjectPullResultHandler.java | 14 +-
.../DefaultAnyObjectPushResultHandler.java | 2 +-
.../pushpull/DefaultGroupPullResultHandler.java | 13 +-
.../pushpull/DefaultGroupPushResultHandler.java | 2 +-
.../pushpull/DefaultUserPullResultHandler.java | 23 +++-
.../pushpull/DefaultUserPushResultHandler.java | 3 +-
.../java/pushpull/LDAPMembershipPullActions.java | 5 +
.../java/pushpull/PullJobDelegate.java | 4 +-
.../java/pushpull/PushJobDelegate.java | 4 +-
.../UsernamePasswordAuthenticationProvider.java | 3 +-
.../workflow/api/AnyObjectWorkflowAdapter.java | 8 +-
.../core/workflow/api/GroupWorkflowAdapter.java | 8 +-
.../core/workflow/api/UserWorkflowAdapter.java | 38 +++--
.../java/AbstractAnyObjectWorkflowAdapter.java | 19 ++-
.../java/AbstractGroupWorkflowAdapter.java | 14 +-
.../workflow/java/AbstractUserWorkflowAdapter.java | 64 +++++----
.../workflow/java/AbstractWorkflowAdapter.java} | 23 ++--
.../java/DefaultAnyObjectWorkflowAdapter.java | 12 +-
.../workflow/java/DefaultGroupWorkflowAdapter.java | 10 +-
.../workflow/java/DefaultUserWorkflowAdapter.java | 31 +++--
.../camel/CamelAnyObjectProvisioningManager.java | 76 +++++++---
.../camel/CamelGroupProvisioningManager.java | 73 ++++++++--
.../camel/CamelUserProvisioningManager.java | 116 ++++++++++++----
.../camel/component/PropagateComponent.java | 25 +++-
.../camel/producer/CreateProducer.java | 14 +-
.../camel/producer/StatusProducer.java | 10 +-
.../src/main/resources/anyObjectRoutes.xml | 8 +-
.../src/main/resources/groupRoutes.xml | 10 +-
.../src/main/resources/userRoutes.xml | 37 +++--
.../elasticsearch/client/ElasticsearchUtils.java | 4 +-
.../java/job/ElasticsearchReindex.java | 2 +-
.../flowable/impl/FlowableUserWorkflowAdapter.java | 31 +++--
.../syncope/core/logic/oidc/OIDCUserManager.java | 8 +-
.../syncope/core/logic/saml2/SAML2UserManager.java | 8 +-
.../fit/core/reference/TestSampleJobDelegate.java | 3 +-
.../apache/syncope/fit/core/AnyObjectITCase.java | 2 +
.../apache/syncope/fit/core/PullTaskITCase.java | 18 ++-
.../org/apache/syncope/fit/core/SearchITCase.java | 20 ++-
pom.xml | 2 +-
91 files changed, 1246 insertions(+), 936 deletions(-)
delete mode 100644 common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java
delete mode 100644 core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnnotatedEntity.java
delete mode 100644 core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
delete mode 100644 core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSysInfoListener.java
delete mode 100644 core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
delete mode 100644 core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PlainAttrListener.java
copy core/{persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainAttrDAO.java => workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractWorkflowAdapter.java} (62%)
[syncope] 01/03: [SYNCOPE-1465] Console support
Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 592c886a3ea54e82782c8c5847a011b88e144ae2
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Mar 30 17:23:56 2020 +0200
[SYNCOPE-1465] Console support
---
.../apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
index d22e34a..dc435f3 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/tasks/ExecutionsDirectoryPanel.java
@@ -104,6 +104,9 @@ public abstract class ExecutionsDirectoryPanel
columns.add(new DatePropertyColumn<>(new StringResourceModel("end", this), "end", "end"));
columns.add(new PropertyColumn<>(new StringResourceModel("status", this), "status", "status"));
+
+ columns.add(new PropertyColumn<>(new StringResourceModel("executor", this), "executor", "executor"));
+
return columns;
}
[syncope] 02/03: Upgrading checkstyle
Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit bede4787b34f1b33965c6a41b0d67d9157685a29
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Mar 30 17:24:49 2020 +0200
Upgrading checkstyle
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 1e2b71a..25f0d1d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2264,7 +2264,7 @@ under the License.
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
- <version>8.30</version>
+ <version>8.31</version>
</dependency>
</dependencies>
<configuration>
[syncope] 03/03: [SYNCOPE-1466] Added creationContext and
lastChangeContext to metadata
Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit ed22a4f65f91f8b479dd7b409fb863c03acb37bc
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Mon Mar 30 17:25:25 2020 +0200
[SYNCOPE-1466] Added creationContext and lastChangeContext to metadata
---
.../client/console/audit/AuditHistoryDetails.java | 8 +-
.../syncope/client/console/pages/Realms.java | 7 +-
.../console/wizards/any/AnnotatedBeanPanel.java | 37 +++--
.../console/wizards/any/AnnotatedBeanPanel.html | 28 +++-
.../wizards/any/AnnotatedBeanPanel.properties | 6 +-
.../any/AnnotatedBeanPanel_fr_CA.properties | 8 +-
.../wizards/any/AnnotatedBeanPanel_it.properties | 2 +
.../wizards/any/AnnotatedBeanPanel_ja.properties | 2 +
.../any/AnnotatedBeanPanel_pt_BR.properties | 2 +
.../wizards/any/AnnotatedBeanPanel_ru.properties | 10 +-
.../common/lib/jaxb/XmlEntityTOAdapter.java | 1 -
.../common/lib/to/AbstractAnnotatedBean.java | 153 ---------------------
.../org/apache/syncope/common/lib/to/AnyTO.java | 98 ++++++++++++-
.../syncope/core/logic/AbstractAnyLogic.java | 2 +
.../apache/syncope/core/logic/AnyObjectLogic.java | 18 ++-
.../org/apache/syncope/core/logic/GroupLogic.java | 20 +--
.../org/apache/syncope/core/logic/TaskLogic.java | 8 +-
.../org/apache/syncope/core/logic/UserLogic.java | 37 +++--
.../syncope/core/rest/cxf/AddETagFilter.java | 12 +-
.../syncope/core/persistence/api/entity/Any.java | 27 +++-
.../api/entity/task/ProvisioningTask.java | 1 -
.../jpa/entity/AbstractAnnotatedEntity.java | 112 ---------------
.../core/persistence/jpa/entity/AbstractAny.java | 101 +++++++++++++-
.../persistence/jpa/entity/AbstractPlainAttr.java | 2 -
.../jpa/entity/AbstractSysInfoListener.java | 47 -------
.../jpa/entity/AnnotatedEntityListener.java | 32 -----
.../persistence/jpa/entity/PlainAttrListener.java | 35 -----
.../entity/EntityValidationListener.java | 4 +-
.../core/persistence/jpa/outer/UserTest.java | 24 ----
.../api/AnyObjectProvisioningManager.java | 9 +-
.../provisioning/api/GroupProvisioningManager.java | 7 +-
.../core/provisioning/api/ProvisioningManager.java | 20 +--
.../provisioning/api/UserProvisioningManager.java | 40 ++++--
.../api/pushpull/ProvisioningProfile.java | 10 ++
.../java/DefaultAnyObjectProvisioningManager.java | 76 ++++++----
.../java/DefaultGroupProvisioningManager.java | 78 +++++++----
.../java/DefaultUserProvisioningManager.java | 142 +++++++++++--------
.../java/data/AnyObjectDataBinderImpl.java | 12 +-
.../java/data/GroupDataBinderImpl.java | 5 +-
.../provisioning/java/data/UserDataBinderImpl.java | 23 ++--
.../java/job/AbstractSchedTaskJobDelegate.java | 14 +-
.../java/job/ExpiredAccessTokenCleanup.java | 3 +-
.../provisioning/java/job/ExpiredBatchCleanup.java | 2 +-
.../job/GroupMemberProvisionTaskJobDelegate.java | 20 +--
.../provisioning/java/job/SetUMembershipsJob.java | 13 +-
.../java/job/notification/NotificationJob.java | 8 +-
.../provisioning/java/job/report/ReportJob.java | 28 ++--
.../pushpull/AbstractProvisioningJobDelegate.java | 9 +-
.../java/pushpull/AbstractPullResultHandler.java | 4 +-
.../pushpull/AbstractSyncopeResultHandler.java | 5 +
.../DefaultAnyObjectPullResultHandler.java | 14 +-
.../DefaultAnyObjectPushResultHandler.java | 2 +-
.../pushpull/DefaultGroupPullResultHandler.java | 13 +-
.../pushpull/DefaultGroupPushResultHandler.java | 2 +-
.../pushpull/DefaultUserPullResultHandler.java | 23 +++-
.../pushpull/DefaultUserPushResultHandler.java | 3 +-
.../java/pushpull/LDAPMembershipPullActions.java | 5 +
.../java/pushpull/PullJobDelegate.java | 4 +-
.../java/pushpull/PushJobDelegate.java | 4 +-
.../UsernamePasswordAuthenticationProvider.java | 3 +-
.../workflow/api/AnyObjectWorkflowAdapter.java | 8 +-
.../core/workflow/api/GroupWorkflowAdapter.java | 8 +-
.../core/workflow/api/UserWorkflowAdapter.java | 38 +++--
.../java/AbstractAnyObjectWorkflowAdapter.java | 19 ++-
.../java/AbstractGroupWorkflowAdapter.java | 14 +-
.../workflow/java/AbstractUserWorkflowAdapter.java | 64 +++++----
.../workflow/java/AbstractWorkflowAdapter.java} | 29 ++--
.../java/DefaultAnyObjectWorkflowAdapter.java | 12 +-
.../workflow/java/DefaultGroupWorkflowAdapter.java | 10 +-
.../workflow/java/DefaultUserWorkflowAdapter.java | 31 +++--
.../camel/CamelAnyObjectProvisioningManager.java | 76 +++++++---
.../camel/CamelGroupProvisioningManager.java | 73 ++++++++--
.../camel/CamelUserProvisioningManager.java | 116 ++++++++++++----
.../camel/component/PropagateComponent.java | 25 +++-
.../camel/producer/CreateProducer.java | 14 +-
.../camel/producer/StatusProducer.java | 10 +-
.../src/main/resources/anyObjectRoutes.xml | 8 +-
.../src/main/resources/groupRoutes.xml | 10 +-
.../src/main/resources/userRoutes.xml | 37 +++--
.../elasticsearch/client/ElasticsearchUtils.java | 4 +-
.../java/job/ElasticsearchReindex.java | 2 +-
.../flowable/impl/FlowableUserWorkflowAdapter.java | 31 +++--
.../syncope/core/logic/oidc/OIDCUserManager.java | 8 +-
.../syncope/core/logic/saml2/SAML2UserManager.java | 8 +-
.../fit/core/reference/TestSampleJobDelegate.java | 3 +-
.../apache/syncope/fit/core/AnyObjectITCase.java | 2 +
.../apache/syncope/fit/core/PullTaskITCase.java | 18 ++-
.../org/apache/syncope/fit/core/SearchITCase.java | 20 ++-
88 files changed, 1242 insertions(+), 901 deletions(-)
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
index 4b58d90..b5fad0a 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/audit/AuditHistoryDetails.java
@@ -26,7 +26,7 @@ import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.panels.MultilevelPanel;
import org.apache.syncope.client.console.wicket.markup.html.form.JsonDiffPanel;
import org.apache.syncope.common.lib.log.AuditEntry;
-import org.apache.syncope.common.lib.to.AbstractAnnotatedBean;
+import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.wicket.PageReference;
@@ -57,9 +57,9 @@ public abstract class AuditHistoryDetails<T extends Serializable> extends Multil
super();
AuditEntry current = new AuditEntry();
- if (currentEntity instanceof AbstractAnnotatedBean) {
- current.setWho(((AbstractAnnotatedBean) currentEntity).getCreator());
- current.setDate(((AbstractAnnotatedBean) currentEntity).getCreationDate());
+ if (currentEntity instanceof AnyTO) {
+ current.setWho(((AnyTO) currentEntity).getCreator());
+ current.setDate(((AnyTO) currentEntity).getCreationDate());
} else {
current.setWho(SyncopeConsoleSession.get().getSelfTO().getUsername());
current.setDate(new Date());
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 034b9a2..8d3e616 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -133,12 +133,7 @@ public class Realms extends BasePage {
}
});
- try {
- updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get("selectedIndex").toInteger());
- } catch (Exception e) {
- LOG.debug("Unexpected error", e);
- updateRealmContent(realmChoicePanel.getCurrentRealm(), 0);
- }
+ updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get("selectedIndex").toInt(0));
}
@Override
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.java
index 66aa7b1..c9a232a 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.java
@@ -18,8 +18,8 @@
*/
package org.apache.syncope.client.console.wizards.any;
+import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.common.lib.to.AbstractAnnotatedBean;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
@@ -29,38 +29,51 @@ public class AnnotatedBeanPanel extends Panel {
private static final long serialVersionUID = 4228064224811390809L;
- public <T extends AnyTO> AnnotatedBeanPanel(
- final String id, final AbstractAnnotatedBean sysInfoTO) {
-
+ public <T extends AnyTO> AnnotatedBeanPanel(final String id, final T anyTO) {
super(id);
// ------------------------
// Creation date
// ------------------------
- add(new Label("creationDate", new Model<>(sysInfoTO.getCreationDate() != null
- ? SyncopeConsoleSession.get().getDateFormat().format(sysInfoTO.getCreationDate()) : "")));
+ add(new Label("creationDate", new Model<>(anyTO.getCreationDate() == null
+ ? StringUtils.EMPTY
+ : SyncopeConsoleSession.get().getDateFormat().format(anyTO.getCreationDate()))));
// ------------------------
// ------------------------
// Last change date
// ------------------------
- add(new Label("lastChangeDate", new Model<>(sysInfoTO.getLastChangeDate() != null
- ? SyncopeConsoleSession.get().getDateFormat().format(sysInfoTO.getLastChangeDate()) : "")));
+ add(new Label("lastChangeDate", new Model<>(anyTO.getLastChangeDate() == null
+ ? StringUtils.EMPTY
+ : SyncopeConsoleSession.get().getDateFormat().format(anyTO.getLastChangeDate()))));
// ------------------------
// ------------------------
// Creator
// ------------------------
- add(new Label("creator", new Model<>(sysInfoTO.getCreator() != null
- ? sysInfoTO.getCreator() : "")));
+ add(new Label("creator", new Model<>(anyTO.getCreator() == null
+ ? StringUtils.EMPTY : anyTO.getCreator())));
// ------------------------
// ------------------------
// Last modifier
// ------------------------
- add(new Label("lastModifier", new Model<>(sysInfoTO.getLastModifier() != null
- ? sysInfoTO.getLastModifier() : "")));
+ add(new Label("lastModifier", new Model<>(anyTO.getLastModifier() != null
+ ? StringUtils.EMPTY : anyTO.getLastModifier())));
+ // ------------------------
+
+ // ------------------------
+ // Creator
+ // ------------------------
+ add(new Label("creationContext", new Model<>(anyTO.getCreationContext() == null
+ ? StringUtils.EMPTY : anyTO.getCreationContext())));
// ------------------------
+ // ------------------------
+ // Last modifier
+ // ------------------------
+ add(new Label("lastChangeContext", new Model<>(anyTO.getLastChangeContext() != null
+ ? StringUtils.EMPTY : anyTO.getLastChangeContext())));
+ // ------------------------
}
}
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.html
index c2ae2b8..39806e5 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.html
@@ -24,7 +24,7 @@ under the License.
<wicket:message key="creationDate"/>:
</div>
<div>
- <span wicket:id="creationDate" />
+ <span wicket:id="creationDate"/>
</div>
</div>
@@ -33,7 +33,7 @@ under the License.
<wicket:message key="lastChangeDate"/>:
</div>
<div>
- <span wicket:id="lastChangeDate" />
+ <span wicket:id="lastChangeDate"/>
</div>
</div>
@@ -42,7 +42,7 @@ under the License.
<wicket:message key="creator"/>:
</div>
<div>
- <span wicket:id="creator" />
+ <span wicket:id="creator"/>
</div>
</div>
@@ -51,11 +51,29 @@ under the License.
<wicket:message key="lastModifier"/>:
</div>
<div>
- <span wicket:id="lastModifier" />
+ <span wicket:id="lastModifier"/>
</div>
</div>
- <wicket:child />
+ <div class="infoleft">
+ <div class="infolabel">
+ <wicket:message key="creationContext"/>:
+ </div>
+ <div>
+ <span wicket:id="creationContext"/>
+ </div>
+ </div>
+
+ <div class="inforight">
+ <div class="infolabel">
+ <wicket:message key="lastChangeContext"/>:
+ </div>
+ <div>
+ <span wicket:id="lastChangeContext"/>
+ </div>
+ </div>
+
+ <wicket:child/>
</div>
</wicket:panel>
</html>
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.properties
index 54a0fcf..b8c984b 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel.properties
@@ -16,5 +16,7 @@
# under the License.
creationDate=Creation Date
creator=Creator
-lastChangeDate=Last change date
-lastModifier=Last modifier
+lastChangeDate=Last Change Date
+lastModifier=Last Modifier
+creationContext=Creation Context
+lastChangeContext=Last Change Context
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_fr_CA.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_fr_CA.properties
index dd4d982..70ae07b 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_fr_CA.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_fr_CA.properties
@@ -14,7 +14,9 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-creationDate=Date de cr�ation
-creator=Cr�ateur
-lastChangeDate=Date de la derni�re modification
+creationDate=Date de cr\u00e9ation
+creator=Cr\u00e9ateur
+lastChangeDate=Date de la derni\u00e8re modification
lastModifier=Dernier modificateur
+creationContext=Creation Context
+lastChangeContext=Last Change Context
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_it.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_it.properties
index 7fae3ab..5dcfa2e 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_it.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_it.properties
@@ -18,3 +18,5 @@ creationDate=Data Di Creazione
creator=Creatore
lastChangeDate=Data Di Ultima Modifica
lastModifier=Ultimo Modificatore
+creationContext=Contesto Di Crezione
+lastChangeContext=Contesto Di Ultima Modifica
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ja.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ja.properties
index 43dab85..934d701 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ja.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ja.properties
@@ -18,3 +18,5 @@ creationDate=\u4f5c\u6210\u65e5
creator=\u4f5c\u6210\u8005
lastChangeDate=\u6700\u7d42\u66f4\u65b0\u65e5
lastModifier=\u6700\u7d42\u66f4\u65b0\u8005
+creationContext=Creation Context
+lastChangeContext=Last Change Context
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_pt_BR.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_pt_BR.properties
index 689436f..ee4221a 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_pt_BR.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_pt_BR.properties
@@ -18,3 +18,5 @@ creationDate=Data de Cria\u00e7\u00e3o
creator=Criador
lastChangeDate=Data De \u00daltima Altera\u00e7\u00e3o
lastModifier=\u00daltima Modificador
+creationContext=Creation Context
+lastChangeContext=Last Change Context
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ru.properties b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ru.properties
index f369610..6284ae4 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ru.properties
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/wizards/any/AnnotatedBeanPanel_ru.properties
@@ -15,11 +15,13 @@
# specific language governing permissions and limitations
# under the License.
#
-# creationDate=Дата создания
+# creationDate=\u00d0\u0094\u00d0\u00b0\u00d1\u0082\u00d0\u00b0 \u00d1\u0081\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
creationDate=\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f
-# creator=Создал
+# creator=\u00d0\u00a1\u00d0\u00be\u00d0\u00b7\u00d0\u00b4\u00d0\u00b0\u00d0\u00bb
creator=\u0421\u043e\u0437\u0434\u0430\u043b
-# lastChangeDate=Дата изменения
+# lastChangeDate=\u00d0\u0094\u00d0\u00b0\u00d1\u0082\u00d0\u00b0 \u00d0\u00b8\u00d0\u00b7\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d1\u008f
lastChangeDate=\u0414\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f
-# lastModifier=Изменил
+# lastModifier=\u00d0\u0098\u00d0\u00b7\u00d0\u00bc\u00d0\u00b5\u00d0\u00bd\u00d0\u00b8\u00d0\u00bb
lastModifier=\u0418\u0437\u043c\u0435\u043d\u0438\u043b
+creationContext=Creation Context
+lastChangeContext=Last Change Context
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java
index 2374891..99400fd 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlEntityTOAdapter.java
@@ -62,5 +62,4 @@ public class XmlEntityTOAdapter<E extends EntityTO> extends XmlAdapter<EntityTOT
return result;
}
-
}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java
deleted file mode 100644
index 538405d..0000000
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AbstractAnnotatedBean.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.to;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import java.util.Date;
-import java.util.Optional;
-
-import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.syncope.common.lib.BaseBean;
-
-/**
- * Abstract wrapper for common system information.
- */
-@XmlType
-public abstract class AbstractAnnotatedBean extends BaseBean implements EntityTO {
-
- private static final long serialVersionUID = -930797879027642457L;
-
- /**
- * Username of the user that has created this profile.
- * <p>
- * Cannot be used a reference to an existing user for two main reasons: the creator can be the user {@code admin};
- * the creator could have been removed.
- */
- private String creator;
-
- /**
- * Creation date.
- */
- private Date creationDate;
-
- /**
- * Username of the user that has performed the last modification to this profile.
- * <p>
- * This field cannot be null: at creation time it have to be initialized with the creator username.
- * <p>
- * The modifier can be the user itself whether the last performed change has been a self-modification.
- * <p>
- * Cannot be used a reference to an existing user for two main reasons: the modifier can be the user {@code admin};
- * the modifier could have been removed.
- */
- private String lastModifier;
-
- /**
- * Last change date.
- * <p>
- * This field cannot be null: at creation time it has to be initialized with {@code creationDate} field value.
- */
- private Date lastChangeDate;
-
- public String getCreator() {
- return creator;
- }
-
- public void setCreator(final String creator) {
- this.creator = creator;
- }
-
- public Date getCreationDate() {
- if (creationDate != null) {
- return new Date(creationDate.getTime());
- }
- return null;
- }
-
- public void setCreationDate(final Date creationDate) {
- if (creationDate != null) {
- this.creationDate = new Date(creationDate.getTime());
- } else {
- this.creationDate = null;
- }
- }
-
- public String getLastModifier() {
- return lastModifier;
- }
-
- public void setLastModifier(final String lastModifier) {
- this.lastModifier = lastModifier;
- }
-
- public Date getLastChangeDate() {
- if (lastChangeDate != null) {
- return new Date(lastChangeDate.getTime());
- }
- return null;
- }
-
- public void setLastChangeDate(final Date lastChangeDate) {
- if (lastChangeDate != null) {
- this.lastChangeDate = new Date(lastChangeDate.getTime());
- } else {
- this.lastChangeDate = null;
- }
- }
-
- @JsonIgnore
- public String getETagValue() {
- Date etagDate = getLastChangeDate() == null
- ? getCreationDate() : getLastChangeDate();
- return Optional.ofNullable(etagDate).map(date -> String.valueOf(date.getTime())).orElse(StringUtils.EMPTY);
- }
-
- @Override
- public int hashCode() {
- return new HashCodeBuilder().
- append(creator).
- append(creationDate).
- append(lastModifier).
- append(lastChangeDate).
- build();
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- final AbstractAnnotatedBean other = (AbstractAnnotatedBean) obj;
- return new EqualsBuilder().
- append(creator, other.creator).
- append(creationDate, other.creationDate).
- append(lastModifier, other.lastModifier).
- append(lastChangeDate, other.lastChangeDate).
- build();
- }
-}
diff --git a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
index 662c601..5eef16c 100644
--- a/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
+++ b/common/idrepo/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
@@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
@@ -34,8 +35,10 @@ import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.syncope.common.lib.BaseBean;
import org.apache.syncope.common.lib.RealmMember;
@XmlType
@@ -43,7 +46,7 @@ import org.apache.syncope.common.lib.RealmMember;
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@class")
@JsonPropertyOrder(value = { "@class", "key", "type", "realm", "username", "name" })
@Schema(subTypes = { UserTO.class, GroupTO.class, AnyObjectTO.class }, discriminatorProperty = "@class")
-public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, RealmMember {
+public abstract class AnyTO extends BaseBean implements EntityTO, RealmMember {
private static final long serialVersionUID = -754311920679872084L;
@@ -51,6 +54,30 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, R
@JsonProperty("@class")
private String discriminator;
+ /**
+ * Username of the user that has created the related instance.
+ */
+ private String creator;
+
+ private Date creationDate;
+
+ /**
+ * Context information about create.
+ */
+ private String creationContext;
+
+ /**
+ * Username of the user that has performed the last modification to the related instance.
+ */
+ private String lastModifier;
+
+ private Date lastChangeDate;
+
+ /**
+ * Context information about last change.
+ */
+ private String lastChangeContext;
+
private String key;
private String type;
@@ -78,6 +105,61 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, R
// do nothing
}
+ public String getCreator() {
+ return creator;
+ }
+
+ public void setCreator(final String creator) {
+ this.creator = creator;
+ }
+
+ public Date getCreationDate() {
+ return Optional.ofNullable(creationDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ public void setCreationDate(final Date creationDate) {
+ this.creationDate = Optional.ofNullable(creationDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ public String getCreationContext() {
+ return creationContext;
+ }
+
+ public void setCreationContext(final String creationContext) {
+ this.creationContext = creationContext;
+ }
+
+ public String getLastModifier() {
+ return lastModifier;
+ }
+
+ public void setLastModifier(final String lastModifier) {
+ this.lastModifier = lastModifier;
+ }
+
+ public Date getLastChangeDate() {
+ return Optional.ofNullable(lastChangeDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ public void setLastChangeDate(final Date lastChangeDate) {
+ this.lastChangeDate = Optional.ofNullable(lastChangeDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ public String getLastChangeContext() {
+ return lastChangeContext;
+ }
+
+ public void setLastChangeContext(final String lastChangeContext) {
+ this.lastChangeContext = lastChangeContext;
+ }
+
+ @JsonIgnore
+ public String getETagValue() {
+ Date etagDate = getLastChangeDate() == null
+ ? getCreationDate() : getLastChangeDate();
+ return Optional.ofNullable(etagDate).map(date -> String.valueOf(date.getTime())).orElse(StringUtils.EMPTY);
+ }
+
@Override
public String getKey() {
return key;
@@ -182,7 +264,12 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, R
@Override
public int hashCode() {
return new HashCodeBuilder().
- appendSuper(super.hashCode()).
+ append(creator).
+ append(creationDate).
+ append(creationContext).
+ append(lastModifier).
+ append(lastChangeDate).
+ append(lastChangeContext).
append(key).
append(type).
append(realm).
@@ -209,7 +296,12 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, R
}
final AnyTO other = (AnyTO) obj;
return new EqualsBuilder().
- appendSuper(super.equals(obj)).
+ append(creator, other.creator).
+ append(creationDate, other.creationDate).
+ append(creationContext, other.creationContext).
+ append(lastModifier, other.lastModifier).
+ append(lastChangeDate, other.lastChangeDate).
+ append(lastChangeContext, other.lastChangeContext).
append(key, other.key).
append(type, other.type).
append(realm, other.realm).
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
index 3b045ff..5db142c 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
@@ -54,6 +54,8 @@ import org.springframework.beans.factory.annotation.Autowired;
public abstract class AbstractAnyLogic<TO extends AnyTO, C extends AnyCR, U extends AnyUR>
extends AbstractResourceAssociator<TO> {
+ protected static final String REST_CONTEXT = "REST";
+
@Autowired
protected UserDAO userDAO;
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
index d0ac105..ce1dd37 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
@@ -116,7 +116,8 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
before.getLeft().getRealm());
securityChecks(effectiveRealms, before.getLeft().getRealm(), null);
- Pair<String, List<PropagationStatus>> created = provisioningManager.create(before.getLeft(), nullPriorityAsync);
+ Pair<String, List<PropagationStatus>> created = provisioningManager.create(
+ before.getLeft(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
return afterCreate(binder.getAnyObjectTO(created.getKey()), created.getRight(), before.getRight());
}
@@ -139,7 +140,7 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
boolean authDynRealms = securityChecks(effectiveRealms, realm, before.getLeft().getKey());
Pair<AnyObjectUR, List<PropagationStatus>> updated =
- provisioningManager.update(updateReq, nullPriorityAsync);
+ provisioningManager.update(updateReq, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
return afterUpdate(
binder.getAnyObjectTO(updated.getLeft().getKey()),
@@ -159,7 +160,8 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
before.getLeft().getRealm());
securityChecks(effectiveRealms, before.getLeft().getRealm(), before.getLeft().getKey());
- List<PropagationStatus> statuses = provisioningManager.delete(before.getLeft().getKey(), nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.delete(
+ before.getLeft().getKey(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
AnyObjectTO anyObjectTO = new AnyObjectTO();
anyObjectTO.setKey(before.getLeft().getKey());
@@ -182,7 +184,7 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
-> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
collect(Collectors.toList()));
- return binder.getAnyObjectTO(provisioningManager.unlink(req));
+ return binder.getAnyObjectTO(provisioningManager.unlink(req, AuthContextUtils.getUsername(), REST_CONTEXT));
}
@Override
@@ -200,7 +202,7 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
-> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
collect(Collectors.toList()));
- return binder.getAnyObjectTO(provisioningManager.link(req));
+ return binder.getAnyObjectTO(provisioningManager.link(req, AuthContextUtils.getUsername(), REST_CONTEXT));
}
@Override
@@ -258,7 +260,8 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
anyObjectTO.getRealm());
securityChecks(effectiveRealms, anyObjectTO.getRealm(), anyObjectTO.getKey());
- List<PropagationStatus> statuses = provisioningManager.deprovision(key, resources, nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.deprovision(
+ key, resources, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
ProvisioningResult<AnyObjectTO> result = new ProvisioningResult<>();
result.setEntity(binder.getAnyObjectTO(key));
@@ -281,7 +284,8 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectCR, A
anyObjectTO.getRealm());
securityChecks(effectiveRealms, anyObjectTO.getRealm(), anyObjectTO.getKey());
- List<PropagationStatus> statuses = provisioningManager.provision(key, resources, nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.provision(
+ key, resources, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
ProvisioningResult<AnyObjectTO> result = new ProvisioningResult<>();
result.setEntity(binder.getAnyObjectTO(key));
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 daf795b..231b074 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
@@ -186,8 +186,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
before.getLeft().getRealm());
securityChecks(effectiveRealms, before.getLeft().getRealm(), null);
- Pair<String, List<PropagationStatus>> created =
- provisioningManager.create(before.getLeft(), nullPriorityAsync);
+ Pair<String, List<PropagationStatus>> created = provisioningManager.create(
+ before.getLeft(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
return afterCreate(binder.getGroupTO(created.getKey()), created.getRight(), before.getRight());
}
@@ -208,7 +208,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
realm);
boolean authDynRealms = securityChecks(effectiveRealms, realm, before.getLeft().getKey());
- Pair<GroupUR, List<PropagationStatus>> updated = provisioningManager.update(req, nullPriorityAsync);
+ Pair<GroupUR, List<PropagationStatus>> updated =
+ provisioningManager.update(req, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
return afterUpdate(
binder.getGroupTO(updated.getLeft().getKey()),
@@ -237,7 +238,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
throw sce;
}
- List<PropagationStatus> statuses = provisioningManager.delete(before.getLeft().getKey(), nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.delete(
+ before.getLeft().getKey(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
GroupTO groupTO = new GroupTO();
groupTO.setKey(before.getLeft().getKey());
@@ -263,7 +265,7 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
req.setUDynMembershipCond(group.getUDynMembershipCond());
req.getADynMembershipConds().putAll(group.getADynMembershipConds());
- return binder.getGroupTO(provisioningManager.unlink(req));
+ return binder.getGroupTO(provisioningManager.unlink(req, AuthContextUtils.getUsername(), REST_CONTEXT));
}
@PreAuthorize("hasRole('" + IdRepoEntitlement.GROUP_UPDATE + "')")
@@ -284,7 +286,7 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
req.getADynMembershipConds().putAll(group.getADynMembershipConds());
req.setUDynMembershipCond(group.getUDynMembershipCond());
- return binder.getGroupTO(provisioningManager.link(req));
+ return binder.getGroupTO(provisioningManager.link(req, AuthContextUtils.getUsername(), REST_CONTEXT));
}
@PreAuthorize("hasRole('" + IdRepoEntitlement.GROUP_UPDATE + "')")
@@ -349,7 +351,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
group.getRealm());
securityChecks(effectiveRealms, group.getRealm(), group.getKey());
- List<PropagationStatus> statuses = provisioningManager.deprovision(key, resources, nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.deprovision(
+ key, resources, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
ProvisioningResult<GroupTO> result = new ProvisioningResult<>();
result.setEntity(binder.getGroupTO(key));
@@ -373,7 +376,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupCR, GroupUR> {
group.getRealm());
securityChecks(effectiveRealms, group.getRealm(), group.getKey());
- List<PropagationStatus> statuses = provisioningManager.provision(key, resources, nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.provision(
+ key, resources, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
ProvisioningResult<GroupTO> result = new ProvisioningResult<>();
result.setEntity(binder.getGroupTO(key));
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
index 006a6f5..57dd2bc 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
@@ -272,15 +272,13 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
Map<String, Object> jobDataMap = jobManager.register(
(SchedTask) task,
startAt,
- confParamOps.get(AuthContextUtils.getDomain(),
- "tasks.interruptMaxRetries", 1L, Long.class), executor);
+ confParamOps.get(AuthContextUtils.getDomain(), "tasks.interruptMaxRetries", 1L, Long.class),
+ executor);
jobDataMap.put(TaskJob.DRY_RUN_JOBDETAIL_KEY, dryRun);
if (startAt == null) {
- scheduler.getScheduler().triggerJob(
- JobNamer.getJobKey(task),
- new JobDataMap(jobDataMap));
+ scheduler.getScheduler().triggerJob(JobNamer.getJobKey(task), new JobDataMap(jobDataMap));
}
} catch (Exception e) {
LOG.error("While executing task {}", task, e);
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
index 270c438..ba7cb92 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
@@ -153,7 +153,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
securityChecks(effectiveRealms, before.getLeft().getRealm(), null);
}
- Pair<String, List<PropagationStatus>> created = provisioningManager.create(before.getLeft(), nullPriorityAsync);
+ Pair<String, List<PropagationStatus>> created = provisioningManager.create(
+ before.getLeft(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
return afterCreate(
binder.returnUserTO(binder.getUserTO(created.getKey())), created.getRight(), before.getRight());
@@ -206,8 +207,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
securityChecks(effectiveRealms, before.getLeft().getRealm().getValue(), before.getLeft().getKey());
}
- Pair<UserUR, List<PropagationStatus>> updated =
- provisioningManager.update(before.getLeft(), nullPriorityAsync);
+ Pair<UserUR, List<PropagationStatus>> updated = provisioningManager.update(
+ before.getLeft(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
return afterUpdate(
binder.returnUserTO(binder.getUserTO(updated.getLeft().getKey())),
@@ -224,16 +225,19 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
switch (statusR.getType()) {
case SUSPEND:
- updated = provisioningManager.suspend(statusR, nullPriorityAsync);
+ updated = provisioningManager.suspend(
+ statusR, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
break;
case REACTIVATE:
- updated = provisioningManager.reactivate(statusR, nullPriorityAsync);
+ updated = provisioningManager.reactivate(
+ statusR, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
break;
case ACTIVATE:
default:
- updated = provisioningManager.activate(statusR, nullPriorityAsync);
+ updated = provisioningManager.activate(
+ statusR, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
break;
}
@@ -302,7 +306,7 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
throw SyncopeClientException.build(ClientExceptionType.InvalidSecurityAnswer);
}
- provisioningManager.requestPasswordReset(user.getKey());
+ provisioningManager.requestPasswordReset(user.getKey(), AuthContextUtils.getUsername(), REST_CONTEXT);
}
@PreAuthorize("isAnonymous() or hasRole('" + IdRepoEntitlement.ANONYMOUS + "')")
@@ -312,7 +316,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
if (user == null) {
throw new NotFoundException("User with token " + token);
}
- provisioningManager.confirmPasswordReset(user.getKey(), token, password);
+ provisioningManager.confirmPasswordReset(
+ user.getKey(), token, password, AuthContextUtils.getUsername(), REST_CONTEXT);
}
@PreAuthorize("isAuthenticated() "
@@ -350,7 +355,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
throw sce;
}
- List<PropagationStatus> statuses = provisioningManager.delete(before.getLeft().getKey(), nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.delete(
+ before.getLeft().getKey(), nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
UserTO deletedTO;
if (userDAO.find(before.getLeft().getKey()) == null) {
@@ -379,7 +385,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
-> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
collect(Collectors.toList()));
- return binder.returnUserTO(binder.getUserTO(provisioningManager.unlink(req)));
+ return binder.returnUserTO(binder.getUserTO(
+ provisioningManager.unlink(req, AuthContextUtils.getUsername(), REST_CONTEXT)));
}
@PreAuthorize("hasRole('" + IdRepoEntitlement.USER_UPDATE + "')")
@@ -398,7 +405,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
-> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
collect(Collectors.toList()));
- return binder.returnUserTO(binder.getUserTO(provisioningManager.link(req)));
+ return binder.returnUserTO(binder.getUserTO(
+ provisioningManager.link(req, AuthContextUtils.getUsername(), REST_CONTEXT)));
}
@PreAuthorize("hasRole('" + IdRepoEntitlement.USER_UPDATE + "')")
@@ -464,7 +472,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
user.getRealm());
securityChecks(effectiveRealms, user.getRealm(), user.getKey());
- List<PropagationStatus> statuses = provisioningManager.deprovision(key, resources, nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.deprovision(
+ key, resources, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
ProvisioningResult<UserTO> result = new ProvisioningResult<>();
result.setEntity(binder.returnUserTO(binder.getUserTO(key)));
@@ -488,8 +497,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserCR, UserUR> {
user.getRealm());
securityChecks(effectiveRealms, user.getRealm(), user.getKey());
- List<PropagationStatus> statuses = provisioningManager.provision(key, changePwd, password, resources,
- nullPriorityAsync);
+ List<PropagationStatus> statuses = provisioningManager.provision(
+ key, changePwd, password, resources, nullPriorityAsync, AuthContextUtils.getUsername(), REST_CONTEXT);
ProvisioningResult<UserTO> result = new ProvisioningResult<>();
result.setEntity(binder.returnUserTO(binder.getUserTO(key)));
diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AddETagFilter.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AddETagFilter.java
index 145bea2..98b1db2 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AddETagFilter.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AddETagFilter.java
@@ -26,7 +26,7 @@ import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.ext.Provider;
import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.common.lib.to.AbstractAnnotatedBean;
+import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.EntityTO;
import org.apache.syncope.common.lib.to.ProvisioningResult;
@@ -40,13 +40,13 @@ public class AddETagFilter implements ContainerResponseFilter {
@Override
public void filter(final ContainerRequestContext reqCtx, final ContainerResponseContext resCtx) throws IOException {
if (resCtx.getEntityTag() == null) {
- AbstractAnnotatedBean annotated = null;
- if (resCtx.getEntity() instanceof AbstractAnnotatedBean) {
- annotated = (AbstractAnnotatedBean) resCtx.getEntity();
+ AnyTO annotated = null;
+ if (resCtx.getEntity() instanceof AnyTO) {
+ annotated = (AnyTO) resCtx.getEntity();
} else if (resCtx.getEntity() instanceof ProvisioningResult) {
EntityTO entity = ((ProvisioningResult<?>) resCtx.getEntity()).getEntity();
- if (entity instanceof AbstractAnnotatedBean) {
- annotated = (AbstractAnnotatedBean) entity;
+ if (entity instanceof AnyTO) {
+ annotated = (AnyTO) entity;
}
}
if (annotated != null) {
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
index 523f561..a658cd9 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
@@ -18,10 +18,35 @@
*/
package org.apache.syncope.core.persistence.api.entity;
+import java.util.Date;
import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
import java.util.List;
-public interface Any<P extends PlainAttr<?>> extends Attributable<P>, AnnotatedEntity {
+public interface Any<P extends PlainAttr<?>> extends Attributable<P>, Entity {
+
+ Date getCreationDate();
+
+ String getCreator();
+
+ String getCreationContext();
+
+ Date getLastChangeDate();
+
+ String getLastModifier();
+
+ String getLastChangeContext();
+
+ void setCreationDate(Date creationDate);
+
+ void setCreator(String creator);
+
+ void setCreationContext(String context);
+
+ void setLastChangeDate(Date lastChangeDate);
+
+ void setLastModifier(String lastModifier);
+
+ void setLastChangeContext(String context);
AnyType getType();
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
index 971e8e5..743c08b 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/ProvisioningTask.java
@@ -57,5 +57,4 @@ public interface ProvisioningTask extends SchedTask {
boolean isSyncStatus();
void setSyncStatus(boolean syncStatus);
-
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
deleted file mode 100644
index d0746cf..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAnnotatedEntity.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity;
-
-import java.util.Date;
-import java.util.Optional;
-
-import javax.persistence.EntityListeners;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
-
-/**
- * Abstract wrapper for common system information.
- */
-@MappedSuperclass
-@EntityListeners(value = AnnotatedEntityListener.class)
-public abstract class AbstractAnnotatedEntity extends AbstractGeneratedKeyEntity implements AnnotatedEntity {
-
- private static final long serialVersionUID = -4801685541488201219L;
-
- /**
- * Username of the user that has created this profile.
- * Reference to existing user cannot be used: the creator can either be {@code admin} or was deleted.
- */
- private String creator;
-
- /**
- * Creation date.
- */
- @Temporal(TemporalType.TIMESTAMP)
- private Date creationDate;
-
- /**
- * Username of the user that has performed the last modification to this profile.
- * This field cannot be null: at creation time it needs to be initialized with the creator username.
- * The modifier can be the user itself if the last performed change was a self-modification.
- * Reference to existing user cannot be used: the creator can either be {@code admin} or was deleted.
- */
- private String lastModifier;
-
- /**
- * Last change date.
- * This field cannot be null: at creation time it needs to be initialized with {@code creationDate} field value.
- */
- @Temporal(TemporalType.TIMESTAMP)
- private Date lastChangeDate;
-
- @Override
- public String getCreator() {
- return creator;
- }
-
- @Override
- public void setCreator(final String creator) {
- this.creator = creator;
- }
-
- @Override
- public Date getCreationDate() {
- return Optional.ofNullable(creationDate).map(date -> new Date(date.getTime())).orElse(null);
- }
-
- @Override
- public void setCreationDate(final Date creationDate) {
- this.creationDate = Optional.ofNullable(creationDate).map(date -> new Date(date.getTime())).orElse(null);
- }
-
- @Override
- public String getLastModifier() {
- return lastModifier;
- }
-
- @Override
- public void setLastModifier(final String lastModifier) {
- this.lastModifier = lastModifier;
- }
-
- @Override
- public Date getLastChangeDate() {
- if (lastChangeDate != null) {
- return new Date(lastChangeDate.getTime());
- } else if (creationDate != null) {
- return new Date(creationDate.getTime());
- }
-
- return null;
- }
-
- @Override
- public void setLastChangeDate(final Date lastChangeDate) {
- this.lastChangeDate = Optional.ofNullable(lastChangeDate)
- .map(changeDate -> new Date(changeDate.getTime())).orElse(null);
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
index 86e2dd5..a667e19 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractAny.java
@@ -18,10 +18,14 @@
*/
package org.apache.syncope.core.persistence.jpa.entity;
+import java.util.Date;
+import java.util.Optional;
import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
import org.apache.syncope.core.persistence.api.entity.Any;
import org.apache.syncope.core.persistence.api.entity.PlainAttr;
import org.apache.syncope.core.persistence.api.entity.Realm;
@@ -29,10 +33,39 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.AnyCheck;
@AnyCheck
@MappedSuperclass
-public abstract class AbstractAny<P extends PlainAttr<?>> extends AbstractAnnotatedEntity implements Any<P> {
+public abstract class AbstractAny<P extends PlainAttr<?>> extends AbstractGeneratedKeyEntity implements Any<P> {
private static final long serialVersionUID = -2666540708092702810L;
+ /**
+ * Username of the user that has created the related instance.
+ */
+ private String creator;
+
+ /**
+ * Creation date.
+ */
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date creationDate;
+
+ /**
+ * Context information about create.
+ */
+ private String creationContext;
+
+ /**
+ * Username of the user that has performed the last modification to the related instance.
+ */
+ private String lastModifier;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date lastChangeDate;
+
+ /**
+ * Context information about last update.
+ */
+ private String lastChangeContext;
+
@ManyToOne(fetch = FetchType.EAGER, optional = false)
private JPARealm realm;
@@ -40,6 +73,72 @@ public abstract class AbstractAny<P extends PlainAttr<?>> extends AbstractAnnota
private String status;
@Override
+ public String getCreator() {
+ return creator;
+ }
+
+ @Override
+ public void setCreator(final String creator) {
+ this.creator = creator;
+ }
+
+ @Override
+ public Date getCreationDate() {
+ return Optional.ofNullable(creationDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ @Override
+ public void setCreationDate(final Date creationDate) {
+ this.creationDate = Optional.ofNullable(creationDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ @Override
+ public String getCreationContext() {
+ return creationContext;
+ }
+
+ @Override
+ public void setCreationContext(final String creationContext) {
+ this.creationContext = creationContext;
+ }
+
+ @Override
+ public String getLastModifier() {
+ return lastModifier;
+ }
+
+ @Override
+ public void setLastModifier(final String lastModifier) {
+ this.lastModifier = lastModifier;
+ }
+
+ @Override
+ public Date getLastChangeDate() {
+ if (lastChangeDate != null) {
+ return new Date(lastChangeDate.getTime());
+ } else if (creationDate != null) {
+ return new Date(creationDate.getTime());
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setLastChangeDate(final Date lastChangeDate) {
+ this.lastChangeDate = Optional.ofNullable(lastChangeDate).map(date -> new Date(date.getTime())).orElse(null);
+ }
+
+ @Override
+ public String getLastChangeContext() {
+ return lastChangeContext;
+ }
+
+ @Override
+ public void setLastChangeContext(final String lastChangeContext) {
+ this.lastChangeContext = lastChangeContext;
+ }
+
+ @Override
public Realm getRealm() {
return realm;
}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
index 332423b..b3dfd3d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
@@ -22,7 +22,6 @@ import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.persistence.Column;
-import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
@@ -37,7 +36,6 @@ import org.apache.syncope.core.persistence.jpa.validation.entity.PlainAttrCheck;
@MappedSuperclass
@PlainAttrCheck
-@EntityListeners(value = PlainAttrListener.class)
public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractGeneratedKeyEntity implements PlainAttr<O> {
private static final long serialVersionUID = -9115431608821806124L;
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSysInfoListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSysInfoListener.java
deleted file mode 100644
index 2009a78..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractSysInfoListener.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity;
-
-import java.util.Date;
-import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
-import org.apache.syncope.core.spring.security.AuthContextUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractSysInfoListener {
-
- protected static final Logger LOG = LoggerFactory.getLogger(AnnotatedEntityListener.class);
-
- protected void setSysInfoOnAnnotatedEntity(final AnnotatedEntity entity) {
- String username = AuthContextUtils.getUsername();
- LOG.debug("Set system properties for '{}'", entity);
-
- Date now = new Date();
-
- if (entity.getCreationDate() == null) {
- LOG.debug("Set creation date '{}' and creator '{}' for '{}'", now, username, entity);
- entity.setCreationDate(now);
- entity.setCreator(username);
- }
-
- LOG.debug("Set last change date '{}' and modifier '{}' for '{}'", now, username, entity);
- entity.setLastModifier(username);
- entity.setLastChangeDate(now);
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
deleted file mode 100644
index b6a47a6..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AnnotatedEntityListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity;
-
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
-
-public class AnnotatedEntityListener extends AbstractSysInfoListener {
-
- @PrePersist
- @PreUpdate
- public void setSysInfo(final AnnotatedEntity entity) {
- setSysInfoOnAnnotatedEntity(entity);
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PlainAttrListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PlainAttrListener.java
deleted file mode 100644
index a3aa93a..0000000
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/PlainAttrListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.persistence.jpa.entity;
-
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
-
-public class PlainAttrListener extends AbstractSysInfoListener {
-
- @PrePersist
- @PreUpdate
- public void setSysInfoOnOwner(final PlainAttr<?> plainAttr) {
- if (plainAttr.getOwner() != null) {
- LOG.debug("Set system properties for owner of '{}'", plainAttr);
- setSysInfoOnAnnotatedEntity(plainAttr.getOwner());
- }
- }
-}
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
index 52ef08c..acde817 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/EntityValidationListener.java
@@ -26,7 +26,6 @@ import javax.validation.Validator;
import org.apache.commons.lang3.ClassUtils;
import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
import org.apache.syncope.core.spring.ApplicationContextProvider;
-import org.apache.syncope.core.persistence.api.entity.AnnotatedEntity;
import org.apache.syncope.core.persistence.api.entity.Any;
import org.apache.syncope.core.persistence.api.entity.DynMembership;
import org.apache.syncope.core.persistence.api.entity.Entity;
@@ -56,7 +55,6 @@ public class EntityValidationListener {
Class<?> entityInt = null;
for (Class<?> interf : ClassUtils.getAllInterfaces(object.getClass())) {
if (!Entity.class.equals(interf)
- && !AnnotatedEntity.class.equals(interf)
&& !ProvidedKeyEntity.class.equals(interf)
&& !Schema.class.equals(interf)
&& !Task.class.equals(interf)
@@ -71,7 +69,7 @@ public class EntityValidationListener {
}
throw new InvalidEntityException(entityInt == null
- ? "Entity" : entityInt.getSimpleName(), violations);
+ ? "Entity" : entityInt.getSimpleName(), violations);
}
}
}
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
index a8f2320..f639503 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
@@ -25,7 +25,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
-import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
@@ -355,27 +354,4 @@ public class UserTest extends AbstractTest {
list = userDAO.findByDerAttrValue(derSchemaDAO.find("kprefix"), 'k' + firstname, false);
assertEquals(1, list.size());
}
-
- @Test
- public void issueSYNCOPE1016() {
- User user = userDAO.findByUsername("rossini");
- Date initial = user.getLastChangeDate();
- assertNotNull(initial);
-
- UPlainAttr attr = entityFactory.newEntity(UPlainAttr.class);
- attr.setOwner(user);
- attr.setSchema(plainSchemaDAO.find("obscure"));
- attr.add("testvalue", anyUtilsFactory.getInstance(AnyTypeKind.USER));
- user.add(attr);
-
- userDAO.save(user);
-
- entityManager().flush();
-
- user = userDAO.findByUsername("rossini");
- Date afterwards = user.getLastChangeDate();
- assertNotNull(afterwards);
-
- assertTrue(afterwards.after(initial));
- }
}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java
index 0036c85..bb40741 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/AnyObjectProvisioningManager.java
@@ -29,7 +29,12 @@ import org.apache.syncope.common.lib.to.PropagationStatus;
public interface AnyObjectProvisioningManager extends ProvisioningManager<AnyObjectCR, AnyObjectUR> {
Pair<String, List<PropagationStatus>> create(
- AnyObjectCR anyObjectCR, Set<String> excludedResources, boolean nullPriorityAsync);
+ AnyObjectCR anyObjectCR,
+ Set<String> excludedResources,
+ boolean nullPriorityAsync,
+ String creator,
+ String context);
- List<PropagationStatus> provision(String key, Collection<String> resources, boolean nullPriorityAsync);
+ List<PropagationStatus> provision(
+ String key, Collection<String> resources, boolean nullPriorityAsync, String updater, String context);
}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java
index 9569105..2209b88 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/GroupProvisioningManager.java
@@ -33,7 +33,10 @@ public interface GroupProvisioningManager extends ProvisioningManager<GroupCR, G
GroupCR groupCR,
Map<String, String> groupOwnerMap,
Set<String> excludedResources,
- boolean nullPriorityAsync);
+ boolean nullPriorityAsync,
+ String creator,
+ String context);
- List<PropagationStatus> provision(String key, Collection<String> resources, boolean nullPriorityAsync);
+ List<PropagationStatus> provision(
+ String key, Collection<String> resources, boolean nullPriorityAsync, String updater, String context);
}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java
index b4e8935..43d11fe 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/ProvisioningManager.java
@@ -28,19 +28,23 @@ import org.apache.syncope.common.lib.to.PropagationStatus;
public interface ProvisioningManager<C extends AnyCR, U extends AnyUR> {
- Pair<String, List<PropagationStatus>> create(C anyCR, boolean nullPriorityAsync);
+ Pair<String, List<PropagationStatus>> create(
+ C anyCR, boolean nullPriorityAsync, String creator, String context);
- Pair<U, List<PropagationStatus>> update(U anyUR, boolean nullPriorityAsync);
+ Pair<U, List<PropagationStatus>> update(U anyUR, boolean nullPriorityAsync, String updater, String context);
- Pair<U, List<PropagationStatus>> update(U anyUR, Set<String> excludedResources, boolean nullPriorityAsync);
+ Pair<U, List<PropagationStatus>> update(
+ U anyUR, Set<String> excludedResources, boolean nullPriorityAsync, String updater, String context);
- List<PropagationStatus> delete(String anyKey, boolean nullPriorityAsync);
+ String unlink(U anyUR, String updater, String context);
- List<PropagationStatus> delete(String anyKey, Set<String> excludedResources, boolean nullPriorityAsync);
+ String link(U anyUR, String updater, String context);
- String unlink(U anyUR);
+ List<PropagationStatus> deprovision(
+ String anyKey, Collection<String> resources, boolean nullPriorityAsync, String updater, String context);
- String link(U anyUR);
+ List<PropagationStatus> delete(String anyKey, boolean nullPriorityAsync, String eraser, String context);
- List<PropagationStatus> deprovision(String anyKey, Collection<String> resources, boolean nullPriorityAsync);
+ List<PropagationStatus> delete(
+ String anyKey, Set<String> excludedResources, boolean nullPriorityAsync, String eraser, String context);
}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java
index 72e4fc9..44502ea 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/UserProvisioningManager.java
@@ -30,33 +30,45 @@ import org.apache.syncope.common.lib.to.ProvisioningReport;
public interface UserProvisioningManager extends ProvisioningManager<UserCR, UserUR> {
- Pair<String, List<PropagationStatus>> activate(StatusR statusR, boolean nullPriorityAsync);
-
- Pair<String, List<PropagationStatus>> reactivate(StatusR statusR, boolean nullPriorityAsync);
-
- Pair<String, List<PropagationStatus>> suspend(StatusR statusR, boolean nullPriorityAsync);
-
- void internalSuspend(String key);
-
Pair<String, List<PropagationStatus>> create(
UserCR userCR,
boolean disablePwdPolicyCheck,
Boolean enabled,
Set<String> excludedResources,
- boolean nullPriorityAsync);
+ boolean nullPriorityAsync,
+ String creator,
+ String context);
Pair<UserUR, List<PropagationStatus>> update(
UserUR userUR,
ProvisioningReport result,
Boolean enabled,
Set<String> excludedResources,
- boolean nullPriorityAsync);
+ boolean nullPriorityAsync,
+ String updater,
+ String context);
- void requestPasswordReset(String key);
+ Pair<String, List<PropagationStatus>> activate(
+ StatusR statusR, boolean nullPriorityAsync, String updater, String context);
- void confirmPasswordReset(String key, String token, String password);
+ Pair<String, List<PropagationStatus>> reactivate(
+ StatusR statusR, boolean nullPriorityAsync, String updater, String context);
- List<PropagationStatus> provision(
- String key, boolean changePwd, String password, Collection<String> resources, boolean nullPriorityAsync);
+ Pair<String, List<PropagationStatus>> suspend(
+ StatusR statusR, boolean nullPriorityAsync, String updater, String context);
+ void internalSuspend(String key, String updater, String context);
+
+ void requestPasswordReset(String key, String updater, String context);
+
+ void confirmPasswordReset(String key, String token, String password, String updater, String context);
+
+ List<PropagationStatus> provision(
+ String key,
+ boolean changePwd,
+ String password,
+ Collection<String> resources,
+ boolean nullPriorityAsync,
+ String updater,
+ String context);
}
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningProfile.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningProfile.java
index 25f61b6..d03b45e 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningProfile.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/pushpull/ProvisioningProfile.java
@@ -37,6 +37,8 @@ public class ProvisioningProfile<T extends ProvisioningTask, A extends Provision
private ConflictResolutionAction conflictResolutionAction;
+ private String executor;
+
private final List<A> actions = new ArrayList<>();
public ProvisioningProfile(final Connector connector, final T task) {
@@ -72,6 +74,14 @@ public class ProvisioningProfile<T extends ProvisioningTask, A extends Provision
this.conflictResolutionAction = conflictResolutionAction;
}
+ public String getExecutor() {
+ return executor;
+ }
+
+ public void setExecutor(final String executor) {
+ this.executor = executor;
+ }
+
public List<A> getActions() {
return actions;
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
index 8a7813a..ac2414c 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
@@ -42,13 +42,9 @@ import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisioningManager {
- @Resource(name = "adminUser")
- protected String adminUser;
-
@Autowired
protected AnyObjectWorkflowAdapter awfAdapter;
@@ -66,17 +62,24 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
@Override
public Pair<String, List<PropagationStatus>> create(
- final AnyObjectCR anyObjectCR, final boolean nullPriorityAsync) {
+ final AnyObjectCR anyObjectCR,
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
- return create(anyObjectCR, Set.of(), nullPriorityAsync);
+ return create(anyObjectCR, Set.of(), nullPriorityAsync, creator, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public Pair<String, List<PropagationStatus>> create(
- final AnyObjectCR anyObjectCR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final AnyObjectCR anyObjectCR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
- WorkflowResult<String> created = awfAdapter.create(anyObjectCR);
+ WorkflowResult<String> created = awfAdapter.create(anyObjectCR, creator, context);
List<PropagationTaskInfo> taskInfos = propagationManager.getCreateTasks(
AnyTypeKind.ANY_OBJECT,
@@ -85,24 +88,31 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
created.getPropByRes(),
anyObjectCR.getVirAttrs(),
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, creator);
return Pair.of(created.getResult(), propagationReporter.getStatuses());
}
@Override
public Pair<AnyObjectUR, List<PropagationStatus>> update(
- final AnyObjectUR anyObjectUR, final boolean nullPriorityAsync) {
+ final AnyObjectUR anyObjectUR,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
- return update(anyObjectUR, Set.of(), nullPriorityAsync);
+ return update(anyObjectUR, Set.of(), nullPriorityAsync, updater, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public Pair<AnyObjectUR, List<PropagationStatus>> update(
- final AnyObjectUR anyObjectUR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final AnyObjectUR anyObjectUR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
- WorkflowResult<AnyObjectUR> updated = awfAdapter.update(anyObjectUR);
+ WorkflowResult<AnyObjectUR> updated = awfAdapter.update(anyObjectUR, updater, context);
List<PropagationTaskInfo> taskInfos = propagationManager.getUpdateTasks(
AnyTypeKind.ANY_OBJECT,
@@ -113,20 +123,26 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
null,
anyObjectUR.getVirAttrs(),
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return Pair.of(updated.getResult(), propagationReporter.getStatuses());
}
@Override
- public List<PropagationStatus> delete(final String key, final boolean nullPriorityAsync) {
- return delete(key, Set.of(), nullPriorityAsync);
+ public List<PropagationStatus> delete(
+ final String key, final boolean nullPriorityAsync, final String eraser, final String context) {
+
+ return delete(key, Set.of(), nullPriorityAsync, eraser, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public List<PropagationStatus> delete(
- final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final String key,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.set(ResourceOperation.DELETE, anyObjectDAO.findAllResourceKeys(key));
@@ -142,7 +158,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
propByRes,
null,
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, eraser);
try {
awfAdapter.delete(key);
@@ -154,18 +170,22 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
}
@Override
- public String unlink(final AnyObjectUR anyObjectUR) {
- return awfAdapter.update(anyObjectUR).getResult().getKey();
+ public String unlink(final AnyObjectUR anyObjectUR, final String updater, final String context) {
+ return awfAdapter.update(anyObjectUR, updater, context).getResult().getKey();
}
@Override
- public String link(final AnyObjectUR anyObjectUR) {
- return awfAdapter.update(anyObjectUR).getResult().getKey();
+ public String link(final AnyObjectUR anyObjectUR, final String updater, final String context) {
+ return awfAdapter.update(anyObjectUR, updater, context).getResult().getKey();
}
@Override
public List<PropagationStatus> provision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.addAll(ResourceOperation.UPDATE, resources);
@@ -179,14 +199,18 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
null,
null,
null);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
@Override
public List<PropagationStatus> deprovision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.addAll(ResourceOperation.DELETE, resources);
@@ -199,7 +223,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
anyObjectDAO.findAllResourceKeys(key).stream().
filter(resource -> !resources.contains(resource)).
collect(Collectors.toList()));
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
index a0ec90f..fd74938 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
@@ -45,13 +45,9 @@ import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskInfo;
import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
public class DefaultGroupProvisioningManager implements GroupProvisioningManager {
- @Resource(name = "adminUser")
- protected String adminUser;
-
@Autowired
protected GroupWorkflowAdapter gwfAdapter;
@@ -71,8 +67,10 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
protected VirAttrHandler virtAttrHandler;
@Override
- public Pair<String, List<PropagationStatus>> create(final GroupCR groupCR, final boolean nullPriorityAsync) {
- WorkflowResult<String> created = gwfAdapter.create(groupCR);
+ public Pair<String, List<PropagationStatus>> create(
+ final GroupCR groupCR, final boolean nullPriorityAsync, final String creator, final String context) {
+
+ WorkflowResult<String> created = gwfAdapter.create(groupCR, creator, context);
List<PropagationTaskInfo> tasks = propagationManager.getCreateTasks(
AnyTypeKind.GROUP,
@@ -81,7 +79,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
created.getPropByRes(),
groupCR.getVirAttrs(),
Set.of());
- PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync, creator);
return Pair.of(created.getResult(), propagationReporter.getStatuses());
}
@@ -92,9 +90,11 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
final GroupCR groupCR,
final Map<String, String> groupOwnerMap,
final Set<String> excludedResources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
- WorkflowResult<String> created = gwfAdapter.create(groupCR);
+ WorkflowResult<String> created = gwfAdapter.create(groupCR, creator, context);
// see ConnObjectUtils#getAnyTOFromConnObject for GroupOwnerSchema
groupCR.getPlainAttr(StringUtils.EMPTY).
@@ -107,24 +107,28 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
created.getPropByRes(),
groupCR.getVirAttrs(),
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync, creator);
return Pair.of(created.getResult(), propagationReporter.getStatuses());
}
@Override
public Pair<GroupUR, List<PropagationStatus>> update(
- final GroupUR groupUR, final boolean nullPriorityAsync) {
+ final GroupUR groupUR, final boolean nullPriorityAsync, final String updater, final String context) {
- return update(groupUR, Set.of(), nullPriorityAsync);
+ return update(groupUR, Set.of(), nullPriorityAsync, updater, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public Pair<GroupUR, List<PropagationStatus>> update(
- final GroupUR groupUR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final GroupUR groupUR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
- WorkflowResult<GroupUR> updated = gwfAdapter.update(groupUR);
+ WorkflowResult<GroupUR> updated = gwfAdapter.update(groupUR, updater, context);
List<PropagationTaskInfo> tasks = propagationManager.getUpdateTasks(
AnyTypeKind.GROUP,
@@ -135,20 +139,26 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
null,
groupUR.getVirAttrs(),
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync, updater);
return Pair.of(updated.getResult(), propagationReporter.getStatuses());
}
@Override
- public List<PropagationStatus> delete(final String key, final boolean nullPriorityAsync) {
- return delete(key, Set.of(), nullPriorityAsync);
+ public List<PropagationStatus> delete(
+ final String key, final boolean nullPriorityAsync, final String eraser, final String context) {
+
+ return delete(key, Set.of(), nullPriorityAsync, eraser, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public List<PropagationStatus> delete(
- final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final String key,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
List<PropagationTaskInfo> taskInfos = new ArrayList<>();
@@ -179,7 +189,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
null,
null));
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, eraser);
gwfAdapter.delete(key);
@@ -187,13 +197,22 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
}
@Override
- public String unlink(final GroupUR groupUR) {
- return gwfAdapter.update(groupUR).getResult().getKey();
+ public String link(final GroupUR groupUR, final String updater, final String context) {
+ return gwfAdapter.update(groupUR, updater, context).getResult().getKey();
+ }
+
+ @Override
+ public String unlink(final GroupUR groupUR, final String updater, final String context) {
+ return gwfAdapter.update(groupUR, updater, context).getResult().getKey();
}
@Override
public List<PropagationStatus> provision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.addAll(ResourceOperation.UPDATE, resources);
@@ -207,14 +226,18 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
null,
null,
null);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
@Override
public List<PropagationStatus> deprovision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.addAll(ResourceOperation.DELETE, resources);
@@ -227,13 +250,8 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
groupDAO.findAllResourceKeys(key).stream().
filter(resource -> !resources.contains(resource)).
collect(Collectors.toList()));
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
-
- @Override
- public String link(final GroupUR groupUR) {
- return gwfAdapter.update(groupUR).getResult().getKey();
- }
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
index 49da4df..dd3a2ef 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
@@ -39,7 +39,6 @@ import org.apache.syncope.core.provisioning.api.UserWorkflowResult;
import org.apache.syncope.core.provisioning.api.PropagationByResource;
import org.apache.syncope.common.lib.types.ResourceOperation;
import org.apache.syncope.common.lib.types.StatusRType;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationException;
import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
@@ -53,15 +52,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
-
public class DefaultUserProvisioningManager implements UserProvisioningManager {
protected static final Logger LOG = LoggerFactory.getLogger(UserProvisioningManager.class);
- @Resource(name = "adminUser")
- protected String adminUser;
-
@Autowired
protected UserWorkflowAdapter uwfAdapter;
@@ -78,8 +72,10 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
protected UserDAO userDAO;
@Override
- public Pair<String, List<PropagationStatus>> create(final UserCR userCR, final boolean nullPriorityAsync) {
- return create(userCR, false, null, Set.of(), nullPriorityAsync);
+ public Pair<String, List<PropagationStatus>> create(
+ final UserCR userCR, final boolean nullPriorityAsync, final String creator, final String context) {
+
+ return create(userCR, false, null, Set.of(), nullPriorityAsync, creator, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@@ -89,9 +85,12 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
final boolean disablePwdPolicyCheck,
final Boolean enabled,
final Set<String> excludedResources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
- UserWorkflowResult<Pair<String, Boolean>> created = uwfAdapter.create(userCR, disablePwdPolicyCheck, enabled);
+ UserWorkflowResult<Pair<String, Boolean>> created =
+ uwfAdapter.create(userCR, disablePwdPolicyCheck, enabled, creator, context);
List<PropagationTaskInfo> taskInfos = propagationManager.getUserCreateTasks(
created.getResult().getLeft(),
@@ -101,26 +100,32 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
created.getPropByLinkedAccount(),
userCR.getVirAttrs(),
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, creator);
return Pair.of(created.getResult().getLeft(), propagationReporter.getStatuses());
}
@Override
- public Pair<UserUR, List<PropagationStatus>> update(final UserUR userUR, final boolean nullPriorityAsync) {
- UserWorkflowResult<Pair<UserUR, Boolean>> updated = uwfAdapter.update(userUR);
+ public Pair<UserUR, List<PropagationStatus>> update(
+ final UserUR userUR, final boolean nullPriorityAsync, final String updater, final String context) {
+
+ UserWorkflowResult<Pair<UserUR, Boolean>> updated = uwfAdapter.update(userUR, updater, context);
List<PropagationTaskInfo> taskInfos = propagationManager.getUserUpdateTasks(updated);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return Pair.of(updated.getResult().getLeft(), propagationReporter.getStatuses());
}
@Override
public Pair<UserUR, List<PropagationStatus>> update(
- final UserUR userUR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final UserUR userUR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
- return update(userUR, new ProvisioningReport(), null, excludedResources, nullPriorityAsync);
+ return update(userUR, new ProvisioningReport(), null, excludedResources, nullPriorityAsync, updater, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@@ -130,11 +135,13 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
final ProvisioningReport result,
final Boolean enabled,
final Set<String> excludedResources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
UserWorkflowResult<Pair<UserUR, Boolean>> updated;
try {
- updated = uwfAdapter.update(userUR);
+ updated = uwfAdapter.update(userUR, updater, context);
} catch (Exception e) {
LOG.error("Update of user {} failed, trying to pull its status anyway (if configured)",
userUR.getKey(), e);
@@ -154,11 +161,11 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
UserWorkflowResult<String> enableUpdate = null;
if (user.isSuspended() == null) {
- enableUpdate = uwfAdapter.activate(userUR.getKey(), null);
+ enableUpdate = uwfAdapter.activate(userUR.getKey(), null, updater, context);
} else if (enabled && user.isSuspended()) {
- enableUpdate = uwfAdapter.reactivate(userUR.getKey());
+ enableUpdate = uwfAdapter.reactivate(userUR.getKey(), updater, context);
} else if (!enabled && !user.isSuspended()) {
- enableUpdate = uwfAdapter.suspend(userUR.getKey());
+ enableUpdate = uwfAdapter.suspend(userUR.getKey(), updater, context);
}
if (enableUpdate != null) {
@@ -172,20 +179,26 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
List<PropagationTaskInfo> taskInfos = propagationManager.getUserUpdateTasks(
updated, updated.getResult().getLeft().getPassword() != null, excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return Pair.of(updated.getResult().getLeft(), propagationReporter.getStatuses());
}
@Override
- public List<PropagationStatus> delete(final String key, final boolean nullPriorityAsync) {
- return delete(key, Set.of(), nullPriorityAsync);
+ public List<PropagationStatus> delete(
+ final String key, final boolean nullPriorityAsync, final String eraser, final String context) {
+
+ return delete(key, Set.of(), nullPriorityAsync, eraser, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public List<PropagationStatus> delete(
- final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final String key,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.set(ResourceOperation.DELETE, userDAO.findAllResourceKeys(key));
@@ -205,56 +218,60 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
propByRes,
propByLinkedAccount,
excludedResources);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, eraser);
- try {
- uwfAdapter.delete(key);
- } catch (PropagationException e) {
- throw e;
- }
+ uwfAdapter.delete(key);
return propagationReporter.getStatuses();
}
@Override
- public String unlink(final UserUR userUR) {
- UserWorkflowResult<Pair<UserUR, Boolean>> updated = uwfAdapter.update(userUR);
+ public String unlink(final UserUR userUR, final String updater, final String context) {
+ UserWorkflowResult<Pair<UserUR, Boolean>> updated = uwfAdapter.update(userUR, updater, context);
return updated.getResult().getLeft().getKey();
}
@Override
- public String link(final UserUR userUR) {
- return uwfAdapter.update(userUR).getResult().getLeft().getKey();
+ public String link(final UserUR userUR, final String updater, final String context) {
+ return uwfAdapter.update(userUR, updater, context).getResult().getLeft().getKey();
}
@Override
- public Pair<String, List<PropagationStatus>> activate(final StatusR statusR, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> activate(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater, final String context) {
+
UserWorkflowResult<String> updated = statusR.isOnSyncope()
- ? uwfAdapter.activate(statusR.getKey(), statusR.getToken())
+ ? uwfAdapter.activate(statusR.getKey(), statusR.getToken(), updater, context)
: new UserWorkflowResult<>(statusR.getKey(), null, null, statusR.getType().name().toLowerCase());
- return Pair.of(updated.getResult(), propagateStatus(statusR, nullPriorityAsync));
+ return Pair.of(updated.getResult(), propagateStatus(statusR, nullPriorityAsync, updater));
}
@Override
- public Pair<String, List<PropagationStatus>> reactivate(final StatusR statusR, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> reactivate(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater, final String context) {
+
UserWorkflowResult<String> updated = statusR.isOnSyncope()
- ? uwfAdapter.reactivate(statusR.getKey())
+ ? uwfAdapter.reactivate(statusR.getKey(), updater, context)
: new UserWorkflowResult<>(statusR.getKey(), null, null, statusR.getType().name().toLowerCase());
- return Pair.of(updated.getResult(), propagateStatus(statusR, nullPriorityAsync));
+ return Pair.of(updated.getResult(), propagateStatus(statusR, nullPriorityAsync, updater));
}
@Override
- public Pair<String, List<PropagationStatus>> suspend(final StatusR statusR, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> suspend(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater, final String context) {
+
UserWorkflowResult<String> updated = statusR.isOnSyncope()
- ? uwfAdapter.suspend(statusR.getKey())
+ ? uwfAdapter.suspend(statusR.getKey(), updater, context)
: new UserWorkflowResult<>(statusR.getKey(), null, null, statusR.getType().name().toLowerCase());
- return Pair.of(updated.getResult(), propagateStatus(statusR, nullPriorityAsync));
+ return Pair.of(updated.getResult(), propagateStatus(statusR, nullPriorityAsync, updater));
}
- protected List<PropagationStatus> propagateStatus(final StatusR statusR, final boolean nullPriorityAsync) {
+ protected List<PropagationStatus> propagateStatus(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater) {
+
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.addAll(ResourceOperation.UPDATE, statusR.getResources());
List<PropagationTaskInfo> taskInfos = propagationManager.getUpdateTasks(
@@ -266,14 +283,14 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
null,
null,
null);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
@Override
- public void internalSuspend(final String key) {
- Pair<UserWorkflowResult<String>, Boolean> updated = uwfAdapter.internalSuspend(key);
+ public void internalSuspend(final String key, final String updater, final String context) {
+ Pair<UserWorkflowResult<String>, Boolean> updated = uwfAdapter.internalSuspend(key, updater, context);
// propagate suspension if and only if it is required by policy
if (updated != null && updated.getRight()) {
@@ -285,7 +302,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
updated.getLeft().getPropByRes(),
updated.getLeft().getPropByLinkedAccount(),
updated.getLeft().getPerformedTasks()));
- taskExecutor.execute(taskInfos, false, adminUser);
+ taskExecutor.execute(taskInfos, false, updater);
}
}
@@ -295,7 +312,9 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
final boolean changePwd,
final String password,
final Collection<String> resources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
UserUR userUR = new UserUR();
userUR.setKey(key);
@@ -318,14 +337,18 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
Pair.of(userUR, (Boolean) null), propByRes, null, "update");
List<PropagationTaskInfo> taskInfos = propagationManager.getUserUpdateTasks(wfResult, changePwd, null);
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
@Override
public List<PropagationStatus> deprovision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PropagationByResource<String> propByRes = new PropagationByResource<>();
propByRes.set(ResourceOperation.DELETE, resources);
@@ -345,21 +368,24 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
userDAO.findAllResourceKeys(key).stream().
filter(resource -> !resources.contains(resource)).
collect(Collectors.toList()));
- PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, adminUser);
+ PropagationReporter propagationReporter = taskExecutor.execute(taskInfos, nullPriorityAsync, updater);
return propagationReporter.getStatuses();
}
@Override
- public void requestPasswordReset(final String key) {
- uwfAdapter.requestPasswordReset(key);
+ public void requestPasswordReset(final String key, final String updater, final String context) {
+ uwfAdapter.requestPasswordReset(key, updater, context);
}
@Override
- public void confirmPasswordReset(final String key, final String token, final String password) {
- UserWorkflowResult<Pair<UserUR, Boolean>> updated = uwfAdapter.confirmPasswordReset(key, token, password);
+ public void confirmPasswordReset(
+ final String key, final String token, final String password, final String updater, final String context) {
+
+ UserWorkflowResult<Pair<UserUR, Boolean>> updated =
+ uwfAdapter.confirmPasswordReset(key, token, password, updater, context);
List<PropagationTaskInfo> taskInfos = propagationManager.getUserUpdateTasks(updated);
- taskExecutor.execute(taskInfos, false, adminUser);
+ taskExecutor.execute(taskInfos, false, updater);
}
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index 2d4db1c..3f2b43b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -76,13 +76,17 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
@Override
public AnyObjectTO getAnyObjectTO(final AnyObject anyObject, final boolean details) {
AnyObjectTO anyObjectTO = new AnyObjectTO();
+
+ anyObjectTO.setCreator(anyObject.getCreator());
+ anyObjectTO.setCreationDate(anyObject.getCreationDate());
+ anyObjectTO.setCreationContext(anyObject.getCreationContext());
+ anyObjectTO.setLastModifier(anyObject.getLastModifier());
+ anyObjectTO.setLastChangeDate(anyObject.getLastChangeDate());
+ anyObjectTO.setLastChangeContext(anyObject.getLastChangeContext());
+
anyObjectTO.setKey(anyObject.getKey());
anyObjectTO.setName(anyObject.getName());
anyObjectTO.setType(anyObject.getType().getKey());
- anyObjectTO.setCreationDate(anyObject.getCreationDate());
- anyObjectTO.setCreator(anyObject.getCreator());
- anyObjectTO.setLastChangeDate(anyObject.getLastChangeDate());
- anyObjectTO.setLastModifier(anyObject.getLastModifier());
anyObjectTO.setStatus(anyObject.getStatus());
Map<VirSchema, List<String>> virAttrValues = details
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index 7368bef..402a7e1 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -329,15 +329,16 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
public GroupTO getGroupTO(final Group group, final boolean details) {
GroupTO groupTO = new GroupTO();
- // set sys info
groupTO.setCreator(group.getCreator());
groupTO.setCreationDate(group.getCreationDate());
+ groupTO.setCreationContext(group.getCreationContext());
groupTO.setLastModifier(group.getLastModifier());
groupTO.setLastChangeDate(group.getLastChangeDate());
- groupTO.setStatus(group.getStatus());
+ groupTO.setLastChangeContext(group.getLastChangeContext());
groupTO.setKey(group.getKey());
groupTO.setName(group.getName());
+ groupTO.setStatus(group.getStatus());
if (group.getUserOwner() != null) {
groupTO.setUserOwner(group.getUserOwner().getKey());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 45cbd65..d760612 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -709,23 +709,28 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
@Override
public UserTO getUserTO(final User user, final boolean details) {
UserTO userTO = new UserTO();
- userTO.setKey(user.getKey());
- userTO.setUsername(user.getUsername());
- userTO.setPassword(user.getPassword());
- userTO.setType(user.getType().getKey());
- userTO.setCreationDate(user.getCreationDate());
+
userTO.setCreator(user.getCreator());
- userTO.setLastChangeDate(user.getLastChangeDate());
+ userTO.setCreationDate(user.getCreationDate());
+ userTO.setCreationContext(user.getCreationContext());
userTO.setLastModifier(user.getLastModifier());
- userTO.setStatus(user.getStatus());
- userTO.setSuspended(BooleanUtils.isTrue(user.isSuspended()));
+ userTO.setLastChangeDate(user.getLastChangeDate());
+ userTO.setLastChangeContext(user.getLastChangeContext());
+
userTO.setChangePwdDate(user.getChangePwdDate());
userTO.setFailedLogins(user.getFailedLogins());
userTO.setLastLoginDate(user.getLastLoginDate());
- userTO.setMustChangePassword(user.isMustChangePassword());
userTO.setToken(user.getToken());
userTO.setTokenExpireTime(user.getTokenExpireTime());
+ userTO.setKey(user.getKey());
+ userTO.setUsername(user.getUsername());
+ userTO.setPassword(user.getPassword());
+ userTO.setType(user.getType().getKey());
+ userTO.setStatus(user.getStatus());
+ userTO.setSuspended(BooleanUtils.isTrue(user.isSuspended()));
+ userTO.setMustChangePassword(user.isMustChangePassword());
+
if (user.getSecurityQuestion() != null) {
userTO.setSecurityQuestion(user.getSecurityQuestion().getKey());
}
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 cc3c556..bdc510f 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
@@ -19,7 +19,9 @@
package org.apache.syncope.core.provisioning.java.job;
import java.util.Date;
+import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.Resource;
import org.apache.syncope.common.lib.types.AuditElements;
import org.apache.syncope.core.provisioning.api.job.JobManager;
import org.apache.syncope.core.provisioning.api.utils.ExceptionUtils2;
@@ -43,6 +45,9 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
protected static final Logger LOG = LoggerFactory.getLogger(SchedTaskJobDelegate.class);
+ @Resource(name = "adminUser")
+ protected String adminUser;
+
/**
* The actual task to be executed.
*/
@@ -111,7 +116,8 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
return;
}
- String executor = context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY);
+ String executor = Optional.ofNullable(context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY)).
+ orElse(adminUser);
TaskExec execution = entityFactory.newEntity(TaskExec.class);
execution.setStart(new Date());
execution.setTask(task);
@@ -122,7 +128,7 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
AuditElements.Result result;
try {
- execution.setMessage(doExecute(dryRun));
+ execution.setMessage(doExecute(dryRun, executor));
execution.setStatus(TaskJob.Status.SUCCESS.name());
result = AuditElements.Result.SUCCESS;
} catch (JobExecutionException e) {
@@ -166,10 +172,11 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
* The actual execution, delegated to child classes.
*
* @param dryRun whether to actually touch the data
+ * @param executor the user executing this task
* @return the task execution status to be set
* @throws JobExecutionException if anything goes wrong
*/
- protected abstract String doExecute(boolean dryRun) throws JobExecutionException;
+ protected abstract String doExecute(boolean dryRun, String executor) throws JobExecutionException;
/**
* Template method to determine whether this job's task execution has to be persisted or not.
@@ -180,5 +187,4 @@ public abstract class AbstractSchedTaskJobDelegate implements SchedTaskJobDelega
protected boolean hasToBeRegistered(final TaskExec execution) {
return false;
}
-
}
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 0a8566c..0ae54fc 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
@@ -28,7 +28,7 @@ public class ExpiredAccessTokenCleanup extends AbstractSchedTaskJobDelegate {
private AccessTokenDAO accessTokenDAO;
@Override
- protected String doExecute(final boolean dryRun) throws JobExecutionException {
+ protected String doExecute(final boolean dryRun, final String executor) throws JobExecutionException {
if (!dryRun) {
int deleted = accessTokenDAO.deleteExpired();
LOG.debug("Successfully deleted {} expired access tokens", deleted);
@@ -36,5 +36,4 @@ public class ExpiredAccessTokenCleanup extends AbstractSchedTaskJobDelegate {
return "SUCCESS";
}
-
}
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 9d8e7bc..74379e4 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
@@ -28,7 +28,7 @@ public class ExpiredBatchCleanup extends AbstractSchedTaskJobDelegate {
private BatchDAO batchDAO;
@Override
- protected String doExecute(final boolean dryRun) throws JobExecutionException {
+ protected String doExecute(final boolean dryRun, final String executor) throws JobExecutionException {
if (!dryRun) {
int 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 6bce3fc..f7b12f2 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
@@ -73,7 +73,7 @@ public class GroupMemberProvisionTaskJobDelegate extends AbstractSchedTaskJobDel
}
@Override
- protected String doExecute(final boolean dryRun) throws JobExecutionException {
+ protected String doExecute(final boolean dryRun, final String executor) throws JobExecutionException {
Group group = groupDAO.authFind(groupKey);
StringBuilder result = new StringBuilder("Group ").append(group.getName()).append(" members ");
@@ -87,15 +87,17 @@ public class GroupMemberProvisionTaskJobDelegate extends AbstractSchedTaskJobDel
MembershipCond membershipCond = new MembershipCond();
membershipCond.setGroup(groupKey);
List<User> users = searchDAO.search(SearchCond.getLeaf(membershipCond), AnyTypeKind.USER);
- Collection<String> groupResourceKeys = groupDAO.findAllResourceKeys(groupKey);
+ Collection<String> gResources = groupDAO.findAllResourceKeys(groupKey);
status.set("About to "
+ (action == ProvisionAction.DEPROVISION ? "de" : "") + "provision "
- + users.size() + " users from " + groupResourceKeys);
+ + users.size() + " users from " + gResources);
for (int i = 0; i < users.size() && !interrupt; i++) {
List<PropagationStatus> statuses = action == ProvisionAction.DEPROVISION
- ? userProvisioningManager.deprovision(users.get(i).getKey(), groupResourceKeys, false)
- : userProvisioningManager.provision(users.get(i).getKey(), true, null, groupResourceKeys, false);
+ ? userProvisioningManager.deprovision(
+ users.get(i).getKey(), gResources, false, executor, getClass().getSimpleName())
+ : userProvisioningManager.provision(
+ users.get(i).getKey(), true, null, gResources, false, executor, getClass().getSimpleName());
for (PropagationStatus propagationStatus : statuses) {
result.append("User ").append(users.get(i).getKey()).append('\t').
append("Resource ").append(propagationStatus.getResource()).append('\t').
@@ -118,12 +120,14 @@ public class GroupMemberProvisionTaskJobDelegate extends AbstractSchedTaskJobDel
List<AnyObject> anyObjects = searchDAO.search(SearchCond.getLeaf(membershipCond), AnyTypeKind.ANY_OBJECT);
status.set("About to "
+ (action == ProvisionAction.DEPROVISION ? "de" : "") + "provision "
- + anyObjects.size() + " any objects from " + groupResourceKeys);
+ + anyObjects.size() + " any objects from " + gResources);
for (int i = 0; i < anyObjects.size() && !interrupt; i++) {
List<PropagationStatus> statuses = action == ProvisionAction.DEPROVISION
- ? anyObjectProvisioningManager.deprovision(anyObjects.get(i).getKey(), groupResourceKeys, false)
- : anyObjectProvisioningManager.provision(anyObjects.get(i).getKey(), groupResourceKeys, false);
+ ? anyObjectProvisioningManager.deprovision(
+ anyObjects.get(i).getKey(), gResources, false, executor, getClass().getSimpleName())
+ : anyObjectProvisioningManager.provision(
+ anyObjects.get(i).getKey(), gResources, false, executor, getClass().getSimpleName());
for (PropagationStatus propagationStatus : statuses) {
result.append(anyObjects.get(i).getType().getKey()).append(' ').
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 cbe20bf..e9f82fc 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
@@ -21,7 +21,9 @@ package org.apache.syncope.core.provisioning.java.job;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
+import javax.annotation.Resource;
import org.apache.syncope.common.lib.request.MembershipUR;
import org.apache.syncope.common.lib.request.UserUR;
import org.apache.syncope.common.lib.types.PatchOperation;
@@ -46,11 +48,19 @@ public class SetUMembershipsJob extends AbstractInterruptableJob {
public static final String MEMBERSHIPS_AFTER_KEY = "membershipsAfter";
+ public static final String CONTEXT = "context";
+
+ @Resource(name = "adminUser")
+ private String adminUser;
+
@Autowired
private UserProvisioningManager userProvisioningManager;
@Override
public void execute(final JobExecutionContext context) throws JobExecutionException {
+ String executor = Optional.ofNullable(context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY)).
+ orElse(adminUser);
+
try {
AuthContextUtils.callAsAdmin(context.getMergedJobDataMap().getString(JobManager.DOMAIN_KEY), () -> {
@@ -102,7 +112,8 @@ public class SetUMembershipsJob extends AbstractInterruptableJob {
updateReqs.stream().filter(req -> !req.isEmpty()).forEach(req -> {
LOG.debug("About to update User {}", req);
- userProvisioningManager.update(req, true);
+ userProvisioningManager.update(
+ req, true, executor, context.getMergedJobDataMap().getString(CONTEXT));
});
return null;
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 f5afad8..cb4eaf5 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,6 +18,8 @@
*/
package org.apache.syncope.core.provisioning.java.job.notification;
+import java.util.Optional;
+import javax.annotation.Resource;
import org.apache.syncope.core.persistence.api.DomainHolder;
import org.apache.syncope.core.provisioning.api.job.JobManager;
import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -50,6 +52,9 @@ public class NotificationJob extends AbstractInterruptableJob {
private static final Logger LOG = LoggerFactory.getLogger(NotificationJob.class);
+ @Resource(name = "adminUser")
+ private String adminUser;
+
@Autowired
private DomainHolder domainHolder;
@@ -64,7 +69,8 @@ public class NotificationJob extends AbstractInterruptableJob {
@Override
public void execute(final JobExecutionContext context) throws JobExecutionException {
LOG.debug("Waking up...");
- String executor = context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY);
+ String executor = Optional.ofNullable(context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY)).
+ orElse(adminUser);
for (String domain : domainHolder.getDomains().keySet()) {
try {
AuthContextUtils.callAsAdmin(domain, () -> {
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 fa80c42..ddebbb4 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
@@ -18,6 +18,8 @@
*/
package org.apache.syncope.core.provisioning.java.job.report;
+import java.util.Optional;
+import javax.annotation.Resource;
import org.apache.syncope.core.provisioning.api.job.JobDelegate;
import org.apache.syncope.core.spring.security.AuthContextUtils;
import org.apache.syncope.core.provisioning.java.job.AbstractInterruptableJob;
@@ -36,6 +38,9 @@ public class ReportJob extends AbstractInterruptableJob {
private static final Logger LOG = LoggerFactory.getLogger(ReportJob.class);
+ @Resource(name = "adminUser")
+ private String adminUser;
+
/**
* Key, set by the caller, for identifying the report to be executed.
*/
@@ -62,23 +67,22 @@ public class ReportJob extends AbstractInterruptableJob {
public void execute(final JobExecutionContext context) throws JobExecutionException {
try {
String domainKey = context.getMergedJobDataMap().getString(JobManager.DOMAIN_KEY);
- String executor = context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY);
+ String executor = Optional.ofNullable(context.getMergedJobDataMap().getString(JobManager.EXECUTOR_KEY)).
+ orElse(adminUser);
- AuthContextUtils.callAsAdmin(domainKey,
- () -> {
- try {
- delegate.execute(reportKey, executor);
- } catch (Exception e) {
- LOG.error("While executing report {}", reportKey, e);
- throw new RuntimeException(e);
- }
+ AuthContextUtils.callAsAdmin(domainKey, () -> {
+ try {
+ delegate.execute(reportKey, executor);
+ } catch (Exception e) {
+ LOG.error("While executing report {}", reportKey, e);
+ throw new RuntimeException(e);
+ }
- return null;
- });
+ return null;
+ });
} catch (RuntimeException e) {
LOG.error("While executing report {}", reportKey, e);
throw new JobExecutionException("While executing report " + reportKey, e);
}
}
-
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
index c5cea62..d81f40c 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
@@ -630,7 +630,7 @@ public abstract class AbstractProvisioningJobDelegate<T extends ProvisioningTask
}
@Override
- protected String doExecute(final boolean dryRun) throws JobExecutionException {
+ protected String doExecute(final boolean dryRun, final String executor) throws JobExecutionException {
try {
Class<T> clazz = getTaskClassReference();
if (!clazz.isAssignableFrom(task.getClass())) {
@@ -665,17 +665,14 @@ public abstract class AbstractProvisioningJobDelegate<T extends ProvisioningTask
return "No provisions nor orgUnit available: aborting...";
}
- return doExecuteProvisioning(
- provisioningTask,
- connector,
- dryRun);
+ return doExecuteProvisioning(provisioningTask, connector, dryRun, executor);
} catch (Throwable t) {
LOG.error("While executing provisioning job {}", getClass().getName(), t);
throw t;
}
}
- protected abstract String doExecuteProvisioning(T task, Connector connector, boolean dryRun)
+ protected abstract String doExecuteProvisioning(T task, Connector connector, boolean dryRun, String executor)
throws JobExecutionException;
@Override
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 548e0f6..ad936fe 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -651,7 +651,9 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
getProvisioningManager().delete(
match.getAny().getKey(),
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
output = null;
resultStatus = Result.SUCCESS;
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
index 3b5e8f2..54f9cdf 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
@@ -108,4 +108,9 @@ public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, A
public ProvisioningProfile<T, A> getProfile() {
return profile;
}
+
+ protected String getContext() {
+ return (getClass().getSimpleName().contains("Pull") ? "PullTask" : "PushTask")
+ + " " + profile.getTask().getKey() + " '" + profile.getTask().getName() + "'";
+ }
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPullResultHandler.java
index 765495b..e617ae5 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPullResultHandler.java
@@ -74,7 +74,7 @@ public class DefaultAnyObjectPullResultHandler extends AbstractPullResultHandler
@Override
protected WorkflowResult<? extends AnyUR> update(final AnyUR req) {
- return awfAdapter.update((AnyObjectUR) req);
+ return awfAdapter.update((AnyObjectUR) req, profile.getExecutor(), getContext());
}
@Override
@@ -82,7 +82,11 @@ public class DefaultAnyObjectPullResultHandler extends AbstractPullResultHandler
AnyObjectCR anyObjectCR = AnyObjectCR.class.cast(anyCR);
Map.Entry<String, List<PropagationStatus>> created = anyObjectProvisioningManager.create(
- anyObjectCR, Set.of(profile.getTask().getResource().getKey()), true);
+ anyObjectCR,
+ Set.of(profile.getTask().getResource().getKey()),
+ true,
+ profile.getExecutor(),
+ getContext());
return anyObjectDataBinder.getAnyObjectTO(created.getKey());
}
@@ -97,7 +101,11 @@ public class DefaultAnyObjectPullResultHandler extends AbstractPullResultHandler
AnyObjectUR anyObjectUR = AnyObjectUR.class.cast(req);
Pair<AnyObjectUR, List<PropagationStatus>> updated = anyObjectProvisioningManager.update(
- anyObjectUR, Set.of(profile.getTask().getResource().getKey()), true);
+ anyObjectUR,
+ Set.of(profile.getTask().getResource().getKey()),
+ true,
+ profile.getExecutor(),
+ getContext());
return updated.getLeft();
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPushResultHandler.java
index dc7ab63..2cf0022 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultAnyObjectPushResultHandler.java
@@ -47,6 +47,6 @@ public class DefaultAnyObjectPushResultHandler extends AbstractPushResultHandler
@Override
protected WorkflowResult<? extends AnyObjectUR> update(final AnyUR req) {
- return awfAdapter.update((AnyObjectUR) req);
+ return awfAdapter.update((AnyObjectUR) req, profile.getExecutor(), getContext());
}
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPullResultHandler.java
index 538b786..6d23fd9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPullResultHandler.java
@@ -84,7 +84,7 @@ public class DefaultGroupPullResultHandler extends AbstractPullResultHandler imp
@Override
protected WorkflowResult<? extends AnyUR> update(final AnyUR req) {
- return gwfAdapter.update((GroupUR) req);
+ return gwfAdapter.update((GroupUR) req, profile.getExecutor(), getContext());
}
@Override
@@ -95,7 +95,9 @@ public class DefaultGroupPullResultHandler extends AbstractPullResultHandler imp
groupCR,
groupOwnerMap,
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
return groupDataBinder.getGroupTO(created.getKey());
}
@@ -110,7 +112,11 @@ public class DefaultGroupPullResultHandler extends AbstractPullResultHandler imp
GroupUR groupUR = GroupUR.class.cast(req);
Pair<GroupUR, List<PropagationStatus>> updated = groupProvisioningManager.update(
- groupUR, Set.of(profile.getTask().getResource().getKey()), true);
+ groupUR,
+ Set.of(profile.getTask().getResource().getKey()),
+ true,
+ profile.getExecutor(),
+ getContext());
String groupOwner = null;
for (AttrPatch attrPatch : groupUR.getPlainAttrs()) {
@@ -126,5 +132,4 @@ public class DefaultGroupPullResultHandler extends AbstractPullResultHandler imp
return req;
}
-
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPushResultHandler.java
index 714711c..b5420fd 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultGroupPushResultHandler.java
@@ -47,6 +47,6 @@ public class DefaultGroupPushResultHandler extends AbstractPushResultHandler imp
@Override
protected WorkflowResult<? extends AnyUR> update(final AnyUR req) {
- return gwfAdapter.update((GroupUR) req);
+ return gwfAdapter.update((GroupUR) req, profile.getExecutor(), getContext());
}
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPullResultHandler.java
index e28b814..e85a451 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPullResultHandler.java
@@ -99,7 +99,8 @@ public class DefaultUserPullResultHandler extends AbstractPullResultHandler impl
@Override
protected WorkflowResult<? extends AnyUR> update(final AnyUR req) {
- WorkflowResult<Pair<UserUR, Boolean>> update = uwfAdapter.update((UserUR) req);
+ WorkflowResult<Pair<UserUR, Boolean>> update =
+ uwfAdapter.update((UserUR) req, profile.getExecutor(), getContext());
return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
}
@@ -114,7 +115,9 @@ public class DefaultUserPullResultHandler extends AbstractPullResultHandler impl
true,
enabled(delta),
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
return userDataBinder.getUserTO(created.getKey());
}
@@ -131,7 +134,9 @@ public class DefaultUserPullResultHandler extends AbstractPullResultHandler impl
result,
enabled(delta),
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
return updated.getLeft();
}
@@ -369,7 +374,9 @@ public class DefaultUserPullResultHandler extends AbstractPullResultHandler impl
report,
null,
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
LinkedAccountTO created = userDAO.find(req.getKey()).
getLinkedAccount(accountTO.getResource(), accountTO.getConnObjectKeyValue()).
@@ -494,7 +501,9 @@ public class DefaultUserPullResultHandler extends AbstractPullResultHandler impl
report,
null,
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
resultStatus = Result.SUCCESS;
LinkedAccountTO updated = userDAO.find(patch.getKey()).
@@ -588,7 +597,9 @@ public class DefaultUserPullResultHandler extends AbstractPullResultHandler impl
report,
null,
Set.of(profile.getTask().getResource().getKey()),
- true);
+ true,
+ profile.getExecutor(),
+ getContext());
resultStatus = Result.SUCCESS;
output = null;
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java
index 8f04fef..3de89eb 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DefaultUserPushResultHandler.java
@@ -174,7 +174,8 @@ public class DefaultUserPushResultHandler extends AbstractPushResultHandler impl
@Override
protected WorkflowResult<? extends AnyUR> update(final AnyUR req) {
- WorkflowResult<Pair<UserUR, Boolean>> update = uwfAdapter.update((UserUR) req);
+ WorkflowResult<Pair<UserUR, Boolean>> update =
+ uwfAdapter.update((UserUR) req, profile.getExecutor(), getContext());
return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
}
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
index 22550fc..d29fd5f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
@@ -34,6 +34,7 @@ import org.apache.syncope.common.lib.to.ProvisioningReport;
import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
import org.apache.syncope.core.persistence.api.dao.PullMatch;
import org.apache.syncope.core.persistence.api.entity.resource.Provision;
+import org.apache.syncope.core.provisioning.api.job.JobManager;
import org.identityconnectors.framework.common.objects.Attribute;
import org.identityconnectors.framework.common.objects.ConnectorObject;
import org.identityconnectors.framework.common.objects.ObjectClass;
@@ -193,6 +194,10 @@ public class LDAPMembershipPullActions extends SchedulingPullActions {
Map<String, Object> jobMap = new HashMap<>();
jobMap.put(SetUMembershipsJob.MEMBERSHIPS_BEFORE_KEY, membershipsBefore);
jobMap.put(SetUMembershipsJob.MEMBERSHIPS_AFTER_KEY, membershipsAfter);
+ jobMap.put(JobManager.EXECUTOR_KEY, profile.getExecutor());
+ jobMap.put(
+ SetUMembershipsJob.CONTEXT,
+ "PullTask " + profile.getTask().getKey() + " '" + profile.getTask().getName() + "'");
schedule(SetUMembershipsJob.class, jobMap);
}
}
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 9e1c7fb..ebd847c 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
@@ -187,7 +187,8 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
protected String doExecuteProvisioning(
final PullTask pullTask,
final Connector connector,
- final boolean dryRun) throws JobExecutionException {
+ final boolean dryRun,
+ final String executor) throws JobExecutionException {
LOG.debug("Executing pull on {}", pullTask.getResource());
@@ -206,6 +207,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
profile.setConflictResolutionAction(pullTask.getResource().getPullPolicy() == null
? ConflictResolutionAction.IGNORE
: pullTask.getResource().getPullPolicy().getConflictResolutionAction());
+ profile.setExecutor(executor);
latestSyncTokens.clear();
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 d890765..f115233 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
@@ -154,7 +154,8 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
protected String doExecuteProvisioning(
final PushTask pushTask,
final Connector connector,
- final boolean dryRun) throws JobExecutionException {
+ final boolean dryRun,
+ final String executor) throws JobExecutionException {
LOG.debug("Executing push on {}", pushTask.getResource());
@@ -173,6 +174,7 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
profile.setConflictResolutionAction(pushTask.getResource().getPushPolicy() == null
? ConflictResolutionAction.IGNORE
: pushTask.getResource().getPushPolicy().getConflictResolutionAction());
+ profile.setExecutor(executor);
if (!profile.isDryRun()) {
for (PushActions action : actions) {
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/UsernamePasswordAuthenticationProvider.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/UsernamePasswordAuthenticationProvider.java
index 862340c..9e7f712 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/UsernamePasswordAuthenticationProvider.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/UsernamePasswordAuthenticationProvider.java
@@ -142,7 +142,8 @@ public class UsernamePasswordAuthenticationProvider implements AuthenticationPro
if (!authResult.getRight()) {
AuthContextUtils.callAsAdmin(domain.getKey(), () -> {
- provisioningManager.internalSuspend(authResult.getLeft().getKey());
+ provisioningManager.internalSuspend(
+ authResult.getLeft().getKey(), adminUser, "Failed authentication");
return null;
});
}
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
index 8aaaefc..3c67721 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
@@ -31,17 +31,21 @@ public interface AnyObjectWorkflowAdapter extends WorkflowAdapter {
* Create a anyObject.
*
* @param anyObjectCR anyObject to be created and whether to propagate it as active
+ * @param creator username that requested this operation
+ * @param context context information
* @return anyObject just created
*/
- WorkflowResult<String> create(AnyObjectCR anyObjectCR);
+ WorkflowResult<String> create(AnyObjectCR anyObjectCR, String creator, String context);
/**
* Update a anyObject.
*
* @param anyObjectUR modification set to be performed
+ * @param updater username that requested this operation
+ * @param context context information
* @return anyObject just updated and propagations to be performed
*/
- WorkflowResult<AnyObjectUR> update(AnyObjectUR anyObjectUR);
+ WorkflowResult<AnyObjectUR> update(AnyObjectUR anyObjectUR, String updater, String context);
/**
* Delete a anyObject.
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
index 8743d26..3c3bb8a 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
@@ -31,17 +31,21 @@ public interface GroupWorkflowAdapter extends WorkflowAdapter {
* Create a group.
*
* @param groupCR group to be created and whether to propagate it as active
+ * @param creator username that requested this operation
+ * @param context context information
* @return group just created
*/
- WorkflowResult<String> create(GroupCR groupCR);
+ WorkflowResult<String> create(GroupCR groupCR, String creator, String context);
/**
* Update a group.
*
* @param groupUR modification set to be performed
+ * @param updater username that requested this operation
+ * @param context context information
* @return group just updated and propagations to be performed
*/
- WorkflowResult<GroupUR> update(GroupUR groupUR);
+ WorkflowResult<GroupUR> update(GroupUR groupUR, String updater, String context);
/**
* Delete a group.
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/UserWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/UserWorkflowAdapter.java
index c7bb9cb..7d9012f 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/UserWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/UserWorkflowAdapter.java
@@ -32,9 +32,11 @@ public interface UserWorkflowAdapter extends WorkflowAdapter {
* Create an user.
*
* @param userCR user to be created and whether to propagate it as active
+ * @param creator username that requested this operation
+ * @param context context information
* @return user just created
*/
- UserWorkflowResult<Pair<String, Boolean>> create(UserCR userCR);
+ UserWorkflowResult<Pair<String, Boolean>> create(UserCR userCR, String creator, String context);
/**
* Create an user, optionally disabling password policy check.
@@ -42,57 +44,72 @@ public interface UserWorkflowAdapter extends WorkflowAdapter {
* @param userCR user to be created and whether to propagate it as active
* @param disablePwdPolicyCheck disable password policy check?
* @param enabled specify true/false to force active/supended status
+ * @param creator username that requested this operation
+ * @param context context information
* @return user just created
*/
- UserWorkflowResult<Pair<String, Boolean>> create(UserCR userCR, boolean disablePwdPolicyCheck, Boolean enabled);
+ UserWorkflowResult<Pair<String, Boolean>> create(
+ UserCR userCR, boolean disablePwdPolicyCheck, Boolean enabled, String creator, String context);
/**
* Activate an user.
*
* @param userKey user to be activated
* @param token to be verified for activation
+ * @param updater username that requested this operation
+ * @param context context information
* @return user just updated
*/
- UserWorkflowResult<String> activate(String userKey, String token);
+ UserWorkflowResult<String> activate(String userKey, String token, String updater, String context);
/**
* Update an user.
*
* @param userUR modification set to be performed
+ * @param updater username that requested this operation
+ * @param context context information
* @return user just updated and propagations to be performed
*/
- UserWorkflowResult<Pair<UserUR, Boolean>> update(UserUR userUR);
+ UserWorkflowResult<Pair<UserUR, Boolean>> update(UserUR userUR, String updater, String context);
/**
* Suspend an user.
*
* @param key to be suspended
+ * @param updater username that requested this operation
+ * @param context context information
* @return user just suspended
*/
- UserWorkflowResult<String> suspend(String key);
+ UserWorkflowResult<String> suspend(String key, String updater, String context);
/**
* Suspend an user (used by internal authentication process)
*
* @param key to be suspended
+ * @param updater username that requested this operation
+ * @param context context information
* @return user just suspended and information whether to propagate suspension
*/
- Pair<UserWorkflowResult<String>, Boolean> internalSuspend(String key);
+ Pair<UserWorkflowResult<String>, Boolean> internalSuspend(String key, String updater, String context);
/**
* Reactivate an user.
*
* @param userKey user to be reactivated
+ * @param updater username that requested this operation
+ * @param context context information
* @return user just reactivated
*/
- UserWorkflowResult<String> reactivate(String userKey);
+ UserWorkflowResult<String> reactivate(String userKey, String updater, String context);
/**
* Request password reset for an user.
*
* @param userKey user requesting password reset
+ * @param updater username that requested this operation
+ * @param context context information
*/
- void requestPasswordReset(String userKey);
+ void requestPasswordReset(String userKey, String updater, String context);
/**
* Confirm password reset for an user.
@@ -100,9 +117,12 @@ public interface UserWorkflowAdapter extends WorkflowAdapter {
* @param userKey user confirming password reset
* @param token security token
* @param password new password value
+ * @param updater username that requested this operation
+ * @param context context information
* @return user just updated and propagations to be performed
*/
- UserWorkflowResult<Pair<UserUR, Boolean>> confirmPasswordReset(String userKey, String token, String password);
+ UserWorkflowResult<Pair<UserUR, Boolean>> confirmPasswordReset(
+ String userKey, String token, String password, String updater, String context);
/**
* Delete an user.
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
index 5b4a975..8c11d00 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
@@ -31,7 +31,8 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { Throwable.class })
-public abstract class AbstractAnyObjectWorkflowAdapter implements AnyObjectWorkflowAdapter {
+public abstract class AbstractAnyObjectWorkflowAdapter
+ extends AbstractWorkflowAdapter implements AnyObjectWorkflowAdapter {
@Autowired
protected AnyObjectDataBinder dataBinder;
@@ -47,18 +48,22 @@ public abstract class AbstractAnyObjectWorkflowAdapter implements AnyObjectWorkf
return null;
}
- protected abstract WorkflowResult<String> doCreate(AnyObjectCR anyObjectCR);
+ protected abstract WorkflowResult<String> doCreate(AnyObjectCR anyObjectCR, String creator, String context);
@Override
- public WorkflowResult<String> create(final AnyObjectCR anyObjectCR) {
- return doCreate(anyObjectCR);
+ public WorkflowResult<String> create(final AnyObjectCR anyObjectCR, final String creator, final String context) {
+ return doCreate(anyObjectCR, creator, context);
}
- protected abstract WorkflowResult<AnyObjectUR> doUpdate(AnyObject anyObject, AnyObjectUR anyObjectUR);
+ protected abstract WorkflowResult<AnyObjectUR> doUpdate(
+ AnyObject anyObject, AnyObjectUR anyObjectUR, String updater, String context);
@Override
- public WorkflowResult<AnyObjectUR> update(final AnyObjectUR anyObjectUR) {
- WorkflowResult<AnyObjectUR> result = doUpdate(anyObjectDAO.authFind(anyObjectUR.getKey()), anyObjectUR);
+ public WorkflowResult<AnyObjectUR> update(
+ final AnyObjectUR anyObjectUR, final String updater, final String context) {
+
+ WorkflowResult<AnyObjectUR> result = doUpdate(
+ anyObjectDAO.authFind(anyObjectUR.getKey()), anyObjectUR, updater, context);
// re-read to ensure that requester's administration rights are still valid
anyObjectDAO.authFind(anyObjectUR.getKey());
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
index 27d3adf..7c2f46f 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
@@ -31,7 +31,7 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { Throwable.class })
-public abstract class AbstractGroupWorkflowAdapter implements GroupWorkflowAdapter {
+public abstract class AbstractGroupWorkflowAdapter extends AbstractWorkflowAdapter implements GroupWorkflowAdapter {
@Autowired
protected GroupDataBinder dataBinder;
@@ -47,18 +47,18 @@ public abstract class AbstractGroupWorkflowAdapter implements GroupWorkflowAdapt
return null;
}
- protected abstract WorkflowResult<String> doCreate(GroupCR groupCR);
+ protected abstract WorkflowResult<String> doCreate(GroupCR groupCR, String creator, String context);
@Override
- public WorkflowResult<String> create(final GroupCR groupCR) {
- return doCreate(groupCR);
+ public WorkflowResult<String> create(final GroupCR groupCR, final String creator, final String context) {
+ return doCreate(groupCR, creator, context);
}
- protected abstract WorkflowResult<GroupUR> doUpdate(Group group, GroupUR groupUR);
+ protected abstract WorkflowResult<GroupUR> doUpdate(Group group, GroupUR groupUR, String updater, String context);
@Override
- public WorkflowResult<GroupUR> update(final GroupUR groupUR) {
- WorkflowResult<GroupUR> result = doUpdate(groupDAO.authFind(groupUR.getKey()), groupUR);
+ public WorkflowResult<GroupUR> update(final GroupUR groupUR, final String updater, final String context) {
+ WorkflowResult<GroupUR> result = doUpdate(groupDAO.authFind(groupUR.getKey()), groupUR, updater, context);
// re-read to ensure that requester's administration rights are still valid
groupDAO.authFind(groupUR.getKey());
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
index c3bb842..ae41d82 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractUserWorkflowAdapter.java
@@ -34,7 +34,7 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { Throwable.class })
-public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter {
+public abstract class AbstractUserWorkflowAdapter extends AbstractWorkflowAdapter implements UserWorkflowAdapter {
protected static final Logger LOG = LoggerFactory.getLogger(UserWorkflowAdapter.class);
@@ -53,34 +53,44 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
}
@Override
- public UserWorkflowResult<Pair<String, Boolean>> create(final UserCR userCR) {
- return create(userCR, false, null);
+ public UserWorkflowResult<Pair<String, Boolean>> create(
+ final UserCR userCR, final String creator, final String context) {
+
+ return create(userCR, false, null, creator, context);
}
protected abstract UserWorkflowResult<Pair<String, Boolean>> doCreate(
- UserCR userCR, boolean disablePwdPolicyCheck, Boolean enabled);
+ UserCR userCR, boolean disablePwdPolicyCheck, Boolean enabled, String creator, String context);
@Override
public UserWorkflowResult<Pair<String, Boolean>> create(
final UserCR userCR,
final boolean disablePwdPolicyCheck,
- final Boolean enabled) {
+ final Boolean enabled,
+ final String creator,
+ final String context) {
- return doCreate(userCR, disablePwdPolicyCheck, enabled);
+ return doCreate(userCR, disablePwdPolicyCheck, enabled, creator, context);
}
- protected abstract UserWorkflowResult<String> doActivate(User user, String token);
+ protected abstract UserWorkflowResult<String> doActivate(User user, String token, String updater, String context);
@Override
- public UserWorkflowResult<String> activate(final String key, final String token) {
- return doActivate(userDAO.authFind(key), token);
+ public UserWorkflowResult<String> activate(
+ final String key, final String token, final String updater, final String context) {
+
+ return doActivate(userDAO.authFind(key), token, updater, context);
}
- protected abstract UserWorkflowResult<Pair<UserUR, Boolean>> doUpdate(User user, UserUR userUR);
+ protected abstract UserWorkflowResult<Pair<UserUR, Boolean>> doUpdate(
+ User user, UserUR userUR, String updater, String context);
@Override
- public UserWorkflowResult<Pair<UserUR, Boolean>> update(final UserUR userUR) {
- UserWorkflowResult<Pair<UserUR, Boolean>> result = doUpdate(userDAO.authFind(userUR.getKey()), userUR);
+ public UserWorkflowResult<Pair<UserUR, Boolean>> update(
+ final UserUR userUR, final String updater, final String context) {
+
+ UserWorkflowResult<Pair<UserUR, Boolean>> result = doUpdate(
+ userDAO.authFind(userUR.getKey()), userUR, updater, context);
// re-read to ensure that requester's administration rights are still valid
userDAO.authFind(userUR.getKey());
@@ -88,20 +98,22 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
return result;
}
- protected abstract UserWorkflowResult<String> doSuspend(User user);
+ protected abstract UserWorkflowResult<String> doSuspend(User user, String updater, String context);
@Override
- public UserWorkflowResult<String> suspend(final String key) {
+ public UserWorkflowResult<String> suspend(final String key, final String updater, final String context) {
User user = userDAO.authFind(key);
// set suspended flag
user.setSuspended(Boolean.TRUE);
- return doSuspend(user);
+ return doSuspend(user, updater, context);
}
@Override
- public Pair<UserWorkflowResult<String>, Boolean> internalSuspend(final String key) {
+ public Pair<UserWorkflowResult<String>, Boolean> internalSuspend(
+ final String key, final String updater, final String context) {
+
User user = userDAO.authFind(key);
Pair<UserWorkflowResult<String>, Boolean> result = null;
@@ -116,16 +128,16 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
// set suspended flag
user.setSuspended(Boolean.TRUE);
- result = Pair.of(doSuspend(user), enforce.getValue());
+ result = Pair.of(doSuspend(user, updater, context), enforce.getValue());
}
return result;
}
- protected abstract UserWorkflowResult<String> doReactivate(User user);
+ protected abstract UserWorkflowResult<String> doReactivate(User user, String updater, String context);
@Override
- public UserWorkflowResult<String> reactivate(final String key) {
+ public UserWorkflowResult<String> reactivate(final String key, final String updater, final String context) {
User user = userDAO.authFind(key);
// reset failed logins
@@ -134,24 +146,24 @@ public abstract class AbstractUserWorkflowAdapter implements UserWorkflowAdapter
// reset suspended flag
user.setSuspended(Boolean.FALSE);
- return doReactivate(user);
+ return doReactivate(user, updater, context);
}
- protected abstract void doRequestPasswordReset(User user);
+ protected abstract void doRequestPasswordReset(User user, String updater, String context);
@Override
- public void requestPasswordReset(final String key) {
- doRequestPasswordReset(userDAO.authFind(key));
+ public void requestPasswordReset(final String key, final String updater, final String context) {
+ doRequestPasswordReset(userDAO.authFind(key), updater, context);
}
protected abstract UserWorkflowResult<Pair<UserUR, Boolean>> doConfirmPasswordReset(
- User user, String token, String password);
+ User user, String token, String password, String updater, String context);
@Override
public UserWorkflowResult<Pair<UserUR, Boolean>> confirmPasswordReset(
- final String key, final String token, final String password) {
+ final String key, final String token, final String password, final String updater, final String context) {
- return doConfirmPasswordReset(userDAO.authFind(key), token, password);
+ return doConfirmPasswordReset(userDAO.authFind(key), token, password, updater, context);
}
protected abstract void doDelete(User user);
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnnotatedEntity.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractWorkflowAdapter.java
similarity index 59%
rename from core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnnotatedEntity.java
rename to core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractWorkflowAdapter.java
index 7792b41..422ec1f 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnnotatedEntity.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractWorkflowAdapter.java
@@ -16,25 +16,24 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.syncope.core.persistence.api.entity;
+package org.apache.syncope.core.workflow.java;
import java.util.Date;
+import org.apache.syncope.core.persistence.api.entity.Any;
-public interface AnnotatedEntity extends Entity {
+public abstract class AbstractWorkflowAdapter {
- Date getCreationDate();
+ protected void metadata(final Any<?> any, final String username, final String context) {
+ Date now = new Date();
- String getCreator();
+ if (any.getCreationDate() == null) {
+ any.setCreationDate(now);
+ any.setCreator(username);
+ any.setCreationContext(context);
+ }
- Date getLastChangeDate();
-
- String getLastModifier();
-
- void setCreationDate(Date creationDate);
-
- void setCreator(String creator);
-
- void setLastChangeDate(Date lastChangeDate);
-
- void setLastModifier(String lastModifier);
+ any.setLastModifier(username);
+ any.setLastChangeDate(now);
+ any.setLastChangeContext(context);
+ }
}
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
index 154e697..fa1e6d2 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
@@ -31,9 +31,12 @@ import org.apache.syncope.core.provisioning.api.WorkflowResult;
public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAdapter {
@Override
- protected WorkflowResult<String> doCreate(final AnyObjectCR anyObjectCR) {
+ protected WorkflowResult<String> doCreate(
+ final AnyObjectCR anyObjectCR, final String creator, final String context) {
+
AnyObject anyObject = entityFactory.newEntity(AnyObject.class);
dataBinder.create(anyObject, anyObjectCR);
+ metadata(anyObject, creator, context);
anyObject = anyObjectDAO.save(anyObject);
PropagationByResource<String> propByRes = new PropagationByResource<>();
@@ -43,8 +46,13 @@ public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAd
}
@Override
- protected WorkflowResult<AnyObjectUR> doUpdate(final AnyObject anyObject, final AnyObjectUR anyObjectUR) {
+ protected WorkflowResult<AnyObjectUR> doUpdate(
+ final AnyObject anyObject, final AnyObjectUR anyObjectUR, final String updater, final String context) {
+
PropagationByResource<String> propByRes = dataBinder.update(anyObject, anyObjectUR);
+ metadata(anyObject, updater, context);
+ anyObjectDAO.save(anyObject);
+
return new WorkflowResult<>(anyObjectUR, propByRes, "update");
}
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
index 29cce60..ba3f8c7 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
@@ -31,9 +31,10 @@ import org.apache.syncope.core.provisioning.api.WorkflowResult;
public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
@Override
- protected WorkflowResult<String> doCreate(final GroupCR groupCR) {
+ protected WorkflowResult<String> doCreate(final GroupCR groupCR, final String creator, final String context) {
Group group = entityFactory.newEntity(Group.class);
dataBinder.create(group, groupCR);
+ metadata(group, creator, context);
group = groupDAO.saveAndRefreshDynMemberships(group);
PropagationByResource<String> propByRes = new PropagationByResource<>();
@@ -43,8 +44,13 @@ public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
}
@Override
- protected WorkflowResult<GroupUR> doUpdate(final Group group, final GroupUR groupUR) {
+ protected WorkflowResult<GroupUR> doUpdate(
+ final Group group, final GroupUR groupUR, final String updater, final String context) {
+
PropagationByResource<String> propByRes = dataBinder.update(group, groupUR);
+ metadata(group, updater, context);
+ groupDAO.save(group);
+
return new WorkflowResult<>(groupUR, propByRes, "update");
}
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
index 1acb999..66ec874 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
@@ -43,7 +43,9 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
protected UserWorkflowResult<Pair<String, Boolean>> doCreate(
final UserCR userCR,
final boolean disablePwdPolicyCheck,
- final Boolean enabled) {
+ final Boolean enabled,
+ final String creator,
+ final String context) {
User user = entityFactory.newEntity(User.class);
dataBinder.create(user, userCR);
@@ -66,6 +68,7 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
user.setSuspended(!enabled);
}
+ metadata(user, creator, context);
user.setStatus(status);
user = userDAO.save(user);
@@ -85,11 +88,14 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
}
@Override
- protected UserWorkflowResult<String> doActivate(final User user, final String token) {
+ protected UserWorkflowResult<String> doActivate(
+ final User user, final String token, final String updater, final String context) {
+
if (!user.checkToken(token)) {
throw new WorkflowException(new IllegalArgumentException("Wrong token: " + token + " for " + user));
}
+ metadata(user, updater, context);
user.removeToken();
user.setStatus("active");
User updated = userDAO.save(user);
@@ -98,9 +104,15 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
}
@Override
- protected UserWorkflowResult<Pair<UserUR, Boolean>> doUpdate(final User user, final UserUR userUR) {
+ protected UserWorkflowResult<Pair<UserUR, Boolean>> doUpdate(
+ final User user, final UserUR userUR, final String updater, final String context) {
+
Pair<PropagationByResource<String>, PropagationByResource<Pair<String, String>>> propInfo =
dataBinder.update(user, userUR);
+
+ metadata(user, updater, context);
+ userDAO.save(user);
+
return new UserWorkflowResult<>(
Pair.of(userUR, !user.isSuspended()),
propInfo.getLeft(),
@@ -109,7 +121,8 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
}
@Override
- protected UserWorkflowResult<String> doSuspend(final User user) {
+ protected UserWorkflowResult<String> doSuspend(final User user, final String updater, final String context) {
+ metadata(user, updater, context);
user.setStatus("suspended");
User updated = userDAO.save(user);
@@ -117,7 +130,8 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
}
@Override
- protected UserWorkflowResult<String> doReactivate(final User user) {
+ protected UserWorkflowResult<String> doReactivate(final User user, final String updater, final String context) {
+ metadata(user, updater, context);
user.setStatus("active");
User updated = userDAO.save(user);
@@ -125,16 +139,17 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
}
@Override
- protected void doRequestPasswordReset(final User user) {
+ protected void doRequestPasswordReset(final User user, final String updater, final String context) {
user.generateToken(
confParamOps.get(AuthContextUtils.getDomain(), "token.length", 256, Integer.class),
confParamOps.get(AuthContextUtils.getDomain(), "token.expireTime", 60, Integer.class));
+ metadata(user, updater, context);
userDAO.save(user);
}
@Override
protected UserWorkflowResult<Pair<UserUR, Boolean>> doConfirmPasswordReset(
- final User user, final String token, final String password) {
+ final User user, final String token, final String password, final String updater, final String context) {
if (!user.checkToken(token)) {
throw new WorkflowException(new IllegalArgumentException("Wrong token: " + token + " for " + user));
@@ -149,7 +164,7 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
resources(userDAO.findAllResourceKeys(user.getKey())).
value(password).build());
- return doUpdate(user, userUR);
+ return doUpdate(user, userUR, updater, context);
}
@Override
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
index 88bdcac..f6511cd 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
@@ -37,21 +37,29 @@ public class CamelAnyObjectProvisioningManager
extends AbstractCamelProvisioningManager implements AnyObjectProvisioningManager {
@Override
- public Pair<String, List<PropagationStatus>> create(final AnyObjectCR req, final boolean nullPriorityAsync) {
- return create(req, Set.of(), nullPriorityAsync);
+ public Pair<String, List<PropagationStatus>> create(
+ final AnyObjectCR req, final boolean nullPriorityAsync, final String creator, final String context) {
+
+ return create(req, Set.of(), nullPriorityAsync, creator, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
@SuppressWarnings("unchecked")
public Pair<String, List<PropagationStatus>> create(
- final AnyObjectCR req, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final AnyObjectCR req,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:createAnyObjectPort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("creator", creator);
+ props.put("context", context);
sendMessage("direct:createAnyObject", req, props);
@@ -66,22 +74,28 @@ public class CamelAnyObjectProvisioningManager
@Override
public Pair<AnyObjectUR, List<PropagationStatus>> update(
- final AnyObjectUR anyUR, final boolean nullPriorityAsync) {
+ final AnyObjectUR anyUR, final boolean nullPriorityAsync, final String updater, final String context) {
- return update(anyUR, Set.of(), nullPriorityAsync);
+ return update(anyUR, Set.of(), nullPriorityAsync, updater, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
@SuppressWarnings("unchecked")
public Pair<AnyObjectUR, List<PropagationStatus>> update(
- final AnyObjectUR anyUR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final AnyObjectUR anyUR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:updateAnyObjectPort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:updateAnyObject", anyUR, props);
@@ -95,21 +109,32 @@ public class CamelAnyObjectProvisioningManager
}
@Override
- public List<PropagationStatus> delete(final String anyObjectObjectKey, final boolean nullPriorityAsync) {
- return delete(anyObjectObjectKey, Set.of(), nullPriorityAsync);
+ public List<PropagationStatus> delete(
+ final String anyObjectObjectKey,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
+
+ return delete(anyObjectObjectKey, Set.of(), nullPriorityAsync, eraser, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> delete(
- final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final String key,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:deleteAnyObjectPort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("eraser", eraser);
+ props.put("context", context);
sendMessage("direct:deleteAnyObject", key, props);
@@ -123,10 +148,14 @@ public class CamelAnyObjectProvisioningManager
}
@Override
- public String unlink(final AnyObjectUR anyObjectUR) {
+ public String unlink(final AnyObjectUR anyObjectUR, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:unlinkAnyObjectPort");
- sendMessage("direct:unlinkAnyObject", anyObjectUR);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:unlinkAnyObject", anyObjectUR, props);
Exchange exchange = pollingConsumer.receive();
@@ -138,10 +167,14 @@ public class CamelAnyObjectProvisioningManager
}
@Override
- public String link(final AnyObjectUR anyObjectUR) {
+ public String link(final AnyObjectUR anyObjectUR, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:linkAnyObjectPort");
- sendMessage("direct:linkAnyObject", anyObjectUR);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:linkAnyObject", anyObjectUR, props);
Exchange exchange = pollingConsumer.receive();
@@ -155,13 +188,19 @@ public class CamelAnyObjectProvisioningManager
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> provision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:provisionAnyObjectPort");
Map<String, Object> props = new HashMap<>();
props.put("resources", resources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:provisionAnyObject", key, props);
@@ -177,13 +216,19 @@ public class CamelAnyObjectProvisioningManager
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> deprovision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:deprovisionAnyObjectPort");
Map<String, Object> props = new HashMap<>();
props.put("resources", resources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:deprovisionAnyObject", key, props);
@@ -195,5 +240,4 @@ public class CamelAnyObjectProvisioningManager
return exchange.getIn().getBody(List.class);
}
-
}
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
index 37fb5cf..85b451e 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
@@ -38,12 +38,16 @@ public class CamelGroupProvisioningManager
@Override
@SuppressWarnings("unchecked")
- public Pair<String, List<PropagationStatus>> create(final GroupCR req, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> create(
+ final GroupCR req, final boolean nullPriorityAsync, final String creator, final String context) {
+
PollingConsumer pollingConsumer = getConsumer("direct:createGroupPort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", Set.of());
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("creator", creator);
+ props.put("context", context);
sendMessage("direct:createGroup", req, props);
@@ -63,7 +67,9 @@ public class CamelGroupProvisioningManager
final GroupCR req,
final Map<String, String> groupOwnerMap,
final Set<String> excludedResources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:createGroupInPullPort");
@@ -71,6 +77,8 @@ public class CamelGroupProvisioningManager
props.put("groupOwnerMap", groupOwnerMap);
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("creator", creator);
+ props.put("context", context);
sendMessage("direct:createGroupInPull", req, props);
@@ -84,21 +92,29 @@ public class CamelGroupProvisioningManager
}
@Override
- public Pair<GroupUR, List<PropagationStatus>> update(final GroupUR groupUR, final boolean nullPriorityAsync) {
- return update(groupUR, Set.of(), nullPriorityAsync);
+ public Pair<GroupUR, List<PropagationStatus>> update(
+ final GroupUR groupUR, final boolean nullPriorityAsync, final String updater, final String context) {
+
+ return update(groupUR, Set.of(), nullPriorityAsync, updater, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
@SuppressWarnings("unchecked")
public Pair<GroupUR, List<PropagationStatus>> update(
- final GroupUR groupUR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final GroupUR groupUR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:updateGroupPort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:updateGroup", groupUR, props);
@@ -112,21 +128,29 @@ public class CamelGroupProvisioningManager
}
@Override
- public List<PropagationStatus> delete(final String key, final boolean nullPriorityAsync) {
- return delete(key, Set.of(), nullPriorityAsync);
+ public List<PropagationStatus> delete(
+ final String key, final boolean nullPriorityAsync, final String eraser, final String context) {
+
+ return delete(key, Set.of(), nullPriorityAsync, eraser, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> delete(
- final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final String key,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:deleteGroupPort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("eraser", eraser);
+ props.put("context", context);
sendMessage("direct:deleteGroup", key, props);
@@ -140,10 +164,14 @@ public class CamelGroupProvisioningManager
}
@Override
- public String unlink(final GroupUR groupUR) {
+ public String unlink(final GroupUR groupUR, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:unlinkGroupPort");
- sendMessage("direct:unlinkGroup", groupUR);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:unlinkGroup", groupUR, props);
Exchange exchange = pollingConsumer.receive();
@@ -155,10 +183,14 @@ public class CamelGroupProvisioningManager
}
@Override
- public String link(final GroupUR groupUR) {
+ public String link(final GroupUR groupUR, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:linkGroupPort");
- sendMessage("direct:linkGroup", groupUR);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:linkGroup", groupUR, props);
Exchange exchange = pollingConsumer.receive();
@@ -172,13 +204,19 @@ public class CamelGroupProvisioningManager
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> provision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:provisionGroupPort");
Map<String, Object> props = new HashMap<>();
props.put("resources", resources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:provisionGroup", key, props);
@@ -194,13 +232,19 @@ public class CamelGroupProvisioningManager
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> deprovision(
- final String key, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String key,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:deprovisionGroupPort");
Map<String, Object> props = new HashMap<>();
props.put("resources", resources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:deprovisionGroup", key, props);
@@ -212,5 +256,4 @@ public class CamelGroupProvisioningManager
return exchange.getIn().getBody(List.class);
}
-
}
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
index 4b7f46e..f3da2e0 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
@@ -45,8 +45,10 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
private static final Logger LOG = LoggerFactory.getLogger(CamelUserProvisioningManager.class);
@Override
- public Pair<String, List<PropagationStatus>> create(final UserCR req, final boolean nullPriorityAsync) {
- return create(req, false, null, Set.of(), nullPriorityAsync);
+ public Pair<String, List<PropagationStatus>> create(
+ final UserCR req, final boolean nullPriorityAsync, final String creator, final String context) {
+
+ return create(req, false, null, Set.of(), nullPriorityAsync, creator, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@@ -57,7 +59,9 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
final boolean disablePwdPolicyCheck,
final Boolean enabled,
final Set<String> excludedResources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String creator,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:createPort");
@@ -66,6 +70,8 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
props.put("enabled", enabled);
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("creator", creator);
+ props.put("context", context);
sendMessage("direct:createUser", req, props);
@@ -80,11 +86,15 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
@Override
@SuppressWarnings("unchecked")
- public Pair<UserUR, List<PropagationStatus>> update(final UserUR userUR, final boolean nullPriorityAsync) {
+ public Pair<UserUR, List<PropagationStatus>> update(
+ final UserUR userUR, final boolean nullPriorityAsync, final String updater, final String context) {
+
PollingConsumer pollingConsumer = getConsumer("direct:updatePort");
Map<String, Object> props = new HashMap<>();
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:updateUser", userUR, props);
@@ -99,27 +109,39 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
@Override
public Pair<UserUR, List<PropagationStatus>> update(
- final UserUR userUR, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final UserUR userUR,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
- return update(userUR, new ProvisioningReport(), null, excludedResources, nullPriorityAsync);
+ return update(userUR, new ProvisioningReport(), null, excludedResources, nullPriorityAsync, updater, context);
}
@Override
- public List<PropagationStatus> delete(final String key, final boolean nullPriorityAsync) {
- return delete(key, Set.of(), nullPriorityAsync);
+ public List<PropagationStatus> delete(
+ final String key, final boolean nullPriorityAsync, final String eraser, final String context) {
+
+ return delete(key, Set.of(), nullPriorityAsync, eraser, context);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> delete(
- final String key, final Set<String> excludedResources, final boolean nullPriorityAsync) {
+ final String key,
+ final Set<String> excludedResources,
+ final boolean nullPriorityAsync,
+ final String eraser,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:deletePort");
Map<String, Object> props = new HashMap<>();
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("eraser", eraser);
+ props.put("context", context);
sendMessage("direct:deleteUser", key, props);
@@ -133,10 +155,14 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
}
@Override
- public String unlink(final UserUR userUR) {
+ public String unlink(final UserUR userUR, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:unlinkPort");
- sendMessage("direct:unlinkUser", userUR);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:unlinkUser", userUR, props);
Exchange exchange = pollingConsumer.receive();
@@ -149,7 +175,9 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
@Override
@SuppressWarnings("unchecked")
- public Pair<String, List<PropagationStatus>> activate(final StatusR statusR, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> activate(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater, final String context) {
+
PollingConsumer pollingConsumer = getConsumer("direct:statusPort");
Map<String, Object> props = new HashMap<>();
@@ -157,6 +185,8 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
props.put("key", statusR.getKey());
props.put("statusR", statusR);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
if (statusR.isOnSyncope()) {
sendMessage("direct:activateUser", statusR.getKey(), props);
@@ -177,13 +207,17 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
@Override
@SuppressWarnings("unchecked")
- public Pair<String, List<PropagationStatus>> reactivate(final StatusR statusR, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> reactivate(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater, final String context) {
+
PollingConsumer pollingConsumer = getConsumer("direct:statusPort");
Map<String, Object> props = new HashMap<>();
props.put("key", statusR.getKey());
props.put("statusR", statusR);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
if (statusR.isOnSyncope()) {
sendMessage("direct:reactivateUser", statusR.getKey(), props);
@@ -204,13 +238,17 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
@Override
@SuppressWarnings("unchecked")
- public Pair<String, List<PropagationStatus>> suspend(final StatusR statusR, final boolean nullPriorityAsync) {
+ public Pair<String, List<PropagationStatus>> suspend(
+ final StatusR statusR, final boolean nullPriorityAsync, final String updater, final String context) {
+
PollingConsumer pollingConsumer = getConsumer("direct:statusPort");
Map<String, Object> props = new HashMap<>();
props.put("key", statusR.getKey());
props.put("statusR", statusR);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
if (statusR.isOnSyncope()) {
sendMessage("direct:suspendUser", statusR.getKey(), props);
@@ -230,10 +268,14 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
}
@Override
- public String link(final UserUR userUR) {
+ public String link(final UserUR userUR, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:linkPort");
- sendMessage("direct:linkUser", userUR);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:linkUser", userUR, props);
Exchange exchange = pollingConsumer.receive();
@@ -251,7 +293,9 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
final boolean changePwd,
final String password,
final Collection<String> resources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:provisionPort");
@@ -261,6 +305,8 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
props.put("password", password);
props.put("resources", resources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:provisionUser", key, props);
@@ -276,13 +322,19 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
@Override
@SuppressWarnings("unchecked")
public List<PropagationStatus> deprovision(
- final String user, final Collection<String> resources, final boolean nullPriorityAsync) {
+ final String user,
+ final Collection<String> resources,
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:deprovisionPort");
Map<String, Object> props = new HashMap<>();
props.put("resources", resources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:deprovisionUser", user, props);
@@ -303,7 +355,9 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
final ProvisioningReport result,
final Boolean enabled,
final Set<String> excludedResources,
- final boolean nullPriorityAsync) {
+ final boolean nullPriorityAsync,
+ final String updater,
+ final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:updateInPullPort");
@@ -313,6 +367,8 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
props.put("enabled", enabled);
props.put("excludedResources", excludedResources);
props.put("nullPriorityAsync", nullPriorityAsync);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:updateUserInPull", userUR, props);
@@ -339,10 +395,14 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
}
@Override
- public void internalSuspend(final String key) {
+ public void internalSuspend(final String key, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:internalSuspendUserPort");
- sendMessage("direct:internalSuspendUser", key);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:internalSuspendUser", key, props);
Exchange exchange = pollingConsumer.receive();
@@ -352,10 +412,14 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
}
@Override
- public void requestPasswordReset(final String key) {
+ public void requestPasswordReset(final String key, final String updater, final String context) {
PollingConsumer pollingConsumer = getConsumer("direct:requestPwdResetPort");
- sendMessage("direct:requestPwdReset", key);
+ Map<String, Object> props = new HashMap<>();
+ props.put("updater", updater);
+ props.put("context", context);
+
+ sendMessage("direct:requestPwdReset", key, props);
Exchange exchange = pollingConsumer.receive();
@@ -365,13 +429,17 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
}
@Override
- public void confirmPasswordReset(final String key, final String token, final String password) {
+ public void confirmPasswordReset(
+ final String key, final String token, final String password, final String updater, final String context) {
+
PollingConsumer pollingConsumer = getConsumer("direct:confirmPwdResetPort");
Map<String, Object> props = new HashMap<>();
props.put("key", key);
props.put("token", token);
props.put("password", password);
+ props.put("updater", updater);
+ props.put("context", context);
sendMessage("direct:confirmPwdReset", key, props);
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
index 8bc34fa..93274ed 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
@@ -19,7 +19,7 @@
package org.apache.syncope.core.provisioning.camel.component;
import java.util.Map;
-
+import javax.annotation.Resource;
import org.apache.camel.Endpoint;
import org.apache.camel.support.DefaultComponent;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -31,8 +31,6 @@ import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecu
import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
import org.springframework.beans.factory.annotation.Autowired;
-import javax.annotation.Resource;
-
public class PropagateComponent extends DefaultComponent {
@Autowired
@@ -60,8 +58,11 @@ public class PropagateComponent extends DefaultComponent {
protected String adminUser;
@Override
- protected Endpoint createEndpoint(final String uri, final String remaining,
+ protected Endpoint createEndpoint(
+ final String uri,
+ final String remaining,
final Map<String, Object> parameters) throws Exception {
+
PropagateType type = PropagateType.valueOf(remaining);
PropagateEndpoint endpoint = new PropagateEndpoint(uri, this);
endpoint.setPropagateType(type);
@@ -72,10 +73,20 @@ public class PropagateComponent extends DefaultComponent {
endpoint.setAnyObjectDAO(anyObjectDAO);
endpoint.setGroupDataBinder(groupDataBinder);
endpoint.setUwfAdapter(uwfAdapter);
- endpoint.setExecutor(adminUser);
-
+
+ String executor = (String) parameters.get("creator");
+ if (executor == null) {
+ executor = (String) parameters.get("updater");
+ }
+ if (executor == null) {
+ executor = (String) parameters.get("eraser");
+ }
+ if (executor == null) {
+ executor = adminUser;
+ }
+ endpoint.setExecutor(executor);
+
setProperties(endpoint, parameters);
return endpoint;
}
-
}
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
index 7eac9e0..c101498 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
@@ -61,18 +61,18 @@ public class CreateProducer extends AbstractProducer {
created.getPropByLinkedAccount(),
((UserCR) actual).getVirAttrs(),
excludedResources);
- PropagationReporter reporter = getPropagationTaskExecutor()
- .execute(taskInfos, nullPriorityAsync, getExecutor());
+ PropagationReporter reporter = getPropagationTaskExecutor().
+ execute(taskInfos, nullPriorityAsync, getExecutor());
- exchange.getMessage().setBody(
- Pair.of(created.getResult().getKey(), reporter.getStatuses()));
+ exchange.getMessage().setBody(Pair.of(created.getResult().getKey(), reporter.getStatuses()));
} else if (actual instanceof AnyCR) {
WorkflowResult<String> created = (WorkflowResult<String>) exchange.getIn().getBody();
if (actual instanceof GroupCR && isPull()) {
Map<String, String> groupOwnerMap = exchange.getProperty("groupOwnerMap", Map.class);
- ((GroupCR) actual).getPlainAttr(StringUtils.EMPTY).ifPresent(groupOwner
- -> groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next()));
+ ((GroupCR) actual).getPlainAttr(StringUtils.EMPTY).
+ ifPresent(groupOwner -> groupOwnerMap.put(
+ created.getResult(), groupOwner.getValues().iterator().next()));
List<PropagationTaskInfo> taskInfos = getPropagationManager().getCreateTasks(
AnyTypeKind.GROUP,
@@ -93,7 +93,7 @@ public class CreateProducer extends AbstractProducer {
((AnyCR) actual).getVirAttrs(),
excludedResources);
PropagationReporter reporter =
- getPropagationTaskExecutor().execute(taskInfos, nullPriorityAsync, getExecutor());
+ getPropagationTaskExecutor().execute(taskInfos, nullPriorityAsync, getExecutor());
exchange.getMessage().setBody(Pair.of(created.getResult(), reporter.getStatuses()));
}
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/StatusProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/StatusProducer.java
index a30289f..b81cd1e 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/StatusProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/StatusProducer.java
@@ -63,17 +63,19 @@ public class StatusProducer extends AbstractProducer {
Boolean enabled = exchange.getProperty("enabled", Boolean.class);
String key = exchange.getProperty("key", String.class);
+ String updater = exchange.getProperty("updater", String.class);
+ String context = exchange.getProperty("context", String.class);
if (enabled != null) {
User user = userDAO.find(key);
WorkflowResult<String> enableUpdate = null;
if (user.isSuspended() == null) {
- enableUpdate = uwfAdapter.activate(key, null);
+ enableUpdate = uwfAdapter.activate(key, null, updater, context);
} else if (enabled && user.isSuspended()) {
- enableUpdate = uwfAdapter.reactivate(key);
+ enableUpdate = uwfAdapter.reactivate(key, updater, context);
} else if (!enabled && !user.isSuspended()) {
- enableUpdate = uwfAdapter.suspend(key);
+ enableUpdate = uwfAdapter.suspend(key, updater, context);
}
if (enableUpdate != null) {
@@ -109,7 +111,7 @@ public class StatusProducer extends AbstractProducer {
null,
null);
PropagationReporter reporter =
- getPropagationTaskExecutor().execute(taskInfos, nullPriorityAsync, getExecutor());
+ getPropagationTaskExecutor().execute(taskInfos, nullPriorityAsync, getExecutor());
exchange.getMessage().setBody(Pair.of(updated.getResult(), reporter.getStatuses()));
}
diff --git a/ext/camel/provisioning-camel/src/main/resources/anyObjectRoutes.xml b/ext/camel/provisioning-camel/src/main/resources/anyObjectRoutes.xml
index cf49f31..717ed3c 100644
--- a/ext/camel/provisioning-camel/src/main/resources/anyObjectRoutes.xml
+++ b/ext/camel/provisioning-camel/src/main/resources/anyObjectRoutes.xml
@@ -25,7 +25,7 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean ref="awfAdapter" method="create(${body})"/>
+ <bean ref="awfAdapter" method="create(${body},${exchangeProperty.creator},${exchangeProperty.context})"/>
<to uri="propagate:create?anyTypeKind=ANY_OBJECT"/>
<to uri="direct:createAnyObjectPort"/>
<doCatch>
@@ -44,7 +44,7 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean ref="awfAdapter" method="update(${body})"/>
+ <bean ref="awfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<to uri="propagate:update?anyTypeKind=ANY_OBJECT"/>
<to uri="direct:updateAnyObjectPort"/>
<doCatch>
@@ -79,7 +79,7 @@ under the License.
<route id="unlinkAnyObject">
<from uri="direct:unlinkAnyObject"/>
<doTry>
- <bean ref="awfAdapter" method="update(${body})"/>
+ <bean ref="awfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<setBody>
<simple>${body.getResult}</simple>
</setBody>
@@ -97,7 +97,7 @@ under the License.
<route id="linkAnyObject">
<from uri="direct:linkAnyObject"/>
<doTry>
- <bean ref="awfAdapter" method="update(${body})"/>
+ <bean ref="awfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<setBody>
<simple>${body.getResult}</simple>
</setBody>
diff --git a/ext/camel/provisioning-camel/src/main/resources/groupRoutes.xml b/ext/camel/provisioning-camel/src/main/resources/groupRoutes.xml
index 1cfaf90..4b5d5fb 100644
--- a/ext/camel/provisioning-camel/src/main/resources/groupRoutes.xml
+++ b/ext/camel/provisioning-camel/src/main/resources/groupRoutes.xml
@@ -25,7 +25,7 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean ref="gwfAdapter" method="create(${body})"/>
+ <bean ref="gwfAdapter" method="create(${body},${exchangeProperty.creator},${exchangeProperty.context})"/>
<to uri="propagate:create?anyTypeKind=GROUP"/>
<to uri="direct:createGroupPort"/>
<doCatch>
@@ -44,7 +44,7 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean ref="gwfAdapter" method="create(${body})"/>
+ <bean ref="gwfAdapter" method="create(${body},${exchangeProperty.creator},${exchangeProperty.context})"/>
<to uri="propagate:create?anyTypeKind=GROUP&pull=true"/>
<to uri="direct:createGroupInPullPort"/>
<doCatch>
@@ -63,7 +63,7 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean ref="gwfAdapter" method="update(${body})"/>
+ <bean ref="gwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<to uri="propagate:update?anyTypeKind=GROUP"/>
<to uri="direct:updateGroupPort"/>
<doCatch>
@@ -98,7 +98,7 @@ under the License.
<route id="unlinkGroup">
<from uri="direct:unlinkGroup"/>
<doTry>
- <bean ref="gwfAdapter" method="update(${body})"/>
+ <bean ref="gwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<setBody>
<simple>${body.getResult}</simple>
</setBody>
@@ -116,7 +116,7 @@ under the License.
<route id="linkGroup">
<from uri="direct:linkGroup"/>
<doTry>
- <bean ref="gwfAdapter" method="update(${body})"/>
+ <bean ref="gwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<setBody>
<simple>${body.getResult}</simple>
</setBody>
diff --git a/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml b/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
index eb7ab3f..d40d8f0 100644
--- a/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
+++ b/ext/camel/provisioning-camel/src/main/resources/userRoutes.xml
@@ -25,7 +25,11 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean method="create(${body},${exchangeProperty.disablePwdPolicyCheck},${exchangeProperty.enabled})"
+ <bean method="create(${body},
+ ${exchangeProperty.disablePwdPolicyCheck},
+ ${exchangeProperty.enabled},
+ ${exchangeProperty.creator},
+ ${exchangeProperty.context})"
ref="uwfAdapter" />
<to uri="propagate:create?anyTypeKind=USER"/>
<to uri="direct:createPort"/>
@@ -45,7 +49,7 @@ under the License.
<simple>${body}</simple>
</setProperty>
<doTry>
- <bean ref="uwfAdapter" method="update(${body})"/>
+ <bean ref="uwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<to uri="propagate:update?anyTypeKind=USER"/>
<to uri="direct:updatePort"/>
<doCatch>
@@ -61,7 +65,7 @@ under the License.
<route id="updateUserInPull">
<from uri="direct:updateUserInPull"/>
<doTry>
- <bean ref="uwfAdapter" method="update(${body})"/>
+ <bean ref="uwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<to uri="direct:userInPull"/>
<doCatch>
<exception>java.lang.RuntimeException</exception>
@@ -102,7 +106,7 @@ under the License.
<route id="unlinkUser">
<from uri="direct:unlinkUser"/>
<doTry>
- <bean ref="uwfAdapter" method="update(${body})"/>
+ <bean ref="uwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<setBody>
<simple>${body.getResult.getKey}</simple>
</setBody>
@@ -120,7 +124,7 @@ under the License.
<route id="linkUser">
<from uri="direct:linkUser"/>
<doTry>
- <bean ref="uwfAdapter" method="update(${body})"/>
+ <bean ref="uwfAdapter" method="update(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<setBody>
<simple>${body.getResult.getKey}</simple>
</setBody>
@@ -138,7 +142,10 @@ under the License.
<route id="activateUser">
<from uri="direct:activateUser"/>
<doTry>
- <bean ref="uwfAdapter" method="activate(${body}, ${exchangeProperty.token})"/>
+ <bean ref="uwfAdapter" method="activate(${body},
+ ${exchangeProperty.token},
+ ${exchangeProperty.updater},
+ ${exchangeProperty.context})"/>
<to uri="direct:userStatusPropagation"/>
<doCatch>
<exception>java.lang.RuntimeException</exception>
@@ -153,7 +160,7 @@ under the License.
<route id="reactivateUser">
<from uri="direct:reactivateUser"/>
<doTry>
- <bean ref="uwfAdapter" method="reactivate(${body})"/>
+ <bean ref="uwfAdapter" method="reactivate(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<to uri="direct:userStatusPropagation"/>
<doCatch>
<exception>java.lang.RuntimeException</exception>
@@ -168,7 +175,7 @@ under the License.
<route id="suspendUser">
<from uri="direct:suspendUser"/>
<doTry>
- <bean ref="uwfAdapter" method="suspend(${body})"/>
+ <bean ref="uwfAdapter" method="suspend(${body},${exchangeProperty.updater},${exchangeProperty.context})"/>
<to uri="direct:userStatusPropagation"/>
<doCatch>
<exception>java.lang.RuntimeException</exception>
@@ -201,7 +208,9 @@ under the License.
<route id="internalSuspendUser">
<from uri="direct:internalSuspendUser"/>
<doTry>
- <bean ref="uwfAdapter" method="internalSuspend(${body})"/>
+ <bean ref="uwfAdapter" method="internalSuspend(${body},
+ ${exchangeProperty.updater},
+ ${exchangeProperty.context})"/>
<to uri="propagate:suspend?anyTypeKind=USER"/>
<to uri="direct:internalSuspendUserPort"/>
<doCatch>
@@ -217,7 +226,9 @@ under the License.
<route id="requestPwdReset">
<from uri="direct:requestPwdReset"/>
<doTry>
- <bean ref="uwfAdapter" method="requestPasswordReset(${body})"/>
+ <bean ref="uwfAdapter" method="requestPasswordReset(${body},
+ ${exchangeProperty.updater},
+ ${exchangeProperty.context})"/>
<to uri="direct:requestPwdResetPort"/>
<doCatch>
<exception>java.lang.RuntimeException</exception>
@@ -232,7 +243,11 @@ under the License.
<route id="confirmPwdReset">
<from uri="direct:confirmPwdReset"/>
<doTry>
- <bean ref="uwfAdapter" method="confirmPasswordReset(${exchangeProperty.key},${exchangeProperty.token},${exchangeProperty.password})"/>
+ <bean ref="uwfAdapter" method="confirmPasswordReset(${exchangeProperty.key},
+ ${exchangeProperty.token},
+ ${exchangeProperty.password},
+ ${exchangeProperty.updater},
+ ${exchangeProperty.context})"/>
<to uri="propagate:confirmPasswordReset?anyTypeKind=USER"/>
<to uri="direct:confirmPwdResetPort"/>
<doCatch>
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
index 211c2f0..14b5041 100644
--- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -109,9 +109,11 @@ public class ElasticsearchUtils {
field("realm", any.getRealm().getFullPath()).
field("anyType", any.getType().getKey()).
field("creationDate", any.getCreationDate()).
+ field("creationContext", any.getCreationContext()).
field("creator", any.getCreator()).
field("lastChangeDate", any.getLastChangeDate()).
- field("lastModified", any.getLastModifier()).
+ field("lastModifier", any.getLastModifier()).
+ field("lastChangeContext", any.getLastChangeContext()).
field("status", any.getStatus()).
field("resources",
any instanceof User
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 849d903..1981775 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
@@ -58,7 +58,7 @@ public class ElasticsearchReindex extends AbstractSchedTaskJobDelegate {
private AnyObjectDAO anyObjectDAO;
@Override
- protected String doExecute(final boolean dryRun) throws JobExecutionException {
+ protected String doExecute(final boolean dryRun, final String executor) throws JobExecutionException {
if (!dryRun) {
LOG.debug("Start rebuilding indexes");
diff --git a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java
index ee96967..2eff029 100644
--- a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java
+++ b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableUserWorkflowAdapter.java
@@ -85,7 +85,9 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
protected UserWorkflowResult<Pair<String, Boolean>> doCreate(
final UserCR userCR,
final boolean disablePwdPolicyCheck,
- final Boolean enabled) {
+ final Boolean enabled,
+ final String creator,
+ final String context) {
Map<String, Object> variables = new HashMap<>();
variables.put(FlowableRuntimeUtils.WF_EXECUTOR, AuthContextUtils.getUsername());
@@ -126,6 +128,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
user.removeClearPassword();
}
+ metadata(user, creator, context);
FlowableRuntimeUtils.updateStatus(engine, procInst.getProcessInstanceId(), user);
User created = userDAO.save(user);
@@ -206,7 +209,9 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
}
@Override
- protected UserWorkflowResult<String> doActivate(final User user, final String token) {
+ protected UserWorkflowResult<String> doActivate(
+ final User user, final String token, final String updater, final String context) {
+
String procInstID = FlowableRuntimeUtils.getWFProcInstID(engine, user.getKey());
Map<String, Object> variables = new HashMap<>(2);
@@ -215,6 +220,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
Set<String> tasks = doExecuteNextTask(procInstID, user, variables);
+ metadata(user, updater, context);
FlowableRuntimeUtils.updateStatus(engine, procInstID, user);
User updated = userDAO.save(user);
@@ -226,7 +232,9 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
}
@Override
- protected UserWorkflowResult<Pair<UserUR, Boolean>> doUpdate(final User user, final UserUR userUR) {
+ protected UserWorkflowResult<Pair<UserUR, Boolean>> doUpdate(
+ final User user, final UserUR userUR, final String updater, final String context) {
+
String procInstID = FlowableRuntimeUtils.getWFProcInstID(engine, user.getKey());
// save some existing variable values for later processing, after actual update is made
@@ -248,6 +256,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
Set<String> tasks = doExecuteNextTask(procInstID, user, variables);
+ metadata(user, updater, context);
FlowableRuntimeUtils.updateStatus(engine, procInstID, user);
User updated = userDAO.save(user);
@@ -298,11 +307,13 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
}
@Override
- protected UserWorkflowResult<String> doSuspend(final User user) {
+ protected UserWorkflowResult<String> doSuspend(final User user, final String updater, final String context) {
String procInstID = FlowableRuntimeUtils.getWFProcInstID(engine, user.getKey());
Set<String> performedTasks =
doExecuteNextTask(procInstID, user, Map.of(FlowableRuntimeUtils.TASK, "suspend"));
+
+ metadata(user, updater, context);
FlowableRuntimeUtils.updateStatus(engine, procInstID, user);
User updated = userDAO.save(user);
@@ -314,13 +325,14 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
}
@Override
- protected UserWorkflowResult<String> doReactivate(final User user) {
+ protected UserWorkflowResult<String> doReactivate(final User user, final String updater, final String context) {
String procInstID = FlowableRuntimeUtils.getWFProcInstID(engine, user.getKey());
Set<String> performedTasks =
doExecuteNextTask(procInstID, user, Map.of(FlowableRuntimeUtils.TASK, "reactivate"));
- FlowableRuntimeUtils.updateStatus(engine, procInstID, user);
+ metadata(user, updater, context);
+ FlowableRuntimeUtils.updateStatus(engine, procInstID, user);
User updated = userDAO.save(user);
engine.getRuntimeService().removeVariable(procInstID, FlowableRuntimeUtils.TASK);
@@ -331,7 +343,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
}
@Override
- protected void doRequestPasswordReset(final User user) {
+ protected void doRequestPasswordReset(final User user, final String updater, final String context) {
Map<String, Object> variables = new HashMap<>(3);
variables.put(FlowableRuntimeUtils.USER_TO, dataBinder.getUserTO(user, true));
variables.put(FlowableRuntimeUtils.TASK, "requestPasswordReset");
@@ -340,6 +352,8 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
String procInstID = FlowableRuntimeUtils.getWFProcInstID(engine, user.getKey());
doExecuteNextTask(procInstID, user, variables);
+
+ metadata(user, updater, context);
userDAO.save(user);
variables.keySet().forEach(key -> engine.getRuntimeService().removeVariable(procInstID, key));
@@ -349,7 +363,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
@Override
protected UserWorkflowResult<Pair<UserUR, Boolean>> doConfirmPasswordReset(
- final User user, final String token, final String password) {
+ final User user, final String token, final String password, final String updater, final String context) {
Map<String, Object> variables = new HashMap<>(5);
variables.put(FlowableRuntimeUtils.TOKEN, token);
@@ -362,6 +376,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter imp
Set<String> tasks = doExecuteNextTask(procInstID, user, variables);
+ metadata(user, updater, context);
userDAO.save(user);
variables.keySet().forEach(key -> engine.getRuntimeService().removeVariable(procInstID, key));
diff --git a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java
index 587dfa5..f6d13fe 100644
--- a/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java
+++ b/ext/oidcclient/logic/src/main/java/org/apache/syncope/core/logic/oidc/OIDCUserManager.java
@@ -61,6 +61,8 @@ public class OIDCUserManager {
private static final Logger LOG = LoggerFactory.getLogger(OIDCUserManager.class);
+ private static final String OIDC_CLIENT_CONTEXT = "ODIC Client";
+
@Autowired
private InboundMatcher inboundMatcher;
@@ -183,7 +185,8 @@ public class OIDCUserManager {
userCR.setUsername(email);
}
- Pair<String, List<PropagationStatus>> created = provisioningManager.create(userCR, false);
+ Pair<String, List<PropagationStatus>> created =
+ provisioningManager.create(userCR, false, userCR.getUsername(), OIDC_CLIENT_CONTEXT);
userTO = binder.getUserTO(created.getKey());
for (OIDCProviderActions action : actions) {
@@ -207,7 +210,8 @@ public class OIDCUserManager {
userUR = action.beforeUpdate(userUR, responseTO);
}
- Pair<UserUR, List<PropagationStatus>> updated = provisioningManager.update(userUR, false);
+ Pair<UserUR, List<PropagationStatus>> updated =
+ provisioningManager.update(userUR, false, userTO.getUsername(), OIDC_CLIENT_CONTEXT);
userTO = binder.getUserTO(updated.getLeft().getKey());
for (OIDCProviderActions action : actions) {
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
index 798b4aa..8c04f42 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
@@ -63,6 +63,8 @@ public class SAML2UserManager {
private static final Logger LOG = LoggerFactory.getLogger(SAML2UserManager.class);
+ private static final String SAML2SP_CONTEXT = "SAML 2.0 SP";
+
@Autowired
private SAML2IdPDAO idpDAO;
@@ -204,7 +206,8 @@ public class SAML2UserManager {
userCR.setUsername(nameID);
}
- Pair<String, List<PropagationStatus>> created = provisioningManager.create(userCR, false);
+ Pair<String, List<PropagationStatus>> created =
+ provisioningManager.create(userCR, false, userCR.getUsername(), SAML2SP_CONTEXT);
userTO = binder.getUserTO(created.getKey());
for (SAML2IdPActions action : actions) {
@@ -228,7 +231,8 @@ public class SAML2UserManager {
userUR = action.beforeUpdate(userUR, responseTO);
}
- Pair<UserUR, List<PropagationStatus>> updated = provisioningManager.update(userUR, false);
+ Pair<UserUR, List<PropagationStatus>> updated =
+ provisioningManager.update(userUR, false, userTO.getUsername(), SAML2SP_CONTEXT);
userTO = binder.getUserTO(updated.getLeft().getKey());
for (SAML2IdPActions action : actions) {
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 ce6d940..223873c 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
@@ -29,7 +29,7 @@ import org.quartz.JobExecutionException;
public class TestSampleJobDelegate extends AbstractSchedTaskJobDelegate {
@Override
- protected String doExecute(final boolean dryRun) throws JobExecutionException {
+ protected String doExecute(final boolean dryRun, final String executor) throws JobExecutionException {
for (int i = 0; i < 2; i++) {
LOG.debug("TestSampleJob#doExecute round {} time {}", i, new Date().toString());
try {
@@ -61,5 +61,4 @@ public class TestSampleJobDelegate extends AbstractSchedTaskJobDelegate {
protected boolean hasToBeRegistered(final TaskExec execution) {
return true;
}
-
}
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
index 7eb3d5d..657c55f 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
@@ -63,6 +63,8 @@ public class AnyObjectITCase extends AbstractITCase {
AnyObjectTO anyObjectTO = createAnyObject(anyObjectCR).getEntity();
assertNotNull(anyObjectTO);
+ assertEquals("REST", anyObjectTO.getCreationContext());
+ assertEquals("REST", anyObjectTO.getLastChangeContext());
ConnObjectTO connObjectTO =
resourceService.readConnObject(RESOURCE_NAME_DBSCRIPTED, anyObjectTO.getType(), anyObjectTO.getKey());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index 3a3e537..27cb5aa 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -363,6 +363,10 @@ public class PullTaskITCase extends AbstractTaskITCase {
// 1. verify execution status
assertEquals(ExecStatus.SUCCESS, ExecStatus.valueOf(execution.getStatus()));
+ // SYNCOPE-898
+ PullTaskTO task = taskService.read(TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", false);
+ assertEquals(SyncopeConstants.ROOT_REALM, task.getDestinationRealm());
+
// 2. verify that pulled group is found
PagedResult<GroupTO> matchingGroups = groupService.search(new AnyQuery.Builder().realm(
SyncopeConstants.ROOT_REALM).
@@ -370,10 +374,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
build());
assertNotNull(matchingGroups);
assertEquals(1, matchingGroups.getResult().size());
- // SYNCOPE-898
- PullTaskTO task = taskService.read(TaskType.PULL, "1e419ca4-ea81-4493-a14f-28b90113686d", false);
- assertEquals("/", task.getDestinationRealm());
- assertEquals("/", matchingGroups.getResult().get(0).getRealm());
+ assertEquals(SyncopeConstants.ROOT_REALM, matchingGroups.getResult().get(0).getRealm());
// 3. verify that pulled user is found
PagedResult<UserTO> matchingUsers = userService.search(
@@ -396,9 +397,18 @@ public class PullTaskITCase extends AbstractTaskITCase {
// Check for SYNCOPE-1343
assertEquals("odd", matchingUsers.getResult().get(0).getPlainAttr("title").get().getValues().get(0));
+ PagedResult<UserTO> matchByLastChangeContext = userService.search(
+ new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+ fiql(SyncopeClient.getUserSearchConditionBuilder().is("lastChangeContext").
+ equalTo("*PullTask " + task.getKey() + "*").query()).
+ build());
+ assertNotNull(matchByLastChangeContext);
+ assertTrue(matchByLastChangeContext.getResult().contains(matchingUsers.getResult().get(0)));
+
GroupTO groupTO = matchingGroups.getResult().get(0);
assertNotNull(groupTO);
assertEquals("testLDAPGroup", groupTO.getName());
+ assertTrue(groupTO.getLastChangeContext().contains("PullTask " + task.getKey()));
assertEquals("true", groupTO.getPlainAttr("show").get().getValues().get(0));
assertEquals(matchingUsers.getResult().get(0).getKey(), groupTO.getUserOwner());
assertNull(groupTO.getGroupOwner());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
index 6940012..7d9da1f 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
@@ -73,10 +73,7 @@ public class SearchITCase extends AbstractITCase {
is("fullname").equalTo("*o*").and("fullname").equalTo("*i*").query()).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
-
- for (UserTO user : matchingUsers.getResult()) {
- assertNotNull(user);
- }
+ matchingUsers.getResult().stream().forEach(Assertions::assertNotNull);
// ISNULL
matchingUsers = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
@@ -169,13 +166,20 @@ public class SearchITCase extends AbstractITCase {
}
}
+ PagedResult<GroupTO> matchingGroups = groupService.search(
+ new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+ fiql(SyncopeClient.getGroupSearchConditionBuilder().
+ is("creationContext").equalTo("REST").query()).
+ build());
+ assertNotNull(matchingGroups);
+ assertTrue(matchingGroups.getTotalCount() > 0);
+
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inGroups(group.getKey()).query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
-
assertTrue(matchingUsers.getResult().stream().
anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
}
@@ -237,7 +241,8 @@ public class SearchITCase extends AbstractITCase {
public void searchUserByResourceName() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
- fiql(SyncopeClient.getUserSearchConditionBuilder().hasResources(RESOURCE_NAME_MAPPINGS2).query()).
+ fiql(SyncopeClient.getUserSearchConditionBuilder().
+ hasResources(RESOURCE_NAME_MAPPINGS2).query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
@@ -325,7 +330,8 @@ public class SearchITCase extends AbstractITCase {
public void nested() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
- fiql("((fullname==*o*,fullname==*i*);$resources!=ws-target-resource-1)").page(1).size(2).build());
+ fiql("((fullname==*o*,fullname==*i*);$resources!=ws-target-resource-1)").
+ page(1).size(2).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());