diff options
| author | Nils Schwabe | 2014-04-25 16:20:50 +0200 |
|---|---|---|
| committer | Nils Schwabe | 2014-04-25 16:20:50 +0200 |
| commit | b9878eda35e354d16ce732a57b7fabebb46c1a46 (patch) | |
| tree | c0d9c7ad51025affb1480e676f3f37841c3bcd7b /src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java | |
| parent | Merge branch 'master' of git.openslx.org:bwlp/masterserver (diff) | |
| download | masterserver-b9878eda35e354d16ce732a57b7fabebb46c1a46.tar.gz masterserver-b9878eda35e354d16ce732a57b7fabebb46c1a46.tar.xz masterserver-b9878eda35e354d16ce732a57b7fabebb46c1a46.zip | |
Add remove image from process list (when user gets deleted after timeout)
Fix problems with timeout user deleting
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java')
| -rw-r--r-- | src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java index 992c49a..19671e3 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java +++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java @@ -1,9 +1,11 @@ package org.openslx.imagemaster.ftp; import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import org.apache.ftpserver.FtpServer; @@ -12,6 +14,8 @@ 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.impl.FtpIoSession; +import org.apache.ftpserver.listener.Listener; import org.apache.ftpserver.listener.ListenerFactory; import org.apache.ftpserver.ssl.SslConfigurationFactory; import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; @@ -29,10 +33,11 @@ public class MasterFtpServer implements Runnable private static Logger log = Logger.getLogger( MasterFtpServer.class ); private FtpServer server; private UserManager userManager; + private Listener listener; // key: serverSessionId, value: FtpCredentials public final HashMap<String, FtpCredentials> users = new HashMap<>(); // key: ftpUsername, value: createTime - public final HashMap<String, Date> timeouts = new HashMap<>(); + public final HashMap<String, Long> timeouts = new HashMap<>(); private boolean ini = false; public void init( int port ) @@ -55,11 +60,22 @@ public class MasterFtpServer implements Runnable factory.setImplicitSsl( true ); // replace the default listener - serverFactory.addListener( "default", factory.createListener() ); + listener = factory.createListener(); + serverFactory.addListener( "default", listener ); // create user manager PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); - userManagerFactory.setFile( new File( "src/main/properties/ftp.properties" ) ); + File userFile = new File( "src/main/properties/ftp.properties" ); + // clear user file to avoid dead users + PrintWriter writer = null; + try { + writer = new PrintWriter(userFile); + } catch ( FileNotFoundException e ) { + } finally { + writer.print(""); + writer.close(); + } + userManagerFactory.setFile( userFile ); userManagerFactory.setPasswordEncryptor( new SaltedPasswordEncryptor() ); userManager = userManagerFactory.createUserManager(); serverFactory.setUserManager( userManager ); @@ -101,7 +117,7 @@ public class MasterFtpServer implements Runnable userManager.save( user ); ftpCredentials = new FtpCredentials( generatedUser, generatedPass ); users.put( serverSessionId, ftpCredentials ); - timeouts.put( ftpCredentials.username, new Date() ); + timeouts.put( ftpCredentials.username, System.currentTimeMillis()); } catch ( FtpException e ) { } @@ -117,7 +133,20 @@ public class MasterFtpServer implements Runnable return false; try { + log.info( "Closing session" ); + // first find active session and close it + Iterator<FtpIoSession> iter = listener.getActiveSessions().iterator(); + while (iter.hasNext()) { + FtpIoSession session = (FtpIoSession) iter.next(); + if (session.getUser() == null) continue; + if (session.getUser().getName() == users.get( serverSessionId ).username) { + session.close(); + } + } + log.info( "Deleting user" ); + // afterwards delete user userManager.delete( users.get( serverSessionId ).username ); + log.info( "removing user from timeout list" ); // remove user from both maps timeouts.remove( users.remove( serverSessionId ).username ); return true; |
