ostatus controller: respond with AS2 objects instead of activities to notice URIs
authorWilliam Pitcock <nenolod@dereferenced.org>
Sat, 17 Nov 2018 22:10:15 +0000 (22:10 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Sat, 17 Nov 2018 22:10:15 +0000 (22:10 +0000)
lib/pleroma/web/ostatus/ostatus_controller.ex
test/web/ostatus/ostatus_controller_test.exs

index 2f92935e7c9f984a743f5d9bec862574c24cf80d..34fdf97274a3a4450e2233bea3215e6e1f362dae 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.OStatus.OStatusController do
   use Pleroma.Web, :controller
 
-  alias Pleroma.{User, Activity}
+  alias Pleroma.{User, Activity, Object}
   alias Pleroma.Web.OStatus.{FeedRepresenter, ActivityRepresenter}
   alias Pleroma.Repo
   alias Pleroma.Web.{OStatus, Federator}
@@ -153,10 +153,21 @@ defmodule Pleroma.Web.OStatus.OStatusController do
     end
   end
 
-  defp represent_activity(conn, "activity+json", activity, user) do
+  defp represent_activity(
+         conn,
+         "activity+json",
+         %Activity{data: %{"type" => "Create"}} = activity,
+         user
+       ) do
+    object = Object.normalize(activity.data["object"])
+
     conn
     |> put_resp_header("content-type", "application/activity+json")
-    |> json(ObjectView.render("object.json", %{object: activity}))
+    |> json(ObjectView.render("object.json", %{object: object}))
+  end
+
+  defp represent_activity(conn, "activity+json", _, _) do
+    {:error, :not_found}
   end
 
   defp represent_activity(conn, _, activity, user) do
index c23b175e885bfd2d15e3f5ec3a97db3d0324cb51..371c835c0b38bdfceb87cad00edf20fadc0aa545 100644 (file)
@@ -2,6 +2,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
   use Pleroma.Web.ConnCase
   import Pleroma.Factory
   alias Pleroma.{User, Repo}
+  alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.OStatus.ActivityRepresenter
 
   test "decodes a salmon", %{conn: conn} do
@@ -167,6 +168,32 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
     assert json_response(conn, 200)
   end
 
+  test "only gets a notice in AS2 format for Create messages", %{conn: conn} do
+    note_activity = insert(:note_activity)
+    url = "/notice/#{note_activity.id}"
+
+    conn =
+      conn
+      |> put_req_header("accept", "application/activity+json")
+      |> get(url)
+
+    assert json_response(conn, 200)
+
+    user = insert(:user)
+
+    {:ok, like_activity, _} = CommonAPI.favorite(note_activity.id, user)
+    url = "/notice/#{like_activity.id}"
+
+    assert like_activity.data["type"] == "Like"
+
+    conn =
+      build_conn()
+      |> put_req_header("accept", "application/activity+json")
+      |> get(url)
+
+    assert response(conn, 404)
+  end
+
   test "gets an activity in AS2 format", %{conn: conn} do
     note_activity = insert(:note_activity)
     [_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["id"]))