From afcdbf700dfdee503bd358f322c84e9114470f2e Mon Sep 17 00:00:00 2001 From: Michael Petretti Date: Tue, 15 Jul 2014 14:24:38 +0200 Subject: Rename and clean-up. --- .../filetransfer/ThriftConnection.java | 268 +++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java (limited to 'src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java') 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. + * + * @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 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 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 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; + } +} -- cgit v1.2.3-55-g7522