package org.openslx.satellitedaemon.ftp; 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 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 FtpCredentials, 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 ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( UnrecoverableKeyException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( InvalidKeyException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( NoSuchAlgorithmException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( CertificateException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( FileNotFoundException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( KeyStoreException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( SignatureException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( IOException e ) { // TODO Auto-generated catch block e.printStackTrace(); } 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 ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( UnrecoverableKeyException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( InvalidKeyException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( NoSuchAlgorithmException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( CertificateException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( FileNotFoundException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( KeyStoreException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( SignatureException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( IOException e ) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * The method calls getConnection() to check if the connection is ok * and to get the DownloadeInfos. If connection is ok, it returns ftpCredential. * * @return returns 'null' if there is a problem. */ public static DownloadInfos getDownloadInfos( DbImage imDat ) { ImageServer.Client theClient = null; try { theClient = getConnection(); if ( theClient == null ) { log.error( "Client was null!" ); return null; } return theClient.getImage( imDat.guid, sSD.sessionId ); } catch ( TException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( UnrecoverableKeyException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( InvalidKeyException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( NoSuchAlgorithmException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( CertificateException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( FileNotFoundException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( KeyStoreException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( SignatureException e ) { // TODO Auto-generated catch block e.printStackTrace(); } catch ( IOException e ) { // TODO Auto-generated catch block e.printStackTrace(); } 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; } private static ImageServer.Client newClient() { ImageServer.Client newClient = null; try { TTransport transport; transport = new TSocket( Globals.getPropertyString( PropString.FTPSERVERIP ), 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; } }