From 40d528627efc309681496b47d66558e15eb3fe5e Mon Sep 17 00:00:00 2001 From: Nils Schwabe Date: Fri, 25 Apr 2014 14:28:56 +0200 Subject: Finally: Add _real_ server authentication. (this challengeresponse thing) --- .../openslx/imagemaster/ftp/MasterFtpServer.java | 144 +++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java (limited to 'src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java') diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java new file mode 100644 index 0000000..992c49a --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java @@ -0,0 +1,144 @@ +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(); + } + } +} -- cgit v1.2.3-55-g7522