package org.gbif.ipt.action;
import org.gbif.ipt.config.AppConfig;
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 org.gbif.ipt.validation.UserValidator;
import java.io.IOException;
import com.google.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
/**
* Action handling account updates, such as changing user name and password.
*/
public class AccountAction extends POSTAction {
// logging
private static final Logger LOG = Logger.getLogger(AccountAction.class);
private static final long serialVersionUID = 5092204508303815778L;
private final UserAccountManager userManager;
private final UserValidator validator = new UserValidator();
private String email;
private String password2;
private User user;
@Inject
public AccountAction(SimpleTextProvider textProvider, AppConfig cfg, RegistrationManager registrationManager,
UserAccountManager userManager) {
super(textProvider, cfg, registrationManager);
this.userManager = userManager;
}
@Override
public String execute() throws Exception {
// check if any user is logged in right now - otherwise redirect to login page
if (user == null) {
return LOGIN;
}
return super.execute();
}
@Override
public void prepare() {
super.prepare();
if (getCurrentUser() != null) {
// modify existing user in session
user = getCurrentUser();
}
}
@Override
public String save() {
try {
if (validator.validate(this, user)) {
addActionMessage(getText("admin.user.account.updated"));
LOG.debug("The user account has been updated");
userManager.save();
return SUCCESS;
}
} catch (IOException e) {
addActionError(getText("admin.user.account.saveError"));
LOG.error("The user account change could not be made: " + e.getMessage(), e);
addActionError(e.getMessage());
}
return INPUT;
}
@Override
public void validateHttpPostOnly() {
if (user != null) {
String trimmedPassword = StringUtils.trimToNull(user.getPassword());
String trimmedPassword2 = StringUtils.trimToNull(password2);
// passwords don't match?
if (trimmedPassword != null && !trimmedPassword.equals(trimmedPassword2)) {
addFieldError("password2", getText("validation.password2.wrong"));
LOG.error("The passwords entered do not match");
password2 = null;
}
// password empty?
else if (trimmedPassword == null) {
addFieldError("user.password", getText("validation.password.reentered"));
LOG.error("The primary password entered is empty");
}
// otherwise set password even if it's too short - it gets validated during save
else {
user.setPassword(trimmedPassword);
LOG.error("The password has been reset");
}
}
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}