From 0f23df1b7b51e9be2034957a7fd47874f44d210c Mon Sep 17 00:00:00 2001 From: jabarros Date: Mon, 7 Jul 2014 14:36:01 +0200 Subject: [PATCH 1/7] Avoid log cookies --- .../android/lib/common/OwnCloudClient.java | 33 +++++++++---------- .../lib/common/accounts/AccountUtils.java | 12 +++---- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/com/owncloud/android/lib/common/OwnCloudClient.java b/src/com/owncloud/android/lib/common/OwnCloudClient.java index e6696ef0..7058ff34 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/src/com/owncloud/android/lib/common/OwnCloudClient.java @@ -43,14 +43,13 @@ import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.http.HttpStatus; import org.apache.http.params.CoreProtocolPNames; +import android.net.Uri; +import android.util.Log; + import com.owncloud.android.lib.common.OwnCloudCredentialsFactory.OwnCloudAnonymousCredentials; import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.network.WebdavUtils; - -import android.net.Uri; -import android.util.Log; - public class OwnCloudClient extends HttpClient { private static final String TAG = OwnCloudClient.class.getSimpleName(); @@ -189,8 +188,8 @@ public class OwnCloudClient extends HttpClient { Log.d(TAG + " #" + mInstanceNumber, "REQUEST " + method.getName() + " " + method.getPath()); - logCookiesAtRequest(method.getRequestHeaders(), "before"); - logCookiesAtState("before"); +// logCookiesAtRequest(method.getRequestHeaders(), "before"); +// logCookiesAtState("before"); int status = super.executeMethod(method); @@ -198,9 +197,9 @@ public class OwnCloudClient extends HttpClient { status = patchRedirection(status, method); } - logCookiesAtRequest(method.getRequestHeaders(), "after"); - logCookiesAtState("after"); - logSetCookiesAtResponse(method.getResponseHeaders()); +// logCookiesAtRequest(method.getRequestHeaders(), "after"); +// logCookiesAtState("after"); +// logSetCookiesAtResponse(method.getResponseHeaders()); return status; @@ -348,17 +347,17 @@ public class OwnCloudClient extends HttpClient { } - public String getCookiesString(){ - Cookie[] cookies = getState().getCookies(); - String cookiesString =""; - for (Cookie cookie: cookies) { + public String getCookiesString() { + Cookie[] cookies = getState().getCookies(); + String cookiesString = ""; + for (Cookie cookie : cookies) { cookiesString = cookiesString + cookie.toString() + ";"; - - logCookie(cookie); + + // logCookie(cookie); } - + return cookiesString; - + } public int getConnectionTimeout() { diff --git a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java b/src/com/owncloud/android/lib/common/accounts/AccountUtils.java index b061c2e5..591f93f7 100644 --- a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java +++ b/src/com/owncloud/android/lib/common/accounts/AccountUtils.java @@ -29,11 +29,6 @@ import java.io.IOException; import org.apache.commons.httpclient.Cookie; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudCredentials; -import com.owncloud.android.lib.common.OwnCloudCredentialsFactory; -import com.owncloud.android.lib.resources.status.OwnCloudVersion; - import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountsException; @@ -43,6 +38,11 @@ import android.content.Context; import android.net.Uri; import android.util.Log; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudCredentials; +import com.owncloud.android.lib.common.OwnCloudCredentialsFactory; +import com.owncloud.android.lib.resources.status.OwnCloudVersion; + public class AccountUtils { private static final String TAG = AccountUtils.class.getSimpleName(); @@ -220,7 +220,7 @@ public class AccountUtils { String cookiesString = client.getCookiesString(); if (cookiesString != "") { ac.setUserData(savedAccount, Constants.KEY_COOKIES, cookiesString); - Log.d(TAG, "Saving Cookies: "+ cookiesString ); + // Log.d(TAG, "Saving Cookies: "+ cookiesString ); } } From 9af57b477e43acf9cf9e014f55716071959df823 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 10 Jul 2014 12:24:31 +0200 Subject: [PATCH 2/7] Back to save cached SimpleDateFormat instances to parse dates from server, to avoid huge performance problem in Android 2.x devices --- .../lib/common/network/WebdavUtils.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/com/owncloud/android/lib/common/network/WebdavUtils.java b/src/com/owncloud/android/lib/common/network/WebdavUtils.java index b5b3607c..a285e13f 100644 --- a/src/com/owncloud/android/lib/common/network/WebdavUtils.java +++ b/src/com/owncloud/android/lib/common/network/WebdavUtils.java @@ -35,15 +35,17 @@ import android.net.Uri; public class WebdavUtils { public static final SimpleDateFormat DISPLAY_DATE_FORMAT = new SimpleDateFormat( "dd.MM.yyyy hh:mm"); - private static final String DATETIME_FORMATS[] = { - "yyyy-MM-dd'T'HH:mm:ss'Z'", - "EEE, dd MMM yyyy HH:mm:ss zzz", - "yyyy-MM-dd'T'HH:mm:ss.sss'Z'", - "yyyy-MM-dd'T'HH:mm:ssZ", - "EEE MMM dd HH:mm:ss zzz yyyy", - "EEEEEE, dd-MMM-yy HH:mm:ss zzz", - "EEE MMMM d HH:mm:ss yyyy", - "yyyy-MM-dd hh:mm:ss" }; + + private static final SimpleDateFormat DATETIME_FORMATS[] = { + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US), + new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US), + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", Locale.US), + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US), + new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US), + new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US), + new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US), + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.US) + }; public static String prepareXmlForPropFind() { String ret = ""; @@ -56,11 +58,16 @@ public class WebdavUtils { public static Date parseResponseDate(String date) { Date returnDate = null; + SimpleDateFormat format = null; for (int i = 0; i < DATETIME_FORMATS.length; ++i) { try { - returnDate = new SimpleDateFormat (DATETIME_FORMATS[i], Locale.US).parse(date); + format = DATETIME_FORMATS[i]; + synchronized(format) { + returnDate = format.parse(date); + } return returnDate; } catch (ParseException e) { + // this is not the format } } return null; From 14d757ad9fd5a0bbb38f0135e3fcd7ba51c875db Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 10 Jul 2014 12:25:18 +0200 Subject: [PATCH 3/7] Removed unused methods from WebdavUtils --- .../owncloud/android/lib/common/network/WebdavUtils.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/com/owncloud/android/lib/common/network/WebdavUtils.java b/src/com/owncloud/android/lib/common/network/WebdavUtils.java index a285e13f..c701e45e 100644 --- a/src/com/owncloud/android/lib/common/network/WebdavUtils.java +++ b/src/com/owncloud/android/lib/common/network/WebdavUtils.java @@ -47,15 +47,6 @@ public class WebdavUtils { new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.US) }; - public static String prepareXmlForPropFind() { - String ret = ""; - return ret; - } - - public static String prepareXmlForPatch() { - return ""; - } - public static Date parseResponseDate(String date) { Date returnDate = null; SimpleDateFormat format = null; From 0f4f4edf6cab6167fafb9ec9dcec49d9064e06e2 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 10 Jul 2014 13:08:10 +0200 Subject: [PATCH 4/7] Fully disable cookie tracking by default, as before introducing OwnCloudClientManager; only SingleSessionManager tracks cookies --- src/com/owncloud/android/lib/common/OwnCloudClient.java | 2 +- .../owncloud/android/lib/common/SingleSessionManager.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/lib/common/OwnCloudClient.java b/src/com/owncloud/android/lib/common/OwnCloudClient.java index 7058ff34..7b48bbc0 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/src/com/owncloud/android/lib/common/OwnCloudClient.java @@ -87,7 +87,7 @@ public class OwnCloudClient extends HttpClient { HttpVersion.HTTP_1_1); getParams().setCookiePolicy( - CookiePolicy.BROWSER_COMPATIBILITY); // to keep sessions + CookiePolicy.IGNORE_COOKIES); getParams().setParameter( PARAM_SINGLE_COOKIE_HEADER, // to avoid problems with some web servers PARAM_SINGLE_COOKIE_HEADER_VALUE); diff --git a/src/com/owncloud/android/lib/common/SingleSessionManager.java b/src/com/owncloud/android/lib/common/SingleSessionManager.java index 690056ff..638362f6 100644 --- a/src/com/owncloud/android/lib/common/SingleSessionManager.java +++ b/src/com/owncloud/android/lib/common/SingleSessionManager.java @@ -29,6 +29,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import org.apache.commons.httpclient.cookie.CookiePolicy; + import android.accounts.Account; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; @@ -102,6 +104,9 @@ public class SingleSessionManager implements OwnCloudClientManager { account.getBaseUri(), context.getApplicationContext(), true); // TODO remove dependency on OwnCloudClientFactory + client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); + // enable cookie tracking + // Restore Cookies ?? AccountUtils.restoreCookies(accountName, client, context); From f7c992f38b9618b4be6a63f78db166582f59fea3 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 23 Jul 2014 18:19:01 +0200 Subject: [PATCH 5/7] Enforcing Travis retry without changes --- AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 708f7893..eaa33e5e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -33,3 +33,4 @@ android:targetSdkVersion="19" /> + From 0862c66b7d1fbb822e51bb94bf7ea77ce427967a Mon Sep 17 00:00:00 2001 From: jabarros Date: Thu, 10 Jul 2014 16:31:32 +0200 Subject: [PATCH 6/7] Update RemoteOperation.ResultCode to include enum value for FORBIDDEN results --- .../lib/common/operations/RemoteOperationResult.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index e8b0be88..54f47a55 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -41,13 +41,13 @@ import org.apache.commons.httpclient.HttpStatus; import org.apache.jackrabbit.webdav.DavException; import org.json.JSONException; -import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; -import com.owncloud.android.lib.common.network.CertificateCombinedException; - import android.accounts.Account; import android.accounts.AccountsException; import android.util.Log; +import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; +import com.owncloud.android.lib.common.network.CertificateCombinedException; + /** * The result of a remote operation required to an ownCloud server. @@ -98,7 +98,8 @@ public class RemoteOperationResult implements Serializable { ACCOUNT_NOT_THE_SAME, INVALID_CHARACTER_IN_NAME, SHARE_NOT_FOUND, - LOCAL_STORAGE_NOT_REMOVED + LOCAL_STORAGE_NOT_REMOVED, + FORBIDDEN } private boolean mSuccess = false; @@ -140,6 +141,9 @@ public class RemoteOperationResult implements Serializable { case HttpStatus.SC_INSUFFICIENT_STORAGE: mCode = ResultCode.QUOTA_EXCEEDED; break; + case HttpStatus.SC_FORBIDDEN: + mCode = ResultCode.FORBIDDEN; + break; default: mCode = ResultCode.UNHANDLED_HTTP_CODE; Log.d(TAG, "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " + httpCode); From 7636d9e0373bafd63dfd79c032ef927d87d0872e Mon Sep 17 00:00:00 2001 From: jabarros Date: Thu, 10 Jul 2014 17:29:43 +0200 Subject: [PATCH 7/7] Update ErrorMessageAdapter class to generate appropiate error messages for operations failed due to lack of permissions (ResultCode.FORBIDDEN) --- .../android/lib/common/operations/RemoteOperationResult.java | 3 ++- .../lib/resources/shares/CreateRemoteShareOperation.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index 54f47a55..3b6b99a4 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -99,7 +99,8 @@ public class RemoteOperationResult implements Serializable { INVALID_CHARACTER_IN_NAME, SHARE_NOT_FOUND, LOCAL_STORAGE_NOT_REMOVED, - FORBIDDEN + FORBIDDEN, + SHARE_FORBIDDEN } private boolean mSuccess = false; diff --git a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java b/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java index 67a1ba51..55b5b7db 100644 --- a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java +++ b/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java @@ -142,6 +142,9 @@ public class CreateRemoteShareOperation extends RemoteOperation { } else if (xmlParser.isFileNotFound()){ result = new RemoteOperationResult(ResultCode.SHARE_NOT_FOUND); + } else if (xmlParser.isFailure()) { + result = new RemoteOperationResult(ResultCode.SHARE_FORBIDDEN); + } else { result = new RemoteOperationResult(false, status, post.getResponseHeaders()); }