From 9dd3a3d79b8efa9ca10275abe3042dac7223c034 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Fri, 14 Oct 2022 20:03:19 +0200 Subject: [PATCH] Parse html tags out of status content before applying filters. (#2713) Fixes #2660 --- .../tusky/network/FilterModel.kt | 3 +- .../com/keylesspalace/tusky/FilterTest.kt | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt b/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt index db47beaf..16a439d9 100644 --- a/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt @@ -3,6 +3,7 @@ package com.keylesspalace.tusky.network import android.text.TextUtils import com.keylesspalace.tusky.entity.Filter import com.keylesspalace.tusky.entity.Status +import com.keylesspalace.tusky.util.parseAsMastodonHtml import java.util.Date import java.util.regex.Pattern import javax.inject.Inject @@ -34,7 +35,7 @@ class FilterModel @Inject constructor() { .mapNotNull { it.description } return ( - matcher.reset(status.actionableStatus.content).find() || + matcher.reset(status.actionableStatus.content.parseAsMastodonHtml().toString()).find() || (spoilerText.isNotEmpty() && matcher.reset(spoilerText).find()) || ( attachmentsDescriptions.isNotEmpty() && diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt index b28f6c9a..b8ca181e 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt @@ -53,6 +53,14 @@ class FilterTest { irreversible = false, wholeWord = true ), + Filter( + id = "123", + phrase = "#hashtag", + context = listOf(Filter.HOME), + expiresAt = null, + irreversible = false, + wholeWord = true + ), Filter( id = "123", phrase = "expired", @@ -69,6 +77,14 @@ class FilterTest { irreversible = false, wholeWord = true ), + Filter( + id = "123", + phrase = "href", + context = listOf(Filter.HOME), + expiresAt = null, + irreversible = false, + wholeWord = false + ), ) filterModel.initWithFilters(filters) @@ -166,6 +182,33 @@ class FilterTest { ) } + @Test + fun shouldFilterHashtags() { + assertTrue( + filterModel.shouldFilterStatus( + mockStatus(content = "#hashtag one two three") + ) + ) + } + + @Test + fun shouldFilterHashtags_whenContentIsMarkedUp() { + assertTrue( + filterModel.shouldFilterStatus( + mockStatus(content = "

#hashtagone two three

") + ) + ) + } + + @Test + fun shouldNotFilterHtmlAttributes() { + assertFalse( + filterModel.shouldFilterStatus( + mockStatus(content = "

https://foo.bar/ one two three

") + ) + ) + } + @Test fun shouldNotFilter_whenFilterIsExpired() { assertFalse(