summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNils Schwabe2014-04-25 16:20:50 +0200
committerNils Schwabe2014-04-25 16:20:50 +0200
commitb9878eda35e354d16ce732a57b7fabebb46c1a46 (patch)
treec0d9c7ad51025affb1480e676f3f37841c3bcd7b
parentMerge branch 'master' of git.openslx.org:bwlp/masterserver (diff)
downloadmasterserver-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
-rw-r--r--src/main/java/org/openslx/imagemaster/db/DbImage.java5
-rw-r--r--src/main/java/org/openslx/imagemaster/db/MySQL.java1
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java16
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java19
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java39
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java2
-rw-r--r--src/main/java/org/openslx/imagemaster/server/ApiServer.java6
-rw-r--r--src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java19
-rw-r--r--src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java1
-rw-r--r--src/test/java/org/openslx/imagemaster/ServerTest.java27
10 files changed, 106 insertions, 29 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;
diff --git a/src/test/java/org/openslx/imagemaster/ServerTest.java b/src/test/java/org/openslx/imagemaster/ServerTest.java
index c791f52..bb81432 100644
--- a/src/test/java/org/openslx/imagemaster/ServerTest.java
+++ b/src/test/java/org/openslx/imagemaster/ServerTest.java
@@ -1,5 +1,6 @@
package org.openslx.imagemaster;
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -7,17 +8,24 @@ import java.net.ConnectException;
import java.net.SocketException;
import java.nio.ByteBuffer;
import java.security.InvalidKeyException;
+import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.UUID;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
+import org.apache.commons.net.ftp.FTPSClient;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
@@ -111,8 +119,8 @@ public class ServerTest extends TestCase
int version = 1;
String imageName = "maschine.vmkd";
UUID uuid = UUID.randomUUID();
- int imageCreateTime = (int)new Date().getTime();
- int imageUpdateTime = imageCreateTime;
+ long imageCreateTime = System.currentTimeMillis();
+ long imageUpdateTime = imageCreateTime;
String imageOwner = "ns202";
String contentOperatingSystem = "win7";
boolean statusIsValid = true;
@@ -124,12 +132,23 @@ public class ServerTest extends TestCase
imageCreateTime, imageUpdateTime, imageOwner, contentOperatingSystem,
statusIsValid, statusIsDeleted, imageShortDescrption, imageLongDescription );
- System.out.println( "Created imageData" );
+ System.out.println( "Created imageData..." );
FtpCredentials ftpCredentials = client.submitImage( data.sessionId, imageData );
System.out.println( "Got FTP credentials. User: " + ftpCredentials.username + ", password: " + ftpCredentials.password );
- FTPClient FtpClient = new FTPClient();
+ FTPSClient FtpClient = new FTPSClient( "SSL" );
+ System.out.println("Created new ftpsclient...");
+ TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( "JKS" );
+ KeyStore keystore = KeyStore.getInstance( "JKS" );
+ keystore.load( new FileInputStream( new File( "./config/keystore.jks" ) ), "password".toCharArray() );
+ System.out.println("Loaded keystore..");
+ trustManagerFactory.init( keystore );
+ TrustManager trustManager = trustManagerFactory.getTrustManagers()[0];
+ FtpClient.setTrustManager(trustManager);
+
+ System.out.println("Trying to connect...");
+
String host = "localhost";
int port = 2221;
String user = ftpCredentials.username;