package infrastructure.ftp;
import org.apache.ftpserver.ftplet.Authentication;
import org.apache.ftpserver.ftplet.AuthenticationFailedException;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.User;
import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
import org.apache.ftpserver.usermanager.UsernamePasswordAuthentication;
import org.apache.ftpserver.usermanager.impl.AbstractUserManager;
import java.util.HashMap;
import java.util.Map;
class InMemoryUserManager extends AbstractUserManager {
private final Map<String, User> users = new HashMap<String, User>();
public InMemoryUserManager() {
super("deep-dark-secret", new ClearTextPasswordEncryptor());
}
@Override
public User getUserByName(String name) throws FtpException {
return users.get(name);
}
@Override
public String[] getAllUserNames() throws FtpException {
return users.keySet().toArray(new String[users.size()]);
}
@Override
public void delete(String name) throws FtpException {
users.remove(name);
}
@Override
public void save(User user) throws FtpException {
users.put(user.getName(), user);
}
@Override
public boolean doesExist(String userName) throws FtpException {
return users.containsKey(userName);
}
@Override
public User authenticate(Authentication authentication) throws AuthenticationFailedException {
if (authentication instanceof UsernamePasswordAuthentication) {
UsernamePasswordAuthentication usernameAndPassword = (UsernamePasswordAuthentication) authentication;
String username = usernameAndPassword.getUsername();
User user = users.get(username);
if (null == user) {
throw new AuthenticationFailedException("unknown user '" + username + "'");
}
String password = usernameAndPassword.getPassword();
if (getPasswordEncryptor().matches(password, user.getPassword())) {
return user;
} else {
throw new AuthenticationFailedException("password wrong");
}
}
throw new AuthenticationFailedException("try harder");
}
}