From 6267b401fdc148f8082c2c6335b31cd5dbdb9470 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 23 Apr 2024 07:19:06 +0600 Subject: [PATCH 1/4] feat: use different userName for ownCloud & nextCloud client As ownCloudClient & nextCloudClient use separate set of sessionCookie to track session, it is better to have different userAgent by default. issue: https://gitlab.e.foundation/e/os/backlog/-/issues/2159 --- .../java/com/nextcloud/common/OkHttpMethodBase.kt | 4 ++-- .../lib/common/OwnCloudClientManagerFactory.java | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt b/library/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt index e3c80f155..8c2bc32af 100644 --- a/library/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt +++ b/library/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt @@ -140,7 +140,7 @@ abstract class OkHttpMethodBase( val temp = requestBuilder.url(buildQueryParameter()) requestHeaders[AUTHORIZATION] = nextcloudClient.credentials - requestHeaders[USER_AGENT] = OwnCloudClientManagerFactory.getUserAgent() + requestHeaders[USER_AGENT] = OwnCloudClientManagerFactory.getNextCloudUserAgent() requestHeaders.forEach { (name, value) -> temp.header(name, value) } if (useOcsApiRequestHeader) { @@ -167,7 +167,7 @@ abstract class OkHttpMethodBase( fun execute(client: PlainClient): Int { val temp = requestBuilder.url(buildQueryParameter()) - requestHeaders[USER_AGENT] = OwnCloudClientManagerFactory.getUserAgent() + requestHeaders[USER_AGENT] = OwnCloudClientManagerFactory.getNextCloudUserAgent() requestHeaders.forEach { (name, value) -> temp.header(name, value) } applyType(temp) diff --git a/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java b/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java index 1b4e6f2bc..ca933e28a 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java +++ b/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java @@ -25,7 +25,8 @@ package com.owncloud.android.lib.common; public class OwnCloudClientManagerFactory { private static OwnCloudClientManager sDefaultSingleton; - private static String sUserAgent = "Mozilla/5.0 (Android) Nextcloud-android"; + private static String ocUserAgent = "eOS (Android) Owncloud-android"; + private static String ncUserAgent = "eOS (Android) Nextcloud-android"; public static OwnCloudClientManager getDefaultSingleton() { if (sDefaultSingleton == null) { @@ -35,10 +36,18 @@ public class OwnCloudClientManagerFactory { } public static void setUserAgent(String userAgent) { - sUserAgent = userAgent; + ocUserAgent = userAgent; } public static String getUserAgent() { - return sUserAgent; + return ocUserAgent; + } + + public static String getNextCloudUserAgent() { + return ncUserAgent; + } + + public static void setNextCloudUserAgent(String userAgent) { + ncUserAgent = userAgent; } } -- GitLab From 785b246669358a5f700a9d587a9b2c18e7c6bea1 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 23 Apr 2024 07:23:41 +0600 Subject: [PATCH 2/4] fix: block passing same cookie multiple times in same request For ownCloud request, it is observed same cookie pair is send multiple time in the same request. This issue block this behavior. issue: https://gitlab.e.foundation/e/os/backlog/-/issues/2159 --- .../android/lib/common/OwnCloudClient.java | 20 +++++++++++++++---- .../lib/common/accounts/AccountUtils.java | 15 +++++++++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java b/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java index 1534004ec..89f0596bd 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/library/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java @@ -51,7 +51,12 @@ import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; import java.net.SocketTimeoutException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; +import java.util.Map; +import java.util.Set; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -428,16 +433,23 @@ public class OwnCloudClient extends HttpClient { @SuppressFBWarnings(value = "SBSC_USE_STRINGBUFFER_CONCATENATION", justification = "replaced by NextcloudClient") public String getCookiesString() { + Map cookieMap = new HashMap<>(); Cookie[] cookies = getState().getCookies(); - String cookiesString = ""; + StringBuilder cookiesString = new StringBuilder(); + for (Cookie cookie : cookies) { - cookiesString = cookiesString + cookie.toString() + ";"; + if (cookie.isExpired()) { + continue; + } - // logCookie(cookie); + cookieMap.put(cookie.getName(), cookie); } - return cookiesString; + for (Cookie cookie: cookieMap.values()) { + cookiesString.append(cookie.toString()).append(";"); + } + return cookiesString.toString(); } public int getConnectionTimeout() { diff --git a/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java b/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java index 4a4f64c0e..cbe515e56 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java +++ b/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java @@ -53,6 +53,8 @@ import org.apache.commons.httpclient.Cookie; import org.json.JSONException; import java.io.IOException; +import java.util.HashSet; +import java.util.Set; import okhttp3.CookieJar; @@ -303,17 +305,28 @@ public class AccountUtils { Log_OC.e(TAG, e.getMessage()); } + client.getState().clearCookies(); + if (cookiesString != null) { String[] cookies = cookiesString.split(";"); if (cookies.length > 0) { + Set cookieNames = new HashSet<>(); + for (int i = 0; i < cookies.length; i++) { int equalPos = cookies[i].indexOf('='); if (equalPos <= 0) { continue; } + String name = cookies[i].substring(0, equalPos); + if (cookieNames.contains(name)) { + continue; + } + + cookieNames.add(name); + Cookie cookie = new Cookie(); - cookie.setName(cookies[i].substring(0, equalPos)); + cookie.setName(name); cookie.setValue(cookies[i].substring(equalPos + 1)); cookie.setDomain(serverUri.getHost()); // VERY IMPORTANT cookie.setPath(serverUri.getPath()); // VERY IMPORTANT -- GitLab From 3703777b2483c9cb4b37341a671ffb8fc18c5d00 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 23 Apr 2024 07:26:29 +0600 Subject: [PATCH 3/4] chore: bump to 1.0.9-u2.17-release --- library/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/build.gradle b/library/build.gradle index 00bdbf91b..3526d815e 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -47,7 +47,7 @@ configurations { def versionMajor = 1 def versionMinor = 0 -def versionPatch = 8 +def versionPatch = 9 def upstreamVersion = "2.17" def releasePatch = "release" def libName = "Nextcloud-Android-Library" -- GitLab From 6ba874bf3056fdbc77b8ef6a8dd54d6061c724de Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Tue, 23 Apr 2024 10:30:47 +0600 Subject: [PATCH 4/4] chore: rename cookieName variable to non-generic version --- .../android/lib/common/accounts/AccountUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java b/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java index cbe515e56..c502d1b7b 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java +++ b/library/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java @@ -318,15 +318,15 @@ public class AccountUtils { continue; } - String name = cookies[i].substring(0, equalPos); - if (cookieNames.contains(name)) { + String cookieName = cookies[i].substring(0, equalPos); + if (cookieNames.contains(cookieName)) { continue; } - cookieNames.add(name); + cookieNames.add(cookieName); Cookie cookie = new Cookie(); - cookie.setName(name); + cookie.setName(cookieName); cookie.setValue(cookies[i].substring(equalPos + 1)); cookie.setDomain(serverUri.getHost()); // VERY IMPORTANT cookie.setPath(serverUri.getPath()); // VERY IMPORTANT -- GitLab