From 9c9d33a582900c22b5c4dbaf2b3d9c15c0474f3b Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 17 Jul 2025 16:28:37 +0200 Subject: [PATCH] misc (room id) : relax room id regex pattern to match new versions --- .../android/libraries/matrix/api/core/MatrixPatterns.kt | 9 +++++++-- .../libraries/matrix/api/core/MatrixPatternsTest.kt | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatterns.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatterns.kt index 70cb18e627..a44e00b664 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatterns.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatterns.kt @@ -28,11 +28,15 @@ object MatrixPatterns { private const val MATRIX_USER_IDENTIFIER_REGEX = "^@\\S*?$DOMAIN_REGEX$" private val PATTERN_CONTAIN_MATRIX_USER_IDENTIFIER = MATRIX_USER_IDENTIFIER_REGEX.toRegex() - // regex pattern to match room ids. + // !localpart:domain" used in most room versions prior to MSC4291 // Note: roomId can be arbitrary strings, including space and new line char private const val MATRIX_ROOM_IDENTIFIER_REGEX = "^!.+$DOMAIN_REGEX$" private val PATTERN_CONTAIN_MATRIX_ROOM_IDENTIFIER = MATRIX_ROOM_IDENTIFIER_REGEX.toRegex(RegexOption.DOT_MATCHES_ALL) + // "!event_id_base_64" used in room versions post MSC4291 + private const val MATRIX_ROOM_IDENTIFIER_DOMAINLESS_REGEX = "!$BASE_64_URL_SAFE_ALPHABET" + private val PATTERN_CONTAIN_MATRIX_ROOM_IDENTIFIER_DOMAINLESS = MATRIX_ROOM_IDENTIFIER_DOMAINLESS_REGEX.toRegex() + // regex pattern to match room aliases. private const val MATRIX_ROOM_ALIAS_REGEX = "^#\\S+$DOMAIN_REGEX$" private val PATTERN_CONTAIN_MATRIX_ALIAS = MATRIX_ROOM_ALIAS_REGEX.toRegex(RegexOption.IGNORE_CASE) @@ -82,7 +86,8 @@ object MatrixPatterns { fun isRoomId(str: String?): Boolean { return str != null && str.length <= MAX_IDENTIFIER_LENGTH && - str matches PATTERN_CONTAIN_MATRIX_ROOM_IDENTIFIER + (str matches PATTERN_CONTAIN_MATRIX_ROOM_IDENTIFIER_DOMAINLESS || + str matches PATTERN_CONTAIN_MATRIX_ROOM_IDENTIFIER) } /** diff --git a/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatternsTest.kt b/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatternsTest.kt index a67e50ccf9..96a40d04ba 100644 --- a/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatternsTest.kt +++ b/libraries/matrix/api/src/test/kotlin/io/element/android/libraries/matrix/api/core/MatrixPatternsTest.kt @@ -94,7 +94,9 @@ class MatrixPatternsTest { assertThat(MatrixPatterns.isRoomId("#room:server.com")).isFalse() assertThat(MatrixPatterns.isRoomId("\$room:server.com")).isFalse() assertThat(MatrixPatterns.isRoomId("!${longLocalPart}a:server.com")).isFalse() + assertThat(MatrixPatterns.isRoomId("!9BozuV4TBw6rfRW@rMEgZ5v-jNk1D6FA8Hd1OsWqT9k")).isFalse() + assertThat(MatrixPatterns.isRoomId("!9BozuV4TBw6rfRW3rMEgZ5v-jNk1D6FA8Hd1OsWqT9k")).isTrue() assertThat(MatrixPatterns.isRoomId("!room:server.com")).isTrue() assertThat(MatrixPatterns.isRoomId("!$longLocalPart:server.com")).isTrue() assertThat(MatrixPatterns.isRoomId("!#test/room\nversion 11, with @🐈️:maunium.net")).isTrue()