summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java
diff options
context:
space:
mode:
authorMichael Petretti2014-07-15 14:24:38 +0200
committerMichael Petretti2014-07-15 14:24:38 +0200
commitafcdbf700dfdee503bd358f322c84e9114470f2e (patch)
tree3fc3522d709f41318bb4560f42095a5d92610080 /src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java
parentFixed a lot of TODOs and upload works. (diff)
downloadsatellite-daemon-afcdbf700dfdee503bd358f322c84e9114470f2e.tar.gz
satellite-daemon-afcdbf700dfdee503bd358f322c84e9114470f2e.tar.xz
satellite-daemon-afcdbf700dfdee503bd358f322c84e9114470f2e.zip
Rename and clean-up.
Diffstat (limited to 'src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java')
-rw-r--r--src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java268
1 files changed, 268 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java b/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java
new file mode 100644
index 0000000..b656a84
--- /dev/null
+++ b/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java
@@ -0,0 +1,268 @@
+package org.openslx.satellitedaemon.filetransfer;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+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.List;
+
+import org.apache.log4j.Logger;
+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.crcchecker.CRCFile;
+import org.openslx.imagemaster.thrift.iface.DownloadInfos;
+import org.openslx.imagemaster.thrift.iface.ImageData;
+import org.openslx.imagemaster.thrift.iface.ImageServer;
+import org.openslx.imagemaster.thrift.iface.ServerAuthenticationException;
+import org.openslx.imagemaster.thrift.iface.ServerSessionData;
+import org.openslx.imagemaster.thrift.iface.UploadInfos;
+import org.openslx.satellitedaemon.Globals;
+import org.openslx.satellitedaemon.Globals.PropInt;
+import org.openslx.satellitedaemon.Globals.PropString;
+import org.openslx.satellitedaemon.db.DbImage;
+import org.openslx.satellitedaemon.util.EncryptWithServerIdPublicKey;
+
+// TODO: Handle all the auto-generated catch blocks in a meaningful way
+
+/***********************************************************************************************/
+/**
+ * Handles the authentication with the Satellite Server and sends the FILTRANSFERCredentials, which
+ * are necessary for the upload of the image.
+ */
+public class ThriftConnection
+{
+ private static ImageServer.Client client = null;
+ private static ServerSessionData sSD = null;
+ private static Logger log = Logger.getLogger( ThriftConnection.class );
+ private static CRCFile crc = null;
+
+ /***********************************************************************************************/
+ /**
+ * Method for getting UploadeInfos
+ *
+ * !! on the first Call !!
+ *
+ * when the CRCsum need to be transfered.
+ * The method calls getConnection() to check if the connection is ok
+ * and to get the ServerSessionData. If connection is ok, it calls
+ * submitImage with CRCsum in List<Integer>.
+ *
+ * @return returns 'null' if there is a problem.
+ */
+ public static UploadInfos getUploadInfos( ImageData imDat, String filename )
+ {
+ ImageServer.Client theClient = null;
+ try {
+ theClient = getConnection();
+ if ( theClient == null ) {
+ log.error( "Client was null!" );
+ return null;
+ }
+ // .submitImage needs the List<Integer> from CRCFile.getCRCs() only
+ // on the first time called. null afterwards.
+ log.info( "First call of submitImage following..." );
+ crc = new CRCFile( filename );
+ log.info( "Made CRCFile from " + filename );
+ return theClient.submitImage( sSD.sessionId, imDat, crc.getCrcSums() );
+ } catch ( TException e ) {
+ log.error("TException");
+ } catch ( UnrecoverableKeyException e ) {
+ log.error("UnrecoverableKeyException");
+ } catch ( InvalidKeyException e ) {
+ log.error("InvalidKeyException");
+ } catch ( NoSuchAlgorithmException e ) {
+ log.error("NoSuchAlgorithmException");
+ } catch ( CertificateException e ) {
+ log.error("CertificateException");
+ } catch ( FileNotFoundException e ) {
+ log.error("FileNotFoundException");
+ } catch ( KeyStoreException e ) {
+ log.error("KeyStoreException");
+ } catch ( SignatureException e ) {
+ log.error("SignatureException");
+ } catch ( IOException e ) {
+ log.error("IOException");
+ }
+ return null;
+ }
+
+ /***********************************************************************************************/
+ /**
+ * Method for getting UploadeInfos when CRCsum was already transfered on first call.
+ * The method calls getConnection() to check if the connection is ok
+ * and to get the ServerSessionData. If connection is ok, it calls
+ * submitImage with sSD.sessionId, imDat and !!null!!
+ *
+ * @return returns 'null' if there is a problem.
+ */
+ public static UploadInfos getUploadInfos( ImageData imDat )
+ {
+ ImageServer.Client theClient = null;
+ try {
+ theClient = getConnection();
+ if ( theClient == null ) {
+ log.error( "Client was null!" );
+ return null;
+ }
+ // .submitImage needs the List<Integer> from CRCFile.getCRCs() only
+ // on the first time called. null afterwards.
+ return theClient.submitImage( sSD.sessionId, imDat, crc.getCrcSums() );
+ } catch ( TException e ) {
+ log.error("TException");
+ } catch ( UnrecoverableKeyException e ) {
+ log.error("UnrecoverableKeyException");
+ } catch ( InvalidKeyException e ) {
+ log.error("InvalidKeyException");
+ } catch ( NoSuchAlgorithmException e ) {
+ log.error("NoSuchAlgorithmException");
+ } catch ( CertificateException e ) {
+ log.error("CertificateException");
+ } catch ( FileNotFoundException e ) {
+ log.error("FileNotFoundException");
+ } catch ( KeyStoreException e ) {
+ log.error("KeyStoreException");
+ } catch ( SignatureException e ) {
+ log.error("SignatureException");
+ } catch ( IOException e ) {
+ log.error("IOException");
+ }
+ return null;
+ }
+
+ /***********************************************************************************************/
+ /**
+ * Method for getting DonwloadInfos. Calls getConnection if client was null.
+ * You need to spezifie all Blocks you want to have in an List.
+ *
+ * @return returns 'null' if there is a problem.
+ */
+ public static DownloadInfos getDownloadInfos( DbImage imDat, List<Integer> range )
+ {
+ ImageServer.Client theClient = null;
+ try {
+ theClient = getConnection();
+ if ( theClient == null ) {
+ log.error( "Client was null!" );
+ return null;
+ }
+
+ return theClient.getImage( imDat.guid, sSD.sessionId, range );
+ } catch ( TException e ) {
+ log.error("TException");
+ } catch ( UnrecoverableKeyException e ) {
+ log.error("UnrecoverableKeyException");
+ } catch ( InvalidKeyException e ) {
+ log.error("InvalidKeyException");
+ } catch ( NoSuchAlgorithmException e ) {
+ log.error("NoSuchAlgorithmException");
+ } catch ( CertificateException e ) {
+ log.error("CertificateException");
+ } catch ( FileNotFoundException e ) {
+ log.error("FileNotFoundException");
+ } catch ( KeyStoreException e ) {
+ log.error("KeyStoreException");
+ } catch ( SignatureException e ) {
+ log.error("SignatureException");
+ } catch ( IOException e ) {
+ log.error("IOException");
+ }
+ return null;
+ }
+
+ /***********************************************************************************************/
+ /**
+ * This method checks if there is already a working connection. If not,
+ * newClient() establishes one. Also it does the Authentication if not done
+ * yet.
+ *
+ * @return returns the client if successful.
+ */
+ private static ImageServer.Client getConnection()
+ throws UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException,
+ FileNotFoundException, KeyStoreException, IOException, InvalidKeyException, SignatureException
+ {
+ ImageServer.Client theClient = null;
+ boolean isAuthenticated = false;
+ if ( client == null ) {
+ log.info( "The global client was null. Making a new client ..." );
+ theClient = newClient();
+ if ( theClient == null ) {
+ log.debug( "ThriftConnection: The client was null after newClient()" );
+ return null;
+ }
+ } else {
+ log.info( "The global Client was already used. Setting isAuthenticated = true." );
+ theClient = client;
+ isAuthenticated = true;
+ }
+ // try {
+ // isAuthenticated = theClient.ping();
+ // } catch ( TException x ) {
+ // theClient = newClient();
+ // if ( theClient == null ) {
+ // return null;
+ // }
+ // }
+ if ( !isAuthenticated ) {
+ log.info( "ThriftConnection: Client not yet Authenticated. Trying..." );
+ String toEncrypt;
+ if ( theClient == null ) {
+ log.debug( "The client was null" );
+ return null;
+ }
+ try {
+ toEncrypt = theClient.startServerAuthentication( Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ) );
+ log.info( "The random String we want to encrypt: " + toEncrypt );
+ EncryptWithServerIdPublicKey rse = new EncryptWithServerIdPublicKey( Globals.getPropertyString( PropString.RNDSTRINGENCRYPTALIAS ),
+ Globals.getPropertyString( PropString.RNDSTRINGENCRYPTPASSWORD ),
+ Globals.getPropertyString( PropString.RNDSTRINGENCRYPTPATH ) );
+ byte[] byteArray = rse.encryptString( toEncrypt );
+ sSD = theClient.serverAuthenticate(
+ Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ), ByteBuffer.wrap( byteArray ) );
+ } catch ( ServerAuthenticationException e ) {
+ log.error( "ThriftConnection: ServerAuthenticationException: Server Authetication was not sucessful." );
+ e.printStackTrace();
+ return null;
+ } catch ( TException e ) {
+ log.error( "ThriftConnection: TException: Server Authetication was not sucessful." );
+ e.printStackTrace();
+ return null;
+ }
+ log.info( "is Authenticated." );
+
+ }
+ client = theClient;
+ return theClient;
+ }
+
+ /***********************************************************************************************/
+ /**
+ *
+ * @return
+ */
+ private static ImageServer.Client newClient()
+ {
+ ImageServer.Client newClient = null;
+ try {
+ TTransport transport;
+ transport = new TSocket( Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ), Globals.getPropertyInt( PropInt.THRIFTPORT ) );
+ transport.open();
+ TProtocol protocol = new TBinaryProtocol( transport );
+ newClient = new ImageServer.Client( protocol );
+ log.debug( "ThriftConnection: Made a new Client" );
+ } catch ( TException x ) {
+ log.error( "ThriftConnection coudn't create new client." );
+ x.printStackTrace();
+ return null;
+ }
+ return newClient;
+ }
+}