package org.devgateway.toolkit.forms.wicket.page.user; import de.agilecoders.wicket.core.markup.html.bootstrap.form.BootstrapForm; import org.apache.commons.lang3.RandomStringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; import org.devgateway.toolkit.forms.service.SendEmailService; import org.devgateway.toolkit.forms.wicket.components.form.TextFieldBootstrapFormComponent; import org.devgateway.toolkit.forms.wicket.page.BasePage; import org.devgateway.toolkit.persistence.dao.Person; import org.devgateway.toolkit.persistence.repository.PersonRepository; import org.springframework.security.crypto.password.StandardPasswordEncoder; import org.wicketstuff.annotation.mount.MountPath; @MountPath(value = "/forgotPassword") public class ForgotYourPasswordPage extends BasePage { private static final long serialVersionUID = -6767090562116351915L; @SpringBean private PersonRepository personRepository; @SpringBean private SendEmailService sendEmailService; public static final int RANDOM_PASSWORD_LENGTH = 16; public ForgotYourPasswordPage(final PageParameters parameters) { super(parameters); ForgotPasswordForm form = new ForgotPasswordForm("form"); add(form); } class ForgotPasswordForm extends BootstrapForm<Void> { private static final long serialVersionUID = 7708855731894924277L; private String emailAddress; private Label message; private IndicatingAjaxButton goBack; ForgotPasswordForm(final String componentId) { super(componentId); } @Override protected void onInitialize() { super.onInitialize(); final TextFieldBootstrapFormComponent<String> emailAddressField = new TextFieldBootstrapFormComponent<>( "emailAddress", new StringResourceModel("emailMessage", ForgotYourPasswordPage.this, null), new PropertyModel<>(this, "emailAddress")); emailAddressField.required(); emailAddressField.setOutputMarkupId(true); add(emailAddressField); message = new Label("message", new StringResourceModel("checkMessage", ForgotYourPasswordPage.this, null)); message.setVisibilityAllowed(false); message.setOutputMarkupId(true); add(message); final IndicatingAjaxButton submit = new IndicatingAjaxButton("submit", new StringResourceModel("submit.label", ForgotYourPasswordPage.this, null)) { private static final long serialVersionUID = 1L; @Override protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) { StandardPasswordEncoder encoder = new StandardPasswordEncoder(""); Person person = personRepository.findByEmail(emailAddress); if (person == null) { feedbackPanel.error("Email address not found"); } else { String newPassword = RandomStringUtils.random(RANDOM_PASSWORD_LENGTH, true, true); person.setPassword(encoder.encode(newPassword)); person.setChangePassword(true); personRepository.saveAndFlush(person); sendEmailService.sendEmailResetPassword(person, newPassword); emailAddressField.setVisibilityAllowed(false); this.setVisibilityAllowed(false); message.setVisibilityAllowed(true); goBack.setVisibilityAllowed(true); target.add(form); } target.add(feedbackPanel); } @Override protected void onError(final AjaxRequestTarget target, final Form<?> form) { target.add(feedbackPanel); } }; submit.setOutputMarkupId(true); add(submit); goBack = new IndicatingAjaxButton("goBack", new StringResourceModel("back", ForgotYourPasswordPage.this, null)) { private static final long serialVersionUID = 1L; @Override protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) { setResponsePage(LoginPage.class); } }; goBack.setVisibilityAllowed(false); goBack.setOutputMarkupId(true); add(goBack); } } }