Ver código fonte

Do not include activities of invisible users unless explicitly requested

Closes #1833
1570-levenshtein-distance-user-search
rinpatch 4 anos atrás
pai
commit
165a4b2a69
5 arquivos alterados com 23 adições e 14 exclusões
  1. +3
    -3
      lib/pleroma/user/query.ex
  2. +12
    -0
      lib/pleroma/web/activity_pub/activity_pub.ex
  3. +1
    -2
      lib/pleroma/web/admin_api/search.ex
  4. +2
    -1
      test/tasks/relay_test.exs
  5. +5
    -8
      test/web/admin_api/controllers/admin_api_controller_test.exs

+ 3
- 3
lib/pleroma/user/query.ex Ver arquivo

@@ -45,7 +45,7 @@ defmodule Pleroma.User.Query do
is_admin: boolean(),
is_moderator: boolean(),
super_users: boolean(),
exclude_service_users: boolean(),
invisible: boolean(),
followers: User.t(),
friends: User.t(),
recipients_from_activity: [String.t()],
@@ -89,8 +89,8 @@ defmodule Pleroma.User.Query do
where(query, [u], ilike(field(u, ^key), ^"%#{value}%"))
end

defp compose_query({:exclude_service_users, _}, query) do
where(query, [u], not like(u.ap_id, "%/relay") and not like(u.ap_id, "%/internal/fetch"))
defp compose_query({:invisible, bool}, query) when is_boolean(bool) do
where(query, [u], u.invisible == ^bool)
end

defp compose_query({key, value}, query)


+ 12
- 0
lib/pleroma/web/activity_pub/activity_pub.ex Ver arquivo

@@ -1030,6 +1030,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
end
end

defp exclude_invisible_actors(query, %{"invisible_actors" => true}), do: query

defp exclude_invisible_actors(query, _opts) do
invisible_ap_ids =
User.Query.build(%{invisible: true, select: [:ap_id]})
|> Repo.all()
|> Enum.map(fn %{ap_id: ap_id} -> ap_id end)

from([activity] in query, where: activity.actor not in ^invisible_ap_ids)
end

defp exclude_id(query, %{"exclude_id" => id}) when is_binary(id) do
from(activity in query, where: activity.id != ^id)
end
@@ -1135,6 +1146,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|> restrict_instance(opts)
|> Activity.restrict_deactivated_users()
|> exclude_poll_votes(opts)
|> exclude_invisible_actors(opts)
|> exclude_visibility(opts)
end



+ 1
- 2
lib/pleroma/web/admin_api/search.ex Ver arquivo

@@ -21,7 +21,7 @@ defmodule Pleroma.Web.AdminAPI.Search do
query =
params
|> Map.drop([:page, :page_size])
|> Map.put(:exclude_service_users, true)
|> Map.put(:invisible, false)
|> User.Query.build()
|> order_by([u], u.nickname)

@@ -31,7 +31,6 @@ defmodule Pleroma.Web.AdminAPI.Search do
count = Repo.aggregate(query, :count, :id)

results = Repo.all(paginated_query)

{:ok, results, count}
end
end

+ 2
- 1
test/tasks/relay_test.exs Ver arquivo

@@ -65,7 +65,8 @@ defmodule Mix.Tasks.Pleroma.RelayTest do
"type" => "Undo",
"actor_id" => follower_id,
"limit" => 1,
"skip_preload" => true
"skip_preload" => true,
"invisible_actors" => true
})

assert undo_activity.data["type"] == "Undo"


+ 5
- 8
test/web/admin_api/controllers/admin_api_controller_test.exs Ver arquivo

@@ -757,8 +757,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
end

test "pagination works correctly with service users", %{conn: conn} do
service1 = insert(:user, ap_id: Web.base_url() <> "/relay")
service2 = insert(:user, ap_id: Web.base_url() <> "/internal/fetch")
service1 = User.get_or_create_service_actor_by_ap_id(Web.base_url() <> "/meido", "meido")
insert_list(25, :user)

assert %{"count" => 26, "page_size" => 10, "users" => users1} =
@@ -767,8 +767,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
|> json_response(200)

assert Enum.count(users1) == 10
assert service1 not in [users1]
assert service2 not in [users1]
assert service1 not in users1

assert %{"count" => 26, "page_size" => 10, "users" => users2} =
conn
@@ -776,8 +775,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
|> json_response(200)

assert Enum.count(users2) == 10
assert service1 not in [users2]
assert service2 not in [users2]
assert service1 not in users2

assert %{"count" => 26, "page_size" => 10, "users" => users3} =
conn
@@ -785,8 +783,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
|> json_response(200)

assert Enum.count(users3) == 6
assert service1 not in [users3]
assert service2 not in [users3]
assert service1 not in users3
end

test "renders empty array for the second page", %{conn: conn} do


Carregando…
Cancelar
Salvar