package nl.topicus.konijn.web.pages.home;
import java.util.Date;
import nl.topicus.konijn.data.dao.hibernate.UserDao;
import nl.topicus.konijn.data.entity.User;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.authroles.authorization.strategies.role.Roles;
import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.EmailTextField;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.odlabs.wiquery.ui.dialog.util.DialogUtilsBehavior;
import com.google.inject.Inject;
/**
* Main page
*
* @author Joost Limburg
*/
public class RegisterPage extends WebPage {
@Inject
private UserDao userDao;
private static final long serialVersionUID = 1L;
private CaptchaImageResource captchaImageResource;
private EmailTextField email;
private DialogUtilsBehavior dialogUtilsBehavior;
private PasswordTextField password;
private RequiredTextField<String> captchaField;
private final Image image;
/**
* Constructor that is invoked when page is invoked without a em.
*
* @param parameters
* Page parameters
*/
public RegisterPage(final PageParameters parameters) {
captchaImageResource = new CaptchaImageResource(imagePass);
Form<String> form = new Form<String>("register");
dialogUtilsBehavior = new DialogUtilsBehavior();
add(dialogUtilsBehavior);
// Email:
form.add(email = new EmailTextField("email", ""));
email.setRequired(true);
email.setOutputMarkupId(true);
// Password:
form.add(password = new PasswordTextField("password",
new Model<String>("")));
password.setRequired(true);
password.setOutputMarkupId(true);
// Captcha:
form.add(new AjaxLink<String>("refreshCaptcha") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
imagePass = randomString(6, 8);
captchaImageResource = new CaptchaImageResource(imagePass);
image.setImageResource(captchaImageResource);
target.add(image);
}
});
// Image:
form.add(image = new Image("captchaImage", captchaImageResource));
image.setOutputMarkupId(true);
// Captcha textfield:
form.add(captchaField = new RequiredTextField<String>("captcha",
new Model<String>("")) {
private static final long serialVersionUID = 1L;
@Override
protected final void onComponentTag(final ComponentTag tag) {
super.onComponentTag(tag);
// clear the field after each render
tag.put("value", "");
}
});
captchaField.setRequired(true);
captchaField.setOutputMarkupId(true);
// Submit button:
form.add(new AjaxSubmitLink("submit") {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
if (processForm(target)) {
form.clearInput();
target.add(form);
}
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.appendJavaScript(dialogUtilsBehavior
.warningDialog(
"One or more necessary fields have not been entered correctly.")
.render().toString());
}
});
add(form);
}
/**
* Process register form
*
* @param target
*/
private boolean processForm(AjaxRequestTarget target) {
String error = "";
String usernameText = email.getModelObject().toLowerCase();
String passwordText = password.getModelObject();
String captchaText = captchaField.getModelObject();
// Validate password:
if (passwordText.length() < 8 || passwordText.length() > 12) {
error = "Your password should be at least 8 characters, with a max of 12.";
}
// Validate email:
if (error.length() == 0 && !email.isValid()) {
error = "The email address entered is invalid.";
}
// Check if user exists:
if (error.length() == 0 && userDao.getUser(usernameText) != null) {
error = "The email adress entered has been registered already.";
}
// Check captcha:
if (error.length() == 0
&& !getCaptcha().toLowerCase()
.equals(captchaText.toLowerCase())) {
error = "Invalid captcha entered. Please try again.";
}
imagePass = randomString(6, 8);
captchaImageResource = new CaptchaImageResource(imagePass);
image.setImageResource(captchaImageResource);
target.add(image);
// Process
if (error.length() == 0) {
User user = new User();
user.setCreatedAt(new Date());
user.setChangedAt(new Date());
user.setPassword(passwordText);
user.setUsername(usernameText);
user.setRoles(Roles.USER);
userDao.save(user);
target.appendJavaScript(dialogUtilsBehavior
.simpleDialog("You have been registered.",
"Success! Now you can login with the email and password entered.")
.render().toString());
return true;
} else {
target.appendJavaScript(dialogUtilsBehavior.warningDialog(error)
.render().toString());
return false;
}
}
private static int randomInt(int min, int max) {
return (int) (Math.random() * (max - min) + min);
}
private static String randomString(int min, int max) {
int num = randomInt(min, max);
byte b[] = new byte[num];
for (int i = 0; i < num; i++)
b[i] = (byte) randomInt('a', 'z');
return new String(b);
}
/** Random captcha password to match against. */
private String imagePass = randomString(6, 8);
private String getCaptcha() {
return imagePass;
}
}