package org.appfuse.webapp.pages;
import org.apache.tapestry5.EventContext;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.alerts.AlertManager;
import org.apache.tapestry5.alerts.Duration;
import org.apache.tapestry5.alerts.Severity;
import org.apache.tapestry5.annotations.InjectPage;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.appfuse.service.UserManager;
import org.appfuse.webapp.services.EmailService;
import org.appfuse.webapp.util.RequestUtil;
import org.slf4j.Logger;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import javax.servlet.http.HttpServletRequest;
/**
* Generates a password recovery token and sends it via email to user.
*
*/
public class PasswordRecoveryToken {
@Inject
private Logger logger;
@Inject
private Messages messages;
@Inject
private UserManager userManager;
@Inject
private AlertManager alertManager;
@Inject
private HttpServletRequest request;
@Inject
private PageRenderLinkSource pageRenderLinkSource;
private String username;
Object onActivate(EventContext ctx) {
// ensure that the username has been set
if (ctx == null || ctx.getCount() == 0) {
logger.warn("Username not specified, notifying user that it's a required field.");
alertManager.alert(Duration.TRANSIENT,
Severity.ERROR,
messages.format("errors.required", messages.get("user.username")));
return Login.class;
}
// Expect username is the first item in the context
int userIdx = 0;
this.username = ctx.get(String.class, userIdx).trim();
logger.debug("Sending recovery token for username: " + username);
try {
userManager.sendPasswordRecoveryEmail(username, RequestUtil.getAppURL(request) + getLink());
} catch (final UsernameNotFoundException ignored) {
// lets ignore this
Throwable exceptionToLog = ignored.getCause() != null ? ignored.getCause() : ignored;
logger.error(exceptionToLog.getLocalizedMessage());
}
alertManager.alert(Duration.TRANSIENT,
Severity.SUCCESS,
messages.get("updatePassword.recoveryToken.sent"));
return Login.class;
}
/**
* Build link for for password reset
* @return URI
*/
public String getLink() {
Link link = pageRenderLinkSource.createPageRenderLinkWithContext(PasswordUpdate.class);
link.addParameter("username", "{username}");
link.addParameter("token", "{token}");
return link.toURI();
}
}