package org.openslx.imagemaster.server; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.ftpserver.FtpServer; import org.apache.ftpserver.FtpServerFactory; import org.apache.ftpserver.ftplet.Authority; import org.apache.ftpserver.ftplet.FtpException; import org.apache.ftpserver.ftplet.Ftplet; import org.apache.ftpserver.ftplet.UserManager; import org.apache.ftpserver.listener.ListenerFactory; import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor; import org.apache.ftpserver.usermanager.impl.BaseUser; import org.apache.ftpserver.usermanager.impl.WritePermission; import org.apache.log4j.Logger; import org.openslx.imagemaster.Globals; import org.openslx.imagemaster.thrift.iface.FtpCredentials; import org.openslx.imagemaster.util.RandomString; public class MasterFtpServer implements Runnable { private static Logger log = Logger.getLogger( MasterFtpServer.class ); private FtpServer server; private UserManager userManager; // key: serverSessionId, value: FtpCredentials public final HashMap users = new HashMap<>(); // key: ftpUsername, value: createTime public final HashMap timeouts = new HashMap<>(); public MasterFtpServer(int port, String adminUsername, String adminPassword, String ftproot) { FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); // set the port of the listener factory.setPort(port); // replace the default listener serverFactory.addListener("default", factory.createListener()); // create user manager PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); userManagerFactory.setFile(new File("src/main/properties/ftp.properties")); userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor()); userManager = userManagerFactory.createUserManager(); // create new admin user //addUser(adminUsername, adminPassword, ftproot, true); serverFactory.setUserManager(userManager); // add the Ftplet HashMap map = new HashMap(); map.put("Ftplet1", new MasterFtplet()); serverFactory.setFtplets(map); // start the server server = serverFactory.createServer(); } public FtpCredentials addUser(final String serverSessionId) { // TODO: enable SSL FtpCredentials ftpCredentials = null; String generatedUser = RandomString.generate(10, false); String generatedPass = RandomString.generate(16, true); String dir = Globals.properties.getProperty(Globals.ftpBaseDir) + "/" + generatedUser + "/"; if (!new File(dir).mkdir()) { return ftpCredentials; } BaseUser user = new BaseUser(); user.setName(generatedUser); user.setPassword(generatedPass); user.setHomeDirectory(dir); List authorities = new ArrayList(); authorities.add(new WritePermission()); user.setAuthorities(authorities); try { userManager.save(user); ftpCredentials = new FtpCredentials(generatedUser, generatedPass); users.put(serverSessionId, ftpCredentials); timeouts.put(ftpCredentials.username, new Date()); } catch (FtpException e) { } log.info("Generated user/pass: " + generatedUser + "\t" + generatedPass + "\n with home dir: " + dir); return ftpCredentials; } public boolean removeUser(final String serverSessionId) { if (!users.containsKey(serverSessionId)) return false; try { userManager.delete(users.get(serverSessionId).username); // remove user from both maps timeouts.remove(users.remove(serverSessionId).username); return true; } catch (FtpException e) { return false; } } public FtpCredentials getCredentialsFromSessionId(String serverSessionId) { return users.get(serverSessionId); } @Override public void run() { try { log.info( "Starting FTP Sever" ); server.start(); } catch (FtpException e1) { e1.printStackTrace(); } } }