X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/37297fb7a9085d10c7a2c34d846f3b7088c30929..d3d0816ed7c16397cad47fc91ce43d5ec5d91995:/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 ec86667b..83f70ac9 100644 --- a/src/com/owncloud/android/authentication/SsoWebViewClient.java +++ b/src/com/owncloud/android/authentication/SsoWebViewClient.java @@ -17,17 +17,38 @@ 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.Log_OC; - +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.content.Context; +import android.content.DialogInterface; 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.text.InputType; +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.EditText; +import android.widget.LinearLayout; + +import com.owncloud.android.R; +import com.owncloud.android.lib.common.network.NetworkUtils; +import com.owncloud.android.utils.Log_OC; /** @@ -47,12 +68,14 @@ 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"; @@ -70,24 +93,7 @@ public class SsoWebViewClient extends WebViewClient { @Override public void onPageStarted (WebView view, String url, Bitmap favicon) { Log_OC.d(TAG, "onPageStarted : " + url); - if (url.startsWith(mTargetUrl)) { - view.setVisibility(View.GONE); - CookieManager cookieManager = CookieManager.getInstance(); - final String cookies = cookieManager.getCookie(url); - //Log_OC.d(TAG, cookies); - if (mListenerHandler != null && mListenerRef != null) { - // this is good idea because onPageStarted is not running in the UI thread - mListenerHandler.post(new Runnable() { - @Override - public void run() { - SsoWebViewClientListener listener = mListenerRef.get(); - if (listener != null) { - listener.onSsoFinished(cookies); - } - } - }); - } - } + super.onPageStarted(view, url, favicon); } @Override @@ -111,6 +117,7 @@ public class SsoWebViewClient extends WebViewClient { mLastReloadedUrlAtError = failingUrl; } else { mLastReloadedUrlAtError = null; + super.onReceivedError(view, errorCode, description, failingUrl); } } @@ -118,22 +125,87 @@ public class SsoWebViewClient extends WebViewClient { 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 doUpdateVisitedHistory (WebView view, String url, boolean isReload) { Log_OC.d(TAG, "doUpdateVisitedHistory : " + url); } @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); + // 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); +// Toast.makeText(mContext, "onReceivedHttpAuthRequest : " + host, Toast.LENGTH_LONG).show(); + + createAuthenticationDialog(view, handler); + } @Override @@ -168,5 +240,59 @@ public class SsoWebViewClient extends WebViewClient { Log_OC.d(TAG, "shouldOverrideKeyEvent : " + event); return false; } - */ + + /** + * Create dialog for request authentication to the user + * @param webView + * @param handler + */ + private void createAuthenticationDialog(WebView webView, HttpAuthHandler handler) { + final WebView mWebView = webView; + final HttpAuthHandler mHandler = handler; + + // Create field for username + final EditText usernameET = new EditText(mContext); + usernameET.setHint(mContext.getText(R.string.auth_username)); + + // Create field for password + final EditText passwordET = new EditText(mContext); + passwordET.setHint(mContext.getText(R.string.auth_password)); + passwordET.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + + // Prepare LinearLayout for dialog + LinearLayout ll = new LinearLayout(mContext); + ll.setOrientation(LinearLayout.VERTICAL); + ll.addView(usernameET); + ll.addView(passwordET); + + Builder authDialog = new AlertDialog + .Builder(mContext) + .setTitle(mContext.getText(R.string.saml_authentication_required_text)) + .setView(ll) + .setCancelable(false) + .setPositiveButton(mContext.getText(R.string.common_ok), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + + String username = usernameET.getText().toString().trim(); + String password = passwordET.getText().toString().trim(); + + // Proceed with the authentication + mHandler.proceed(username, password); + dialog.dismiss(); + } + }) + .setNegativeButton(mContext.getText(R.string.common_cancel), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + mWebView.stopLoading(); + } + }); + + if (mWebView!=null) { + authDialog.show(); + } + + } }