diff options
author | Nils Schwabe | 2014-04-10 15:49:18 +0200 |
---|---|---|
committer | Nils Schwabe | 2014-04-10 15:49:18 +0200 |
commit | 298f7ca2b7e8861a70e31da237a775f45d77b597 (patch) | |
tree | c838288c443d976251a216f6a9318f4860907785 | |
parent | added some comments (diff) | |
download | masterserver-298f7ca2b7e8861a70e31da237a775f45d77b597.tar.gz masterserver-298f7ca2b7e8861a70e31da237a775f45d77b597.tar.xz masterserver-298f7ca2b7e8861a70e31da237a775f45d77b597.zip |
tried to implement the server auth. (did not work)
added ImageProcessor to process image after ftp upload
7 files changed, 191 insertions, 76 deletions
diff --git a/src/main/java/org/openslx/imagemaster/server/ApiServer.java b/src/main/java/org/openslx/imagemaster/server/ApiServer.java index 2c49a0d..258c490 100644 --- a/src/main/java/org/openslx/imagemaster/server/ApiServer.java +++ b/src/main/java/org/openslx/imagemaster/server/ApiServer.java @@ -103,6 +103,9 @@ public class ApiServer { * * And removed with: removeUser(username); */ + if (ServerSessionManager.getSession(serverSessionData.sessionId) == null) { + throw new AuthenticationException(AuthenticationError.GENERIC_ERROR, "No valid serverSessionData"); + } String generatedUser = RandomString.generate(10, false); String generatedPass = RandomString.generate(16, true); diff --git a/src/main/java/org/openslx/imagemaster/server/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/server/ImageProcessor.java new file mode 100644 index 0000000..e10ea21 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/server/ImageProcessor.java @@ -0,0 +1,14 @@ +package org.openslx.imagemaster.server; + +import org.apache.log4j.Logger; + +public class ImageProcessor { + + private static Logger log = Logger.getLogger(ImageProcessor.class); + public static void processImageAfterUpload(String username, String filename) { + /* + * TODO: Process the image after download + */ + + } +} diff --git a/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java index 9ec5cf7..973c768 100644 --- a/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java +++ b/src/main/java/org/openslx/imagemaster/server/MasterFtpServer.java @@ -19,7 +19,7 @@ import org.apache.ftpserver.usermanager.impl.WritePermission; import org.apache.log4j.Logger; public class MasterFtpServer implements Runnable { - private static Logger log = Logger.getLogger( ApiServer.class ); + private static Logger log = Logger.getLogger( MasterFtpServer.class ); private FtpServer server; private UserManager userManager; diff --git a/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java b/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java index 73d69d2..a1b9a90 100644 --- a/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java +++ b/src/main/java/org/openslx/imagemaster/server/MasterFtplet.java @@ -10,29 +10,25 @@ import org.apache.ftpserver.ftplet.Ftplet; import org.apache.ftpserver.ftplet.FtpletContext; import org.apache.ftpserver.ftplet.FtpletResult; import org.apache.log4j.Logger; -import org.openslx.imagemaster.App; public class MasterFtplet implements Ftplet { - private static Logger log = Logger.getLogger(App.class); + private static Logger log = Logger.getLogger(Ftplet.class); @Override public void init(FtpletContext ftpletContext) throws FtpException { - // TODO Auto-generated method stub - + // not used } @Override public void destroy() { - // TODO Auto-generated method stub - + // not used } @Override public FtpletResult beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException { - if (session.getUser() != null && request.getCommand() == "QUIT") { - // TODO: tell server that user finished uploading - String user = session.getUser().getName(); + if (session.getUser() != null) { + log.info(session.getUser().getName() + " issued command: " + request.getRequestLine()); } return null; } @@ -40,21 +36,25 @@ public class MasterFtplet implements Ftplet { @Override public FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply) throws FtpException, IOException { - // TODO Auto-generated method stub + if (session.getUser() != null) { + log.info(session.getUser().getName() + " is done with command: " + request.getRequestLine()); + // TODO: delete temporary user + ImageProcessor.processImageAfterUpload(session.getUser().getName(), request.getRequestLine().split(" ")[1]); + } return null; } @Override public FtpletResult onConnect(FtpSession session) throws FtpException, IOException { - // TODO Auto-generated method stub + // not used return null; } @Override public FtpletResult onDisconnect(FtpSession session) throws FtpException, IOException { - // TODO Auto-generated method stub + // not used return null; } diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java index b0fd72f..d57eb36 100644 --- a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java +++ b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java @@ -2,28 +2,37 @@ package org.openslx.imagemaster.serversession; import java.util.HashMap; +import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.openslx.imagemaster.thrift.iface.AuthenticationException; 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>(); + /** * Start the server authentification. - * @param organization the organization of the server + * + * @param organization + * the organization of the server * @return encrypted random string */ public static String startServerAuthentication(String organization) { String secret = RandomString.generate(100, false); synchronized (authenticatingServers) { authenticatingServers.put(organization, secret); + log.info("Server of organinzation '" + organization + + "' starts to authenticate. And got string: '" + secret + + "'"); } return secret; } - + /** * Authenticate with the challengeResponse + * * @param organization * @param address * @param challengeResponse @@ -31,14 +40,23 @@ public class ServerAuthenticator { * @throws AuthenticationException * @throws TException */ - public static ServerUser serverAuthenticate(String organization, String address, - String challengeResponse) throws AuthenticationException, - TException { + public static ServerUser serverAuthenticate(String organization, + String address, String challengeResponse) + throws AuthenticationException, TException { /* - * TODO: - * Decrypt the given challengeResponse and check whether it was right or not. - * Authenticate server if so. + * TODO: Decrypt the given challengeResponse and check whether it was + * right or not. Authenticate server if so. */ + if (!challengeResponse.equals(authenticatingServers.get(organization))) { + throw new AuthenticationException(); + } + + log.info("Server of organinzation '" + organization + + " authenticated. With response: '" + challengeResponse + + "'"); + + authenticatingServers.remove(organization); + return new ServerUser(organization, address); } } 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 858f682..096f63f 100644 --- a/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java +++ b/src/main/java/org/openslx/imagemaster/thrift/server/ImageServerHandler.java @@ -15,7 +15,7 @@ import org.openslx.imagemaster.thrift.iface.UserInfo; public class ImageServerHandler implements ImageServer.Iface { - private static Logger log = Logger.getLogger( ApiServer.class ); + private static Logger log = Logger.getLogger( ImageServerHandler.class ); @Override public boolean ping() throws TException diff --git a/src/test/java/org/openslx/imagemaster/AppTest.java b/src/test/java/org/openslx/imagemaster/AppTest.java index 6c1350c..e978478 100644 --- a/src/test/java/org/openslx/imagemaster/AppTest.java +++ b/src/test/java/org/openslx/imagemaster/AppTest.java @@ -18,7 +18,10 @@ import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; +import org.openslx.imagemaster.thrift.iface.ImageData; import org.openslx.imagemaster.thrift.iface.ImageServer.Client; +import org.openslx.imagemaster.thrift.iface.FtpCredentials; +import org.openslx.imagemaster.thrift.iface.ServerSessionData; import org.openslx.imagemaster.thrift.iface.SessionData; import org.openslx.imagemaster.thrift.iface.UserInfo; @@ -54,10 +57,87 @@ public class AppTest assertTrue( true ); } +// /** +// * Test the authentication +// */ +// public void testAuthentication() { +// TTransport transport = new TSocket("localhost", 9090); +// try { +// transport.open(); +// } catch (TTransportException e) { +// assertTrue("Could not connect", false); +// } +// +// TProtocol protocol = new TBinaryProtocol(transport); +// Client client = new Client(protocol); +// +// try { +// assertTrue("Could not ping server", client.ping()); +// } catch (TException e) { +// assertTrue("Could not ping server", false); +// } +// try { +// 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); +// } catch (TException e) { +// e.printStackTrace(); +// assertTrue("Could not login", false); +// } +// } +// +// /** +// * Test FTP connection +// */ +// public void testFtpConnection() { +// FTPClient client = new FTPClient(); +// String host = "localhost"; +// int port = 2221; +// String user = "admin"; +// String password = "SI*HoZCC!]V)p>B2"; +// String fileName = "/home/nils/file_to_upload.bin"; +// +// try { +// client.connect(host, port); +// System.out.println("Connected to " + host + ":" + port + ". Reply code: " + client.getReplyCode()); +// if ( !FTPReply.isPositiveCompletion( client.getReplyCode() ) ) { +// ConnectException ce = new ConnectException("No positive reply code."); +// throw ce; +// } +// if ( !client.login(user, password) ) { +// ConnectException ce = new ConnectException("Could not login."); +// throw ce; +// } +// System.out.println("Logged in with user: " + user); +// client.setFileType(FTP.BINARY_FILE_TYPE); +// client.enterLocalPassiveMode(); +// System.out.println("Entered PASSIVE MODE"); +// InputStream input = new FileInputStream(fileName); +// client.makeDirectory("myFolder"); +// System.out.println("Made directory 'myFolder'"); +// System.out.print("Starting file upload ... "); +// client.storeFile("myFolder/myFile.txt", input); +// System.out.println("done."); +// client.noop(); +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// if (client.isConnected()) { +// try { +// client.logout(); +// client.disconnect(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// } + /** - * Test the authentication + * Test the server authentification. */ - public void testAuthentication() { + public void testServerAuth() { TTransport transport = new TSocket("localhost", 9090); try { transport.open(); @@ -73,61 +153,61 @@ public class AppTest } catch (TException e) { assertTrue("Could not ping server", false); } + try { - 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); + 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() + "'"); + + FtpCredentials ftpCredentials = client.submitImage(new ImageData("123", "maschine"), data); + 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("maschine.vmdk", input); + System.out.println("done."); + FtpClient.noop(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (FtpClient.isConnected()) { + try { + FtpClient.logout(); + FtpClient.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } catch (TException e) { e.printStackTrace(); - assertTrue("Could not login", false); } } - - /** - * Test FTP connection - */ - public void testFtpConnection() { - FTPClient client = new FTPClient(); - String host = "localhost"; - int port = 2221; - String user = "admin"; - String password = "SI*HoZCC!]V)p>B2"; - String fileName = "/home/nils/file_to_upload.bin"; - - try { - client.connect(host, port); - System.out.println("Connected to " + host + ":" + port + ". Reply code: " + client.getReplyCode()); - if ( !FTPReply.isPositiveCompletion( client.getReplyCode() ) ) { - ConnectException ce = new ConnectException("No positive reply code."); - throw ce; - } - if ( !client.login(user, password) ) { - ConnectException ce = new ConnectException("Could not login."); - throw ce; - } - System.out.println("Logged in with user: " + user); - client.setFileType(FTP.BINARY_FILE_TYPE); - client.enterLocalPassiveMode(); - System.out.println("Entered PASSIVE MODE"); - InputStream input = new FileInputStream(fileName); - client.makeDirectory("myFolder"); - System.out.println("Made directory 'myFolder'"); - System.out.print("Starting file upload ... "); - client.storeFile("myFolder/myFile.txt", input); - System.out.println("done."); - client.noop(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (client.isConnected()) { - try { - client.logout(); - client.disconnect(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } } |