diff options
-rw-r--r-- | lib/pleroma/activity.ex | 1 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 7 | ||||
-rw-r--r-- | priv/repo/migrations/20190825225451_add_recipient_users_to_activities.exs | 11 | ||||
-rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 20 |
4 files changed, 38 insertions, 1 deletions
diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 2d4e9da0c..893a7536e 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -39,6 +39,7 @@ defmodule Pleroma.Activity do field(:local, :boolean, default: true) field(:actor, :string) field(:recipients, {:array, :string}, default: []) + field(:recipient_users, {:array, :string}, default: []) field(:thread_muted?, :boolean, virtual: true) # This is a fake relation, do not use outside of with_preloaded_bookmark/get_bookmark has_one(:bookmark, Bookmark) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index ab29ee497..dba9560ab 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -61,6 +61,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do {recipients, to, cc} end + defp get_recipient_users(recipients), + do: Enum.filter(recipients, fn recipient -> !is_nil(User.get_cached_by_ap_id(recipient)) end) + defp check_actor_is_active(actor) do if not is_nil(actor) do with user <- User.get_cached_by_ap_id(actor), @@ -126,6 +129,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do {_, true} <- {:remote_limit_error, check_remote_limit(map)}, {:ok, map} <- MRF.filter(map), {recipients, _, _} = get_recipients(map), + recipient_users <- get_recipient_users(recipients), {:fake, false, map, recipients} <- {:fake, fake, map, recipients}, :ok <- Containment.contain_child(map), {:ok, map, object} <- insert_full_object(map) do @@ -134,7 +138,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do data: map, local: local, actor: map["actor"], - recipients: recipients + recipients: recipients, + recipient_users: recipient_users }) # Splice in the child object if we have one. diff --git a/priv/repo/migrations/20190825225451_add_recipient_users_to_activities.exs b/priv/repo/migrations/20190825225451_add_recipient_users_to_activities.exs new file mode 100644 index 000000000..72f82e8e6 --- /dev/null +++ b/priv/repo/migrations/20190825225451_add_recipient_users_to_activities.exs @@ -0,0 +1,11 @@ +defmodule Pleroma.Repo.Migrations.AddRecipientUsersToActivities do + use Ecto.Migration + + def change do + alter table(:activities) do + add :recipient_users, {:array, :string} + end + + create_if_not_exists index(:activities, [:recipient_users], using: :gin) + end +end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 1515f4eb6..afa220dd2 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -16,6 +16,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do import Tesla.Mock import Mock + require Pleroma.Constants + setup do mock(fn env -> apply(HttpRequestMock, :request, [env]) end) :ok @@ -278,6 +280,24 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert activity.recipients == ["user1", "user2", user.ap_id] end + test "recipient_users only contains AP IDs of actual users" do + user = insert(:user) + + {:ok, activity} = + ActivityPub.create(%{ + to: [Pleroma.Constants.as_public(), user.ap_id], + actor: user, + context: "", + object: %{ + "to" => [Pleroma.Constants.as_public(), user.ap_id], + "type" => "Note", + "content" => "testing" + } + }) + + assert activity.recipient_users == [user.ap_id] + end + test "increases user note count only for public activities" do user = insert(:user) |