You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2013/09/17 12:50:23 UTC
svn commit: r1523980 - in /syncope/trunk:
common/src/main/java/org/apache/syncope/common/services/
common/src/main/java/org/apache/syncope/common/to/
common/src/main/java/org/apache/syncope/common/types/
console/src/main/java/org/apache/syncope/console...
Author: fmartelli
Date: Tue Sep 17 10:50:22 2013
New Revision: 1523980
URL: http://svn.apache.org/r1523980
Log:
SYNCOPE-133 Fixed
Modified:
syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java
syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java
syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java
syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/UserRequestModalPage.java
syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java
syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java
syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java
syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java
syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java
syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/UserRequestDataBinder.java
syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java
syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java
Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java Tue Sep 17 10:50:22 2013
@@ -27,8 +27,10 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
+import org.apache.syncope.common.mod.UserMod;
import org.apache.syncope.common.to.UserRequestTO;
+import org.apache.syncope.common.to.UserTO;
@Path("requests/user")
public interface UserRequestService {
@@ -80,4 +82,16 @@ public interface UserRequestService {
@DELETE
@Path("{requestId}")
void delete(@PathParam("requestId") Long requestId);
+
+ @POST
+ @Path("create/execute/{requestId}")
+ UserTO executeCreate(@PathParam("requestId") Long requestId, UserTO reviewed);
+
+ @POST
+ @Path("update/execute/{requestId}")
+ UserTO executeUpdate(@PathParam("requestId") Long requestId, UserMod changes);
+
+ @POST
+ @Path("delete/execute{requestId}")
+ UserTO executeDelete(@PathParam("requestId") Long requestId);
}
Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java Tue Sep 17 10:50:22 2013
@@ -41,6 +41,8 @@ public class UserRequestTO extends Abstr
private UserRequestType type;
+ private boolean executed;
+
public UserRequestTO() {
}
@@ -119,4 +121,12 @@ public class UserRequestTO extends Abstr
public void setUserId(final Long userId) {
this.userId = userId;
}
+
+ public void setExecuted(boolean executed) {
+ this.executed = executed;
+ }
+
+ public boolean isExecuted() {
+ return executed;
+ }
}
Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java Tue Sep 17 10:50:22 2013
@@ -241,7 +241,8 @@ public final class AuditElements {
read,
update,
delete,
- isCreateAllowed
+ isCreateAllowed,
+ execute
}
Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/UserRequestModalPage.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/UserRequestModalPage.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/UserRequestModalPage.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/UserRequestModalPage.java Tue Sep 17 10:50:22 2013
@@ -64,7 +64,6 @@ public class UserRequestModalPage extend
case UPDATE:
this.initialUserTO = userRestClient.read(userRequestTO.getUserMod().getId());
-
userTO = AttributableOperations.apply(initialUserTO, userRequestTO.getUserMod());
break;
@@ -88,10 +87,7 @@ public class UserRequestModalPage extend
break;
case ADMIN:
- userRestClient.create(updatedUserTO);
- if (userRequestTO != null) {
- requestRestClient.delete(userRequestTO.getId());
- }
+ requestRestClient.executeCreate(userRequestTO.getId(), userTO);
break;
default:
@@ -111,10 +107,7 @@ public class UserRequestModalPage extend
break;
case ADMIN:
- userRestClient.update(userMod);
- if (userRequestTO != null) {
- requestRestClient.delete(userRequestTO.getId());
- }
+ requestRestClient.executeUpdate(userRequestTO.getId(), userMod);
break;
default:
Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java Tue Sep 17 10:50:22 2013
@@ -60,4 +60,16 @@ public class UserRequestRestClient exten
userRequestTO.setUserId(userId);
getService(UserRequestService.class).create(userRequestTO);
}
+
+ public UserTO executeCreate(final Long requestId, final UserTO reviewed) {
+ return getService(UserRequestService.class).executeCreate(requestId, reviewed);
+ }
+
+ public UserTO executeUpdate(final Long requestId, final UserMod changes) {
+ return getService(UserRequestService.class).executeUpdate(requestId, changes);
+ }
+
+ public UserTO executeDelete(final Long requestId) {
+ return getService(UserRequestService.class).executeDelete(requestId);
+ }
}
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java Tue Sep 17 10:50:22 2013
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.core.persistence.beans;
+import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
@@ -25,6 +26,8 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.apache.syncope.common.mod.UserMod;
@@ -49,6 +52,15 @@ public class UserRequest extends Abstrac
@Enumerated(EnumType.STRING)
private UserRequestType type;
+ @Basic
+ @Min(0)
+ @Max(1)
+ private Integer executed;
+
+ public UserRequest() {
+ this.executed = 0;
+ }
+
public Long getId() {
return id;
}
@@ -89,4 +101,12 @@ public class UserRequest extends Abstrac
type = UserRequestType.DELETE;
payload = String.valueOf(userId);
}
+
+ public boolean isExecuted() {
+ return isBooleanAsInteger(executed);
+ }
+
+ public void setExecuted(boolean executed) {
+ this.executed = getBooleanAsInteger(executed);
+ }
}
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java Tue Sep 17 10:50:22 2013
@@ -28,6 +28,8 @@ public interface UserRequestDAO extends
UserRequest find(Long id);
List<UserRequest> findAll();
+
+ List<UserRequest> findAll(final boolean executed);
UserRequest save(UserRequest userRequest) throws InvalidEntityException;
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java Tue Sep 17 10:50:22 2013
@@ -45,6 +45,17 @@ public class UserRequestDAOImpl extends
}
@Override
+ @Transactional(readOnly = true)
+ public List<UserRequest> findAll(final boolean executed) {
+ TypedQuery<UserRequest> query = entityManager.createQuery(
+ "SELECT e " + "FROM " + UserRequest.class.getSimpleName() + " e WHERE e.executed = :executed",
+ UserRequest.class);
+ query.setParameter("executed", executed ? 1 : 0);
+
+ return query.getResultList();
+ }
+
+ @Override
public UserRequest save(final UserRequest userRequest) throws InvalidEntityException {
return entityManager.merge(userRequest);
}
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java Tue Sep 17 10:50:22 2013
@@ -18,6 +18,9 @@
*/
package org.apache.syncope.core.rest.controller;
+import static org.apache.syncope.common.types.UserRequestType.CREATE;
+import static org.apache.syncope.common.types.UserRequestType.DELETE;
+import static org.apache.syncope.common.types.UserRequestType.UPDATE;
import java.util.ArrayList;
import java.util.List;
@@ -61,6 +64,9 @@ public class UserRequestController {
private UserRequestDAO userRequestDAO;
@Autowired
+ private UserController userController;
+
+ @Autowired
private UserRequestDataBinder binder;
public boolean isCreateAllowed() {
@@ -112,7 +118,7 @@ public class UserRequestController {
request = userRequestDAO.save(request);
auditManager.audit(Category.userRequest, UserRequestSubCategory.update, Result.success,
- "Successfully updated user request for " + request.getUserMod().getUsername());
+ "Successfully updated user request for " + request.getUserMod().getId());
return binder.getUserRequestTO(request);
}
@@ -132,6 +138,22 @@ public class UserRequestController {
return result;
}
+ @PreAuthorize("hasRole('USER_REQUEST_LIST')")
+ @Transactional(readOnly = true)
+ public List<UserRequestTO> list(final boolean executed) {
+ List<UserRequestTO> result = new ArrayList<UserRequestTO>();
+
+ for (UserRequest request : userRequestDAO.findAll(executed)) {
+ result.add(binder.getUserRequestTO(request));
+ }
+
+ auditManager.audit(Category.userRequest, UserRequestSubCategory.list, Result.success,
+ String.format("Successfully listed all %s executed user requests: %d",
+ (executed ? "" : "not"), result.size()));
+
+ return result;
+ }
+
@PreAuthorize("hasRole('USER_REQUEST_READ')")
@Transactional(readOnly = true)
public UserRequestTO read(final Long requestId) {
@@ -140,10 +162,11 @@ public class UserRequestController {
throw new NotFoundException("User request " + requestId);
}
+ final UserRequestTO userRequestTO = binder.getUserRequestTO(request);
auditManager.audit(Category.userRequest, UserRequestSubCategory.read, Result.success,
- "Successfully read user request for " + request.getUserTO().getUsername());
+ "Successfully read user request for " + getUserId(userRequestTO));
- return binder.getUserRequestTO(request);
+ return userRequestTO;
}
@PreAuthorize("isAuthenticated()")
@@ -182,4 +205,46 @@ public class UserRequestController {
return requestToDelete;
}
+
+ @PreAuthorize("hasRole('USER_REQUEST_READ') and ("
+ + "(hasRole('USER_CREATE') and #request.type == #request.type.CREATE) or "
+ + "(hasRole('USER_UPDATE') and #request.type == #request.type.UPDATE) or "
+ + "(hasRole('USER_DELETE') and #request.type == #request.type.DELETE))")
+ public UserTO execute(final UserRequestTO request, final UserTO reviewed, final UserMod changes) {
+ UserRequest userRequest = userRequestDAO.find(request.getId());
+ if (request == null || request.isExecuted()) {
+ throw new NotFoundException("Executable user request " + request.getId());
+ }
+
+ final UserTO res;
+
+ switch (request.getType()) {
+ case CREATE:
+ res = userController.create(reviewed == null ? request.getUserTO() : reviewed);
+ break;
+ case UPDATE:
+ res = userController.update(changes == null ? request.getUserMod() : changes);
+ break;
+ case DELETE:
+ res = userController.delete(request.getUserId());
+ break;
+ default:
+ throw new NotFoundException("User request " + request.getType());
+ }
+
+ userRequest.setExecuted(true);
+ userRequestDAO.save(userRequest);
+
+ auditManager.audit(Category.userRequest, UserRequestSubCategory.execute, Result.success,
+ String.format("Successfully executed %s request for user %s",
+ request.getType(), getUserId(request)));
+
+ return res;
+ }
+
+ private String getUserId(final UserRequestTO request) {
+ return request.getType() == CREATE ? request.getUserTO().getUsername()
+ : request.getType() == UPDATE ? String.valueOf(request.getUserMod().getId())
+ : String.valueOf(request.getUserId());
+ }
}
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/UserRequestDataBinder.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/UserRequestDataBinder.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/UserRequestDataBinder.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/UserRequestDataBinder.java Tue Sep 17 10:50:22 2013
@@ -70,7 +70,8 @@ public class UserRequestDataBinder {
public UserRequestTO getUserRequestTO(final UserRequest request) {
UserRequestTO result = new UserRequestTO();
- BeanUtils.copyProperties(request, result);
+ BeanUtils.copyProperties(request, result, new String[] {"executed"});
+ result.setExecuted(request.isExecuted());
return result;
}
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java Tue Sep 17 10:50:22 2013
@@ -24,8 +24,10 @@ import java.util.List;
import javax.ws.rs.core.Response;
import org.apache.syncope.common.SyncopeConstants;
+import org.apache.syncope.common.mod.UserMod;
import org.apache.syncope.common.services.UserRequestService;
import org.apache.syncope.common.to.UserRequestTO;
+import org.apache.syncope.common.to.UserTO;
import org.apache.syncope.core.rest.controller.UserRequestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -74,7 +76,7 @@ public class UserRequestServiceImpl exte
@Override
public List<UserRequestTO> list() {
- return controller.list();
+ return controller.list(false);
}
@Override
@@ -86,4 +88,19 @@ public class UserRequestServiceImpl exte
public void delete(final Long requestId) {
controller.deleteRequest(requestId);
}
+
+ @Override
+ public UserTO executeCreate(final Long requestId, final UserTO reviewed) {
+ return controller.execute(controller.read(requestId), reviewed, null);
+ }
+
+ @Override
+ public UserTO executeUpdate(final Long requestId, final UserMod changes) {
+ return controller.execute(controller.read(requestId), null, changes);
+ }
+
+ @Override
+ public UserTO executeDelete(final Long requestId) {
+ return controller.execute(controller.read(requestId), null, null);
+ }
}
Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java?rev=1523980&r1=1523979&r2=1523980&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java Tue Sep 17 10:50:22 2013
@@ -21,6 +21,7 @@ package org.apache.syncope.core.rest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.security.AccessControlException;
@@ -82,7 +83,7 @@ public class UserRequestTestITCase exten
// 4. as anonymous, request user create works
UserRequestService userRequestService2 = createServiceInstance(UserRequestService.class, null, null);
- response = createUserRequest(userRequestService2, new UserRequestTO(userTO));
+ createUserRequest(userRequestService2, new UserRequestTO(userTO));
// 5. try to find user
AttributeCond attrCond = new AttributeCond(AttributeCond.Type.EQ);
@@ -199,6 +200,93 @@ public class UserRequestTestITCase exten
}
}
+ @Test
+ public void execute() {
+ UserTO userTO = UserTestITCase.getUniqueSampleTO("ex.create@syncope.apache.org");
+ final String initialPassword = userTO.getPassword();
+
+ UserRequestService selfservice = createServiceInstance(UserRequestService.class, null, null);
+ Response response = createUserRequest(selfservice, new UserRequestTO(userTO));
+
+ UserRequestTO userRequest = getObject(response, UserRequestTO.class, userRequestService);
+ assertNotNull(userRequest);
+
+ try {
+ userService.read(userTO.getUsername());
+ fail();
+ } catch (Exception ignore) {
+ // ignore
+ }
+
+ assertFalse(userRequestService.read(userRequest.getId()).isExecuted());
+ assertNotNull(userRequestService.executeCreate(userRequest.getId(), userTO));
+ assertTrue(userRequestService.read(userRequest.getId()).isExecuted());
+
+ for (UserRequestTO userRequestTO : userRequestService.list()) {
+ assertFalse(userRequestTO.isExecuted());
+ }
+
+ userTO = userService.read(userTO.getUsername());
+ assertNotNull(userTO);
+
+ UserMod userMod = new UserMod();
+ userMod.setId(userTO.getId());
+
+ selfservice = createServiceInstance(UserRequestService.class, userTO.getUsername(), initialPassword);
+
+ userMod.setPassword("new" + initialPassword);
+ response = createUserRequest(selfservice, new UserRequestTO(userMod));
+
+ userRequest = getObject(response, UserRequestTO.class, userRequestService);
+ assertNotNull(userRequest);
+
+ final String newpwd = "new" + initialPassword + "!";
+
+ UserMod furtherChanges = new UserMod();
+ furtherChanges.setId(userMod.getId());
+ furtherChanges.setPassword(newpwd);
+
+ assertFalse(userRequestService.read(userRequest.getId()).isExecuted());
+ assertNotNull(userRequestService.executeUpdate(userRequest.getId(), furtherChanges));
+ assertTrue(userRequestService.read(userRequest.getId()).isExecuted());
+
+ for (UserRequestTO userRequestTO : userRequestService.list()) {
+ assertFalse(userRequestTO.isExecuted());
+ }
+
+ assertNotNull(userService.read(userTO.getUsername()));
+
+ try {
+ createServiceInstance(UserService.class, userTO.getUsername(), "new" + initialPassword).readSelf();
+ fail("Credentials are not updated yet, thus request should raise AccessControlException");
+ } catch (AccessControlException e) {
+ assertNotNull(e);
+ }
+
+ assertNotNull(createServiceInstance(UserService.class, userTO.getUsername(), newpwd).readSelf());
+
+ selfservice = createServiceInstance(UserRequestService.class, userTO.getUsername(), newpwd);
+ response = createUserRequest(selfservice, new UserRequestTO(userTO.getId()));
+
+ userRequest = getObject(response, UserRequestTO.class, userRequestService);
+ assertNotNull(userRequest);
+
+ assertFalse(userRequestService.read(userRequest.getId()).isExecuted());
+ userRequestService.executeDelete(userRequest.getId());
+ assertTrue(userRequestService.read(userRequest.getId()).isExecuted());
+
+ for (UserRequestTO userRequestTO : userRequestService.list()) {
+ assertFalse(userRequestTO.isExecuted());
+ }
+
+ try {
+ userService.read(userTO.getUsername());
+ fail();
+ } catch (Exception ignore) {
+ // ignore
+ }
+ }
+
private Response createUserRequest(final UserRequestService service, final UserRequestTO userRequestTO) {
Response response = service.create(userRequestTO);
if (response.getStatus() != org.apache.http.HttpStatus.SC_CREATED) {