package fr.openwide.core.basicapp.web.application.security.password.component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
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.form.TextField;
import org.apache.wicket.markup.html.form.validation.EqualPasswordInputValidator;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.EmailAddressValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.openwide.core.basicapp.core.business.user.model.User;
import fr.openwide.core.basicapp.core.security.service.ISecurityManagementService;
import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.UserTypeDescriptor;
import fr.openwide.core.basicapp.web.application.common.validator.EmailExistsValidator;
import fr.openwide.core.basicapp.web.application.common.validator.UserPasswordValidator;
import fr.openwide.core.wicket.markup.html.basic.CoreLabel;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.form.LabelPlaceholderBehavior;
public class SecurityPasswordResetContentPanel extends GenericPanel<User> {
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = LoggerFactory.getLogger(SecurityPasswordResetContentPanel.class);
private final IModel<String> emailModel = Model.of("");
private final IModel<String> newPasswordModel = Model.of("");
@SpringBean
private ISecurityManagementService securityManagementService;
public SecurityPasswordResetContentPanel(String wicketId, IModel<User> userModel) {
super(wicketId, userModel);
UserTypeDescriptor<?> typeDescriptor = UserTypeDescriptor.get(getModelObject());
Form<?> form = new Form<Void>("form");
TextField<String> newPasswordField = new PasswordTextField("newPassword", newPasswordModel);
TextField<String> confirmPasswordField = new PasswordTextField("confirmPassword", Model.of(""));
add(form);
form.add(
new RequiredTextField<String>("email", emailModel)
.setLabel(new ResourceModel("business.user.email"))
.add(EmailAddressValidator.getInstance())
.add(EmailExistsValidator.get())
.add(new LabelPlaceholderBehavior()),
newPasswordField
.setLabel(new ResourceModel("business.user.newPassword"))
.setRequired(true)
.add(
new UserPasswordValidator(UserTypeDescriptor.get(userModel.getObject()))
.userModel(userModel)
)
.add(new LabelPlaceholderBehavior()),
new CoreLabel("passwordHelp",
new ResourceModel(
typeDescriptor.securityTypeDescriptor().resourceKeyGenerator().resourceKey("password.help"),
new ResourceModel(UserTypeDescriptor.USER.securityTypeDescriptor()
.resourceKeyGenerator().resourceKey("password.help"))
)
),
confirmPasswordField
.setLabel(new ResourceModel("business.user.confirmPassword"))
.setRequired(true)
.add(new LabelPlaceholderBehavior()),
new AjaxButton("validate", form) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
try {
User user = SecurityPasswordResetContentPanel.this.getModelObject();
securityManagementService.updatePassword(user, newPasswordModel.getObject());
getSession().success(getString("security.password.reset.validate.success"));
throw UserTypeDescriptor.get(user).securityTypeDescriptor()
.loginSuccessPageLinkDescriptor().newRestartResponseException();
} catch (RestartResponseException e) {
throw e;
} catch (Exception e) {
LOGGER.error("Error occurred while resetting password", e);
getSession().error(getString("common.error.unexpected"));
}
FeedbackUtils.refreshFeedback(target, getPage());
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
FeedbackUtils.refreshFeedback(target, getPage());
}
}
);
form.add(new EqualPasswordInputValidator(newPasswordField, confirmPasswordField));
}
@Override
protected void onDetach() {
super.onDetach();
emailModel.detach();
newPasswordModel.detach();
}
}