aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/activity.ex1
-rw-r--r--lib/pleroma/web/activity_pub/activity_pub.ex7
-rw-r--r--priv/repo/migrations/20190825225451_add_recipient_users_to_activities.exs11
-rw-r--r--test/web/activity_pub/activity_pub_test.exs20
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)