summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/openslx/imagemaster/App.java4
-rw-r--r--src/main/java/org/openslx/imagemaster/Globals.java22
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java (renamed from src/main/java/org/openslx/imagemaster/server/FtpCredentialsScheduler.java)2
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java (renamed from src/main/java/org/openslx/imagemaster/db/ImageProcessor.java)3
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java (renamed from src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java)9
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java (renamed from src/main/java/org/openslx/imagemaster/server/MasterFtplet.java)2
-rw-r--r--src/main/java/org/openslx/imagemaster/server/ApiServer.java5
-rw-r--r--src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java42
-rw-r--r--src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java5
-rw-r--r--src/main/java/org/openslx/imagemaster/util/AsymMessageSign.java63
-rw-r--r--src/main/java/org/openslx/imagemaster/util/Util.java20
-rw-r--r--src/main/thrift/imagemaster.thrift2
-rw-r--r--src/test/java/org/openslx/imagemaster/AppTest.java148
-rw-r--r--src/test/java/org/openslx/imagemaster/ServerTest.java172
14 files changed, 341 insertions, 158 deletions
diff --git a/src/main/java/org/openslx/imagemaster/App.java b/src/main/java/org/openslx/imagemaster/App.java
index 85ec50b..a73e1ef 100644
--- a/src/main/java/org/openslx/imagemaster/App.java
+++ b/src/main/java/org/openslx/imagemaster/App.java
@@ -6,8 +6,8 @@ import java.util.List;
import org.apache.log4j.Logger;
import org.openslx.imagemaster.Globals.PropInt;
-import org.openslx.imagemaster.server.FtpCredentialsScheduler;
-import org.openslx.imagemaster.server.MasterFtpServer;
+import org.openslx.imagemaster.ftp.FtpCredentialsScheduler;
+import org.openslx.imagemaster.ftp.MasterFtpServer;
import org.openslx.imagemaster.thrift.server.BinaryListener;
public class App
diff --git a/src/main/java/org/openslx/imagemaster/Globals.java b/src/main/java/org/openslx/imagemaster/Globals.java
index 717cb1e..166e629 100644
--- a/src/main/java/org/openslx/imagemaster/Globals.java
+++ b/src/main/java/org/openslx/imagemaster/Globals.java
@@ -7,7 +7,6 @@ import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
-import org.openslx.imagemaster.server.MasterFtpServer;
public class Globals
{
@@ -23,7 +22,7 @@ public class Globals
public static enum PropString
{
- IMAGEDIR, KEYSTORE, LDAPHOST, LDAPBINDQUERY, LDAPSEARCHBASEDN, LDAPSEARCHFILTER, FTPBASEDIR
+ IMAGEDIR, KEYSTOREFILE, KEYSTOREALIAS, KEYSTOREPASSWORD, LDAPHOST, LDAPBINDQUERY, LDAPSEARCHBASEDN, LDAPSEARCHFILTER, FTPBASEDIR
}
public static enum PropBool
@@ -64,8 +63,12 @@ public class Globals
|| Globals.getPropertyString( PropString.LDAPSEARCHFILTER ).isEmpty()
|| Globals.getPropertyString( PropString.FTPBASEDIR ) == null
|| Globals.getPropertyString( PropString.FTPBASEDIR ).isEmpty()
- || Globals.getPropertyString( PropString.KEYSTORE ) == null
- || Globals.getPropertyString( PropString.KEYSTORE ).isEmpty()
+ || Globals.getPropertyString( PropString.KEYSTOREFILE ) == null
+ || Globals.getPropertyString( PropString.KEYSTOREFILE ).isEmpty()
+ || Globals.getPropertyString( PropString.KEYSTOREALIAS ) == null
+ || Globals.getPropertyString( PropString.KEYSTOREALIAS ).isEmpty()
+ || Globals.getPropertyString( PropString.KEYSTOREPASSWORD ) == null
+ || Globals.getPropertyString( PropString.KEYSTOREPASSWORD ).isEmpty()
|| Globals.getPropertyInt( PropInt.LDAPPORT ) == 0
|| Globals.getPropertyInt( PropInt.SESSIONTIMEOUTUSER ) == 0
@@ -88,7 +91,7 @@ public class Globals
}
// check keystore
- if ( !Globals.getPropertyString( PropString.KEYSTORE ).endsWith( ".jks" )) {
+ if ( !Globals.getPropertyString( PropString.KEYSTOREFILE ).endsWith( ".jks" )) {
log.error( "Keystore is not in jks format." );
return false;
}
@@ -146,6 +149,15 @@ public class Globals
case IMAGEDIR:
result = properties.getProperty( "image_dir" );
break;
+ case KEYSTOREFILE:
+ result = properties.getProperty( "keystore_file" );
+ break;
+ case KEYSTOREALIAS:
+ result = properties.getProperty( "keystore_alias" );
+ break;
+ case KEYSTOREPASSWORD:
+ result = properties.getProperty( "keystore_password" );
+ break;
case LDAPHOST:
result = properties.getProperty( "ldap_host" );
break;
diff --git a/src/main/java/org/openslx/imagemaster/server/FtpCredentialsScheduler.java b/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java
index ba88f33..b0b23aa 100644
--- a/src/main/java/org/openslx/imagemaster/server/FtpCredentialsScheduler.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java
@@ -1,4 +1,4 @@
-package org.openslx.imagemaster.server;
+package org.openslx.imagemaster.ftp;
import java.io.File;
import java.util.Date;
diff --git a/src/main/java/org/openslx/imagemaster/db/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java
index d0ac5c6..4c09907 100644
--- a/src/main/java/org/openslx/imagemaster/db/ImageProcessor.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java
@@ -1,10 +1,11 @@
-package org.openslx.imagemaster.db;
+package org.openslx.imagemaster.ftp;
import java.io.File;
import java.util.HashMap;
import org.apache.log4j.Logger;
import org.openslx.imagemaster.Globals;
+import org.openslx.imagemaster.db.DbImage;
import org.openslx.imagemaster.thrift.iface.ImageData;
public class ImageProcessor
diff --git a/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
index de0d758..992c49a 100644
--- a/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java
@@ -1,4 +1,4 @@
-package org.openslx.imagemaster.server;
+package org.openslx.imagemaster.ftp;
import java.io.File;
import java.util.ArrayList;
@@ -20,6 +20,7 @@ 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;
@@ -44,9 +45,9 @@ public class MasterFtpServer implements Runnable
// config ssl
SslConfigurationFactory sslConfigFactory = new SslConfigurationFactory();
- sslConfigFactory.setKeystoreFile( new File( "./keyfiles/ftp.jks" ) );
- sslConfigFactory.setKeyAlias( "ftp" );
- sslConfigFactory.setKeystorePassword( "password" );
+ 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 );
diff --git a/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java
index a8c1cbe..3c73dba 100644
--- a/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java
+++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java
@@ -1,4 +1,4 @@
-package org.openslx.imagemaster.server;
+package org.openslx.imagemaster.ftp;
import java.io.IOException;
diff --git a/src/main/java/org/openslx/imagemaster/server/ApiServer.java b/src/main/java/org/openslx/imagemaster/server/ApiServer.java
index c88bd05..7479fd3 100644
--- a/src/main/java/org/openslx/imagemaster/server/ApiServer.java
+++ b/src/main/java/org/openslx/imagemaster/server/ApiServer.java
@@ -1,13 +1,14 @@
package org.openslx.imagemaster.server;
import java.io.File;
+import java.nio.ByteBuffer;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.openslx.imagemaster.App;
import org.openslx.imagemaster.Globals;
import org.openslx.imagemaster.db.DbSatellite;
-import org.openslx.imagemaster.db.ImageProcessor;
+import org.openslx.imagemaster.ftp.ImageProcessor;
import org.openslx.imagemaster.serversession.ServerAuthenticator;
import org.openslx.imagemaster.serversession.ServerSession;
import org.openslx.imagemaster.serversession.ServerSessionManager;
@@ -146,7 +147,7 @@ public class ApiServer
* @throws TException
*/
public static ServerSessionData serverAuthenticate( String organization,
- String challengeResponse ) throws AuthenticationException,
+ ByteBuffer challengeResponse ) throws AuthenticationException,
TException
{
if ( organization == null || challengeResponse == null ) {
diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java
index 726b062..24e2928 100644
--- a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java
+++ b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java
@@ -1,10 +1,14 @@
package org.openslx.imagemaster.serversession;
+import java.nio.ByteBuffer;
import java.util.HashMap;
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
+import org.openslx.imagemaster.Globals;
+import org.openslx.imagemaster.Globals.PropString;
import org.openslx.imagemaster.thrift.iface.AuthenticationException;
+import org.openslx.imagemaster.util.AsymMessageSign;
import org.openslx.imagemaster.util.RandomString;
public class ServerAuthenticator
@@ -12,6 +16,22 @@ 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
+ */
+ static {
+ try {
+ messageSign = new AsymMessageSign( Globals.getPropertyString( PropString.KEYSTOREALIAS ),
+ Globals.getPropertyString( PropString.KEYSTOREPASSWORD ),
+ Globals.getPropertyString( PropString.KEYSTOREFILE ) );
+ log.info( "Loaded keystore" );
+ } catch ( Exception e ) {
+ log.error( "Error loading the keystore", e );
+ System.exit(1);
+ }
+ }
/**
* Start the server authentification.
@@ -43,20 +63,26 @@ public class ServerAuthenticator
* @throws TException
*/
public static ServerUser serverAuthenticate( String organization,
- String address, String challengeResponse )
+ String address, ByteBuffer challengeResponse )
throws AuthenticationException, TException
{
- /*
- * TODO: Decrypt the given challengeResponse and check whether it was
- * right or not. Authenticate server if so.
- */
- if ( !challengeResponse.equals( authenticatingServers.get( organization ) ) ) {
+ byte[] bytes = challengeResponse.array();
+ 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 );
+ }
+
+ if ( !result ) {
throw new AuthenticationException();
}
log.info( "Server of organinzation '" + organization
- + " authenticated. With response: '" + challengeResponse
- + "'" );
+ + " 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 16496a2..5cc82fc 100644
--- a/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java
+++ b/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java
@@ -1,5 +1,7 @@
package org.openslx.imagemaster.thrift.server;
+import java.nio.ByteBuffer;
+
import org.apache.log4j.Logger;
import org.apache.thrift.TException;
import org.openslx.imagemaster.server.ApiServer;
@@ -9,6 +11,7 @@ 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;
@@ -48,7 +51,7 @@ public class ImageServerHandler implements ImageServer.Iface
@Override
public ServerSessionData serverAuthenticate( String organization,
- String challengeResponse ) throws AuthenticationException,
+ ByteBuffer challengeResponse ) throws AuthenticationException,
TException
{
return ApiServer.serverAuthenticate( organization, challengeResponse );
diff --git a/src/main/java/org/openslx/imagemaster/util/AsymMessageSign.java b/src/main/java/org/openslx/imagemaster/util/AsymMessageSign.java
new file mode 100644
index 0000000..134b399
--- /dev/null
+++ b/src/main/java/org/openslx/imagemaster/util/AsymMessageSign.java
@@ -0,0 +1,63 @@
+package org.openslx.imagemaster.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyPair;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+
+public class AsymMessageSign
+{
+
+ KeyPair pair;
+
+// String alias = "ftp";
+// String password = "password";
+// String file = "./config/keystore.jks";
+
+
+ public AsymMessageSign(String alias, String password, String file) throws NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException, KeyStoreException, UnrecoverableKeyException
+ {
+ KeyStore keystore = KeyStore.getInstance( "JKS" );
+ keystore.load( new FileInputStream( new File( file ) ), password.toCharArray() );
+ Certificate cert = null;
+
+ Key key = keystore.getKey( alias,
+ password.toCharArray() );
+
+ if ( key instanceof PrivateKey ) {
+ cert = keystore.getCertificate( alias );
+ PublicKey publicKey = cert.getPublicKey();
+ pair = new KeyPair( publicKey, (PrivateKey)key );
+ }
+ }
+
+ public byte[] signMessage( String message ) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException
+ {
+ Signature signature = Signature.getInstance( "SHA256WITHRSA" );
+ signature.initSign( pair.getPrivate() );
+ signature.update( message.getBytes() );
+ return signature.sign();
+ }
+
+ public boolean verifyMessage( byte[] signedMessage, byte[] realMessage ) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException
+ {
+ Signature signature = Signature.getInstance( "SHA256WITHRSA" );
+ signature.initVerify( pair.getPublic() );
+ signature.update( realMessage );
+ return signature.verify( signedMessage );
+ }
+
+}
diff --git a/src/main/java/org/openslx/imagemaster/util/Util.java b/src/main/java/org/openslx/imagemaster/util/Util.java
index 0df4212..9805c21 100644
--- a/src/main/java/org/openslx/imagemaster/util/Util.java
+++ b/src/main/java/org/openslx/imagemaster/util/Util.java
@@ -1,9 +1,27 @@
package org.openslx.imagemaster.util;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyPair;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
import java.util.Random;
import org.apache.log4j.Logger;
+import org.openslx.imagemaster.Globals;
+import org.openslx.imagemaster.Globals.PropString;
public class Util
{
@@ -70,5 +88,5 @@ public class Util
}
folder.delete();
}
-
+
}
diff --git a/src/main/thrift/imagemaster.thrift b/src/main/thrift/imagemaster.thrift
index fdf63ee..5db7b05 100644
--- a/src/main/thrift/imagemaster.thrift
+++ b/src/main/thrift/imagemaster.thrift
@@ -93,7 +93,7 @@ service ImageServer {
string startServerAuthentication(1:string organization),
- ServerSessionData serverAuthenticate(1:string organization, 2:string challengeResponse) throws (1:ServerAuthenticationException failure),
+ ServerSessionData serverAuthenticate(1:string organization, 2:binary challengeResponse) throws (1:ServerAuthenticationException failure),
FtpCredentials submitImage(1:string serverSessionId, 2:ImageData imageDescription) throws (1:AuthorizationException failure),
diff --git a/src/test/java/org/openslx/imagemaster/AppTest.java b/src/test/java/org/openslx/imagemaster/AppTest.java
index 291206b..2b20b77 100644
--- a/src/test/java/org/openslx/imagemaster/AppTest.java
+++ b/src/test/java/org/openslx/imagemaster/AppTest.java
@@ -1,38 +1,25 @@
package org.openslx.imagemaster;
-import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStream;
-import java.net.ConnectException;
-import java.net.SocketException;
-import java.util.Date;
-import java.util.UUID;
+import java.security.InvalidKeyException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
-import org.apache.commons.net.ftp.FTP;
-import org.apache.commons.net.ftp.FTPClient;
-import org.apache.commons.net.ftp.FTPReply;
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-import org.openslx.imagemaster.thrift.iface.FtpCredentials;
-import org.openslx.imagemaster.thrift.iface.ImageData;
-import org.openslx.imagemaster.thrift.iface.ImageServer.Client;
-import org.openslx.imagemaster.thrift.iface.ServerSessionData;
-import org.openslx.imagemaster.thrift.iface.SessionData;
-import org.openslx.imagemaster.thrift.iface.UserInfo;
+import org.openslx.imagemaster.util.AsymMessageSign;
import org.openslx.imagemaster.util.Sha512Crypt;
/**
* Unit test for simple App.
*/
-public class AppTest
- extends TestCase
+public class AppTest extends TestCase
{
/**
@@ -61,117 +48,16 @@ public class AppTest
assertTrue( true );
}
- /**
- * Test the authentication
- *
- * @throws TException
- */
- public void testAuthentication() throws TException
- {
- TTransport transport = new TSocket( "localhost", 9090 );
- transport.open();
-
- TProtocol protocol = new TBinaryProtocol( transport );
- Client client = new Client( protocol );
-
- assertTrue( "Could not ping server", client.ping() );
-
- SessionData sessionData = client.authenticate( "ns202", "xxxxxxxxxxxx" );
- UserInfo userInfo = client.getUserFromToken( sessionData.getAuthToken() );
- System.out.println( "User info: " + userInfo );
- System.out.println( "Server address from MySQL: " + sessionData.serverAddress );
- }
-
- /**
- * Test the server authentication and FTP Upload.
- *
- * @throws TException
- * @throws IOException
- * @throws SocketException
- */
- public void testServerAuth() throws TException, SocketException, IOException
- {
- TTransport transport = new TSocket( "localhost", 9090 );
- transport.open();
-
- TProtocol protocol = new TBinaryProtocol( transport );
- Client client = new Client( protocol );
-
- assertTrue( "Could not ping server", client.ping() );
-
- String stringToEncrypt = client.startServerAuthentication( "Test Organization" );
- System.out.println( "Authentication started. Got string: " + stringToEncrypt );
-
- String response = stringToEncrypt;
-
- ServerSessionData data = client.serverAuthenticate( "Test Organization", response );
- System.out.println( "Authenticated and got sid: '" + data.getSessionId() + "'" );
-
- // Create ImageData
- int version = 1;
- String imageName = "maschine.vmkd";
- UUID uuid = UUID.randomUUID();
- int imageCreateTime = (int)new Date().getTime();
- int imageUpdateTime = imageCreateTime;
- String imageOwner = "ns202";
- String contentOperatingSystem = "win7";
- boolean statusIsValid = true;
- boolean statusIsDeleted = false;
- String imageShortDescrption = "EIN SUPER TOLLES IMAGE!";
- String imageLongDescription = "Lorem ipsum dolor sit amet.";
-
- ImageData imageData = new ImageData( uuid.toString(), version, imageName,
- imageCreateTime, imageUpdateTime, imageOwner, contentOperatingSystem,
- statusIsValid, statusIsDeleted, imageShortDescrption, imageLongDescription );
-
- 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();
- String host = "localhost";
- int port = 2221;
- String user = ftpCredentials.username;
- String password = ftpCredentials.password;
- String fileName = "/home/nils/file_to_upload.bin";
-
- try {
- FtpClient.connect( host, port );
- System.out.println( "Connected to " + host + ":" + port + ". Reply code: " + FtpClient.getReplyCode() );
- if ( !FTPReply.isPositiveCompletion( FtpClient.getReplyCode() ) ) {
- ConnectException ce = new ConnectException( "No positive reply code." );
- throw ce;
- }
- if ( !FtpClient.login( user, password ) ) {
- ConnectException ce = new ConnectException( "Could not login." );
- throw ce;
- }
- System.out.println( "Logged in with user: " + user );
- FtpClient.setFileType( FTP.BINARY_FILE_TYPE );
- FtpClient.enterLocalPassiveMode();
- System.out.println( "Entered PASSIVE MODE" );
- InputStream input = new FileInputStream( fileName );
- System.out.print( "Starting file upload ... " );
- FtpClient.storeFile( "xcvb.vmdk", input );
- System.out.println( "done." );
- FtpClient.noop();
- client.finshedUpload( data.sessionId, imageData );
- } finally {
- if ( FtpClient.isConnected() ) {
- try {
- FtpClient.logout();
- FtpClient.disconnect();
- } catch ( IOException e ) {
- e.printStackTrace();
- }
- }
- }
-
- }
-
public void testSha512_Crypt()
{
Sha512Crypt.selfTest();
}
+
+ public void testMessageSigning() throws UnrecoverableKeyException, InvalidKeyException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, KeyStoreException, SignatureException, IOException {
+ String asdf = "Hallo";
+ AsymMessageSign mySigner = new AsymMessageSign( "ftp", "password", "./config/keystore.jks" );
+ byte[] signedMessage = mySigner.signMessage( asdf );
+ System.out.println("The signed message: " + signedMessage + " with length: " + signedMessage.length);
+ assertTrue("Message could not be verified.", mySigner.verifyMessage( signedMessage, asdf.getBytes() ));
+ }
}
diff --git a/src/test/java/org/openslx/imagemaster/ServerTest.java b/src/test/java/org/openslx/imagemaster/ServerTest.java
new file mode 100644
index 0000000..c791f52
--- /dev/null
+++ b/src/test/java/org/openslx/imagemaster/ServerTest.java
@@ -0,0 +1,172 @@
+package org.openslx.imagemaster;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.ConnectException;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.security.InvalidKeyException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.util.Date;
+import java.util.UUID;
+
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPReply;
+import org.apache.thrift.TException;
+import org.apache.thrift.protocol.TBinaryProtocol;
+import org.apache.thrift.protocol.TProtocol;
+import org.apache.thrift.transport.TSocket;
+import org.apache.thrift.transport.TTransport;
+import org.openslx.imagemaster.thrift.iface.FtpCredentials;
+import org.openslx.imagemaster.thrift.iface.ImageData;
+import org.openslx.imagemaster.thrift.iface.ServerSessionData;
+import org.openslx.imagemaster.thrift.iface.SessionData;
+import org.openslx.imagemaster.thrift.iface.UserInfo;
+import org.openslx.imagemaster.thrift.iface.ImageServer.Client;
+import org.openslx.imagemaster.util.AsymMessageSign;
+
+import junit.framework.TestCase;
+
+
+public class ServerTest extends TestCase
+{
+ @Override
+ public void setUp() throws Exception {
+ // start the server
+// Thread t = new Thread(new Runnable() {
+//
+// @Override
+// public void run()
+// {
+// App.main( null );
+// }
+// }, "App");
+// t.start();
+// Thread.sleep( 2000 );
+ }
+
+ /**
+ * Test the authentication
+ *
+ * @throws TException
+ */
+ public void testAuthentication() throws TException
+ {
+ TTransport transport = new TSocket( "localhost", 9090 );
+ transport.open();
+
+ TProtocol protocol = new TBinaryProtocol( transport );
+ Client client = new Client( protocol );
+
+ assertTrue( "Could not ping server", client.ping() );
+
+ SessionData sessionData = client.authenticate( "ns202", "xxxxxxxxxxxx" );
+ UserInfo userInfo = client.getUserFromToken( sessionData.getAuthToken() );
+ System.out.println( "User info: " + userInfo );
+ System.out.println( "Server address from MySQL: " + sessionData.serverAddress );
+ }
+
+ /**
+ * Test the server authentication and FTP Upload.
+ *
+ * @throws TException
+ * @throws IOException
+ * @throws SocketException
+ * @throws KeyStoreException
+ * @throws CertificateException
+ * @throws NoSuchAlgorithmException
+ * @throws UnrecoverableKeyException
+ * @throws SignatureException
+ * @throws InvalidKeyException
+ */
+ public void testServerAuthAndFtpUpload() throws TException, SocketException, IOException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, KeyStoreException, InvalidKeyException, SignatureException
+ {
+ TTransport transport = new TSocket( "localhost", 9090 );
+ transport.open();
+
+ TProtocol protocol = new TBinaryProtocol( transport );
+ Client client = new Client( protocol );
+
+ assertTrue( "Could not ping server", client.ping() );
+
+ String stringToEncrypt = client.startServerAuthentication( "Test Organization" );
+ System.out.println( "Authentication started. Got string: " + stringToEncrypt );
+
+ AsymMessageSign messageSigner = new AsymMessageSign( "ftp", "password", "./config/keystore.jks" );
+ byte[] response = messageSigner.signMessage( stringToEncrypt );
+
+ System.out.println( "Signed string: " + response );
+ ByteBuffer bBuffer = ByteBuffer.wrap( response );
+
+ ServerSessionData data = client.serverAuthenticate( "Test Organization", bBuffer );
+ System.out.println( "Authenticated and got sid: '" + data.getSessionId() + "'" );
+
+ // Create ImageData
+ int version = 1;
+ String imageName = "maschine.vmkd";
+ UUID uuid = UUID.randomUUID();
+ int imageCreateTime = (int)new Date().getTime();
+ int imageUpdateTime = imageCreateTime;
+ String imageOwner = "ns202";
+ String contentOperatingSystem = "win7";
+ boolean statusIsValid = true;
+ boolean statusIsDeleted = false;
+ String imageShortDescrption = "EIN SUPER TOLLES IMAGE!";
+ String imageLongDescription = "Lorem ipsum dolor sit amet.";
+
+ ImageData imageData = new ImageData( uuid.toString(), version, imageName,
+ imageCreateTime, imageUpdateTime, imageOwner, contentOperatingSystem,
+ statusIsValid, statusIsDeleted, imageShortDescrption, imageLongDescription );
+
+ 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();
+ String host = "localhost";
+ int port = 2221;
+ String user = ftpCredentials.username;
+ String password = ftpCredentials.password;
+ String fileName = "/home/nils/file_to_upload.bin";
+
+ try {
+ FtpClient.connect( host, port );
+ System.out.println( "Connected to " + host + ":" + port + ". Reply code: " + FtpClient.getReplyCode() );
+ if ( !FTPReply.isPositiveCompletion( FtpClient.getReplyCode() ) ) {
+ ConnectException ce = new ConnectException( "No positive reply code." );
+ throw ce;
+ }
+ if ( !FtpClient.login( user, password ) ) {
+ ConnectException ce = new ConnectException( "Could not login." );
+ throw ce;
+ }
+ System.out.println( "Logged in with user: " + user );
+ FtpClient.setFileType( FTP.BINARY_FILE_TYPE );
+ FtpClient.enterLocalPassiveMode();
+ System.out.println( "Entered PASSIVE MODE" );
+ InputStream input = new FileInputStream( fileName );
+ System.out.print( "Starting file upload ... " );
+ FtpClient.storeFile( "xcvb.vmdk", input );
+ System.out.println( "done." );
+ FtpClient.noop();
+ client.finshedUpload( data.sessionId, imageData );
+ } finally {
+ if ( FtpClient.isConnected() ) {
+ try {
+ FtpClient.logout();
+ FtpClient.disconnect();
+ } catch ( IOException e ) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ }
+}