package org.gbif.ipt.action;
import org.gbif.ipt.config.AppConfig;
import org.gbif.ipt.config.Constants;
import org.gbif.ipt.model.User;
import org.gbif.ipt.service.admin.RegistrationManager;
import org.gbif.ipt.service.admin.UserAccountManager;
import org.gbif.ipt.struts2.SimpleTextProvider;
import java.io.IOException;
import com.google.inject.Inject;
import org.apache.log4j.Logger;
/**
* Action handling login/logout only. Login can happen both from small login box on every page, or dedicated login
* page that provides the IPT administrator contact in case of problems or to create a new account.
*/
public class LoginAction extends POSTAction {
// logging
private static final Logger LOG = Logger.getLogger(AccountAction.class);
private final UserAccountManager userManager;
private String redirectUrl;
private String email;
private String password;
// to show admin contact
private User admin;
@Inject
public LoginAction(SimpleTextProvider textProvider, AppConfig cfg, RegistrationManager registrationManager,
UserAccountManager userManager) {
super(textProvider, cfg, registrationManager);
this.userManager = userManager;
}
@Override
public void prepare() {
super.prepare();
// populate admin user
admin = userManager.list(User.Role.Admin).get(0);
}
public String login() throws IOException {
// login
if (email != null) {
User authUser = userManager.authenticate(email, password);
if (authUser == null) {
addActionError(getText("admin.user.wrong.email.password.combination"));
LOG.info("User " + email + " failed to log in");
} else {
LOG.info("User " + email + " logged in successfully");
authUser.setLastLoginToNow();
userManager.save();
session.put(Constants.SESSION_USER, authUser);
// remember previous URL to redirect back to
setRedirectUrl();
return SUCCESS;
}
}
return INPUT;
}
public String logout() {
redirectUrl = getBase() + "/";
session.clear();
return SUCCESS;
}
private void setRedirectUrl() {
redirectUrl = "/";
// if we have a request refer back to the originally requested page
if (req != null) {
String referer = req.getHeader("Referer");
if (referer != null && referer.startsWith(cfg.getBaseUrl()) && !(referer.endsWith("login.do") || referer
.endsWith("login"))) {
redirectUrl = referer;
}
}
LOG.info("Redirecting to " + redirectUrl);
}
public String getRedirectUrl() {
return redirectUrl;
}
public void setRedirectUrl(String redirectUrl) {
this.redirectUrl = redirectUrl;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User getAdmin() {
return admin;
}
public void setAdmin(User admin) {
this.admin = admin;
}
}