package org.primftpd;
import android.os.Environment;
import org.apache.ftpserver.ftplet.Authentication;
import org.apache.ftpserver.ftplet.AuthenticationFailedException;
import org.apache.ftpserver.ftplet.Authority;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.User;
import org.apache.ftpserver.ftplet.UserManager;
import org.apache.ftpserver.usermanager.AnonymousAuthentication;
import org.apache.ftpserver.usermanager.UsernamePasswordAuthentication;
import org.apache.ftpserver.usermanager.impl.BaseUser;
import org.apache.ftpserver.usermanager.impl.ConcurrentLoginPermission;
import org.apache.ftpserver.usermanager.impl.TransferRatePermission;
import org.apache.ftpserver.usermanager.impl.WritePermission;
import org.primftpd.util.EncryptionUtil;
import org.primftpd.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class AndroidPrefsUserManager implements UserManager {
public static final String ANONYMOUS_USER_NAME = "anonymous";
protected final Logger logger = LoggerFactory.getLogger(getClass());
private final PrefsBean prefsBean;
public AndroidPrefsUserManager(PrefsBean prefsBean) {
this.prefsBean = prefsBean;
}
protected List<Authority> buildAuthorities() {
List<Authority> authorities = new ArrayList<Authority>();
WritePermission writePerm = new WritePermission();
authorities.add(writePerm);
//TransferRatePermission ratePerm = new TransferRatePermission(100, 100);
TransferRatePermission ratePerm = new TransferRatePermission(0, 0);
authorities.add(ratePerm);
ConcurrentLoginPermission concurLoginPerm = new ConcurrentLoginPermission(10, 10);
authorities.add(concurLoginPerm);
return authorities;
}
protected User buildUser() {
return createUser(prefsBean.getUserName(), prefsBean.getPassword());
}
protected User anonymousUser() {
return createUser(ANONYMOUS_USER_NAME, null);
}
private User createUser(String username, String password) {
BaseUser user = new BaseUser();
user.setEnabled(true);
String rootDir = Environment.getExternalStorageDirectory().getAbsolutePath();
logger.debug("rootDir: {}", rootDir);
user.setHomeDirectory(rootDir);
user.setMaxIdleTime(60);
user.setName(username);
if(password != null) {
user.setPassword(prefsBean.getPassword());
}
user.setAuthorities(buildAuthorities());
return user;
}
@Override
public User getUserByName(String username) throws FtpException {
if (doesExist(username)) {
return buildUser();
}
return null;
}
@Override
public String[] getAllUserNames() throws FtpException {
return new String[]{prefsBean.getUserName(), ANONYMOUS_USER_NAME};
}
@Override
public void delete(String username) throws FtpException {
}
@Override
public void save(User user) throws FtpException {
}
@Override
public boolean doesExist(String username) {
return prefsBean.getUserName().equals(username) || ANONYMOUS_USER_NAME.equals(username);
}
@Override
public User authenticate(Authentication authentication)
throws AuthenticationFailedException
{
if (authentication instanceof UsernamePasswordAuthentication) {
UsernamePasswordAuthentication auth = (UsernamePasswordAuthentication) authentication;
if (doesExist(auth.getUsername())) {
String pw = auth.getPassword();
if (!StringUtils.isBlank(pw)) {
String encryptedPW = EncryptionUtil.encrypt(pw);
String storedPW = prefsBean.getPassword();
if (storedPW.equals(encryptedPW)) {
return buildUser();
}
}
}
} else if(authentication instanceof AnonymousAuthentication) {
if(prefsBean.isAnonymousLogin()) {
return anonymousUser();
}
}
throw new AuthenticationFailedException();
}
@Override
public String getAdminName() throws FtpException {
return prefsBean.getUserName();
}
@Override
public boolean isAdmin(String username) throws FtpException {
return prefsBean.getUserName().equals(username);
}
}