summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
diff options
context:
space:
mode:
authorNils Schwabe2014-04-25 14:28:56 +0200
committerNils Schwabe2014-04-25 14:28:56 +0200
commit40d528627efc309681496b47d66558e15eb3fe5e (patch)
tree4cb7ba77b4b55ecb0b29a734c782b68d6926d441 /src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
parentAdd FTPS to MasterFtpServer (diff)
downloadmasterserver-40d528627efc309681496b47d66558e15eb3fe5e.tar.gz
masterserver-40d528627efc309681496b47d66558e15eb3fe5e.tar.xz
masterserver-40d528627efc309681496b47d66558e15eb3fe5e.zip
Finally: Add _real_ server authentication. (this challengeresponse thing)
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java')
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java144
1 files changed, 144 insertions, 0 deletions
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<String, FtpCredentials> users = new HashMap<>();
+ // key: ftpUsername, value: createTime
+ public final HashMap<String, Date> 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<String, Ftplet> map = new HashMap<String, Ftplet>();
+ 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<Authority> authorities = new ArrayList<Authority>();
+ 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();
+ }
+ }
+}