Return-Path: X-Original-To: apmail-syncope-commits-archive@www.apache.org Delivered-To: apmail-syncope-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 5FA151786A for ; Thu, 6 Nov 2014 08:46:41 +0000 (UTC) Received: (qmail 72892 invoked by uid 500); 6 Nov 2014 08:46:41 -0000 Delivered-To: apmail-syncope-commits-archive@syncope.apache.org Received: (qmail 72860 invoked by uid 500); 6 Nov 2014 08:46:41 -0000 Mailing-List: contact commits-help@syncope.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@syncope.apache.org Delivered-To: mailing list commits@syncope.apache.org Received: (qmail 72851 invoked by uid 99); 6 Nov 2014 08:46:41 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 06 Nov 2014 08:46:41 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 0717F930CCE; Thu, 6 Nov 2014 08:46:41 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: fmartelli@apache.org To: commits@syncope.apache.org Message-Id: <1a213456df5a4984b0209bb239389379@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: [SYNCOPE-598] fixed Date: Thu, 6 Nov 2014 08:46:41 +0000 (UTC) Repository: syncope Updated Branches: refs/heads/1_2_X 84587034c -> 4d264368e [SYNCOPE-598] fixed Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/4d264368 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/4d264368 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/4d264368 Branch: refs/heads/1_2_X Commit: 4d264368ed1df29e13690e9c6b05b651a366f273 Parents: 8458703 Author: fmartelli Authored: Thu Nov 6 09:46:13 2014 +0100 Committer: fmartelli Committed: Thu Nov 6 09:46:13 2014 +0100 ---------------------------------------------------------------------- .../impl/AbstractSubjectPushResultHandler.java | 60 +++++----- .../apache/syncope/core/sync/impl/PushJob.java | 4 +- .../core/sync/impl/RolePushResultHandler.java | 2 +- .../syncope/core/rest/TaskTestITCase.java | 119 ++++++++++++++++++- 4 files changed, 151 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/4d264368/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 a34e634..f8cb658 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 @@ -73,9 +73,9 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe protected abstract ConnectorObject getRemoteObject(final String accountId); @Transactional - public boolean handle(final AbstractSubject subject) { + public boolean handle(final long subjectId) { try { - doHandle(subject); + doHandle(subjectId); return true; } catch (JobExecutionException e) { LOG.error("Synchronization failed", e); @@ -83,30 +83,30 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe } } - protected final void doHandle(final AbstractSubject subject) + protected final void doHandle(final long subjectId) throws JobExecutionException { if (profile.getResults() == null) { profile.setResults(new ArrayList()); } - final AbstractSubject toBeHandled = getSubject(subject.getId()); + final AbstractSubject subject = getSubject(subjectId); - final AttributableUtil attrUtil = AttributableUtil.getInstance(toBeHandled); + final AttributableUtil attrUtil = AttributableUtil.getInstance(subject); final SyncResult result = new SyncResult(); profile.getResults().add(result); - result.setId(toBeHandled.getId()); + result.setId(subject.getId()); result.setSubjectType(attrUtil.getType()); - result.setName(getName(toBeHandled)); + result.setName(getName(subject)); - final Boolean enabled = toBeHandled instanceof SyncopeUser && profile.getSyncTask().isSyncStatus() - ? ((SyncopeUser) toBeHandled).isSuspended() ? Boolean.FALSE : Boolean.TRUE + final Boolean enabled = subject instanceof SyncopeUser && profile.getSyncTask().isSyncStatus() + ? ((SyncopeUser) subject).isSuspended() ? Boolean.FALSE : Boolean.TRUE : null; LOG.debug("Propagating {} with ID {} towards {}", - attrUtil.getType(), toBeHandled.getId(), profile.getSyncTask().getResource()); + attrUtil.getType(), subject.getId(), profile.getSyncTask().getResource()); Object output = null; Result resultStatus = null; @@ -138,37 +138,37 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe switch (profile.getSyncTask().getUnmatchingRule()) { case ASSIGN: for (PushActions action : profile.getActions()) { - action.beforeAssign(this.getProfile(), toBeHandled); + action.beforeAssign(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformCreate()) { LOG.debug("PushTask not configured for create"); } else { - assign(toBeHandled, status); + assign(subject, status); } break; case PROVISION: for (PushActions action : profile.getActions()) { - action.beforeProvision(this.getProfile(), toBeHandled); + action.beforeProvision(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformCreate()) { LOG.debug("PushTask not configured for create"); } else { - provision(toBeHandled, status); + provision(subject, status); } break; case UNLINK: for (PushActions action : profile.getActions()) { - action.beforeUnlink(this.getProfile(), toBeHandled); + action.beforeUnlink(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformUpdate()) { LOG.debug("PushTask not configured for update"); } else { - link(toBeHandled, true); + link(subject, true); } break; @@ -183,60 +183,60 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe switch (profile.getSyncTask().getMatchingRule()) { case UPDATE: for (PushActions action : profile.getActions()) { - action.beforeUpdate(this.getProfile(), toBeHandled); + action.beforeUpdate(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformUpdate()) { LOG.debug("PushTask not configured for update"); } else { - update(toBeHandled, status); + update(subject, status); } break; case DEPROVISION: for (PushActions action : profile.getActions()) { - action.beforeDeprovision(this.getProfile(), toBeHandled); + action.beforeDeprovision(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformDelete()) { LOG.debug("PushTask not configured for delete"); } else { - deprovision(toBeHandled); + deprovision(subject); } break; case UNASSIGN: for (PushActions action : profile.getActions()) { - action.beforeUnassign(this.getProfile(), toBeHandled); + action.beforeUnassign(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformDelete()) { LOG.debug("PushTask not configured for delete"); } else { - unassign(toBeHandled); + unassign(subject); } break; case LINK: for (PushActions action : profile.getActions()) { - action.beforeLink(this.getProfile(), toBeHandled); + action.beforeLink(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformUpdate()) { LOG.debug("PushTask not configured for update"); } else { - link(toBeHandled, false); + link(subject, false); } break; case UNLINK: for (PushActions action : profile.getActions()) { - action.beforeUnlink(this.getProfile(), toBeHandled); + action.beforeUnlink(this.getProfile(), subject); } if (!profile.getSyncTask().isPerformUpdate()) { LOG.debug("PushTask not configured for update"); } else { - link(toBeHandled, true); + link(subject, true); } break; @@ -246,7 +246,7 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe } for (PushActions action : profile.getActions()) { - action.after(this.getProfile(), toBeHandled, result); + action.after(this.getProfile(), subject, result); } result.setStatus(SyncResult.Status.SUCCESS); @@ -258,7 +258,7 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe resultStatus = AuditElements.Result.FAILURE; output = e; - LOG.warn("Error pushing {} towards {}", toBeHandled, profile.getSyncTask().getResource(), e); + LOG.warn("Error pushing {} towards {}", subject, profile.getSyncTask().getResource(), e); throw new JobExecutionException(e); } finally { notificationManager.createTasks( @@ -269,7 +269,7 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe resultStatus, beforeObj, output, - toBeHandled); + subject); auditManager.audit( AuditElements.EventCategoryType.PUSH, AttributableType.USER.name().toLowerCase(), @@ -278,7 +278,7 @@ public abstract class AbstractSubjectPushResultHandler extends AbstractSyncopeRe resultStatus, beforeObj, output, - toBeHandled); + subject); } } } http://git-wip-us.apache.org/repos/asf/syncope/blob/4d264368/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java b/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java index d323fdb..73e1d48 100644 --- a/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java +++ b/core/src/main/java/org/apache/syncope/core/sync/impl/PushJob.java @@ -116,7 +116,7 @@ public class PushJob extends AbstractSyncJob { for (SyncopeUser localUser : localUsers) { try { // user propagation - uhandler.handle(localUser); + uhandler.handle(localUser.getId()); } catch (Exception e) { LOG.warn("Failure pushing user '{}' on '{}'", localUser, pushTask.getResource(), e); throw new JobExecutionException("While pushing users on connector", e); @@ -131,7 +131,7 @@ public class PushJob extends AbstractSyncJob { for (SyncopeRole localRole : localRoles) { try { // role propagation - rhandler.handle(localRole); + rhandler.handle(localRole.getId()); } catch (Exception e) { LOG.warn("Failure pushing role '{}' on '{}'", localRole, pushTask.getResource(), e); throw new JobExecutionException("While pushing roles on connector", e); http://git-wip-us.apache.org/repos/asf/syncope/blob/4d264368/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java b/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java index 6c861d4..c29b49e 100644 --- a/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java +++ b/core/src/main/java/org/apache/syncope/core/sync/impl/RolePushResultHandler.java @@ -123,7 +123,7 @@ public class RolePushResultHandler extends AbstractSubjectPushResultHandler { try { return roleDataBinder.getRoleFromId(id); } catch (Exception e) { - LOG.warn("Error retrieving user {}", id, e); + LOG.warn("Error retrieving role {}", id, e); return null; } } http://git-wip-us.apache.org/repos/asf/syncope/blob/4d264368/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 9428a81..468b8f9 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 @@ -18,7 +18,6 @@ */ package org.apache.syncope.core.rest; -import static org.apache.syncope.core.rest.AbstractTest.userService; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -63,14 +62,22 @@ import org.apache.syncope.common.to.SyncTaskTO; import org.apache.syncope.common.to.TaskExecTO; import org.apache.syncope.common.to.AbstractTaskTO; import org.apache.syncope.common.reqres.PagedResult; +import org.apache.syncope.common.services.ResourceService; +import org.apache.syncope.common.to.MappingItemTO; +import org.apache.syncope.common.to.MappingTO; import org.apache.syncope.common.to.PushTaskTO; +import org.apache.syncope.common.to.SchemaTO; import org.apache.syncope.common.to.UserTO; +import org.apache.syncope.common.types.AttributableType; +import org.apache.syncope.common.types.AttributeSchemaType; import org.apache.syncope.common.types.CipherAlgorithm; import org.apache.syncope.common.types.ConnConfProperty; import org.apache.syncope.common.types.IntMappingType; +import org.apache.syncope.common.types.MappingPurpose; import org.apache.syncope.common.types.MatchingRule; import org.apache.syncope.common.types.PropagationTaskExecStatus; import org.apache.syncope.common.types.ResourceDeassociationActionType; +import org.apache.syncope.common.types.SchemaType; import org.apache.syncope.common.types.TaskType; import org.apache.syncope.common.types.TraceLevel; import org.apache.syncope.common.types.SubjectType; @@ -1268,4 +1275,114 @@ public class TaskTestITCase extends AbstractTest { connectorService.update(ldapResource.getConnectorId(), resourceConnector); deleteUser(updatedUser.getId()); } + + @Test + public void issueSYNCOPE598() { + // create a new role schema + final SchemaTO schemaTO = new SchemaTO(); + schemaTO.setName("LDAPGroupName" + getUUIDString()); + schemaTO.setType(AttributeSchemaType.String); + schemaTO.setMandatoryCondition("true"); + + final SchemaTO newSchemaTO = createSchema(AttributableType.ROLE, SchemaType.NORMAL, schemaTO); + assertEquals(schemaTO, newSchemaTO); + + // create a new sample role + RoleTO roleTO = new RoleTO(); + roleTO.setName("all" + getUUIDString()); + roleTO.setParent(8L); + + roleTO.getRAttrTemplates().add(newSchemaTO.getName()); + roleTO.getAttrs().add(attributeTO(newSchemaTO.getName(), "all")); + + roleTO = createRole(roleTO); + assertNotNull(roleTO); + + String resourceName = "resource-ldap-roleonly"; + ResourceTO newResourceTO = null; + + try { + // Create resource ad-hoc + ResourceTO resourceTO = new ResourceTO(); + resourceTO.setName(resourceName); + resourceTO.setConnectorId(105L); + + final MappingTO umapping = new MappingTO(); + MappingItemTO item = new MappingItemTO(); + item.setIntMappingType(IntMappingType.Username); + item.setExtAttrName("cn"); + item.setAccountid(true); + item.setPurpose(MappingPurpose.PROPAGATION); + item.setMandatoryCondition("true"); + umapping.setAccountIdItem(item); + + item = new MappingItemTO(); + item.setIntMappingType(IntMappingType.UserSchema); + item.setExtAttrName("surname"); + item.setIntAttrName("sn"); + item.setPurpose(MappingPurpose.BOTH); + umapping.addItem(item); + + item = new MappingItemTO(); + item.setIntMappingType(IntMappingType.UserSchema); + item.setExtAttrName("email"); + item.setIntAttrName("mail"); + item.setPurpose(MappingPurpose.BOTH); + umapping.addItem(item); + + item = new MappingItemTO(); + item.setIntMappingType(IntMappingType.Password); + item.setPassword(true); + item.setPurpose(MappingPurpose.BOTH); + item.setMandatoryCondition("true"); + umapping.addItem(item); + + umapping.setAccountLink("'cn=' + username + ',ou=people,o=isp'"); + + final MappingTO rmapping = new MappingTO(); + + item = new MappingItemTO(); + item.setIntMappingType(IntMappingType.RoleSchema); + item.setExtAttrName("cn"); + item.setIntAttrName(newSchemaTO.getName()); + item.setAccountid(true); + item.setPurpose(MappingPurpose.BOTH); + rmapping.setAccountIdItem(item); + + rmapping.setAccountLink("'cn=' + " + newSchemaTO.getName() + " + ',ou=groups,o=isp'"); + + resourceTO.setRmapping(rmapping); + + Response response = resourceService.create(resourceTO); + newResourceTO = getObject(response.getLocation(), ResourceService.class, ResourceTO.class); + + assertNotNull(newResourceTO); + assertNull(newResourceTO.getUmapping()); + assertNotNull(newResourceTO.getRmapping()); + + // create push task ad-hoc + final PushTaskTO task = new PushTaskTO(); + task.setName("issueSYNCOPE598"); + task.setResource(resourceName); + task.setPerformCreate(true); + task.setPerformDelete(true); + task.setPerformUpdate(true); + task.setUnmatchingRule(UnmatchingRule.ASSIGN); + task.setMatchingRule(MatchingRule.UPDATE); + + response = taskService.create(task); + final PushTaskTO push = getObject(response.getLocation(), TaskService.class, PushTaskTO.class); + + assertNotNull(push); + + // execute the new task + final TaskExecTO pushExec = execSyncTask(push.getId(), 50, false); + assertTrue(PropagationTaskExecStatus.valueOf(pushExec.getStatus()).isSuccessful()); + } finally { + roleService.delete(roleTO.getId()); + if (newResourceTO != null) { + resourceService.delete(resourceName); + } + } + } }