diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationBase.java index e8b8f23dc06..d1d000339b8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationBase.java @@ -1,8 +1,10 @@ package com.evolveum.midpoint.web.page.login; import org.apache.wicket.RestartResponseException; +import org.apache.wicket.spring.injection.annot.SpringBean; import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.model.api.AuthenticationEvaluator; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; @@ -21,6 +23,9 @@ public class PageRegistrationBase extends PageBase { private static final Trace LOGGER = TraceManager.getTrace(PageSelfRegistration.class); + @SpringBean(name = "authenticationEvaluator") + private AuthenticationEvaluator authenticationEvaluator; + private SelfRegistrationDto selfRegistrationDto; public PageRegistrationBase() { @@ -77,5 +82,9 @@ public SelfRegistrationDto getSelfRegistrationConfiguration() { return selfRegistrationDto; } + + public AuthenticationEvaluator getAuthenticationEvaluator() { + return authenticationEvaluator; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationConfirmation.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationConfirmation.java index fe433f9f884..f1ba75a7819 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationConfirmation.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageRegistrationConfirmation.java @@ -14,33 +14,42 @@ import org.apache.wicket.util.string.StringValue; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.context.SecurityContextHolder; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.AuthenticationEvaluator; 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.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.ConnectionEnvironment; import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.security.api.SecurityUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.Producer; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.util.MidPointPageParametersEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.NonceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import net.sf.jasperreports.components.map.ItemData; + //CONFIRMATION_LINK = "http://localhost:8080/midpoint/confirm/registration/"; @PageDescriptor(url = "/confirm", encoder = MidPointPageParametersEncoder.class) public class PageRegistrationConfirmation extends PageRegistrationBase { - @SpringBean(name = "authenticationEvaluator") - private AuthenticationEvaluator authenticationEvaluator; - private static final String DOT_CLASS = PageRegistrationConfirmation.class.getName() + "."; private static final String ID_LABEL_SUCCESS = "successLabel"; @@ -77,53 +86,115 @@ private void init(final PageParameters pageParameters) { ConnectionEnvironment connEnv = new ConnectionEnvironment(); connEnv.setChannel(SchemaConstants.CHANNEL_GUI_SELF_REGISTRATION_URI); + OperationResult result = new OperationResult(OPERATION_FINISH_REGISTRATION); UsernamePasswordAuthenticationToken token = null; try { - token = authenticationEvaluator.authenticateUserNonce(connEnv, - userNameValue.toString(), tokenValue.toString(), - getSelfRegistrationConfiguration().getNoncePolicy()); - } catch (AuthenticationException ex ) { - getSession().error(createStringResource("PageRegistrationConfirmation.bad.credentials").getString()); - throw new RestartResponseException(PageLogin.class); + token = getAuthenticationEvaluator().authenticateUserNonce(connEnv, userNameValue.toString(), + tokenValue.toString(), getSelfRegistrationConfiguration().getNoncePolicy()); + } catch (AuthenticationException ex) { + getSession() + .error(createStringResource("PageRegistrationConfirmation.bad.credentials").getString()); + result.recordFatalError("Failed to validate user"); + initLayout(result); + return; } + final MidPointPrincipal principal = (MidPointPrincipal) token.getPrincipal(); - - OperationResult result = runPrivileged(new Producer() { - + final NonceType nonceClone = principal.getUser().getCredentials().getNonce().clone(); + + result = runPrivileged(new Producer() { + @Override public OperationResult run() { - - Task task = createAnonymousTask(OPERATION_FINISH_REGISTRATION); - - OperationResult result = new OperationResult(OPERATION_FINISH_REGISTRATION); - - ObjectDelta assignRoleDelta; - List defaultRoles = getSelfRegistrationConfiguration().getDefaultRoles(); - List> assignmentDeltas = new ArrayList<>(defaultRoles.size()); - + OperationResult result = new OperationResult("assignDefaultRoles"); + Task task = createAnonymousTask("assignDefaultRoles"); + + ObjectDelta userAssignmentsDelta; try { - for (ObjectReferenceType defaultRole : defaultRoles) { - AssignmentType assignment = new AssignmentType(); - assignment.setTargetRef(defaultRole); - getPrismContext().adopt(assignment); - assignmentDeltas.add(ContainerDelta.createModificationAdd(UserType.F_ASSIGNMENT, - UserType.class, getPrismContext(), assignment)); - } - assignRoleDelta = ObjectDelta.createModifyDelta(principal.getOid(), assignmentDeltas, - UserType.class, getPrismContext()); - assignRoleDelta.setPrismContext(getPrismContext()); + userAssignmentsDelta = ObjectDelta.createModificationDeleteContainer(UserType.class, principal.getOid(), new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_NONCE), getPrismContext(), nonceClone); } catch (SchemaException e) { result.recordFatalError("Could not create delta"); return result; } - - WebModelServiceUtils.save(assignRoleDelta, result, task, PageRegistrationConfirmation.this); - result.computeStatus(); + WebModelServiceUtils.save(userAssignmentsDelta, result, task, PageRegistrationConfirmation.this); + result.computeStatusIfUnknown(); return result; - } }); + +// if (result.getS) + +// final String oid = principal.getOid(); +// result = runPrivileged(new Producer() { +// +// @Override +// public OperationResult run() { +// OperationResult result = new OperationResult("assignDefaultRoles"); +// Task task = createAnonymousTask("assignDefaultRoles"); +// List> assignmentDelta = new ArrayList>(); +// for (ObjectReferenceType defaultRole : getSelfRegistrationConfiguration().getDefaultRoles()) { +// AssignmentType assignment = new AssignmentType(); +// assignment.setTargetRef(defaultRole); +// try { +// assignmentDelta.add(ContainerDelta.createModificationAdd(UserType.F_ASSIGNMENT, UserType.class, getPrismContext(), assignment)); +// getPrismContext().adopt(assignment); +// } catch (SchemaException e) { +// //nothing to do +// } +// +// } +// ObjectDelta userAssignmentsDelta = ObjectDelta.createModifyDelta(oid, assignmentDelta, UserType.class, getPrismContext()); +// WebModelServiceUtils.save(userAssignmentsDelta, result, task, PageRegistrationConfirmation.this); +// result.computeStatusIfUnknown(); +// return result; +// } +// }); + +// token = getAuthenticationEvaluator().authenticateUserNonce(connEnv, userNameValue.toString(), +// tokenValue.toString(), getSelfRegistrationConfiguration().getNoncePolicy()); +// principal = (MidPointPrincipal) token.getPrincipal(); +// + List userDeltas = new ArrayList<>(); +// userDeltas.add(PropertyDelta.createModificationReplaceProperty( +// SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS, +// principal.getUser().asPrismObject().getDefinition(), (ActivationStatusType) null)); + + + SecurityContextHolder.getContext().setAuthentication(token); + + if (nonceClone.getResetType() != null) { + + Task task = createSimpleTask(OPERATION_FINISH_REGISTRATION); + + ObjectDelta assignRoleDelta = null; + + try { + AssignmentType assignment = new AssignmentType(); + assignment.setTargetRef( + ObjectTypeUtil.createObjectRef(nonceClone.getResetType(), ObjectTypes.ABSTRACT_ROLE)); + getPrismContext().adopt(assignment); + userDeltas.add((ItemDelta) ContainerDelta.createModificationAdd(UserType.F_ASSIGNMENT, + UserType.class, getPrismContext(), assignment)); + + assignRoleDelta = ObjectDelta.createModifyDelta(principal.getOid(), userDeltas, + UserType.class, getPrismContext()); + assignRoleDelta.setPrismContext(getPrismContext()); + } catch (SchemaException e) { + result.recordFatalError("Could not create delta"); + initLayout(result); + return; + } + + WebModelServiceUtils.save(assignRoleDelta, result, task, PageRegistrationConfirmation.this); + result.computeStatusIfUnknown(); + + } + SecurityContextHolder.getContext().setAuthentication(null); + + + + initLayout(result); } 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 eccfab6d0b1..83f13c33a72 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 @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; +import org.apache.commons.lang.Validate; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; @@ -17,6 +18,9 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.request.mapper.parameter.INamedParameters.NamedPair; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.string.StringValue; import com.evolveum.midpoint.common.policy.StringPolicyUtils; import com.evolveum.midpoint.common.policy.ValuePolicyGenerator; @@ -28,6 +32,8 @@ import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; 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.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectPaging; @@ -36,6 +42,7 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.security.api.ConnectionEnvironment; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.Producer; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -52,11 +59,16 @@ import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractAuthenticationPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LimitationsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MailAuthenticationPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.NonceCredentialsPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.NonceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PasswordType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; @@ -98,11 +110,15 @@ public class PageSelfRegistration extends PageRegistrationBase { private boolean submited = false; String randomString = null; String captchaString = null; - + public PageSelfRegistration() { + this(null); + } + + public PageSelfRegistration(PageParameters pageParameters) { super(); - userModel = new LoadableModel(true) { + userModel = new LoadableModel(true) { private static final long serialVersionUID = 1L; @Override @@ -112,8 +128,9 @@ protected UserType load() { }; initLayout(); + } - + private UserType createUser() { PrismObjectDefinition userDef = getPrismContext().getSchemaRegistry() .findObjectDefinitionByCompileTimeClass(UserType.class); @@ -150,7 +167,7 @@ public boolean isEnabled() { TextPanel firstName = new TextPanel<>(ID_FIRST_NAME, new PropertyModel(userModel, UserType.F_GIVEN_NAME.getLocalPart() + ".orig") { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; @Override public void setObject(String object) { @@ -163,7 +180,8 @@ public void setObject(String object) { TextPanel lastName = new TextPanel<>(ID_LAST_NAME, new PropertyModel(userModel, UserType.F_FAMILY_NAME.getLocalPart() + ".orig") { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; + @Override public void setObject(String object) { userModel.getObject().setFamilyName(new PolyStringType(object)); @@ -204,12 +222,12 @@ public Iterator getIterator(String input) { @Override public String getObject() { - randomString = generateCaptcha(); + randomString = generateCaptcha(); return randomString; } + }); - final Image captchaImage = new Image(ID_IMAGE, captcha); captchaImage.setOutputMarkupId(true); mainForm.add(captchaImage); @@ -283,12 +301,9 @@ public boolean isEnabled() { }); } - - private void submitRegistration(AjaxRequestTarget target, CaptchaImageResource captcha) { - OperationResult result = runPrivileged(new Producer() { @Override @@ -302,40 +317,67 @@ public OperationResult run() { return result; } - }); - + if (result.getStatus() == OperationResultStatus.SUCCESS) { submited = true; getSession() .success(createStringResource("PageSelfRegistration.registration.success").getString()); +// PageParameters params = getPageParameters(); +// +// if (params != null) { +// ConnectionEnvironment connEnv = new ConnectionEnvironment(); +// connEnv.setChannel(SchemaConstants.CHANNEL_GUI_SELF_REGISTRATION_URI); +// UserType userType = userModel.getObject(); +// ProtectedStringType protectedString = userType.getCredentials().getNonce().getValue(); +// String nonce = null; +// if (protectedString.getClearValue() == null) { +// getPrismContext().getDefaultProtector(). +// } +// getAuthenticationEvaluator().authenticateUserNonce(connEnv, userType.getName().getOrig(),, noncePolicy) +// List values = params.getAllNamed(); +// List> rolesToAssign = new ArrayList<>(); +// Task task = createSimpleTask("Request roles"); +// for (NamedPair namedPair : values) { +// PrismObject abstractRole = WebModelServiceUtils.loadObject(AbstractRoleType.class, namedPair.getValue(), this, task, result); +// AssignmentType assignment = new AssignmentType(); +// if (abstractRole != null) { +// assignment.setTarget(abstractRole.asObjectable()); +// try { +// rolesToAssign.add(ContainerDelta.createModificationAdd(UserType.F_ASSIGNMENT, UserType.class, getPrismContext(), assignment)); +// } catch (SchemaException e) { +// //just ignore this assignment (for now) +// } +// } +// } +// } +// +// + switch (getSelfRegistrationConfiguration().getAuthenticationMethod()) { - case MAIL : + case MAIL: target.add(PageSelfRegistration.this); break; - case SMS : + case SMS: throw new UnsupportedOperationException(); - case NONE : + case NONE: setResponsePage(PageLogin.class); } - } else { getSession().error( createStringResource("PageSelfRegistration.registration.error", result.getMessage()) .getString()); throw new RestartResponseException(PageSelfRegistration.class); - + } - + updateCaptcha(captcha, target); target.add(getFeedbackPanel()); - } - - + private String generateCaptcha() { OperationResult result = new OperationResult("generateRandomString"); @@ -388,19 +430,18 @@ private void updateCaptcha(CaptchaImageResource captcha, AjaxRequestTarget targe target.add(captchaImage); } - - private void saveUser(Task task, OperationResult result) { - UserType userType = prepareUserToSave(getSelfRegistrationConfiguration().getNoncePolicy(), task, result); - ObjectDelta userDelta = ObjectDelta.createAddDelta(userType.asPrismObject()); - userDelta.setPrismContext(getPrismContext()); + UserType userType = prepareUserToSave(task, + result); + ObjectDelta userDelta = ObjectDelta.createAddDelta(userType.asPrismObject()); + userDelta.setPrismContext(getPrismContext()); + + WebModelServiceUtils.save(userDelta, result, task, PageSelfRegistration.this); + result.computeStatus(); - WebModelServiceUtils.save(userDelta, result, task, PageSelfRegistration.this); - result.computeStatus(); - } - - private UserType prepareUserToSave(NonceCredentialsPolicyType noncePolicy, Task task, + + private UserType prepareUserToSave(Task task, OperationResult result) { String organization = getOrganization(); UserType userType = userModel.getObject(); @@ -409,12 +450,35 @@ private UserType prepareUserToSave(NonceCredentialsPolicyType noncePolicy, Task } ProtectedStringType nonceCredentials = new ProtectedStringType(); - nonceCredentials.setClearValue(generateNonce(noncePolicy, task, result)); + nonceCredentials.setClearValue(generateNonce(getSelfRegistrationConfiguration().getNoncePolicy(), task, result)); NonceType nonceType = new NonceType(); nonceType.setValue(nonceCredentials); + + PageParameters pageParameters = getPageParameters(); + if (pageParameters != null){ + List namedParameters = pageParameters.getAllNamed(); + if (namedParameters != null && !namedParameters.isEmpty()) { + NamedPair firstParam = namedParameters.iterator().next(); + if (firstParam != null) { + nonceType.setResetType(firstParam.getValue()); + } + } + } userType.getCredentials().setNonce(nonceType); + + for (ObjectReferenceType defaultRole : getSelfRegistrationConfiguration().getDefaultRoles()) { + AssignmentType assignment = new AssignmentType(); + assignment.setTargetRef(defaultRole); + try { + getPrismContext().adopt(assignment); + userType.getAssignment().add(assignment); + } catch (SchemaException e) { + //nothing to do + } + + } try { getPrismContext().adopt(userType); @@ -437,8 +501,6 @@ private String generateNonce(NonceCredentialsPolicyType noncePolicy, Task task, return ValuePolicyGenerator.generate(policy != null ? policy.getStringPolicy() : null, 24, result); } - - private String getOrganization() { AutoCompleteTextPanel org = (AutoCompleteTextPanel) get( createComponentPath(ID_MAIN_FORM, ID_ORGANIZATION)); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/AuthenticationEvaluatorImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/AuthenticationEvaluatorImpl.java index 834661448c0..2d490be980e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/AuthenticationEvaluatorImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/AuthenticationEvaluatorImpl.java @@ -91,6 +91,12 @@ public UsernamePasswordAuthenticationToken authenticateUserPassword(ConnectionEn passwordCredentialsPolicy = credentialsPolicyType.getPassword(); } } + + // Activated - e.g. registration was finished + if (!isActivated(credentials, passwordCredentialsPolicy)) { + recordAuthenticationFailure(principal, connEnv, "no authorizations"); + throw new DisabledException("web.security.provider.access.denied"); + } // Lockout if (isLockedOut(passwordType, passwordCredentialsPolicy)) { @@ -140,13 +146,6 @@ public UsernamePasswordAuthenticationToken authenticateUserNonce(ConnectionEnvir } NonceType nonceType = credentials.getNonce(); -// -// // Authorizations -// if (!hasAnyAuthorization(principal)) { -// recordAuthenticationFailure(principal, connEnv, "no authorizations"); -// throw new DisabledException("web.security.provider.access.denied"); -// } -// // Password age checkPasswordValidityAndAge(connEnv, principal, nonceType.getValue(), nonceType.getMetadata(), noncePolicy); @@ -321,6 +320,10 @@ private String getPassword(ConnectionEnvironment connEnv, @NotNull MidPointPrinc return decryptedPassword; } + private boolean isActivated(CredentialsType credentialsType, AbstractCredentialPolicyType credentialsPolicy) { + return !isOverFailedLockoutAttempts(credentialsType.getPassword(), credentialsPolicy) && isActivated(credentialsType.getNonce()); + } + private boolean isLockedOut(AbstractCredentialType credentialsType, AbstractCredentialPolicyType credentialsPolicy) { return isOverFailedLockoutAttempts(credentialsType, credentialsPolicy) && !isLockoutExpired(credentialsType, credentialsPolicy); } @@ -335,6 +338,11 @@ private boolean isOverFailedLockoutAttempts(int failedLogins, AbstractCredential credentialsPolicy.getLockoutMaxFailedAttempts() > 0 && failedLogins >= credentialsPolicy.getLockoutMaxFailedAttempts(); } + private boolean isActivated(NonceType nonce) { + return nonce == null; + } + + private boolean isLockoutExpired(AbstractCredentialType credentialsType, AbstractCredentialPolicyType credentialsPolicy) { Duration lockoutDuration = credentialsPolicy.getLockoutDuration(); if (lockoutDuration == null) { diff --git a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/notifiers/UserRegistrationNotifier.java b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/notifiers/UserRegistrationNotifier.java index 8383ffaa1ca..e442004eb33 100644 --- a/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/notifiers/UserRegistrationNotifier.java +++ b/model/notifications-impl/src/main/java/com/evolveum/midpoint/notifications/impl/notifiers/UserRegistrationNotifier.java @@ -151,7 +151,7 @@ private String createConfirmationLink(UserType userType, GeneralNotifierType gen if (confirmationMethod == null) { return null; } - + switch (confirmationMethod) { case LINK: StringBuilder confirmLinkBuilder = new StringBuilder(CONFIRMATION_LINK);