Skip to content

Commit

Permalink
self registration improvements.. adding button for registration on lo…
Browse files Browse the repository at this point in the history
…gin page, checking initial and required state..
  • Loading branch information
katkav committed Nov 2, 2016
1 parent 3a5c76b commit cee07df
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 39 deletions.
Expand Up @@ -105,4 +105,8 @@ public String getCaptchaText() {
return captchaText;
}

public String getRandomText() {
return randomText;
}

}
Expand Up @@ -50,6 +50,9 @@
<input type="submit" class="btn btn-primary pull-right" wicket:message="value:PageLogin.signIn"/>
</form>

<a class="btn btn-default" wicket:id="selfRegistration">
<wicket:message key="PageLogin.selfRegistration"/>
</a>
<wicket:link>
<a href="forgetpassword" wicket:id="forgetpassword">
<wicket:message key="PageLogin.forgetPassword"/>
Expand Down
Expand Up @@ -18,6 +18,7 @@

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
Expand All @@ -28,6 +29,10 @@
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RegistrationsPolicyType;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.cycle.RequestCycle;
Expand All @@ -46,10 +51,12 @@ public class PageLogin extends PageBase {
private static final Trace LOGGER = TraceManager.getTrace(PageLogin.class);

private static final String ID_FORGET_PASSWORD = "forgetpassword";
private static final String ID_SELF_REGISTRATION = "selfRegistration";

private static final String DOT_CLASS = PageLogin.class.getName() + ".";
protected static final String OPERATION_LOAD_RESET_PASSWORD_POLICY = DOT_CLASS + "loadPasswordResetPolicy";

private static final String OPERATION_LOAD_REGISTRATION_POLICY = DOT_CLASS + "loadRegistrationPolicy";

public PageLogin() {
if (SecurityUtils.getPrincipalUser() != null) {
MidPointApplication app = getMidpointApplication();
Expand Down Expand Up @@ -82,6 +89,39 @@ public boolean isVisible() {
}
});
add(link);

AjaxLink<String> registration = new AjaxLink<String>(ID_SELF_REGISTRATION) {

@Override
public void onClick(AjaxRequestTarget target) {
setResponsePage(PageSelfRegistration.class);
}
};
registration.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
OperationResult parentResult = new OperationResult(OPERATION_LOAD_REGISTRATION_POLICY);

RegistrationsPolicyType registrationPolicies = null;
try {
Task task = createAnonymousTask(OPERATION_LOAD_REGISTRATION_POLICY);
registrationPolicies = getModelInteractionService().getRegistrationPolicy(null, task, parentResult);
} catch (ObjectNotFoundException | SchemaException e) {
LOGGER.warn("Cannot read credentials policy: " + e.getMessage(), e);
}

boolean linkIsVisible = false;
if (registrationPolicies != null
&& registrationPolicies.getSelfRegistration() != null) {
linkIsVisible = true;
}

return linkIsVisible;
}
});
add(registration);
}

@Override
Expand Down
Expand Up @@ -28,13 +28,15 @@
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
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.ObjectDelta;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.SearchResultList;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
Expand Down Expand Up @@ -165,6 +167,7 @@ public void setObject(String object) {
}
});
firstName.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
firstName.getBaseFormComponent().setRequired(true);
mainForm.add(firstName);

TextPanel<String> lastName = new TextPanel<>(ID_LAST_NAME,
Expand All @@ -179,11 +182,13 @@ public void setObject(String object) {

});
lastName.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
lastName.getBaseFormComponent().setRequired(true);
mainForm.add(lastName);

TextPanel<String> email = new TextPanel<>(ID_EMAIL,
new PropertyModel<String>(userModel, UserType.F_EMAIL_ADDRESS.getLocalPart()));
email.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
email.getBaseFormComponent().setRequired(true);
mainForm.add(email);

AutoCompleteTextPanel<String> organization = new AutoCompleteTextPanel<String>(ID_ORGANIZATION,
Expand All @@ -204,47 +209,13 @@ public Iterator<String> getIterator(String input) {
+ CredentialsType.F_PASSWORD.getLocalPart() + "."
+ PasswordType.F_VALUE.getLocalPart()));
password.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
password.getBaseFormComponent().setRequired(true);
mainForm.add(password);

CaptchaPanel captcha = new CaptchaPanel(ID_CAPTCHA);
captcha.setOutputMarkupId(true);
// final CaptchaImageResource captcha = new CaptchaImageResource(new AbstractReadOnlyModel<String>() {
//
// private static final long serialVersionUID = 1L;
//
// @Override
// public String getObject() {
// randomString = generateCaptcha();
// return randomString;
// }
//
// });
//
// final Image captchaImage = new Image(ID_IMAGE, captcha);
// captchaImage.setOutputMarkupId(true);
mainForm.add(captcha);

// AjaxLink<Void> changeCaptchaLink = new AjaxLink<Void>(ID_CHANGE_LINK) {
// private static final long serialVersionUID = 1L;
//
// @Override
// public void onClick(AjaxRequestTarget target) {
// updateCaptcha(captcha, target);
// }
// };
// mainForm.add(changeCaptchaLink);


// userText.add(new EmptyOnBlurAjaxFormUpdatingBehaviour(){
//
// @Override
// protected void onUpdate(AjaxRequestTarget target) {
// PageSelfRegistration.this.captchaString = (String)
// getDefaultModelObject();
// }
// });


AjaxSubmitButton register = new AjaxSubmitButton(ID_SUBMIT_REGISTRATION) {

private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -280,9 +251,22 @@ public boolean isEnabled() {
});

}

private CaptchaPanel getCaptcha() {
return (CaptchaPanel) get(createComponentPath(ID_MAIN_FORM, ID_CAPTCHA));
}

private void submitRegistration(AjaxRequestTarget target) {

CaptchaPanel captcha = getCaptcha();
if (captcha.getCaptchaText() != null && captcha.getRandomText() != null) {
if (!captcha.getCaptchaText().equals(captcha.getRandomText())) {
getSession().error(createStringResource("PageSelfRegistration.captcha.validation.failed").getString());
captcha.invalidateCaptcha();
throw new RestartResponseException(this);
}
}

OperationResult result = runPrivileged(new Producer<OperationResult>() {

@Override
Expand Down Expand Up @@ -384,21 +368,48 @@ private void saveUser(Task task, OperationResult result) {
ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(userType.asPrismObject());
userDelta.setPrismContext(getPrismContext());

WebModelServiceUtils.save(userDelta, result, task, PageSelfRegistration.this);
WebModelServiceUtils.save(userDelta, ModelExecuteOptions.createOverwrite(), result, task, PageSelfRegistration.this);
result.computeStatus();

}

private UserType prepareUserToSave(Task task,
OperationResult result) {
String organization = getOrganization();

SelfRegistrationDto selfRegistrationConfiguration = getSelfRegistrationConfiguration();
UserType userType = userModel.getObject();
if (selfRegistrationConfiguration.getRequiredLifecycleState() != null) {
ObjectQuery query = QueryBuilder.queryFor(UserType.class, getPrismContext())
.item(UserType.F_EMAIL_ADDRESS).eq(userType.getEmailAddress())
.build();
SearchResultList<PrismObject<UserType>> users = null;
try {
users = getModelService().searchObjects(UserType.class, query, null, task, result);
} catch (SchemaException | ObjectNotFoundException | SecurityViolationException
| CommunicationException | ConfigurationException e) {
// TODO Auto-generated catch block
}

if (users == null || users.size() == 0 || users.size() > 1) {
getSession().error(createStringResource("PageSelfRegistration.registration.failed.unsatisfied.registration.configuration").getString());
throw new RestartResponseException(this);

}

PrismObject<UserType> preregisteredUser = users.iterator().next();

userType.setOid(preregisteredUser.getOid());

}

String organization = getOrganization();

if (organization != null) {
userType.getOrganization().add(new PolyStringType(organization));
}

ProtectedStringType nonceCredentials = new ProtectedStringType();
nonceCredentials.setClearValue(generateNonce(getSelfRegistrationConfiguration().getNoncePolicy(), task, result));
nonceCredentials.setClearValue(generateNonce(selfRegistrationConfiguration.getNoncePolicy(), task, result));

NonceType nonceType = new NonceType();
nonceType.setValue(nonceCredentials);
Expand Down
Expand Up @@ -3417,3 +3417,5 @@ ObjectType.description=Description
PageUserHistory.title='{0}' historical data {1}
PageXmlDataReview.title=Historical data
PageXmlDataReview.aceEditorPanelTitle='{0}' historical xml data {1}
PageLogin.selfRegistration=Sign up
PageSelfRegistration.registration.failed.unsatisfied.registration.configuration=Registration process not allowed. Please contact system administrator.

0 comments on commit cee07df

Please sign in to comment.