summaryrefslogtreecommitdiff
path: root/core/java/android/webkit/BrowserFrame.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/webkit/BrowserFrame.java')
-rw-r--r--core/java/android/webkit/BrowserFrame.java50
1 files changed, 50 insertions, 0 deletions
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 2c38c93ede6f..97bbd5aba7db 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -28,6 +28,8 @@ import android.net.Uri;
import android.net.WebAddress;
import android.net.http.ErrorStrings;
import android.net.http.SslCertificate;
+import android.net.http.SslError;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.OpenableColumns;
@@ -44,11 +46,15 @@ import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.URLEncoder;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
+import org.apache.harmony.security.provider.cert.X509CertImpl;
+
class BrowserFrame extends Handler {
private static final String LOGTAG = "webkit";
@@ -1102,6 +1108,47 @@ class BrowserFrame extends Handler {
}
/**
+ * Called by JNI when the native HTTP(S) stack gets a invalid cert chain.
+ *
+ * We delegate the request to CallbackProxy, and route its response to
+ * {@link #nativeSslCertErrorProceed(int)} or
+ * {@link #nativeSslCertErrorCancel(int, int)}.
+ */
+ private void reportSslCertError(final int handle, final int cert_error, byte cert_der[]) {
+ final SslError ssl_error;
+ try {
+ X509Certificate cert = new X509CertImpl(cert_der);
+ ssl_error = new SslError(cert_error, cert);
+ } catch (IOException e) {
+ // Can't get the cert, not much to do.
+ Log.e(LOGTAG, "Can't get the certificate from WebKit, cancling");
+ nativeSslCertErrorCancel(handle, cert_error);
+ return;
+ }
+
+ SslErrorHandler handler = new SslErrorHandler() {
+
+ @Override
+ public void proceed() {
+ SslCertLookupTable.getInstance().Allow(ssl_error);
+ nativeSslCertErrorProceed(handle);
+ }
+
+ @Override
+ public void cancel() {
+ SslCertLookupTable.getInstance().Deny(ssl_error);
+ nativeSslCertErrorCancel(handle, cert_error);
+ }
+ };
+
+ if (SslCertLookupTable.getInstance().IsAllowed(ssl_error)) {
+ nativeSslCertErrorProceed(handle);
+ } else {
+ mCallbackProxy.onReceivedSslError(handler, ssl_error);
+ }
+ }
+
+ /**
* Called by JNI when the native HTTP stack needs to download a file.
*
* We delegate the request to CallbackProxy, which owns the current app's
@@ -1246,4 +1293,7 @@ class BrowserFrame extends Handler {
private native void nativeAuthenticationProceed(int handle, String username, String password);
private native void nativeAuthenticationCancel(int handle);
+
+ private native void nativeSslCertErrorProceed(int handle);
+ private native void nativeSslCertErrorCancel(int handle, int cert_error);
}