Add support for AP C2S uploadMedia
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Mon, 23 Sep 2019 17:16:36 +0000 (19:16 +0200)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Mon, 23 Sep 2019 18:00:12 +0000 (20:00 +0200)
Closes: https://git.pleroma.social/pleroma/pleroma/issues/1171
lib/pleroma/web/activity_pub/activity_pub_controller.ex
lib/pleroma/web/activity_pub/views/user_view.ex
lib/pleroma/web/router.ex
test/web/activity_pub/activity_pub_controller_test.exs
test/web/ostatus/ostatus_controller_test.exs

index 34bf04a200f6b427e40ffc82879a9ece336a3192..6b60132d45555fa5fa3bac36275d5c60a0075bca 100644 (file)
@@ -443,4 +443,31 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
 
     {new_user, for_user}
   end
+
+  # TODO: Add support for "object" field
+  @doc """
+  Endpoint based on <https://www.w3.org/wiki/SocialCG/ActivityPub/MediaUpload>
+
+  Parameters:
+  - (required) `file`: data of the media
+  - (optionnal) `description`: description of the media, intended for accessibility
+
+  Response:
+  - HTTP Code: 201 Created
+  - HTTP Body: ActivityPub object to be inserted into another's `attachment` field
+  """
+  def upload_media(%{assigns: %{user: user}} = conn, %{"file" => file} = data) do
+    with {:ok, object} <-
+           ActivityPub.upload(
+             file,
+             actor: User.ap_id(user),
+             description: Map.get(data, "description")
+           ) do
+      Logger.debug(inspect(object))
+
+      conn
+      |> put_status(:created)
+      |> json(object.data)
+    end
+  end
 end
index a2f73e140f3f6adcdd1cf2cc844d235575ab1d4d..ff54b95ed505db76212d318ed8597056b76807c8 100644 (file)
@@ -25,7 +25,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do
       "oauthAuthorizationEndpoint" => Helpers.o_auth_url(Endpoint, :authorize),
       "oauthRegistrationEndpoint" => Helpers.mastodon_api_url(Endpoint, :create_app),
       "oauthTokenEndpoint" => Helpers.o_auth_url(Endpoint, :token_exchange),
-      "sharedInbox" => Helpers.activity_pub_url(Endpoint, :inbox)
+      "sharedInbox" => Helpers.activity_pub_url(Endpoint, :inbox),
+      "uploadMedia" => Helpers.activity_pub_url(Endpoint, :upload_media)
     }
   end
 
index b9b85fd6776ca31ffdf2c4970034c51cae0173f7..8ee188f08ffc5e8bd537600eaf199e1303841dc1 100644 (file)
@@ -572,6 +572,7 @@ defmodule Pleroma.Web.Router do
     scope [] do
       pipe_through(:oauth_write)
       post("/users/:nickname/outbox", ActivityPubController, :update_outbox)
+      post("/api/ap/uploadMedia", ActivityPubController, :upload_media)
     end
 
     scope [] do
index 0f8638a9414248f75d46aa49dd4a9d57d373793f..c2bcddf85b02dee13673486ca28342253567706c 100644 (file)
@@ -990,5 +990,30 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
 
       assert UserView.render("user.json", %{user: user}) == json_response(conn, 200)
     end
+
+    clear_config([:media_proxy])
+    clear_config([Pleroma.Upload])
+
+    test "uploadMedia", %{conn: conn} do
+      user = insert(:user)
+
+      desc = "Description of the image"
+
+      image = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname("test/fixtures/image.jpg"),
+        filename: "an_image.jpg"
+      }
+
+      conn =
+        conn
+        |> assign(:user, user)
+        |> post("/api/ap/uploadMedia", %{"file" => image, "description" => desc})
+
+      assert object = json_response(conn, :created)
+      assert object["name"] == desc
+      assert object["type"] == "Document"
+      assert object["actor"] == user.ap_id
+    end
   end
 end
index ec96f0012f94fb28a4201022020201d5fddeaa9e..fc1635a2f8e78d8b002eadd358c592cc2396a9a0 100644 (file)
@@ -400,7 +400,8 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
                "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize",
                "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps",
                "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token",
-               "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox"
+               "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox",
+               "uploadMedia" => "#{Pleroma.Web.base_url()}/api/ap/uploadMedia"
              }
 
       assert response["@context"] == [
@@ -462,7 +463,8 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
                "oauthAuthorizationEndpoint" => "#{Pleroma.Web.base_url()}/oauth/authorize",
                "oauthRegistrationEndpoint" => "#{Pleroma.Web.base_url()}/api/v1/apps",
                "oauthTokenEndpoint" => "#{Pleroma.Web.base_url()}/oauth/token",
-               "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox"
+               "sharedInbox" => "#{Pleroma.Web.base_url()}/inbox",
+               "uploadMedia" => "#{Pleroma.Web.base_url()}/api/ap/uploadMedia"
              }
 
       assert response["@context"] == [