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.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.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.BasicApplicationSession;
import fr.openwide.core.basicapp.web.application.common.typedescriptor.user.UserTypeDescriptor;
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 SecurityPasswordExpirationContentPanel extends GenericPanel<User> {
private static final long serialVersionUID = 547223775134254240L;
private static final Logger LOGGER = LoggerFactory.getLogger(SecurityPasswordExpirationContentPanel.class);
private final IModel<String> newPasswordModel = Model.of("");
@SpringBean
private ISecurityManagementService securityManagementService;
public SecurityPasswordExpirationContentPanel(String id) {
super(id, BasicApplicationSession.get().getUserModel());
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(
newPasswordField
.setLabel(new ResourceModel("business.user.newPassword"))
.setRequired(true)
.add(
new UserPasswordValidator(typeDescriptor)
.userModel(getModel())
)
.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 = BasicApplicationSession.get().getUser();
securityManagementService.updatePassword(user, newPasswordModel.getObject());
getSession().success(getString("security.password.expiration.validate.success"));
throw UserTypeDescriptor.get(user).securityTypeDescriptor()
.loginSuccessPageLinkDescriptor().newRestartResponseException();
} catch (RestartResponseException e) {
throw e;
} catch (Exception e) {
LOGGER.error("Error occurred while reseting password after expiration", 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();
newPasswordModel.detach();
}
}