Merge branch 'develop' into refactor_remote_saml_authentication
authormasensio <masensio@solidgear.es>
Tue, 14 Jan 2014 10:12:31 +0000 (11:12 +0100)
committermasensio <masensio@solidgear.es>
Tue, 14 Jan 2014 10:12:31 +0000 (11:12 +0100)
oc_framework/src/com/owncloud/android/oc_framework/accounts/AccountUtils.java
oc_framework/src/com/owncloud/android/oc_framework/accounts/SsoWebViewClient.java [new file with mode: 0644]
oc_framework/src/com/owncloud/android/oc_framework/operations/RemoteOperationResult.java
oc_framework/src/com/owncloud/android/oc_framework/operations/remote/GetUserNameRemoteOperation.java [new file with mode: 0644]
src/com/owncloud/android/authentication/AuthenticatorActivity.java
src/com/owncloud/android/authentication/SsoWebViewClient.java [deleted file]
src/com/owncloud/android/ui/dialog/SamlWebViewDialog.java

index 810f3eb..20e5b07 100644 (file)
@@ -24,6 +24,7 @@ import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AccountsException;
 import android.content.Context;
+import android.net.Uri;
 
 public class AccountUtils {
     public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php";
@@ -34,6 +35,9 @@ public class AccountUtils {
     public static final String CARDDAV_PATH_2_0 = "/apps/contacts/carddav.php";
     public static final String CARDDAV_PATH_4_0 = "/remote/carddav.php";
     public static final String STATUS_PATH = "/status.php";
+    
+    // Key for UserName in Saml Cookie
+    private static final String KEY_OC_USERNAME_EQUALS = "oc_username=";
 
     /**
      * 
@@ -125,5 +129,23 @@ public class AccountUtils {
             return mFailedAccount;
         }
     }
+    
+    /** 
+     * Get the UserName for the SamlSso cookie
+     * @param authToken
+     * @return userName
+     */
+    public static String getUserNameForSamlSso(String authToken) {
+       if (authToken != null) {
+            String [] cookies = authToken.split(";");
+            for (int i=0; i<cookies.length; i++) {
+                if (cookies[i].startsWith(KEY_OC_USERNAME_EQUALS )) {
+                    String value = Uri.decode(cookies[i].substring(KEY_OC_USERNAME_EQUALS.length()));
+                    return value;
+                }
+            }
+        }
+        return "";
+    }
 
 }
diff --git a/oc_framework/src/com/owncloud/android/oc_framework/accounts/SsoWebViewClient.java b/oc_framework/src/com/owncloud/android/oc_framework/accounts/SsoWebViewClient.java
new file mode 100644 (file)
index 0000000..04f8d95
--- /dev/null
@@ -0,0 +1,182 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   as published by the Free Software Foundation.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.owncloud.android.oc_framework.accounts;
+
+import java.lang.ref.WeakReference;
+
+import android.graphics.Bitmap;
+import android.net.http.SslError;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+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;
+
+
+/**
+ * Custom {@link WebViewClient} client aimed to catch the end of a single-sign-on process 
+ * running in the {@link WebView} that is attached to.
+ * 
+ * Assumes that the single-sign-on is kept thanks to a cookie set at the end of the
+ * authentication process.
+ *   
+ * @author David A. Velasco
+ */
+public class SsoWebViewClient extends WebViewClient {
+        
+    private static final String TAG = SsoWebViewClient.class.getSimpleName();
+    
+    public interface SsoWebViewClientListener {
+        public void onSsoFinished(String sessionCookie);
+    }
+    
+    private Handler mListenerHandler;
+    private WeakReference<SsoWebViewClientListener> mListenerRef;
+    private String mTargetUrl;
+    private String mLastReloadedUrlAtError;
+    
+    public SsoWebViewClient (Handler listenerHandler, SsoWebViewClientListener listener) {
+        mListenerHandler = listenerHandler;
+        mListenerRef = new WeakReference<SsoWebViewClient.SsoWebViewClientListener>(listener);
+        mTargetUrl = "fake://url.to.be.set";
+        mLastReloadedUrlAtError = null;
+    }
+    
+    public String getTargetUrl() {
+        return mTargetUrl;
+    }
+    
+    public void setTargetUrl(String targetUrl) {
+        mTargetUrl = targetUrl;
+    }
+
+    @Override
+    public void onPageStarted (WebView view, String url, Bitmap favicon) {
+        Log.d(TAG, "onPageStarted : " + url);
+        super.onPageStarted(view, url, favicon);
+    }
+    
+    @Override
+    public void onFormResubmission (WebView view, Message dontResend, Message resend) {
+        Log.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) {
+        return false;
+    }
+    
+    @Override
+    public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
+        Log.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 onPageFinished (WebView view, String url) {
+        Log.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.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);
+                        }
+                    }
+                });
+            }
+        } else {
+               Log.d(TAG, "URL==> " + url + " mTarget==> " + mTargetUrl);
+        }
+    }
+    
+    
+    @Override
+    public void doUpdateVisitedHistory (WebView view, String url, boolean isReload) {
+        Log.d(TAG, "doUpdateVisitedHistory : " + url);
+    }
+    
+    @Override
+    public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
+        Log.d(TAG, "onReceivedSslError : " + error);
+        handler.proceed();
+    }
+    
+    @Override
+    public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm) {
+        Log.d(TAG, "onReceivedHttpAuthRequest : " + host);
+    }
+
+    @Override
+    public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
+        Log.d(TAG, "shouldInterceptRequest : " + url);
+        return null;
+    }
+    
+    @Override
+    public void onLoadResource (WebView view, String url) {
+        Log.d(TAG, "onLoadResource : " + url);   
+    }
+    
+    @Override
+    public void onReceivedLoginRequest (WebView view, String realm, String account, String args) {
+        Log.d(TAG, "onReceivedLoginRequest : " + realm + ", " + account + ", " + args);
+    }
+    
+    @Override
+    public void onScaleChanged (WebView view, float oldScale, float newScale) {
+        Log.d(TAG, "onScaleChanged : " + oldScale + " -> " + newScale);
+        super.onScaleChanged(view, oldScale, newScale);
+    }
+
+    @Override
+    public void onUnhandledKeyEvent (WebView view, KeyEvent event) {
+        Log.d(TAG, "onUnhandledKeyEvent : " + event);
+    }
+    
+    @Override
+    public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
+        Log.d(TAG, "shouldOverrideKeyEvent : " + event);
+        return false;
+    }
+
+}
index 58accf9..ada12d2 100644 (file)
@@ -33,6 +33,7 @@ import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpException;
 import org.apache.commons.httpclient.HttpStatus;
 import org.apache.jackrabbit.webdav.DavException;
+import org.json.JSONException;
 
 import com.owncloud.android.oc_framework.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.oc_framework.network.CertificateCombinedException;
@@ -89,7 +90,8 @@ public class RemoteOperationResult implements Serializable {
         ACCOUNT_EXCEPTION, 
         ACCOUNT_NOT_NEW, 
         ACCOUNT_NOT_THE_SAME,
-        INVALID_CHARACTER_IN_NAME
+        INVALID_CHARACTER_IN_NAME,
+        JSON_EXCEPTION
     }
 
     private boolean mSuccess = false;
@@ -99,11 +101,13 @@ public class RemoteOperationResult implements Serializable {
     private String mRedirectedLocation;
 
     private ArrayList<RemoteFile> mFiles;
+    private String mUserName;
     
     public RemoteOperationResult(ResultCode code) {
         mCode = code;
         mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
         mFiles = null;
+        setUserName("");
     }
 
     private RemoteOperationResult(boolean success, int httpCode) {
@@ -192,6 +196,9 @@ public class RemoteOperationResult implements Serializable {
                 mCode = ResultCode.SSL_ERROR;
             }
 
+        } else if (e instanceof JSONException) {
+               mCode = ResultCode.JSON_EXCEPTION;
+               
         } else {
             mCode = ResultCode.UNKNOWN_ERROR;
         }
@@ -294,6 +301,8 @@ public class RemoteOperationResult implements Serializable {
             } else if (mException instanceof AccountsException) {
                 return "Exception while using account";
                 
+            } else if (mException instanceof JSONException) {
+               return "JSON exception";
             } else {
                 return "Unexpected exception";
             }
@@ -349,4 +358,12 @@ public class RemoteOperationResult implements Serializable {
                 mRedirectedLocation.toLowerCase().contains("wayf")));
     }
 
+       public String getUserName() {
+               return mUserName;
+       }
+
+       public void setUserName(String mUserName) {
+               this.mUserName = mUserName;
+       }
+
 }
diff --git a/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/GetUserNameRemoteOperation.java b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/GetUserNameRemoteOperation.java
new file mode 100644 (file)
index 0000000..d8e7626
--- /dev/null
@@ -0,0 +1,137 @@
+
+/* ownCloud Android client application
+ *   Copyright (C) 2012-2013 ownCloud Inc.
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License version 2,
+ *   as published by the Free Software Foundation.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.owncloud.android.oc_framework.operations.remote;
+
+import java.io.IOException;
+
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.http.HttpStatus;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.util.Log;
+
+import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
+import com.owncloud.android.oc_framework.operations.RemoteOperation;
+import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
+
+
+/**
+ * @author masensio
+ *
+ * Get the UserName for a SAML connection, from a JSON with the format:
+ *             id
+ *             display-name
+ *             email
+ */
+
+public class GetUserNameRemoteOperation extends RemoteOperation {
+       
+       private static final String TAG = GetUserNameRemoteOperation.class.getSimpleName();
+
+       // HEADER
+       private static final String TAG_HEADER_OCS_API = "OCS-APIREQUEST";
+       private static final String TAG_HEADER_OCS_API_VALUE = "true";
+       
+       private static final String TAG_HEADER_CONTENT = "Content-Type";
+       private static final String TAG_HEADER_CONTENT_VALUE = "application/xml";
+       private static final String TAG_HEADER_COOKIE = "Cookie";
+
+       // OCS Route
+       private static final String TAG_OCS_ROUTE ="/index.php/ocs/cloud/user?format=json"; 
+
+       // JSON Node names
+       private static final String TAG_OCS = "ocs";
+       private static final String TAG_DATA = "data";
+       private static final String TAG_ID = "id";
+       private static final String TAG_DISPLAY_NAME= "display-name";
+       private static final String TAG_EMAIL= "email";
+
+       private String mUrl;
+       private String mSessionCookie;
+       private String mUserName;
+
+       public String getUserName() {
+               return mUserName;
+       }
+
+       
+       public GetUserNameRemoteOperation(String url, String sessioncookie) {
+               mUrl = url;
+               mSessionCookie = sessioncookie;
+       }
+
+       @Override
+       protected RemoteOperationResult run(WebdavClient client) {
+        RemoteOperationResult result = null;
+        int status = -1;
+        
+        // Get Method
+        GetMethod get = new GetMethod(mUrl + TAG_OCS_ROUTE);
+        Log.d(TAG, "URL ------> " + mUrl + TAG_OCS_ROUTE);
+        // Add the Header
+        get.addRequestHeader(TAG_HEADER_CONTENT, TAG_HEADER_CONTENT_VALUE);
+        get.addRequestHeader(TAG_HEADER_OCS_API, TAG_HEADER_OCS_API_VALUE);
+        get.setRequestHeader(TAG_HEADER_COOKIE, mSessionCookie);
+        
+        //Get the user
+        try {
+                       status = client.executeMethod(get);
+                       if(isSuccess(status)) {
+                                Log.d(TAG, "Obtain RESPONSE");
+                                String response = get.getResponseBodyAsString();
+                                
+                                Log.d(TAG, "GET RESPONSE.................... " + response);
+
+                                // Parse the response
+                                JSONObject respJSON = new JSONObject(response);
+                                JSONObject respOCS = respJSON.getJSONObject(TAG_OCS);
+                                JSONObject respData = respOCS.getJSONObject(TAG_DATA);
+                                String id = respData.getString(TAG_ID);
+                                String displayName = respData.getString(TAG_DISPLAY_NAME);
+                                String email = respData.getString(TAG_EMAIL);
+                                
+                                // Result
+                                result = new RemoteOperationResult(isSuccess(status), status, (get != null ? get.getResponseHeaders() : null));
+                                result.setUserName(displayName);
+                                
+                                Log.d(TAG, "Response: " + id + " - " + displayName + " - " + email);
+                                
+                       }
+               } catch (HttpException e) {
+                       result = new RemoteOperationResult(e);
+                       e.printStackTrace();
+               } catch (IOException e) {
+                       result = new RemoteOperationResult(e);
+                       e.printStackTrace();
+               } catch (JSONException e) {
+                       result = new RemoteOperationResult(e);
+                       e.printStackTrace();
+               } finally {
+                       get.releaseConnection();
+               }
+        
+               return result;
+       }
+
+    private boolean isSuccess(int status) {
+        return (status == HttpStatus.SC_OK);
+    }
+    
+}
index 456e284..dd918e6 100644 (file)
@@ -18,6 +18,8 @@
 \r
 package com.owncloud.android.authentication;\r
 \r
+import java.util.concurrent.ExecutionException;\r
+\r
 import android.accounts.Account;\r
 import android.accounts.AccountManager;\r
 import android.app.AlertDialog;\r
@@ -29,6 +31,7 @@ import android.content.SharedPreferences;
 import android.graphics.Rect;\r
 import android.graphics.drawable.Drawable;\r
 import android.net.Uri;\r
+import android.os.AsyncTask;\r
 import android.os.Bundle;\r
 import android.os.Handler;\r
 import android.preference.PreferenceManager;\r
@@ -52,9 +55,9 @@ import android.widget.TextView.OnEditorActionListener;
 import com.actionbarsherlock.app.SherlockDialogFragment;\r
 import com.owncloud.android.MainApp;\r
 import com.owncloud.android.R;\r
-import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;\r
 import com.owncloud.android.oc_framework.accounts.AccountTypeUtils;\r
 import com.owncloud.android.oc_framework.accounts.OwnCloudAccount;\r
+import com.owncloud.android.oc_framework.accounts.SsoWebViewClient.SsoWebViewClientListener;\r
 import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory;\r
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;\r
 import com.owncloud.android.operations.OAuth2GetAccessToken;\r
@@ -64,6 +67,7 @@ import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;\r
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;\r
 import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation;\r
+import com.owncloud.android.oc_framework.operations.remote.GetUserNameRemoteOperation;\r
 import com.owncloud.android.ui.dialog.SamlWebViewDialog;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;\r
@@ -102,8 +106,6 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
     private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT";\r
     private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON";\r
     private static final String KEY_REFRESH_BUTTON_ENABLED = "KEY_REFRESH_BUTTON_ENABLED";\r
-    \r
-    private static final String KEY_OC_USERNAME_EQUALS = "oc_username=";\r
 \r
     private static final String AUTH_ON = "on";\r
     private static final String AUTH_OFF = "off";\r
@@ -794,8 +796,9 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             }\r
         }\r
     }\r
-    \r
-    \r
+\r
+\r
+\r
     private void onSamlBasedFederatedSingleSignOnAuthorizationStart(RemoteOperation operation, RemoteOperationResult result) {\r
         try {\r
             dismissDialog(DIALOG_LOGIN_PROGRESS);\r
@@ -1177,7 +1180,11 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);\r
             \r
         } else if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(mAuthTokenType)) {\r
-            String username = getUserNameForSamlSso();\r
+            \r
+            String username= getUserNameForSaml(mHostBaseUrl);\r
+            if (username == null)\r
+                return false;\r
+            \r
             if (!mUsernameInput.getText().toString().equals(username)) {\r
                 // fail - not a new account, but an existing one; disallow\r
                 RemoteOperationResult result = new RemoteOperationResult(ResultCode.ACCOUNT_NOT_THE_SAME); \r
@@ -1217,8 +1224,10 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         Uri uri = Uri.parse(mHostBaseUrl);\r
         String username = mUsernameInput.getText().toString().trim();\r
         if (isSaml) {\r
-            username = getUserNameForSamlSso();\r
-            \r
+            username = getUserNameForSaml(mHostBaseUrl);\r
+            if (username == null)\r
+                return false;\r
+\r
         } else if (isOAuth) {\r
             username = "OAuth_user" + (new java.util.Random(System.currentTimeMillis())).nextLong();\r
         }            \r
@@ -1279,20 +1288,6 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         }\r
     }\r
 \r
-    \r
-    private String getUserNameForSamlSso() {\r
-        if (mAuthToken != null) {\r
-            String [] cookies = mAuthToken.split(";");\r
-            for (int i=0; i<cookies.length; i++) {\r
-                if (cookies[i].startsWith(KEY_OC_USERNAME_EQUALS )) {\r
-                    String value = Uri.decode(cookies[i].substring(KEY_OC_USERNAME_EQUALS.length()));\r
-                    return value;\r
-                }\r
-            }\r
-        }\r
-        return "";\r
-    }\r
-\r
 \r
     /**\r
      * {@inheritDoc}\r
@@ -1652,4 +1647,45 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         }\r
         return super.onTouchEvent(event);\r
     }\r
+    \r
+    \r
+    /**\r
+     * Asynchronous task to get the SAML User name from OCS-API\r
+     *\r
+     */\r
+    private class GetUserNameTask extends AsyncTask<String, Void, String>{\r
+\r
+        @Override\r
+        protected String doInBackground(String... params) {\r
+            \r
+            String hostUrl = (String)params[0];\r
+            \r
+            GetUserNameRemoteOperation getUserOperation = new GetUserNameRemoteOperation(hostUrl, mAuthToken);\r
+            WebdavClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(hostUrl), getApplicationContext(), true);\r
+            RemoteOperationResult result = getUserOperation.execute(client);\r
+          \r
+            return result.getUserName();\r
+        }\r
+        \r
+    }\r
+\r
+    /**\r
+     * Get the user name form OCS-API\r
+     * @param hostUrl\r
+     * @return username\r
+     */\r
+    private String getUserNameForSaml(String hostUrl){\r
+\r
+        GetUserNameTask getUserTask = new GetUserNameTask();\r
+        String username = null;\r
+        try {\r
+            username = getUserTask.execute(mHostBaseUrl).get();\r
+        } catch (InterruptedException e) {\r
+            e.printStackTrace();\r
+        } catch (ExecutionException e) {\r
+            e.printStackTrace();\r
+        }\r
+\r
+        return username;\r
+    }\r
 }\r
diff --git a/src/com/owncloud/android/authentication/SsoWebViewClient.java b/src/com/owncloud/android/authentication/SsoWebViewClient.java
deleted file mode 100644 (file)
index 8d80e9b..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/* ownCloud Android client application
- *   Copyright (C) 2012-2013 ownCloud Inc.
- *
- *   This program is free software: you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License version 2,
- *   as published by the Free Software Foundation.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-package com.owncloud.android.authentication;
-
-import java.lang.ref.WeakReference;
-
-import com.owncloud.android.utils.Log_OC;
-
-
-import android.graphics.Bitmap;
-import android.os.Handler;
-import android.os.Message;
-import android.view.View;
-import android.webkit.CookieManager;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-
-/**
- * Custom {@link WebViewClient} client aimed to catch the end of a single-sign-on process 
- * running in the {@link WebView} that is attached to.
- * 
- * Assumes that the single-sign-on is kept thanks to a cookie set at the end of the
- * authentication process.
- *   
- * @author David A. Velasco
- */
-public class SsoWebViewClient extends WebViewClient {
-        
-    private static final String TAG = SsoWebViewClient.class.getSimpleName();
-    
-    public interface SsoWebViewClientListener {
-        public void onSsoFinished(String sessionCookie);
-    }
-    
-    private Handler mListenerHandler;
-    private WeakReference<SsoWebViewClientListener> mListenerRef;
-    private String mTargetUrl;
-    private String mLastReloadedUrlAtError;
-    
-    public SsoWebViewClient (Handler listenerHandler, SsoWebViewClientListener listener) {
-        mListenerHandler = listenerHandler;
-        mListenerRef = new WeakReference<SsoWebViewClient.SsoWebViewClientListener>(listener);
-        mTargetUrl = "fake://url.to.be.set";
-        mLastReloadedUrlAtError = null;
-    }
-    
-    public String getTargetUrl() {
-        return mTargetUrl;
-    }
-    
-    public void setTargetUrl(String targetUrl) {
-        mTargetUrl = targetUrl;
-    }
-
-    @Override
-    public void onPageStarted (WebView view, String url, Bitmap favicon) {
-        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) {
-        return false;
-    }
-    
-    @Override
-    public void onReceivedError (WebView view, int errorCode, String description, String 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 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) {
-                            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) {
-        Log_OC.d(TAG, "onReceivedSslError : " + error);
-    }
-    
-    @Override
-    public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm) {
-        Log_OC.d(TAG, "onReceivedHttpAuthRequest : " + host);
-    }
-
-    @Override
-    public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
-        Log_OC.d(TAG, "shouldInterceptRequest : " + url);
-        return null;
-    }
-    
-    @Override
-    public void onLoadResource (WebView view, String url) {
-        Log_OC.d(TAG, "onLoadResource : " + url);   
-    }
-    
-    @Override
-    public void onReceivedLoginRequest (WebView view, String realm, String account, String args) {
-        Log_OC.d(TAG, "onReceivedLoginRequest : " + realm + ", " + account + ", " + args);
-    }
-    
-    @Override
-    public void onScaleChanged (WebView view, float oldScale, float newScale) {
-        Log_OC.d(TAG, "onScaleChanged : " + oldScale + " -> " + newScale);
-        super.onScaleChanged(view, oldScale, newScale);
-    }
-
-    @Override
-    public void onUnhandledKeyEvent (WebView view, KeyEvent event) {
-        Log_OC.d(TAG, "onUnhandledKeyEvent : " + event);
-    }
-    
-    @Override
-    public boolean shouldOverrideKeyEvent (WebView view, KeyEvent event) {
-        Log_OC.d(TAG, "shouldOverrideKeyEvent : " + event);
-        return false;
-    }
-    */
-}
index 91c607e..9927dc8 100644 (file)
@@ -36,8 +36,8 @@ import android.webkit.WebView;
 
 import com.actionbarsherlock.app.SherlockDialogFragment;
 import com.owncloud.android.R;
-import com.owncloud.android.authentication.SsoWebViewClient;
-import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
+import com.owncloud.android.oc_framework.accounts.SsoWebViewClient;
+import com.owncloud.android.oc_framework.accounts.SsoWebViewClient.SsoWebViewClientListener;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 import com.owncloud.android.utils.Log_OC;