diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java index 3a92e2cf8a5..be1dfd59f8f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java @@ -40,7 +40,11 @@ import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.delta.ContainerDelta; +import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -80,6 +84,8 @@ import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; +import net.sf.jasperreports.components.map.ItemData; + //"http://localhost:8080/midpoint/confirm/registrationid=" + newUser.getOid() //+ "/token=" + userType.getCostCenter() + "/roleId=00000000-0000-0000-0000-000000000008"; @PageDescriptor(url = "/registration") @@ -178,8 +184,7 @@ public PrismObject run() { } private UserType instantiateUser(){ - PrismObjectDefinition userDef = getPrismContext().getSchemaRegistry() - .findObjectDefinitionByCompileTimeClass(UserType.class); + PrismObjectDefinition userDef = getUserDefinition(); PrismObject user; try { user = userDef.instantiate(); @@ -190,6 +195,11 @@ private UserType instantiateUser(){ } return user.asObjectable(); } + + private PrismObjectDefinition getUserDefinition(){ + return getPrismContext().getSchemaRegistry() + .findObjectDefinitionByCompileTimeClass(UserType.class); + } private void initLayout() { @@ -425,85 +435,88 @@ private void updateCaptcha(AjaxRequestTarget target) { } private void saveUser(Task task, OperationResult result) { - UserType userType = prepareUserToSave(task, - result); - ObjectDelta userDelta = ObjectDelta.createAddDelta(userType.asPrismObject()); + + ObjectDelta userDelta = prepareUserDelta(task, result); userDelta.setPrismContext(getPrismContext()); WebModelServiceUtils.save(userDelta, ModelExecuteOptions.createOverwrite(), result, task, PageSelfRegistration.this); result.computeStatus(); } + + private ObjectDelta prepareUserDelta(Task task, OperationResult result) { + if (getOidFromParams(getPageParameters()) == null) { + UserType userType = prepareUserToSave(task, result); + return ObjectDelta.createAddDelta(userType.asPrismObject()); + } else { + ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(UserType.class, getOidFromParams(getPageParameters()), getPrismContext()); + if (getSelfRegistrationConfiguration().getInitialLifecycleState() != null) { + delta.addModificationReplaceProperty(UserType.F_LIFECYCLE_STATE, getSelfRegistrationConfiguration().getInitialLifecycleState()); + } + delta.addModificationReplaceProperty(SchemaConstants.PATH_PASSWORD_VALUE, createPassword().getValue()); + delta.addModificationReplaceContainer(SchemaConstants.PATH_NONCE, createNonce(getSelfRegistrationConfiguration().getNoncePolicy(), task, result).asPrismContainerValue()); + return delta; + + } + } private UserType prepareUserToSave(Task task, OperationResult result) { SelfRegistrationDto selfRegistrationConfiguration = getSelfRegistrationConfiguration(); UserType userType = userModel.getObject(); + UserType userToSave = userType.clone(); if (selfRegistrationConfiguration.getRequiredLifecycleState() != null) { - String userLifecycle = userType.getLifecycleState(); + String userLifecycle = userToSave.getLifecycleState(); if (!selfRegistrationConfiguration.getRequiredLifecycleState().equals(userLifecycle)){ getSession().error(createStringResource("PageSelfRegistration.registration.failed.unsatisfied.registration.configuration").getString()); throw new RestartResponseException(this); } -// if (getOidFromParams(getPageParameters()) == null) { -// getSession().error(createStringResource("PageSelfRegistration.registration.failed.unsatisfied.registration.configuration").getString()); -// throw new RestartResponseException(this); -// } -// -// -//// ObjectQuery query = QueryBuilder.queryFor(UserType.class, getPrismContext()) -//// .item(UserType.F_EMAIL_ADDRESS).eq(userType.getEmailAddress()) -//// .build(); -//// SearchResultList> users = null; -//// try { -//// users = getModelService().searchObjects(UserType.class, query, null, task, result); -//// } catch (SchemaException | ObjectNotFoundException | SecurityViolationException -//// | CommunicationException | ConfigurationException e) { -//// // TODO Auto-generated catch block -//// } -// -// WebModelServiceUtils.loadObject(type, oid, page, task, result) -// -// if (users == null || users.size() == 0 || users.size() > 1) { -// getSession().error(createStringResource("PageSelfRegistration.registration.failed.unsatisfied.registration.configuration").getString()); -// throw new RestartResponseException(this); -// -// } -// -// PrismObject preregisteredUser = users.iterator().next(); -// -// userType.setOid(preregisteredUser.getOid()); - } + + CredentialsType credentials = createCredentials(selfRegistrationConfiguration.getNoncePolicy(), task, result); + userToSave.setCredentials(credentials); + if (selfRegistrationConfiguration.getInitialLifecycleState() != null) { + userToSave.setLifecycleState(selfRegistrationConfiguration.getInitialLifecycleState()); + } + + try { + getPrismContext().adopt(userToSave); + } catch (SchemaException e) { + // nothing to do, try without it + } + + return userToSave; + + } + + private CredentialsType createCredentials(NonceCredentialsPolicyType noncePolicy, Task task, OperationResult result) { + NonceType nonceType = createNonce(noncePolicy, task, result); + + PasswordType password = createPassword(); + CredentialsType credentials = new CredentialsType(); + credentials.setNonce(nonceType); + credentials.setPassword(password); + return credentials; + } + + private NonceType createNonce(NonceCredentialsPolicyType noncePolicy, Task task, OperationResult result) { ProtectedStringType nonceCredentials = new ProtectedStringType(); - nonceCredentials.setClearValue(generateNonce(selfRegistrationConfiguration.getNoncePolicy(), task, result)); + nonceCredentials.setClearValue(generateNonce(noncePolicy, task, result)); NonceType nonceType = new NonceType(); nonceType.setValue(nonceCredentials); - + return nonceType; + } + + private PasswordType createPassword() { PasswordType password = new PasswordType(); ProtectedStringType protectedString = new ProtectedStringType(); protectedString.setClearValue(getPassword()); password.setValue(protectedString); - - CredentialsType credentials = new CredentialsType(); - credentials.setNonce(nonceType); - credentials.setPassword(password); - - userType.setCredentials(credentials); - userType.setLifecycleState(getSelfRegistrationConfiguration().getInitialLifecycleState()); - - try { - getPrismContext().adopt(userType); - } catch (SchemaException e) { - // nothing to do, try without it - } - - return userType; - + return password; } private String generateNonce(NonceCredentialsPolicyType noncePolicy, Task task, OperationResult result) {