From 9d65b2ace1891fa76dcb08566f4938b5a902114d Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Mon, 6 Jan 2020 16:16:54 +0100 Subject: [PATCH] Filters: Make behavior of "whole word" filters consistent with the web UI when filters are non-alphanumeric (#1623) * Fix tests build * Make behavior of non-alphanumeric whole-word filters consistent with the web UI. Fixes #1543 * Fix typo in filter tests --- .../com/keylesspalace/tusky/TimelineDAOTest.kt | 2 ++ .../keylesspalace/tusky/fragment/SFragment.java | 8 ++++++-- .../java/com/keylesspalace/tusky/FilterTest.kt | 17 ++++++++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt b/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt index d8b70aade..241781b6d 100644 --- a/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt +++ b/app/src/androidTest/java/com/keylesspalace/tusky/TimelineDAOTest.kt @@ -208,6 +208,7 @@ class TimelineDAOTest { favouritesCount = 2 * statusId.toInt(), reblogged = even, favourited = !even, + bookmarked = false, sensitive = even, spoilerText = "spoier$statusId", visibility = Status.Visibility.PRIVATE, @@ -236,6 +237,7 @@ class TimelineDAOTest { favouritesCount = 0, reblogged = false, favourited = false, + bookmarked = false, sensitive = false, spoilerText = null, visibility = null, diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java index 6e7164389..bbee3c07e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java @@ -95,6 +95,7 @@ public abstract class SFragment extends BaseFragment implements Injectable { private static List filters; private boolean filterRemoveRegex; private Matcher filterRemoveRegexMatcher; + private static Matcher alphanumeric = Pattern.compile("^\\w+$").matcher(""); @Inject public MastodonApi mastodonApi; @@ -520,8 +521,11 @@ public abstract class SFragment extends BaseFragment implements Injectable { } private static String filterToRegexToken(Filter filter) { - String phrase = Pattern.quote(filter.getPhrase()); - return filter.getWholeWord() ? String.format("(^|\\W)%s($|\\W)", phrase) : phrase; + String phrase = filter.getPhrase(); + String quotedPhrase = Pattern.quote(phrase); + return (filter.getWholeWord() && alphanumeric.reset(phrase).matches()) ? // "whole word" should only apply to alphanumeric filters, #1543 + String.format("(^|\\W)%s($|\\W)", quotedPhrase) : + quotedPhrase; } public static void flushFilters() { diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt index b766cd2f8..c94f26330 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt @@ -86,6 +86,14 @@ class FilterTest { expiresAt = null, irreversible = false, wholeWord = true + ), + Filter( + id = "123", + phrase = "@twitter.com", + context = listOf(Filter.HOME), + expiresAt = null, + irreversible = false, + wholeWord = true ) ) ) @@ -145,7 +153,7 @@ class FilterTest { } @Test - fun shouldNotFilter_whenContentDoesNotMAtchWholeWord() { + fun shouldNotFilter_whenContentDoesNotMatchWholeWord() { assertFalse(fragment.shouldFilterStatus( mockStatus(content = "one two badWholeWordTest three") )) @@ -172,6 +180,13 @@ class FilterTest { )) } + @Test + fun shouldFilterPartialWord_whenWholeWordFilterContainsNonAlphanumericCharacters() { + assertTrue(fragment.shouldFilterStatus( + mockStatus(content = "one two someone@twitter.com three") + )) + } + private fun mockStatus( content: String = "", spoilerText: String = "",