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 | |
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')
9 files changed, 83 insertions, 25 deletions
diff --git a/src/main/java/org/openslx/imagemaster/db/DbImage.java b/src/main/java/org/openslx/imagemaster/db/DbImage.java index bf643bb..f5b8ee4 100644 --- a/src/main/java/org/openslx/imagemaster/db/DbImage.java +++ b/src/main/java/org/openslx/imagemaster/db/DbImage.java @@ -59,4 +59,9 @@ public class DbImage { return MySQL.update( "UPDATE images SET images.image_path = ? WHERE images.UUID = ?", location, imageData.uuid ); } + + public static int delete( ImageData imageData ) + { + return MySQL.update( "DELETE FROM images WHERE images.UUID=?", imageData.uuid ); + } } diff --git a/src/main/java/org/openslx/imagemaster/db/MySQL.java b/src/main/java/org/openslx/imagemaster/db/MySQL.java index 121ef1b..06496ea 100644 --- a/src/main/java/org/openslx/imagemaster/db/MySQL.java +++ b/src/main/java/org/openslx/imagemaster/db/MySQL.java @@ -6,6 +6,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import java.util.Properties; + import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import org.apache.log4j.Logger; diff --git a/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java b/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java index b0b23aa..62d16dc 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java +++ b/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java @@ -17,12 +17,17 @@ public class FtpCredentialsScheduler extends TimerTask private static Logger log = Logger.getLogger( FtpCredentialsScheduler.class ); public static final long timeout = Long.valueOf( Globals.getPropertyInt( Globals.PropInt.FTPTIMEOUT ) ) * 60L * 1000L; // timeout in ms + + static { + log.info( "timeout is:" + timeout ); + } @Override public void run() { // check all folders for ( Map.Entry<String, FtpCredentials> entry : App.ftpServer.users.entrySet() ) { + if (entry == null) continue; String sessionId = entry.getKey(); String username = entry.getValue().username; File dir = new File( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username ); @@ -34,27 +39,28 @@ public class FtpCredentialsScheduler extends TimerTask log.info( username + "'s files are too old. Deleting him and his folder." ); Util.deleteFolder( dir ); App.ftpServer.removeUser( sessionId ); + ImageProcessor.removeImageFromProcessList( username ); } } else if ( list.length > 1 ) { log.info( username + " uploaded too many files. Deleting his account and his folder." ); Util.deleteFolder( dir ); App.ftpServer.removeUser( sessionId ); + ImageProcessor.removeImageFromProcessList( username ); } else { // check the creation time of the user - if ( ( new Date().getTime() - App.ftpServer.timeouts.get( username ).getTime() ) >= timeout ) { - // remove user and his folder + if ( ( System.currentTimeMillis() - App.ftpServer.timeouts.get( username ) ) >= timeout ) { + log.info( username + " did nothing for too long. Deleting him and his folder" ); Util.deleteFolder( dir ); App.ftpServer.removeUser( sessionId ); - log.info( username + " did nothing for too long. Deleting him and his folder" ); + ImageProcessor.removeImageFromProcessList( username ); } } } - //TODO: remove image from process list } public static void startScheduling() { - Timer timer = new Timer(); + Timer timer = new Timer( "FtpScheduler" ); // start timer now and fire every 60 seconds timer.schedule( new FtpCredentialsScheduler(), 0, 60000 ); diff --git a/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java index 4c09907..3169aec 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java +++ b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java @@ -87,4 +87,23 @@ public class ImageProcessor images.put( username, imageData ); return true; } + + /** + * Removes image from process list (and also from db) + * @param username the user that uploaded the image + * @return + */ + public static boolean removeImageFromProcessList( String username) { + + if (!images.containsKey( username )) { + return false; + } + + DbImage.delete( images.get( username )); + images.remove( username ); + + log.info( "Deleted image from process list and db. (User: " + username + ")" ); + + return true; + } } 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; diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java index 3c73dba..0e113fe 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java +++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java @@ -49,7 +49,7 @@ public class MasterFtplet implements Ftplet public FtpletResult onConnect( FtpSession session ) throws FtpException, IOException { - // not used + log.info( session.getUser().getName() + " connected" ); return null; } diff --git a/src/main/java/org/openslx/imagemaster/server/ApiServer.java b/src/main/java/org/openslx/imagemaster/server/ApiServer.java index 7479fd3..31bb712 100644 --- a/src/main/java/org/openslx/imagemaster/server/ApiServer.java +++ b/src/main/java/org/openslx/imagemaster/server/ApiServer.java @@ -191,13 +191,11 @@ public class ApiServer log.info( username + " is done with upload" ); - // remove user that is not needed anymore - App.ftpServer.removeUser( username ); - log.info( "Removed user: " + username ); - ImageProcessor.processImageAfterUpload( username, list[0].getName() ); + // remove user that is not needed anymore App.ftpServer.removeUser( serverSessionId ); + log.info( "Removed user: " + username ); return true; } diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java index 24e2928..4f67415 100644 --- a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java +++ b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java @@ -13,11 +13,12 @@ import org.openslx.imagemaster.util.RandomString; public class ServerAuthenticator { + private static Logger log = Logger.getLogger( ServerAuthenticator.class ); // map of currently authenticating servers private static HashMap<String, String> authenticatingServers = new HashMap<String, String>(); private static AsymMessageSign messageSign = null; - + /** * Initialize the message signer/verifier */ @@ -29,7 +30,7 @@ public class ServerAuthenticator log.info( "Loaded keystore" ); } catch ( Exception e ) { log.error( "Error loading the keystore", e ); - System.exit(1); + System.exit( 1 ); } } @@ -67,22 +68,22 @@ public class ServerAuthenticator throws AuthenticationException, TException { byte[] bytes = challengeResponse.array(); - log.info( "Response was: " + challengeResponse + " with length: " + bytes.length); - + log.info( "Response was: " + challengeResponse + " with length: " + bytes.length ); + boolean result = false; - + try { result = messageSign.verifyMessage( bytes, authenticatingServers.get( organization ).getBytes() ); - } catch (Exception e) { - log.error( "Error while verifying message", e ); + } catch ( Exception e ) { + log.error( "Error while verifying message", e ); } - + if ( !result ) { throw new AuthenticationException(); } log.info( "Server of organinzation '" + organization - + " authenticated."); + + " authenticated." ); authenticatingServers.remove( organization ); diff --git a/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java b/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java index 5cc82fc..e468d46 100644 --- a/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java +++ b/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java @@ -11,7 +11,6 @@ import org.openslx.imagemaster.thrift.iface.FtpCredentials; import org.openslx.imagemaster.thrift.iface.ImageData; import org.openslx.imagemaster.thrift.iface.ImageServer; import org.openslx.imagemaster.thrift.iface.InvalidTokenException; -import org.openslx.imagemaster.thrift.iface.ServerAuthenticationException; import org.openslx.imagemaster.thrift.iface.ServerSessionData; import org.openslx.imagemaster.thrift.iface.SessionData; import org.openslx.imagemaster.thrift.iface.UserInfo; |