You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2015/03/17 16:10:01 UTC
syncope git commit: [SYNCOPE-648] Add matching/unmatching events to
notification and audit
Repository: syncope
Updated Branches:
refs/heads/1_2_X b63021933 -> 89d5ad43c
[SYNCOPE-648] Add matching/unmatching events to notification and audit
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/89d5ad43
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/89d5ad43
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/89d5ad43
Branch: refs/heads/1_2_X
Commit: 89d5ad43cf26454092dbd04446a0d9a6f5192f4a
Parents: b630219
Author: Marco Di Sabatino Di Diodoro <md...@apache.org>
Authored: Tue Mar 17 16:09:35 2015 +0100
Committer: Marco Di Sabatino Di Diodoro <md...@apache.org>
Committed: Tue Mar 17 16:09:35 2015 +0100
----------------------------------------------------------------------
.../syncope/common/types/MatchingRule.java | 7 ++-
.../syncope/common/types/UnmatchingRule.java | 7 ++-
.../core/rest/controller/LoggerController.java | 18 +++++++-
.../impl/AbstractSubjectPushResultHandler.java | 12 +++--
.../impl/AbstractSubjectSyncResultHandler.java | 47 +++++++++++++++++---
.../syncope/core/sync/impl/AbstractSyncJob.java | 33 +++++++++++---
.../syncope/core/rest/TaskTestITCase.java | 44 ++++++++++++++++++
7 files changed, 150 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/common/src/main/java/org/apache/syncope/common/types/MatchingRule.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/syncope/common/types/MatchingRule.java b/common/src/main/java/org/apache/syncope/common/types/MatchingRule.java
index 51933fc..ff36dec 100644
--- a/common/src/main/java/org/apache/syncope/common/types/MatchingRule.java
+++ b/common/src/main/java/org/apache/syncope/common/types/MatchingRule.java
@@ -49,6 +49,11 @@ public enum MatchingRule {
/**
* Just link resource without performing any (de-)provisioning operation.
*/
- LINK
+ LINK;
+
+ public static String toEventName(final MatchingRule rule) {
+ return new StringBuilder(MatchingRule.class.getSimpleName()).
+ append("_").append(rule.name()).toString().toLowerCase();
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/common/src/main/java/org/apache/syncope/common/types/UnmatchingRule.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/syncope/common/types/UnmatchingRule.java b/common/src/main/java/org/apache/syncope/common/types/UnmatchingRule.java
index d57aacf..224cf63 100644
--- a/common/src/main/java/org/apache/syncope/common/types/UnmatchingRule.java
+++ b/common/src/main/java/org/apache/syncope/common/types/UnmatchingRule.java
@@ -42,6 +42,11 @@ public enum UnmatchingRule {
* Just unlink resource without performing any (de-)provisioning operation.
* In case of sync task UNLINK and IGNORE will coincide.
*/
- UNLINK
+ UNLINK;
+
+ public static String toEventName(final UnmatchingRule rule) {
+ return new StringBuilder(UnmatchingRule.class.getSimpleName()).
+ append("_").append(rule.name()).toString().toLowerCase();
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java b/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java
index a4e53b8..f38d0b2 100644
--- a/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java
+++ b/core/src/main/java/org/apache/syncope/core/rest/controller/LoggerController.java
@@ -41,6 +41,8 @@ import org.apache.syncope.common.types.LoggerType;
import org.apache.syncope.common.types.ResourceOperation;
import org.apache.syncope.common.util.BeanUtils;
import org.apache.syncope.common.SyncopeClientException;
+import org.apache.syncope.common.types.MatchingRule;
+import org.apache.syncope.common.types.UnmatchingRule;
import org.apache.syncope.core.persistence.beans.ExternalResource;
import org.apache.syncope.core.persistence.beans.SchedTask;
import org.apache.syncope.core.persistence.beans.SyncTask;
@@ -217,7 +219,7 @@ public class LoggerController extends AbstractTransactionalController<LoggerTO>
final String packageSearchPath =
ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ ClassUtils.convertClassNameToResourcePath(
- SystemPropertyUtils.resolvePlaceholders(this.getClass().getPackage().getName()))
+ SystemPropertyUtils.resolvePlaceholders(this.getClass().getPackage().getName()))
+ "/" + "**/*.class";
final Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
@@ -239,7 +241,7 @@ public class LoggerController extends AbstractTransactionalController<LoggerTO>
}
}
}
-
+
//SYNCOPE-608
final EventCategoryTO authenticationControllerEvents = new EventCategoryTO();
authenticationControllerEvents.setCategory("AuthenticationController");
@@ -270,6 +272,18 @@ public class LoggerController extends AbstractTransactionalController<LoggerTO>
pushEventCategoryTO.getEvents().add(resourceOperation.name().toLowerCase());
}
+ for (UnmatchingRule unmatching : UnmatchingRule.values()) {
+ String event = UnmatchingRule.toEventName(unmatching);
+ syncEventCategoryTO.getEvents().add(event);
+ pushEventCategoryTO.getEvents().add(event);
+ }
+
+ for (MatchingRule matching : MatchingRule.values()) {
+ String event = MatchingRule.toEventName(matching);
+ syncEventCategoryTO.getEvents().add(event);
+ pushEventCategoryTO.getEvents().add(event);
+ }
+
events.add(propEventCategoryTO);
events.add(syncEventCategoryTO);
events.add(pushEventCategoryTO);
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java b/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java
index f8cb658..e8954e9 100644
--- a/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java
+++ b/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectPushResultHandler.java
@@ -132,7 +132,7 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe
} else {
try {
if (beforeObj == null) {
- operation = profile.getSyncTask().getUnmatchingRule().name().toLowerCase();
+ operation = UnmatchingRule.toEventName(profile.getSyncTask().getUnmatchingRule());
result.setOperation(getResourceOperation(profile.getSyncTask().getUnmatchingRule()));
switch (profile.getSyncTask().getUnmatchingRule()) {
@@ -172,12 +172,15 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe
}
break;
+ case IGNORE:
+ LOG.debug("Ignored subjectId: {}", subjectId);
+ break;
default:
// do nothing
}
} else {
- operation = profile.getSyncTask().getMatchingRule().name().toLowerCase();
+ operation = MatchingRule.toEventName(profile.getSyncTask().getMatchingRule());
result.setOperation(getResourceOperation(profile.getSyncTask().getMatchingRule()));
switch (profile.getSyncTask().getMatchingRule()) {
@@ -240,6 +243,9 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe
}
break;
+ case IGNORE:
+ LOG.debug("Ignored subjectId: {}", subjectId);
+ break;
default:
// do nothing
}
@@ -263,7 +269,7 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe
} finally {
notificationManager.createTasks(
AuditElements.EventCategoryType.PUSH,
- AttributableType.USER.name().toLowerCase(),
+ attrUtil.getType().name().toLowerCase(),
profile.getSyncTask().getResource().getName(),
operation,
resultStatus,
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectSyncResultHandler.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectSyncResultHandler.java b/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectSyncResultHandler.java
index ff9bc3d..9a51ebe 100644
--- a/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectSyncResultHandler.java
+++ b/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSubjectSyncResultHandler.java
@@ -31,7 +31,9 @@ import org.apache.syncope.common.mod.AbstractSubjectMod;
import org.apache.syncope.common.to.AbstractSubjectTO;
import org.apache.syncope.common.types.AuditElements;
import org.apache.syncope.common.types.AuditElements.Result;
+import org.apache.syncope.common.types.MatchingRule;
import org.apache.syncope.common.types.ResourceOperation;
+import org.apache.syncope.common.types.UnmatchingRule;
import org.apache.syncope.core.persistence.beans.SyncTask;
import org.apache.syncope.core.persistence.dao.NotFoundException;
import org.apache.syncope.core.persistence.dao.UserDAO;
@@ -126,7 +128,7 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
_delta = action.beforeAssign(this.getProfile(), _delta, transformed);
}
- create(transformed, _delta, attrUtil, "assign", result);
+ create(transformed, _delta, attrUtil, UnmatchingRule.toEventName(UnmatchingRule.ASSIGN), result);
}
return Collections.singletonList(result);
@@ -161,7 +163,7 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
_delta = action.beforeProvision(this.getProfile(), _delta, transformed);
}
- create(transformed, _delta, attrUtil, "provision", result);
+ create(transformed, _delta, attrUtil, UnmatchingRule.toEventName(UnmatchingRule.PROVISION), result);
}
return Collections.<SyncResult>singletonList(result);
@@ -278,7 +280,7 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
resultStatus = Result.FAILURE;
}
}
- audit("update", resultStatus, before, output, delta);
+ audit(MatchingRule.toEventName(MatchingRule.UPDATE), resultStatus, before, output, delta);
}
updResults.add(result);
}
@@ -361,7 +363,9 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
resultStatus = Result.FAILURE;
}
}
- audit(unlink ? "unassign" : "deprovision", resultStatus, before, output, delta);
+ audit(unlink
+ ? MatchingRule.toEventName(MatchingRule.UNASSIGN)
+ : MatchingRule.toEventName(MatchingRule.DEPROVISION), resultStatus, before, output, delta);
}
updResults.add(result);
}
@@ -444,7 +448,8 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
resultStatus = Result.FAILURE;
}
}
- audit(unlink ? "unlink" : "link", resultStatus, before, output, delta);
+ audit(unlink ? MatchingRule.toEventName(MatchingRule.UNLINK)
+ : MatchingRule.toEventName(MatchingRule.LINK), resultStatus, before, output, delta);
}
updResults.add(result);
}
@@ -500,7 +505,7 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
action.after(this.getProfile(), delta, before, result);
}
- audit("delete", resultStatus, before, output, delta);
+ audit(ResourceOperation.DELETE.name().toLowerCase(), resultStatus, before, output, delta);
}
delResults.add(result);
@@ -517,6 +522,30 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
return delResults;
}
+ private List<SyncResult> ignore(SyncDelta delta, final AttributableUtil attrUtil, final boolean matching)
+ throws JobExecutionException {
+
+ LOG.debug("Subject to ignore {}", delta.getObject().getUid().getUidValue());
+
+ final List<SyncResult> ignoreResults = new ArrayList<SyncResult>();
+ final SyncResult result = new SyncResult();
+
+ result.setId(null);
+ result.setName(delta.getObject().getUid().getUidValue());
+ result.setOperation(ResourceOperation.NONE);
+ result.setSubjectType(attrUtil.getType());
+ result.setStatus(SyncResult.Status.SUCCESS);
+ ignoreResults.add(result);
+
+ if (!profile.isDryRun()) {
+ audit(matching
+ ? MatchingRule.toEventName(MatchingRule.IGNORE)
+ : UnmatchingRule.toEventName(UnmatchingRule.IGNORE), Result.SUCCESS, null, null, delta);
+ }
+
+ return ignoreResults;
+ }
+
/**
* Look into SyncDelta and take necessary profile.getActions() (create / update / delete) on user(s)/role(s).
*
@@ -566,6 +595,9 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
case PROVISION:
profile.getResults().addAll(create(delta, attrUtil));
break;
+ case IGNORE:
+ profile.getResults().addAll(ignore(delta, attrUtil, false));
+ break;
default:
// do nothing
}
@@ -586,6 +618,9 @@ public abstract class AbstractSubjectSyncResultHandler extends AbstractSyncopeRe
case UNLINK:
profile.getResults().addAll(link(delta, subjectIds, attrUtil, true));
break;
+ case IGNORE:
+ profile.getResults().addAll(ignore(delta, attrUtil, true));
+ break;
default:
// do nothing
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java b/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java
index cabeb4f..0124082 100644
--- a/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java
+++ b/core/src/main/java/org/apache/syncope/core/sync/impl/AbstractSyncJob.java
@@ -116,12 +116,14 @@ public abstract class AbstractSyncJob<T extends AbstractSyncTask, A extends Abst
List<SyncResult> uFailUpdate = new ArrayList<SyncResult>();
List<SyncResult> uSuccDelete = new ArrayList<SyncResult>();
List<SyncResult> uFailDelete = new ArrayList<SyncResult>();
+ List<SyncResult> uSuccNone = new ArrayList<SyncResult>();
List<SyncResult> rSuccCreate = new ArrayList<SyncResult>();
List<SyncResult> rFailCreate = new ArrayList<SyncResult>();
List<SyncResult> rSuccUpdate = new ArrayList<SyncResult>();
List<SyncResult> rFailUpdate = new ArrayList<SyncResult>();
List<SyncResult> rSuccDelete = new ArrayList<SyncResult>();
List<SyncResult> rFailDelete = new ArrayList<SyncResult>();
+ List<SyncResult> rSuccNone = new ArrayList<SyncResult>();
for (SyncResult syncResult : syncResults) {
switch (syncResult.getStatus()) {
@@ -169,6 +171,20 @@ public abstract class AbstractSyncJob<T extends AbstractSyncTask, A extends Abst
}
break;
+ case NONE:
+ switch (syncResult.getSubjectType()) {
+ case USER:
+ uSuccNone.add(syncResult);
+ break;
+
+ case ROLE:
+ rSuccNone.add(syncResult);
+ break;
+
+ default:
+ }
+ break;
+
default:
}
break;
@@ -232,13 +248,16 @@ public abstract class AbstractSyncJob<T extends AbstractSyncTask, A extends Abst
append("[updated/failures]: ").append(uSuccUpdate.size()).append('/').append(uFailUpdate.size()).
append(' ').
append("[deleted/failures]: ").append(uSuccDelete.size()).append('/').append(uFailDelete.size()).
- append('\n');
+ append(' ').
+ append("[ignored]: ").append(uSuccNone.size()).append('\n');
report.append("Roles ").
append("[created/failures]: ").append(rSuccCreate.size()).append('/').append(rFailCreate.size()).
append(' ').
append("[updated/failures]: ").append(rSuccUpdate.size()).append('/').append(rFailUpdate.size()).
append(' ').
- append("[deleted/failures]: ").append(rSuccDelete.size()).append('/').append(rFailDelete.size());
+ append("[deleted/failures]: ").append(rSuccDelete.size()).append('/').append(rFailDelete.size()).
+ append(' ').
+ append("[ignored]: ").append(rSuccNone.size());
// Failures
if (syncTraceLevel == TraceLevel.FAILURES || syncTraceLevel == TraceLevel.ALL) {
@@ -276,13 +295,17 @@ public abstract class AbstractSyncJob<T extends AbstractSyncTask, A extends Abst
.append("\nUsers updated:\n")
.append(SyncResult.produceReport(uSuccUpdate, syncTraceLevel))
.append("\nUsers deleted:\n")
- .append(SyncResult.produceReport(uSuccDelete, syncTraceLevel));
+ .append(SyncResult.produceReport(uSuccDelete, syncTraceLevel))
+ .append("\nUsers ignored:\n")
+ .append(SyncResult.produceReport(uSuccNone, syncTraceLevel));
report.append("\n\nRoles created:\n")
.append(SyncResult.produceReport(rSuccCreate, syncTraceLevel))
.append("\nRoles updated:\n")
.append(SyncResult.produceReport(rSuccUpdate, syncTraceLevel))
.append("\nRoles deleted:\n")
- .append(SyncResult.produceReport(rSuccDelete, syncTraceLevel));
+ .append(SyncResult.produceReport(rSuccDelete, syncTraceLevel))
+ .append("\nRoles ignored:\n")
+ .append(SyncResult.produceReport(rSuccNone, syncTraceLevel));
}
return report.toString();
@@ -316,7 +339,7 @@ public abstract class AbstractSyncJob<T extends AbstractSyncTask, A extends Abst
} catch (Exception e) {
final String msg = String.
format("Connector instance bean for resource %s and connInstance %s not found",
- syncTask.getResource(), syncTask.getResource().getConnector());
+ syncTask.getResource(), syncTask.getResource().getConnector());
throw new JobExecutionException(msg, e);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/89d5ad43/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java b/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
index 468b8f9..0cc137a 100644
--- a/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
+++ b/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
@@ -1385,4 +1385,48 @@ public class TaskTestITCase extends AbstractTest {
}
}
}
+
+ @Test
+ public void issueSYNCOPE648() {
+ //1. Create Push Task
+ final PushTaskTO task = new PushTaskTO();
+ task.setName("Test create Push");
+ task.setResource(RESOURCE_NAME_LDAP);
+ task.setUserFilter(
+ SyncopeClient.getUserSearchConditionBuilder().is("username").equalTo("_NO_ONE_").query());
+ task.setRoleFilter(
+ SyncopeClient.getRoleSearchConditionBuilder().is("name").equalTo("citizen").query());
+ task.setMatchingRule(MatchingRule.IGNORE);
+ task.setUnmatchingRule(UnmatchingRule.IGNORE);
+
+ final Response response = taskService.create(task);
+ final PushTaskTO actual = getObject(response.getLocation(), TaskService.class, PushTaskTO.class);
+ assertNotNull(actual);
+
+ // 2. Create notification
+ NotificationTO notification = new NotificationTO();
+ notification.setTraceLevel(TraceLevel.FAILURES);
+ notification.getEvents().add("[PushTask]:[role]:[resource-ldap]:[matchingrule_ignore]:[SUCCESS]");
+ notification.getEvents().add("[PushTask]:[role]:[resource-ldap]:[unmatchingrule_ignore]:[SUCCESS]");
+
+ notification.getStaticRecipients().add("issueyncope648@syncope.apache.org");
+ notification.setSelfAsRecipient(false);
+ notification.setRecipientAttrName("email");
+ notification.setRecipientAttrType(IntMappingType.UserSchema);
+
+ notification.setSender("syncope648@syncope.apache.org");
+ String subject = "Test notification";
+ notification.setSubject(subject);
+ notification.setTemplate("optin");
+ notification.setActive(true);
+
+ Response responseNotification = notificationService.create(notification);
+ notification = getObject(responseNotification.getLocation(), NotificationService.class, NotificationTO.class);
+ assertNotNull(notification);
+
+ execSyncTask(actual.getId(), 50, false);
+
+ NotificationTaskTO taskTO = findNotificationTaskBySender("syncope648@syncope.apache.org");
+ assertNotNull(taskTO);
+ }
}