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.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; import org.openslx.imagemaster.thrift.iface.ServerAuthenticationException; import org.openslx.imagemaster.thrift.iface.ServerSessionData; import org.openslx.satellitedaemon.util.EncryptWithServerIdPublicKey; import org.openslx.satellitedaemon.util.Util; /** * 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; // TODO: All of the Strings and int's should not fall from sky. (Globals config) static String nilsIp = "132.230.4.23"; static int thriftPort = 9090; /** * The method calls getConnection() to check if the connection is ok, * if so, it returns ftpCredential. * * @return returns 'null' if there is a problem. */ public static FtpCredentials getFtpCredentials( ImageData imDat ) { try { client = getConnection(); Util.notNullFatal( client, "Client is null. Maybe a Network error." ); // TODO: Don't call fatal, it would exit the program, just log a message and return null return client.submitImage( sSD.sessionId, imDat ); } 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 ServerAuthenticationException, TException, UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, FileNotFoundException, KeyStoreException, IOException, InvalidKeyException, SignatureException { ImageServer.Client theClient = null; if ( client == null ) { theClient = newClient(); } else { theClient = client; } boolean isAuthenticated = false; try { isAuthenticated = theClient.ping(); } catch ( TException x ) { theClient = newClient(); if ( theClient == null ) { return null; } } if ( !isAuthenticated ) { String toEncrypt = client.startServerAuthentication( "uni-freiburg.de" ); // System.out.println( toEncrypt ); EncryptWithServerIdPublicKey rse = new EncryptWithServerIdPublicKey( "serverid", "password", "/home/michael/satellite-daemon/config/serverid.jks" ); byte[] byteArray = rse.encryptString( toEncrypt ); sSD = client.serverAuthenticate( "uni-freiburg.de", ByteBuffer.wrap( byteArray ) ); } return theClient; } private static ImageServer.Client newClient() { ImageServer.Client newClient = null; try { TTransport transport; transport = new TSocket( nilsIp, thriftPort ); // Nils IP transport.open(); TProtocol protocol = new TBinaryProtocol( transport ); newClient = new ImageServer.Client( protocol ); } catch ( TException x ) { x.printStackTrace(); return null; } return newClient; } }