Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
5 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/pleroma/web/activity_pub/importer.ex b/lib/pleroma/web/activity_pub/importer.ex
index c6b226b14..6433961d6 100644
--- a/lib/pleroma/web/activity_pub/importer.ex
+++ b/lib/pleroma/web/activity_pub/importer.ex
@@ -1,64 +1,74 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.Importer do
alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ActivityPub
+ alias Pleroma.Web.ActivityPub.Pipeline
+ alias Pleroma.Web.ActivityPub.Utils
require Pleroma.Constants
def import_object(
%{
"type" => type,
"published" => published,
"context" => context
} = object,
%User{} = user
)
when type in Pleroma.Constants.status_types() do
fixed_object =
object
|> strip_ap_id()
|> rewrite_actor(user)
|> strip_recipients()
- ActivityPub.create(%{
- actor: user,
- published: published,
- object: fixed_object,
- to: [],
- local: true,
- context: context
- })
+ create_data =
+ Utils.make_create_data(%{
+ actor: user,
+ published: published,
+ object: fixed_object,
+ to: [],
+ context: context
+ }, %{})
+ |> Utils.lazy_put_activity_defaults()
+
+ with {:ok, activity, _meta} <- Pipeline.common_pipeline(create_data, local: true) do
+ # This is to meant to be executed in the oban queue, we only care if it succeeds,
+ # so don't query for and put in the object here.
+ {:ok, activity}
+ else
+ e -> e
+ end
end
def import_activity(%{"type" => "Create", "object" => object} = _activity, %User{} = user) do
import_object(object, user)
end
def import_activity(_, _), do: nil
def import_one(%{"type" => type} = object, %User{} = user) do
if type in Pleroma.Constants.status_types() do
import_object(object, user)
else
import_activity(object, user)
end
end
defp strip_ap_id(object), do: object |> Map.drop(["id"])
defp rewrite_actor(object, user) do
object
|> Map.put("actor", user.ap_id)
end
defp strip_recipients(object) do
object
|> Map.put("to", [])
- |> Map.put("cc", [])
+ |> Map.put("cc", [object["actor"]])
|> Map.put("bto", [])
|> Map.put("bcc", [])
end
end
diff --git a/test/pleroma/web/activity_pub/importer_test.exs b/test/pleroma/web/activity_pub/importer_test.exs
index ea9b0c105..2471daa7f 100644
--- a/test/pleroma/web/activity_pub/importer_test.exs
+++ b/test/pleroma/web/activity_pub/importer_test.exs
@@ -1,47 +1,71 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.ImporterTest do
use Pleroma.DataCase
+ alias Pleroma.Activity
alias Pleroma.Web.ActivityPub.Importer
alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.CommonAPI
require Pleroma.Constants
import Pleroma.Factory
describe "import_one/2" do
test "it imports an activity" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{status: "mew"})
{:ok, activity_for_import} = Transmogrifier.prepare_outgoing(activity.data)
importing_user = insert(:user)
assert {:ok, imported_activity} = Importer.import_one(activity_for_import, importing_user)
+ imported_activity = Activity.normalize(imported_activity)
+
assert imported_activity.id != activity.id
assert imported_activity.actor == importing_user.ap_id
assert imported_activity.object.data["actor"] == importing_user.ap_id
assert imported_activity.object.data["content"] == activity.object.data["content"]
assert imported_activity.object.data["published"] == activity.object.data["published"]
end
test "it strips all mentions" do
user = insert(:user)
user2 = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{status: "mew @#{user2.nickname}"})
assert user2.ap_id in activity.recipients
{:ok, activity_for_import} = Transmogrifier.prepare_outgoing(activity.data)
importing_user = insert(:user)
assert {:ok, imported_activity} = Importer.import_one(activity_for_import, importing_user)
+ imported_activity = Activity.normalize(imported_activity)
+
assert [importing_user.ap_id] == imported_activity.recipients
assert [] == imported_activity.object.data["to"]
- assert [] == imported_activity.object.data["cc"]
+ assert [importing_user.ap_id] == imported_activity.object.data["cc"]
+ end
+
+ test "it keeps inReplyTo and context" do
+ user = insert(:user)
+ user2 = insert(:user)
+ {:ok, replied_to_activity} = CommonAPI.post(user2, %{status: "mew"})
+ {:ok, activity} = CommonAPI.post(user, %{status: "mew @#{user2.nickname}", in_reply_to_id: replied_to_activity})
+ assert user2.ap_id in activity.recipients
+
+ {:ok, activity_for_import} = Transmogrifier.prepare_outgoing(activity.data)
+
+ importing_user = insert(:user)
+ assert {:ok, imported_activity} = Importer.import_one(activity_for_import, importing_user)
+ imported_activity = Activity.normalize(imported_activity)
+
+ assert [importing_user.ap_id] == imported_activity.recipients
+ assert imported_activity.object.data["context"] == activity.object.data["context"]
+ assert imported_activity.object.data["inReplyTo"] == activity.object.data["inReplyTo"]
+ assert imported_activity.data["context"] == activity.data["context"]
end
end
end

File Metadata

Mime Type
text/x-diff
Expires
Sat, Oct 31, 9:12 AM (19 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1801215
Default Alt Text
(5 KB)

Event Timeline