Restrict statuses that contain user's irreversible filters

This commit is contained in:
Sergey Suprunenko 2019-11-16 22:54:13 +01:00 committed by Alexander Strizhakov
commit 4a8c26654e
No known key found for this signature in database
GPG key ID: 022896A53AEF1381
6 changed files with 141 additions and 4 deletions

View file

@ -126,7 +126,7 @@ defmodule Pleroma.FilterTest do
{:ok, filter_one} = Pleroma.Filter.create(query_one)
{:ok, filter_two} = Pleroma.Filter.create(query_two)
filters = Pleroma.Filter.get_filters(user)
filters = Pleroma.Filter.get_by_user(Pleroma.Filter, user)
assert filter_one in filters
assert filter_two in filters
end

View file

@ -428,4 +428,12 @@ defmodule Pleroma.Factory do
user: build(:user)
}
end
def filter_factory do
%Pleroma.Filter{
user: build(:user),
filter_id: sequence(:filter_id, & &1),
phrase: "cofe"
}
end
end

View file

@ -785,6 +785,75 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
assert activity == expected_activity
end
describe "irreversible filters" do
setup do
user = insert(:user)
user_two = insert(:user)
insert(:filter, user: user_two, phrase: "cofe", hide: true)
insert(:filter, user: user_two, phrase: "ok boomer", hide: true)
insert(:filter, user: user_two, phrase: "test", hide: false)
params = %{
"type" => ["Create", "Announce"],
"user" => user_two
}
{:ok, %{user: user, user_two: user_two, params: params}}
end
test "it returns statuses if they don't contain exact filter words", %{
user: user,
params: params
} do
{:ok, _} = CommonAPI.post(user, %{"status" => "hey"})
{:ok, _} = CommonAPI.post(user, %{"status" => "got cofefe?"})
{:ok, _} = CommonAPI.post(user, %{"status" => "I am not a boomer"})
{:ok, _} = CommonAPI.post(user, %{"status" => "ok boomers"})
{:ok, _} = CommonAPI.post(user, %{"status" => "ccofee is not a word"})
{:ok, _} = CommonAPI.post(user, %{"status" => "this is a test"})
activities = ActivityPub.fetch_activities([], params)
assert Enum.count(activities) == 6
end
test "it does not filter user's own statuses", %{user_two: user_two, params: params} do
{:ok, _} = CommonAPI.post(user_two, %{"status" => "Give me some cofe!"})
{:ok, _} = CommonAPI.post(user_two, %{"status" => "ok boomer"})
activities = ActivityPub.fetch_activities([], params)
assert Enum.count(activities) == 2
end
test "it excludes statuses with filter words", %{user: user, params: params} do
{:ok, _} = CommonAPI.post(user, %{"status" => "Give me some cofe!"})
{:ok, _} = CommonAPI.post(user, %{"status" => "ok boomer"})
{:ok, _} = CommonAPI.post(user, %{"status" => "is it a cOfE?"})
{:ok, _} = CommonAPI.post(user, %{"status" => "cofe is all I need"})
{:ok, _} = CommonAPI.post(user, %{"status" => "— ok BOOMER\n"})
activities = ActivityPub.fetch_activities([], params)
assert Enum.empty?(activities)
end
test "it returns all statuses if user does not have any filters" do
another_user = insert(:user)
{:ok, _} = CommonAPI.post(another_user, %{"status" => "got cofe?"})
{:ok, _} = CommonAPI.post(another_user, %{"status" => "test!"})
activities =
ActivityPub.fetch_activities([], %{
"type" => ["Create", "Announce"],
"user" => another_user
})
assert Enum.count(activities) == 2
end
end
describe "public fetch activities" do
test "doesn't retrieve unlisted activities" do
user = insert(:user)