package fr.openwide.core.basicapp.web.application.security.password.page;
import org.apache.wicket.Component;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
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.BasicApplicationApplication;
import fr.openwide.core.basicapp.web.application.BasicApplicationSession;
import fr.openwide.core.basicapp.web.application.security.password.component.SecurityPasswordIntroPanel;
import fr.openwide.core.basicapp.web.application.security.password.component.SecurityPasswordResetContentPanel;
import fr.openwide.core.basicapp.web.application.security.password.template.SecurityPasswordTemplate;
import fr.openwide.core.wicket.more.link.descriptor.IPageLinkDescriptor;
import fr.openwide.core.wicket.more.link.descriptor.builder.LinkDescriptorBuilder;
import fr.openwide.core.wicket.more.link.descriptor.mapper.ITwoParameterLinkDescriptorMapper;
import fr.openwide.core.wicket.more.link.descriptor.parameter.CommonParameters;
import fr.openwide.core.wicket.more.markup.html.template.model.BreadCrumbElement;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
public class SecurityPasswordResetPage extends SecurityPasswordTemplate {
private static final long serialVersionUID = 1L;
public static final ITwoParameterLinkDescriptorMapper<IPageLinkDescriptor, User, String> MAPPER =
LinkDescriptorBuilder.start()
.model(User.class)
.model(String.class)
.pickFirst().map(CommonParameters.ID).mandatory()
.pickSecond().map(CommonParameters.TOKEN).mandatory()
.page(SecurityPasswordCreationPage.class);
private final IModel<User> userModel = new GenericEntityModel<Long, User>();
@SpringBean
private ISecurityManagementService securityManagementService;
public SecurityPasswordResetPage(PageParameters parameters) {
super(parameters);
// Being connected here doesn't make any sense
BasicApplicationSession.get().signOut();
final IModel<String> tokenModel = Model.of("");
MAPPER.map(userModel, tokenModel).extractSafely(
parameters,
BasicApplicationApplication.get().getHomePageLinkDescriptor(),
getString("common.error.unexpected")
);
parameters.remove(CommonParameters.TOKEN);
if (!tokenModel.getObject().equals(userModel.getObject().getPasswordRecoveryRequest().getToken())) {
getSession().error(getString("security.password.reset.wrongToken"));
throw BasicApplicationApplication.get().getHomePageLinkDescriptor().newRestartResponseException();
}
if (securityManagementService.isPasswordRecoveryRequestExpired(userModel.getObject())) {
getSession().error(getString("security.password.reset.expired"));
throw BasicApplicationApplication.get().getHomePageLinkDescriptor().newRestartResponseException();
}
addHeadPageTitlePrependedElement(
new BreadCrumbElement(new ResourceModel("security.password.reset.pageTitle"))
);
}
@Override
protected IModel<String> getTitleModel() {
return new ResourceModel("security.password.reset.pageTitle");
}
@Override
protected Component getIntroComponent(String wicketId) {
return new SecurityPasswordIntroPanel(wicketId, "security.password.reset.intro");
}
@Override
protected Component getContentComponent(String wicketId) {
return new SecurityPasswordResetContentPanel(wicketId, userModel);
}
@Override
protected void onDetach() {
super.onDetach();
userModel.detach();
}
}