Skip to content

Commit

Permalink
added captcha to registration page..small improivements for user regi…
Browse files Browse the repository at this point in the history
…stration notifier
  • Loading branch information
katkav committed Oct 25, 2016
1 parent 0995eed commit 48c322e
Show file tree
Hide file tree
Showing 5 changed files with 236 additions and 37 deletions.
Expand Up @@ -8,10 +8,13 @@
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import org.w3c.tools.codec.Base64Decoder;
import org.w3c.tools.codec.Base64Encoder;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.crypto.EncryptionException;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -25,10 +28,10 @@
import com.evolveum.midpoint.web.util.MidPointPageParametersEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;


//"http://localhost:8080/midpoint/confirm/registrationid=" + newUser.getOid()
//+ "/token=" + userType.getCostCenter() + "/roleId=00000000-0000-0000-0000-000000000008";
//CONFIRMATION_LINK = "http://localhost:8080/midpoint/confirm/registration/";
@PageDescriptor(url = "/confirm", encoder = MidPointPageParametersEncoder.class)
public class PageRegistrationConfirmation extends PageBase {

Expand Down Expand Up @@ -59,14 +62,48 @@ private void init(final PageParameters pageParameters){
OperationResult result = runPrivileged(new Producer<OperationResult>() {


/*
* private String createConfirmationLink(UserType userType){
StringBuilder confirmLinkBuilder = new StringBuilder(CONFIRMATION_LINK);
StringBuilder suffixBuilder = new StringBuilder("registrationId");
suffixBuilder.append(userType.getOid()).append("/token/").append(userType.getCostCenter()).append("/roleId/00000000-0000-0000-0000-000000000008");
String suffix = suffixBuilder.toString();
Base64Encoder base64Encoder = new Base64Encoder(suffix);
String encoded = base64Encoder.processString();
String urlSuffix;
try {
ProtectedStringType protectedString = prismContext.getDefaultProtector().encryptString(encoded);
urlSuffix = new String(protectedString.getEncryptedDataType().getCipherData().getCipherValue());
} catch (EncryptionException e) {
urlSuffix = encoded;
}
confirmLinkBuilder.append(urlSuffix);
return confirmLinkBuilder.toString();
}(non-Javadoc)
* @see
*
com.evolveum.midpoint.util.Producer#run()
*/


@Override
public OperationResult run() {
PageParameters params = pageParameters;
if (params == null) {
params = getPageParameters();
}
StringValue userOidValue = params.get("registrationid");
// StringValue registrationLink = params.get("registration");
// Validate.notEmpty(registrationLink.toString());
//
// String encoded = registrationLink.toString();
// Base64Decoder decoder = new Base64Decoder(encoded);
// String decoded = decoder.processString();

StringValue userOidValue = params.get("registrationId");
Validate.notEmpty(userOidValue.toString());
StringValue tokenValue = params.get("token");
Validate.notEmpty(tokenValue.toString());
Expand Down
Expand Up @@ -86,6 +86,20 @@
</div>
</td>
</tr>
<tr>
<td>
<p>
<img wicket:id="image" />
</p>
<p>
<input wicket:id="text" type="text" size="40" />
</p>

</td>
<td>
<a wicket:id="changeLink"><wicket:message key="PageSelfRegistration.reload"/></a>
</td>
</tr>
</table>

<div class="btn btn-primary">
Expand Down
Expand Up @@ -5,14 +5,21 @@
import java.util.Iterator;
import java.util.List;

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

import com.evolveum.midpoint.web.component.form.Form;
import com.evolveum.midpoint.common.policy.StringPolicyUtils;
import com.evolveum.midpoint.common.policy.ValuePolicyGenerator;
import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;
import com.evolveum.midpoint.gui.api.component.password.PasswordPanel;
Expand Down Expand Up @@ -42,22 +49,23 @@
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.CredentialsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LimitationsType;
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.StringPolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ValuePolicyType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;


//"http://localhost:8080/midpoint/confirm/registrationid=" + newUser.getOid()
//+ "/token=" + userType.getCostCenter() + "/roleId=00000000-0000-0000-0000-000000000008";
@PageDescriptor(url = "/registration")
public class PageSelfRegistration extends PageBase {
private static final String DOT_CLASS = PageSelfRegistration.class.getName() + ".";

private static final String DOT_CLASS = PageSelfRegistration.class.getName() + ".";

private static final String ID_MAIN_FORM = "mainForm";
private static final String ID_FIRST_NAME = "firstName";
Expand All @@ -67,20 +75,26 @@ public class PageSelfRegistration extends PageBase {
private static final String ID_PASSWORD = "password";
private static final String ID_SUBMIT_REGISTRATION = "submitRegistration";
private static final String ID_REGISTRATION_SUBMITED = "registrationInfo";
private static final String ID_IMAGE = "image";
private static final String ID_CHANGE_LINK = "changeLink";
private static final String ID_USER_TEXT = "text";

private static final String OPERATION_SAVE_USER = DOT_CLASS + "saveUser";
private static final String OPERATION_LOAD_ORGANIZATIONS = DOT_CLASS + "loadOrganization";

private static final long serialVersionUID = 1L;

IModel<UserType> userModel;
boolean submited = false;
private IModel<UserType> userModel;

private boolean submited = false;
String randomString = null;
String captchaString = null;

public PageSelfRegistration() {

final UserType user = createUser();

userModel = new LoadableModel<UserType>() {
userModel = new LoadableModel<UserType>(true) {
private static final long serialVersionUID = 1L;

@Override
Expand Down Expand Up @@ -175,22 +189,89 @@ public Iterator<String> getIterator(String input) {
password.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
mainForm.add(password);

final CaptchaImageResource captcha = new CaptchaImageResource();
OperationResult result = new OperationResult("generateRandomString");

StringPolicyType sp = StringPolicyUtils.normalize(new StringPolicyType());
LimitationsType limits = new LimitationsType();
limits.setMinLength(8);
limits.setMaxLength(12);
limits.setMinUniqueChars(6);
sp.setLimitations(limits);

randomString = ValuePolicyGenerator.generate(sp, 8, result);
captcha.getChallengeIdModel().setObject(randomString);

final Image captchaImage = new Image(ID_IMAGE, captcha);
captchaImage.setOutputMarkupId(true);
mainForm.add(captchaImage);

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);

RequiredTextField<String> userText = new RequiredTextField<String>(ID_USER_TEXT, new PropertyModel<String>(PageSelfRegistration.this, "captchaString"), String.class) {

private static final long serialVersionUID = 1L;

@Override
protected final void onComponentTag(final ComponentTag tag) {
super.onComponentTag(tag);
tag.put("value", "");
}

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

mainForm.add(userText);


AjaxSubmitButton register = new AjaxSubmitButton(ID_SUBMIT_REGISTRATION) {

private static final long serialVersionUID = 1L;

protected void onSubmit(AjaxRequestTarget target,
org.apache.wicket.markup.html.form.Form<?> form) {
saveUser(target);

if (randomString == null || captchaString == null || !randomString.equals(captchaString))
{
getSession().error(createStringResource("PageSelfRegistration.captcha.validation.failed").getString());
new RestartResponseException(PageSelfRegistration.class);
}
else
{
saveUser(target);
}
captcha.invalidate();
target.add(getFeedbackPanel());
target.add(PageSelfRegistration.this);

}

};

mainForm.add(register);

MultiLineLabel label = new MultiLineLabel(ID_REGISTRATION_SUBMITED, createStringResource("PageSelfRegistration.registration.confirm.message"));
MultiLineLabel label = new MultiLineLabel(ID_REGISTRATION_SUBMITED,
createStringResource("PageSelfRegistration.registration.confirm.message"));
add(label);
label.add(new VisibleEnableBehaviour() {

private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
return submited;
Expand Down Expand Up @@ -236,6 +317,13 @@ public List<String> run() {
});

}

private void updateCaptcha(CaptchaImageResource captcha, AjaxRequestTarget target) {

captcha.invalidate();
Image captchaImage = (Image) get(createComponentPath(ID_MAIN_FORM, ID_IMAGE));
target.add(captchaImage);
}

private void saveUser(AjaxRequestTarget target) {
OperationResult result = runPrivileged(new Producer<OperationResult>() {
Expand All @@ -247,44 +335,57 @@ public OperationResult run() {
if (organization != null) {
userType.getOrganization().add(new PolyStringType(organization));
}

Task task = createAnonymousTask(OPERATION_SAVE_USER);
task.setChannel(SchemaConstants.CHANNEL_GUI_REGISTRATION_URI);
OperationResult result = new OperationResult(OPERATION_SAVE_USER);

PrismObject<SystemConfigurationType> systemConfig = WebModelServiceUtils.loadObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), PageSelfRegistration.this, task, result);


PrismObject<SystemConfigurationType> systemConfig = WebModelServiceUtils.loadObject(
SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(),
PageSelfRegistration.this, task, result);

String token = null;
ValuePolicyType policy = null;
if (systemConfig.asObjectable().getGlobalPasswordPolicyRef() != null) {
PrismObject<ValuePolicyType> valuePolicy = WebModelServiceUtils.loadObject(ValuePolicyType.class, systemConfig.asObjectable().getGlobalPasswordPolicyRef().getOid(), PageSelfRegistration.this, task, result);
if (systemConfig.asObjectable().getGlobalPasswordPolicyRef() != null) {
PrismObject<ValuePolicyType> valuePolicy = WebModelServiceUtils.loadObject(
ValuePolicyType.class,
systemConfig.asObjectable().getGlobalPasswordPolicyRef().getOid(),
PageSelfRegistration.this, task, result);
policy = valuePolicy.asObjectable();
}

token = ValuePolicyGenerator.generate(policy != null ? policy.getStringPolicy() : null, 24, result);

token = ValuePolicyGenerator.generate(policy != null ? policy.getStringPolicy() : null, 24,
result);
userType.setCostCenter(token);

ObjectDelta<UserType> userDelta= ObjectDelta.createAddDelta(userType.asPrismObject());

try {
getPrismContext().adopt(userType);
} catch (SchemaException e) {
// nothing to do, try without it
}

ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(userType.asPrismObject());
userDelta.setPrismContext(getPrismContext());

WebModelServiceUtils.save(userDelta, result, task, PageSelfRegistration.this);
return result;
}

});

result.computeStatus();

if (result.getStatus() == OperationResultStatus.SUCCESS) {
submited = true;
success(createStringResource("PageSelfRegistration.registration.success").getString());
getSession().success(createStringResource("PageSelfRegistration.registration.success").getString());

} else {
error(createStringResource("PageSelfRegistration.registration.error", result.getMessage()).getString());
getSession().error(createStringResource("PageSelfRegistration.registration.error", result.getMessage())
.getString());
new RestartResponseException(PageSelfRegistration.class);
}
target.add(getFeedbackPanel());
target.add(this);


}

private String getOrganization() {
Expand Down
Expand Up @@ -3405,3 +3405,5 @@ PageRegistrationConfirmation.continueToLogin=Continue to login page
PageRegistrationConfirmation.confirmation.successful=Confirmation successful
PageSelfRegistration.title=Registration
PageRegistrationConfirmation.title=Confirm registration
PageSelfRegistration.reload=Reload
PageSelfRegistration.captcha.validation.failed=CAPTCHA validation failed, try again

0 comments on commit 48c322e

Please sign in to comment.