From b91c55e90e855934f6b913f476155eeb58a984b1 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 25 Feb 2026 17:44:20 +0100 Subject: [PATCH 1/5] fix account name Signed-off-by: sowjanyakch --- .../android/common/core/utils/ecosystem/EcosystemManager.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt b/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt index 52012194..72b95b0b 100644 --- a/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt +++ b/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt @@ -39,7 +39,11 @@ class EcosystemManager( private const val PLAY_STORE_MARKET_LINK = "market://details?id=" private const val EXTRA_KEY_ACCOUNT = "KEY_ACCOUNT" - const val ACCOUNT_NAME_PATTERN_REGEX = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-z]{2,}" + const val ACCOUNT_NAME_PATTERN_REGEX = "^[A-Za-z0-9._%+-]+(?:" + + "@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?:@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,})?" + + "|" + + "@(?:\\d{1,3}\\.){2,3}\\d{1,3}(?::\\d{1,5})?" + + ")$" } private val accountNamePattern = Pattern.compile(ACCOUNT_NAME_PATTERN_REGEX) From 90188adba52de4e34021adc5f0d8cbee6ec2988d Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 26 Feb 2026 08:23:46 +0100 Subject: [PATCH 2/5] add tests for new pattern Signed-off-by: alperozturk96 --- .../android/common/core/utils/AccountNamePatternTest.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt b/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt index e725a7f8..56c63f28 100644 --- a/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt +++ b/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt @@ -52,4 +52,11 @@ class AccountNamePatternTest { assertFalse(pattern.matcher("").matches()) assertFalse(pattern.matcher(" ").matches()) } + + @Test + fun `special account name formats`() { + assertTrue(pattern.matcher("abc@cloud.com@example.inst2.cloud.com").matches()) + assertTrue(pattern.matcher("admin@10.0.2.2:55002").matches()) + assertTrue(pattern.matcher("admin@10.0.2.2").matches()) + } } From 33c3efdd9c6bd4d66a0831593e692e8c1b890cf6 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 26 Feb 2026 08:33:22 +0100 Subject: [PATCH 3/5] fix spotless check Signed-off-by: alperozturk96 --- .../common/core/utils/ecosystem/EcosystemManager.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt b/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt index 72b95b0b..635a7176 100644 --- a/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt +++ b/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt @@ -39,11 +39,12 @@ class EcosystemManager( private const val PLAY_STORE_MARKET_LINK = "market://details?id=" private const val EXTRA_KEY_ACCOUNT = "KEY_ACCOUNT" - const val ACCOUNT_NAME_PATTERN_REGEX = "^[A-Za-z0-9._%+-]+(?:" + - "@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?:@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,})?" + - "|" + - "@(?:\\d{1,3}\\.){2,3}\\d{1,3}(?::\\d{1,5})?" + - ")$" + const val ACCOUNT_NAME_PATTERN_REGEX = + "^[A-Za-z0-9._%+-]+(?:" + + "@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?:@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,})?" + + "|" + + "@(?:\\d{1,3}\\.){2,3}\\d{1,3}(?::\\d{1,5})?" + + ")$" } private val accountNamePattern = Pattern.compile(ACCOUNT_NAME_PATTERN_REGEX) From da67e59277d725cb78d3767efb4b520e8a6fc51b Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 2 Mar 2026 13:53:45 +0100 Subject: [PATCH 4/5] add new cloud id Signed-off-by: sowjanyakch --- .../common/core/utils/ecosystem/EcosystemManager.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt b/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt index 635a7176..a134a03f 100644 --- a/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt +++ b/core/src/main/java/com/nextcloud/android/common/core/utils/ecosystem/EcosystemManager.kt @@ -40,11 +40,10 @@ class EcosystemManager( private const val EXTRA_KEY_ACCOUNT = "KEY_ACCOUNT" const val ACCOUNT_NAME_PATTERN_REGEX = - "^[A-Za-z0-9._%+-]+(?:" + - "@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(?:@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,})?" + - "|" + - "@(?:\\d{1,3}\\.){2,3}\\d{1,3}(?::\\d{1,5})?" + - ")$" + "^[A-Za-z0-9._%+-]+(?:@(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,})?" + + "@(?:(?:[A-Za-z0-9-]+\\.)+[A-Za-z]{2,}|(?:\\d{1,3}\\.){3}\\d{1,3})" + + "(?::\\d{1,5})?" + + "(?:/[^\\s?#]*)?$" } private val accountNamePattern = Pattern.compile(ACCOUNT_NAME_PATTERN_REGEX) From a4ab93bed8d40cab0c327ebd9ec89fc12b942c79 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 2 Mar 2026 13:55:08 +0100 Subject: [PATCH 5/5] add test for new pattern Signed-off-by: sowjanyakch --- .../android/common/core/utils/AccountNamePatternTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt b/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt index 56c63f28..1950d2a9 100644 --- a/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt +++ b/core/src/test/java/com/nextcloud/android/common/core/utils/AccountNamePatternTest.kt @@ -58,5 +58,6 @@ class AccountNamePatternTest { assertTrue(pattern.matcher("abc@cloud.com@example.inst2.cloud.com").matches()) assertTrue(pattern.matcher("admin@10.0.2.2:55002").matches()) assertTrue(pattern.matcher("admin@10.0.2.2").matches()) + assertTrue(pattern.matcher("test@example.tld@cloud.example.tld:443/subfolder/deep").matches()) } }