aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/constants.ex12
-rw-r--r--lib/pleroma/web/activity_pub/side_effects.ex3
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex52
-rw-r--r--test/pleroma/web/activity_pub/transmogrifier_test.exs71
-rw-r--r--test/pleroma/web/common_api_test.exs21
5 files changed, 107 insertions, 52 deletions
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
index bbb95104f..1b3d09d73 100644
--- a/lib/pleroma/constants.ex
+++ b/lib/pleroma/constants.ex
@@ -42,6 +42,18 @@ defmodule Pleroma.Constants do
]
)
+ const(updatable_object_types,
+ do: [
+ "Note",
+ "Question",
+ "Audio",
+ "Video",
+ "Event",
+ "Article",
+ "Page"
+ ]
+ )
+
const(actor_types,
do: [
"Application",
diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex
index 747f467db..f56e357bf 100644
--- a/lib/pleroma/web/activity_pub/side_effects.ex
+++ b/lib/pleroma/web/activity_pub/side_effects.ex
@@ -411,7 +411,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
{:ok, object, meta}
end
- @updatable_object_types ["Note", "Question"]
defp handle_update_object(
%{data: %{"type" => "Update", "object" => updated_object}} = object,
meta
@@ -429,7 +428,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
meta[:object_data]
end
- if orig_object_data["type"] in @updatable_object_types do
+ if orig_object_data["type"] in Pleroma.Constants.updatable_object_types() do
%{
updated_data: updated_object_data,
updated: updated,
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 5750396a4..cccee342f 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -687,6 +687,24 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> strip_internal_fields
|> strip_internal_tags
|> set_type
+ |> maybe_process_history
+ end
+
+ defp maybe_process_history(%{"formerRepresentations" => %{"orderedItems" => history}} = object) do
+ processed_history =
+ Enum.map(
+ history,
+ fn
+ item when is_map(item) -> prepare_object(item)
+ item -> item
+ end
+ )
+
+ put_in(object, ["formerRepresentations", "orderedItems"], processed_history)
+ end
+
+ defp maybe_process_history(object) do
+ object
end
# @doc
@@ -711,6 +729,21 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
{:ok, data}
end
+ def prepare_outgoing(%{"type" => "Update", "object" => %{"type" => objtype} = object} = data)
+ when objtype in Pleroma.Constants.updatable_object_types() do
+ object =
+ object
+ |> prepare_object
+
+ data =
+ data
+ |> Map.put("object", object)
+ |> Map.merge(Utils.make_json_ld_header())
+ |> Map.delete("bcc")
+
+ {:ok, data}
+ end
+
def prepare_outgoing(%{"type" => "Announce", "actor" => ap_id, "object" => object_id} = data) do
object =
object_id
@@ -902,24 +935,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
def strip_internal_fields(object) do
- outer = Map.drop(object, Pleroma.Constants.object_internal_fields())
-
- case outer do
- %{"formerRepresentations" => %{"orderedItems" => list}} when is_list(list) ->
- update_in(
- outer["formerRepresentations"]["orderedItems"],
- &Enum.map(
- &1,
- fn
- item when is_map(item) -> Map.drop(item, Pleroma.Constants.object_internal_fields())
- item -> item
- end
- )
- )
-
- _ ->
- outer
- end
+ Map.drop(object, Pleroma.Constants.object_internal_fields())
end
defp strip_internal_tags(%{"tag" => tags} = object) do
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index dae07cf21..6520eabc9 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -312,6 +312,28 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert url == "http://localhost:4001/emoji/dino%20walking.gif"
end
+
+ test "Updates of Notes are handled" do
+ user = insert(:user)
+
+ {:ok, activity} = CommonAPI.post(user, %{status: "everybody do the dinosaur :dinosaur:"})
+ {:ok, update} = CommonAPI.update(user, activity, %{status: "mew mew :blank:"})
+
+ {:ok, prepared} = Transmogrifier.prepare_outgoing(update.data)
+
+ assert %{
+ "content" => "mew mew :blank:",
+ "tag" => [%{"name" => ":blank:", "type" => "Emoji"}],
+ "formerRepresentations" => %{
+ "orderedItems" => [
+ %{
+ "content" => "everybody do the dinosaur :dinosaur:",
+ "tag" => [%{"name" => ":dinosaur:", "type" => "Emoji"}]
+ }
+ ]
+ }
+ } = prepared["object"]
+ end
end
describe "user upgrade" do
@@ -576,57 +598,42 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
end
end
- describe "strip_internal_fields/1" do
- test "it strips internal fields in formerRepresentations" do
+ describe "prepare_object/1" do
+ test "it processes history" do
original = %{
"formerRepresentations" => %{
"orderedItems" => [
- %{"generator" => %{}}
+ %{
+ "generator" => %{},
+ "emoji" => %{"blobcat" => "http://localhost:4001/emoji/blobcat.png"}
+ }
]
}
}
- stripped = Transmogrifier.strip_internal_fields(original)
-
- refute Map.has_key?(
- Enum.at(stripped["formerRepresentations"]["orderedItems"], 0),
- "generator"
- )
- end
+ processed = Transmogrifier.prepare_object(original)
- test "it strips internal fields in maybe badly-formed formerRepresentations" do
- original = %{
- "formerRepresentations" => %{
- "orderedItems" => [
- %{"generator" => %{}},
- "https://example.com/1"
- ]
- }
- }
+ history_item = Enum.at(processed["formerRepresentations"]["orderedItems"], 0)
- stripped = Transmogrifier.strip_internal_fields(original)
+ refute Map.has_key?(history_item, "generator")
- refute Map.has_key?(
- Enum.at(stripped["formerRepresentations"]["orderedItems"], 0),
- "generator"
- )
-
- assert Enum.at(stripped["formerRepresentations"]["orderedItems"], 1) ==
- "https://example.com/1"
+ assert [%{"name" => ":blobcat:"}] = history_item["tag"]
end
- test "it ignores if formerRepresentations does not look like an OrderedCollection" do
+ test "it works when there is no or bad history" do
original = %{
"formerRepresentations" => %{
"items" => [
- %{"generator" => %{}}
+ %{
+ "generator" => %{},
+ "emoji" => %{"blobcat" => "http://localhost:4001/emoji/blobcat.png"}
+ }
]
}
}
- stripped = Transmogrifier.strip_internal_fields(original)
-
- assert Map.has_key?(Enum.at(stripped["formerRepresentations"]["items"], 0), "generator")
+ processed = Transmogrifier.prepare_object(original)
+ assert processed["formerRepresentations"] == original["formerRepresentations"]
end
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 32d6562d7..842c75e21 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -1584,5 +1584,26 @@ defmodule Pleroma.Web.CommonAPITest do
assert updated_object.data["content"] == "updated 2 :#{emoji2}:"
assert %{^emoji2 => _} = updated_object.data["emoji"]
end
+
+ test "updates a post with emoji and federate properly" do
+ [{emoji1, _}, {emoji2, _} | _] = Pleroma.Emoji.get_all()
+
+ user = insert(:user)
+
+ {:ok, activity} =
+ CommonAPI.post(user, %{status: "foo1", spoiler_text: "title 1 :#{emoji1}:"})
+
+ clear_config([:instance, :federating], true)
+
+ with_mock Pleroma.Web.Federator,
+ publish: fn p -> nil end do
+ {:ok, updated} = CommonAPI.update(user, activity, %{status: "updated 2 :#{emoji2}:"})
+
+ assert updated.data["object"]["content"] == "updated 2 :#{emoji2}:"
+ assert %{^emoji2 => _} = updated.data["object"]["emoji"]
+
+ assert called(Pleroma.Web.Federator.publish(updated))
+ end
+ end
end
end