package com.kedzie.vbox.soap.ssl;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.transport.ServiceConnection;
import android.os.Handler;
import android.util.Log;
import com.kedzie.vbox.app.BundleBuilder;
import com.kedzie.vbox.server.Server;
/**
* Uses {@link TrustManager} which sends certificates to handler for user response
*/
public class InteractiveTrustedHttpsTransport extends HttpTransportSE{
private static final String TAG = "InteractiveTrustedHttpsTransport";
static final String PROTOCOL = "https";
private ServiceConnection serviceConnection = null;
protected final Server server;
private final int timeout;
protected Handler handler;
private TrustManager []trust = new TrustManager[]{
new X509TrustManager() {
private X509TrustManager _keystoreTM = (X509TrustManager)SSLUtil.getKeyStoreTrustManager()[0];
@Override public X509Certificate[] getAcceptedIssuers() { return null; }
@Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException{}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{
Log.i(TAG, String.format("checkServerTrusted(%1$d, %2$s)", chain.length, authType));
try {
_keystoreTM.checkServerTrusted(chain, authType);
} catch(CertificateException e) {
Log.w(TAG, "Untrusted Server " + e.getMessage());
new BundleBuilder()
.putParcelable(Server.BUNDLE, server)
.putBoolean("isTrusted", false)
.putSerializable("certs", chain)
.sendMessage(handler, 0);
return;
}
new BundleBuilder()
.putParcelable(Server.BUNDLE, server)
.putBoolean("isTrusted", true)
.sendMessage(handler, 0);
}
}
};
public InteractiveTrustedHttpsTransport (Server server, int timeout, Handler handler) {
super(InteractiveTrustedHttpsTransport.PROTOCOL + "://" + server.getHost() + ":" + server.getPort());
this.server = server;
this.timeout = timeout;
this.handler=handler;
}
/**
* Returns the HttpsServiceConnectionSE and creates it if necessary
* @see org.ksoap2.transport.HttpsTransportSE#getServiceConnection()
*/
public ServiceConnection getServiceConnection() throws IOException {
serviceConnection = new TrustedHttpsServiceConnection(server.getHost(), server.getPort(), "", timeout, trust);
return serviceConnection;
}
public String getHost() {
return server.getHost();
}
public int getPort() {
return server.getPort();
}
public String getPath() {
return "";
}
}