From 153d393bf1a9a33316bd7fd7a22da653f6279a87 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 8 Apr 2021 17:28:47 +0200 Subject: [PATCH] Prevent searching for forbidden terms --- .../features/roomdirectory/ExplicitTermFilterTest.kt | 10 ++++++++++ .../app/features/roomdirectory/ExplicitTermFilter.kt | 8 +++++++- .../features/roomdirectory/RoomDirectoryViewModel.kt | 11 +++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/vector/src/androidTest/java/im/vector/app/features/roomdirectory/ExplicitTermFilterTest.kt b/vector/src/androidTest/java/im/vector/app/features/roomdirectory/ExplicitTermFilterTest.kt index a5d8108ae9..7c66ad7462 100644 --- a/vector/src/androidTest/java/im/vector/app/features/roomdirectory/ExplicitTermFilterTest.kt +++ b/vector/src/androidTest/java/im/vector/app/features/roomdirectory/ExplicitTermFilterTest.kt @@ -115,4 +115,14 @@ class ExplicitTermFilterTest : InstrumentedTest { fun isValidLastFalse() { explicitTermFilter.isValid("zoo") shouldBe false } + + @Test + fun canSearchForFalse() { + explicitTermFilter.canSearchFor("zoo") shouldBe false + } + + @Test + fun canSearchForTrue() { + explicitTermFilter.canSearchFor("android") shouldBe true + } } \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/ExplicitTermFilter.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/ExplicitTermFilter.kt index addc04ed96..8abccbbe5e 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/ExplicitTermFilter.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/ExplicitTermFilter.kt @@ -23,14 +23,20 @@ class ExplicitTermFilter @Inject constructor( assetReader: AssetReader ) { // List of forbidden terms is in file asset forbidden_terms.txt, in lower case - private val explicitContentRegex = assetReader.readAssetFile("forbidden_terms.txt") + private val explicitTerms = assetReader.readAssetFile("forbidden_terms.txt") .orEmpty() .split("\n") .map { it.trim() } .filter { it.isNotEmpty() } + + private val explicitContentRegex = explicitTerms .joinToString(prefix = ".*\\b(", separator = "|", postfix = ")\\b.*") .toRegex(RegexOption.IGNORE_CASE) + fun canSearchFor(term: String): Boolean { + return term !in explicitTerms && term != "18+" + } + fun isValid(str: String): Boolean { return explicitContentRegex.matches(str.replace("\n", " ")).not() // Special treatment for "18+" since word boundaries does not work here diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt index 9932fdb551..a6c4646f8c 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt @@ -161,6 +161,17 @@ class RoomDirectoryViewModel @AssistedInject constructor( } private fun load(filter: String, roomDirectoryData: RoomDirectoryData) { + if (!showAllRooms && !explicitTermFilter.canSearchFor(filter)) { + setState { + copy( + asyncPublicRoomsRequest = Success(Unit), + publicRooms = emptyList(), + hasMore = false + ) + } + return + } + currentJob = viewModelScope.launch { val data = try { session.getPublicRooms(roomDirectoryData.homeServer,