package org.openslx.satellitedaemon.ftp; import java.io.File; import java.io.IOException; import java.util.ArrayList; import org.apache.ftpserver.ConnectionConfigFactory; 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.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; /** * FTP-Test-Utility, basierend auf Apache FtpServer: {@link http * ://www.jarvana.com * /jarvana/view/org/apache/ftpserver/ftpserver-core/1.0.6/ftpserver * -core-1.0.6-javadoc.jar!/org/apache/ftpserver/FtpServer.html} */ public class FtpTestUtil { /** * Erzeuge FTP-Server. * * @param ftpPort * FTP-Port, z.B. 2121 * @param ftpHomeDir * FTP-Verzeichnis, z.B. "target/FtpHome" * @param readUserName * leseberechtigter Benutzer: Name * @param readUserPwd * leseberechtigter Benutzer: Passwort * @param writeUserName * schreibberechtigter Benutzer: Name * @param writeUserPwd * schreibberechtigter Benutzer: Passwort * @param ftpUsersPropsFile * kann null sein, oder z.B. "target/FtpUsers.properties" * @param maxLogins * maximale Anzahl von Logins (0 fuer Defaultwert) */ public static FtpServer createFtpServer(int ftpPort, String ftpHomeDir, String readUserName, String readUserPwd, String writeUserName, String writeUserPwd) throws FtpException, IOException { return createFtpServer(ftpPort, ftpHomeDir, readUserName, readUserPwd, writeUserName, writeUserPwd, null, 0); } public static FtpServer createFtpServer(int ftpPort, String ftpHomeDir, String readUserName, String readUserPwd, String writeUserName, String writeUserPwd, String ftpUsersPropsFile, int maxLogins) throws FtpException, IOException { return createFtpServer(ftpPort, ftpHomeDir, readUserName, readUserPwd, writeUserName, writeUserPwd, ftpUsersPropsFile, maxLogins, 0); } public static FtpServer createFtpServer(int ftpPort, String ftpHomeDir, String readUserName, String readUserPwd, String writeUserName, String writeUserPwd, String ftpUsersPropsFile, int maxLogins, int maxIdleTimeSec) throws FtpException, IOException { File fhd = new File(ftpHomeDir); if (!fhd.exists()) fhd.mkdirs(); ListenerFactory listenerFactory = new ListenerFactory(); listenerFactory.setPort(ftpPort); PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor()); if (ftpUsersPropsFile != null && ftpUsersPropsFile.trim().length() > 0) { File upf = new File(ftpUsersPropsFile); if (!upf.exists()) upf.createNewFile(); userManagerFactory.setFile(upf); } // Einen Nur-Lese-User und einen User mit Schreibberechtigung anlegen: UserManager userManager = userManagerFactory.createUserManager(); BaseUser userRd = new BaseUser(); BaseUser userWr = new BaseUser(); userRd.setName(readUserName); userRd.setPassword(readUserPwd); userRd.setHomeDirectory(ftpHomeDir); userWr.setName(writeUserName); userWr.setPassword(writeUserPwd); userWr.setHomeDirectory(ftpHomeDir); if (maxIdleTimeSec > 0) { userRd.setMaxIdleTime(maxIdleTimeSec); userWr.setMaxIdleTime(maxIdleTimeSec); } ArrayList authorities = new ArrayList(); authorities.add(new WritePermission()); userWr.setAuthorities(authorities); userManager.save(userRd); userManager.save(userWr); FtpServerFactory serverFactory = new FtpServerFactory(); serverFactory.addListener("default", listenerFactory.createListener()); serverFactory.setUserManager(userManager); if (maxLogins > 0) { ConnectionConfigFactory ccf = new ConnectionConfigFactory(); ccf.setMaxLogins(maxLogins); serverFactory.setConnectionConfig(ccf.createConnectionConfig()); } return serverFactory.createServer(); } }