X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/296df1bb6550081535ff06dfacd1d28345c51545..aae90eb1aa42a11449e30330e3e23e1e9e5eebb6:/src/com/owncloud/android/authentication/SsoWebViewClient.java diff --git a/src/com/owncloud/android/authentication/SsoWebViewClient.java b/src/com/owncloud/android/authentication/SsoWebViewClient.java index 442ec73d..fb078bdf 100644 --- a/src/com/owncloud/android/authentication/SsoWebViewClient.java +++ b/src/com/owncloud/android/authentication/SsoWebViewClient.java @@ -17,12 +17,18 @@ package com.owncloud.android.authentication; +import java.io.ByteArrayInputStream; import java.lang.ref.WeakReference; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; -import com.owncloud.android.utils.Log_OC; - +import android.content.Context; import android.graphics.Bitmap; +import android.net.http.SslCertificate; import android.net.http.SslError; +import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.KeyEvent; @@ -34,6 +40,9 @@ import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; +import com.owncloud.android.lib.common.network.NetworkUtils; +import com.owncloud.android.utils.Log_OC; + /** * Custom {@link WebViewClient} client aimed to catch the end of a single-sign-on process @@ -52,12 +61,15 @@ public class SsoWebViewClient extends WebViewClient { public void onSsoFinished(String sessionCookie); } + private Context mContext; private Handler mListenerHandler; private WeakReference mListenerRef; private String mTargetUrl; private String mLastReloadedUrlAtError; + - public SsoWebViewClient (Handler listenerHandler, SsoWebViewClientListener listener) { + public SsoWebViewClient (Context context, Handler listenerHandler, SsoWebViewClientListener listener) { + mContext = context; mListenerHandler = listenerHandler; mListenerRef = new WeakReference(listener); mTargetUrl = "fake://url.to.be.set"; @@ -75,6 +87,7 @@ public class SsoWebViewClient extends WebViewClient { @Override public void onPageStarted (WebView view, String url, Bitmap favicon) { Log_OC.d(TAG, "onPageStarted : " + url); + view.clearCache(true); super.onPageStarted(view, url, favicon); } @@ -135,14 +148,57 @@ public class SsoWebViewClient extends WebViewClient { } @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { + public void onReceivedSslError (final WebView view, final SslErrorHandler handler, SslError error) { Log_OC.d(TAG, "onReceivedSslError : " + error); - handler.proceed(); + // Test 1 + X509Certificate x509Certificate = getX509CertificateFromError(error); + boolean isKnownServer = false; + + if (x509Certificate != null) { + Log_OC.d(TAG, "------>>>>> x509Certificate " + x509Certificate.toString()); + + try { + isKnownServer = NetworkUtils.isCertInKnownServersStore((Certificate) x509Certificate, mContext); + } catch (Exception e) { + Log_OC.e(TAG, "Exception: " + e.getMessage()); + } + } + + if (isKnownServer) { + handler.proceed(); + } else { + ((AuthenticatorActivity)mContext).showUntrustedCertDialog(x509Certificate, error, handler); + } + } + + /** + * Obtain the X509Certificate from SslError + * @param error SslError + * @return X509Certificate from error + */ + public X509Certificate getX509CertificateFromError (SslError error) { + Bundle bundle = SslCertificate.saveState(error.getCertificate()); + X509Certificate x509Certificate; + byte[] bytes = bundle.getByteArray("x509-certificate"); + if (bytes == null) { + x509Certificate = null; + } else { + try { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes)); + x509Certificate = (X509Certificate) cert; + } catch (CertificateException e) { + x509Certificate = null; + } + } + return x509Certificate; } @Override public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm) { Log_OC.d(TAG, "onReceivedHttpAuthRequest : " + host); + + ((AuthenticatorActivity)mContext).createAuthenticationDialog(view, handler); } @Override @@ -177,5 +233,4 @@ public class SsoWebViewClient extends WebViewClient { Log_OC.d(TAG, "shouldOverrideKeyEvent : " + event); return false; } - }