X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/d2ee9062fad2591bcb91badbee1636812860a790..185aae4bc345f453479f94e2a78da62e8c9930b0:/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 9d78d6a8..27e1f5b8 100644 --- a/src/com/owncloud/android/authentication/SsoWebViewClient.java +++ b/src/com/owncloud/android/authentication/SsoWebViewClient.java @@ -17,15 +17,32 @@ 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.lib.common.network.NetworkUtils; +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; import android.view.View; import android.webkit.CookieManager; +import android.webkit.HttpAuthHandler; +import android.webkit.SslErrorHandler; +import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; -import android.widget.Toast; -import com.owncloud.android.Log_OC; /** * Custom {@link WebViewClient} client aimed to catch the end of a single-sign-on process @@ -40,12 +57,22 @@ public class SsoWebViewClient extends WebViewClient { private static final String TAG = SsoWebViewClient.class.getSimpleName(); + public interface SsoWebViewClientListener { + public void onSsoFinished(String sessionCookie); + } + private Context mContext; + private Handler mListenerHandler; + private WeakReference mListenerRef; private String mTargetUrl; + private String mLastReloadedUrlAtError; - public SsoWebViewClient (Context context) { + public SsoWebViewClient (Context context, Handler listenerHandler, SsoWebViewClientListener listener) { mContext = context; + mListenerHandler = listenerHandler; + mListenerRef = new WeakReference(listener); mTargetUrl = "fake://url.to.be.set"; + mLastReloadedUrlAtError = null; } public String getTargetUrl() { @@ -58,85 +85,149 @@ public class SsoWebViewClient extends WebViewClient { @Override public void onPageStarted (WebView view, String url, Bitmap favicon) { - //Log_OC.e(TAG, "onPageStarted : " + url); - if (url.startsWith(mTargetUrl)) { - view.setVisibility(View.GONE); - CookieManager cookieManager = CookieManager.getInstance(); - String cookies = cookieManager.getCookie(url); - Toast.makeText(mContext, "got cookies: " + cookies, Toast.LENGTH_LONG).show(); - } + Log_OC.d(TAG, "onPageStarted : " + url); + super.onPageStarted(view, url, favicon); } @Override + public void onFormResubmission (WebView view, Message dontResend, Message resend) { + Log_OC.d(TAG, "onFormResubMission "); + + // necessary to grant reload of last page when device orientation is changed after sending a form + resend.sendToTarget(); + } + + @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { - //view.loadUrl(url); return false; } @Override public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) { - Log_OC.e(TAG, "onReceivedError : " + failingUrl); + Log_OC.e(TAG, "onReceivedError : " + failingUrl + ", code " + errorCode + ", description: " + description); + if (!failingUrl.equals(mLastReloadedUrlAtError)) { + view.reload(); + mLastReloadedUrlAtError = failingUrl; + } else { + mLastReloadedUrlAtError = null; + super.onReceivedError(view, errorCode, description, failingUrl); + } } - /* - @Override - public void doUpdateVisitedHistory (WebView view, String url, boolean isReload) { - Log_OC.e(TAG, "doUpdateVisitedHistory : " + url); + public void onPageFinished (WebView view, String url) { + Log_OC.d(TAG, "onPageFinished : " + url); + mLastReloadedUrlAtError = null; + if (url.startsWith(mTargetUrl)) { + view.setVisibility(View.GONE); + CookieManager cookieManager = CookieManager.getInstance(); + final String cookies = cookieManager.getCookie(url); + Log_OC.d(TAG, "Cookies: " + cookies); + if (mListenerHandler != null && mListenerRef != null) { + // this is good idea because onPageFinished is not running in the UI thread + mListenerHandler.post(new Runnable() { + @Override + public void run() { + SsoWebViewClientListener listener = mListenerRef.get(); + if (listener != null) { + // Send Cookies to the listener + listener.onSsoFinished(cookies); + } + } + }); + } + } } + @Override - public void onPageFinished (WebView view, String url) { - Log_OC.e(TAG, "onPageFinished : " + url); + public void doUpdateVisitedHistory (WebView view, String url, boolean isReload) { + Log_OC.d(TAG, "doUpdateVisitedHistory : " + url); } @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { - Log_OC.e(TAG, "onReceivedSslError : " + error); + public void onReceivedSslError (final WebView view, final SslErrorHandler handler, SslError error) { + Log_OC.d(TAG, "onReceivedSslError : " + error); + // 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.e(TAG, "onReceivedHttpAuthRequest : " + host); + Log_OC.d(TAG, "onReceivedHttpAuthRequest : " + host); } @Override public WebResourceResponse shouldInterceptRequest (WebView view, String url) { - Log_OC.e(TAG, "shouldInterceptRequest : " + url); + Log_OC.d(TAG, "shouldInterceptRequest : " + url); return null; } @Override public void onLoadResource (WebView view, String url) { - Log_OC.e(TAG, "onLoadResource : " + url); - } - - @Override - public void onFormResubmission (WebView view, Message dontResend, Message resend) { - Log_OC.e(TAG, "onFormResubMission "); - super.onFormResubmission(view, dontResend, resend); + Log_OC.d(TAG, "onLoadResource : " + url); } @Override public void onReceivedLoginRequest (WebView view, String realm, String account, String args) { - Log_OC.e(TAG, "onReceivedLoginRequest : " + realm + ", " + account + ", " + args); + Log_OC.d(TAG, "onReceivedLoginRequest : " + realm + ", " + account + ", " + args); } @Override public void onScaleChanged (WebView view, float oldScale, float newScale) { - Log_OC.e(TAG, "onScaleChanged : " + oldScale + " -> " + newScale); + Log_OC.d(TAG, "onScaleChanged : " + oldScale + " -> " + newScale); + super.onScaleChanged(view, oldScale, newScale); } - + @Override public void onUnhandledKeyEvent (WebView view, KeyEvent event) { - Log_OC.e(TAG, "onUnhandledKeyEvent : " + event); + Log_OC.d(TAG, "onUnhandledKeyEvent : " + event); } @Override public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) { - Log_OC.e(TAG, "shouldOverrideKeyEvent : " + event); + Log_OC.d(TAG, "shouldOverrideKeyEvent : " + event); return false; } - - */ + }