package org.openslx.imagemaster.ftp; 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.ssl.SslConfigurationFactory; 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.Globals.PropString; 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<>(); private boolean ini = false; public void init( int port ) { if ( ini ) return; FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); // config ssl SslConfigurationFactory sslConfigFactory = new SslConfigurationFactory(); sslConfigFactory.setKeystoreFile( new File( Globals.getPropertyString( PropString.KEYSTOREFILE ) ) ); sslConfigFactory.setKeyAlias( Globals.getPropertyString( PropString.KEYSTOREALIAS ) ); sslConfigFactory.setKeystorePassword( Globals.getPropertyString( PropString.KEYSTOREPASSWORD ) ); // set the port of the listener factory.setPort( port ); factory.setSslConfiguration( sslConfigFactory.createSslConfiguration() ); factory.setImplicitSsl( true ); // 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(); serverFactory.setUserManager( userManager ); // add the Ftplet HashMap map = new HashMap(); map.put( "Ftplet1", new MasterFtplet() ); serverFactory.setFtplets( map ); // start the server server = serverFactory.createServer(); ini = true; } public FtpCredentials addUser( final String serverSessionId ) { FtpCredentials ftpCredentials = null; String generatedUser = RandomString.generate( 10, false ); String generatedPass = RandomString.generate( 16, true ); String dir = Globals.getPropertyString( Globals.PropString.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(); } } }