Basic file uploading via TwAPI.
authorRoger Braun <roger@rogerbraun.net>
Wed, 29 Mar 2017 00:05:51 +0000 (02:05 +0200)
committerRoger Braun <roger@rogerbraun.net>
Wed, 29 Mar 2017 00:07:56 +0000 (02:07 +0200)
config/config.exs
config/dev.exs
lib/pleroma/upload.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/endpoint.ex
lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
test/web/activity_pub/activity_pub_test.exs
test/web/twitter_api/twitter_api_test.exs

index bf050197fed293e627922ae4c2497b356ed54d14..2b041b10f3a7539032e05e4c036db5a77ec681e4 100644 (file)
@@ -15,6 +15,7 @@ config :pleroma, Pleroma.Upload,
 # Configures the endpoint
 config :pleroma, Pleroma.Web.Endpoint,
   url: [host: "localhost"],
+  protocol: "https",
   secret_key_base: "aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl",
   render_errors: [view: Pleroma.Web.ErrorView, accepts: ~w(json)],
   pubsub: [name: Pleroma.PubSub,
index 78f543720b7290204067d89c28a9c5e6912efa48..6adde84a27205b533947347b08b0f5b02a73ce48 100644 (file)
@@ -8,6 +8,7 @@ use Mix.Config
 # with brunch.io to recompile .js and .css sources.
 config :pleroma, Pleroma.Web.Endpoint,
   http: [port: 4000],
+  protocol: "http",
   debug_errors: true,
   code_reloader: true,
   check_origin: false,
index 43ebe98e3d709288b572ead2b035c404fa262ff4..fdda2634e84f90294722cb3c11a46812729d1cf7 100644 (file)
@@ -25,6 +25,8 @@ defmodule Pleroma.Upload do
       |> Keyword.fetch!(:url)
       |> Keyword.fetch!(:host)
 
-    "https://#{host}/media/#{file}"
+    protocol = Application.get_env(:pleroma, Pleroma.Web.Endpoint) |> Keyword.fetch!(:protocol)
+
+    "#{protocol}://#{host}/media/#{file}"
   end
 end
index 043e330422172b2b5650db9467e8ce6d472eff9b..f7ba1bb37e50959b09b20e42f92934ebfd96353e 100644 (file)
@@ -1,6 +1,6 @@
 defmodule Pleroma.Web.ActivityPub.ActivityPub do
   alias Pleroma.Repo
-  alias Pleroma.Activity
+  alias Pleroma.{Activity, Object, Upload}
   import Ecto.Query
 
   def insert(map) when is_map(map) do
@@ -33,7 +33,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       Application.get_env(:pleroma, Pleroma.Web.Endpoint)
       |> Keyword.fetch!(:url)
       |> Keyword.fetch!(:host)
-    "https://#{host}/#{type}/#{Ecto.UUID.generate}"
+
+    protocol = Application.get_env(:pleroma, Pleroma.Web.Endpoint) |> Keyword.fetch!(:protocol)
+    "#{protocol}://#{host}/#{type}/#{Ecto.UUID.generate}"
   end
 
   def fetch_public_activities(opts \\ %{}) do
@@ -66,4 +68,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       where: fragment("? @> ?", activity.data, ^%{ context: context })
     Repo.all(query)
   end
+
+  def upload(%Plug.Upload{} = file) do
+    data = Upload.store(file)
+    Repo.insert(%Object{data: data})
+  end
 end
index e35a94c84976cb375a9dd6d9d43b4e9e0e9481e7..6af42a68526cb5ddceca063a225215c2c8a9dd86 100644 (file)
@@ -8,8 +8,7 @@ defmodule Pleroma.Web.Endpoint do
   # You should set gzip to true if you are running phoenix.digest
   # when deploying your static files in production.
   plug Plug.Static,
-    at: "/", from: :pleroma, gzip: false,
-    only: ~w(css fonts images js favicon.ico robots.txt)
+    at: "/media", from: "uploads", gzip: false
 
   # Code reloading can be explicitly enabled under the
   # :code_reloader configuration of your endpoint.
index c60107072a2326b633b07f0c1147eb3e60785343..52030d684ac16d093977094286974f7bcd94dde8 100644 (file)
@@ -35,5 +35,6 @@ defmodule Pleroma.Web.Router do
     get "/statuses/friends_timeline", TwitterAPI.Controller, :friends_timeline
     post "/friendships/create", TwitterAPI.Controller, :follow
     post "/friendships/destroy", TwitterAPI.Controller, :unfollow
+    post "/statusnet/media/upload", TwitterAPI.Controller, :upload
   end
 end
index e240dc2ea696933699c756b9d47ba6efa399a94d..b6e7d5cc6ae407cd039d50c0843f4015832af97b 100644 (file)
@@ -96,6 +96,23 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
+  def upload(%Plug.Upload{} = file) do
+    {:ok, object} = ActivityPub.upload(file)
+
+    # Fake this as good as possible...
+    """
+    <?xml version="1.0" encoding="UTF-8"?>
+    <rsp stat="ok" xmlns:atom="http://www.w3.org/2005/Atom">
+      <mediaid>#{object.id}</mediaid>
+      <media_id>#{object.id}</media_id>
+      <media_id_string>#{object.id}</media_id_string>
+      <media_url>#{object.data["href"]}</media_url>
+      <mediaurl>#{object.data["href"]}</mediaurl>
+      <atom:link rel="enclosure" href="#{object.data["href"]}" type="image"></atom:link>
+    </rsp>
+    """
+  end
+
   defp add_conversation_id(activity) do
     if is_integer(activity.data["statusnetConversationId"]) do
       {:ok, activity}
index f42cee0b09555335cb60a94e00eac892f19b88b3..a26885bf148c44729fe948559a113840ce84a2a1 100644 (file)
@@ -65,6 +65,12 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     |> json_reply(200, response)
   end
 
+  def upload(conn, %{"media" => media}) do
+    response = TwitterAPI.upload(media)
+    conn
+    |> put_resp_content_type("application/atom+xml")
+    |> send_resp(200, response)
+  end
 
   defp json_reply(conn, status, json) do
     conn
index b773c323ef66d9d3e117bf35e35a50cc412b9035..0e778d8877e091a75b1463ab182e52aa28ba3b0c 100644 (file)
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
   use Pleroma.DataCase
   alias Pleroma.Web.ActivityPub.ActivityPub
-  alias Pleroma.Activity
+  alias Pleroma.{Activity, Object}
   alias Pleroma.Builders.ActivityBuilder
 
   describe "insertion" do
@@ -94,4 +94,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
       assert last == last_expected
     end
   end
+
+  describe "uploading files" do
+    test "copies the file to the configured folder" do
+      file = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
+
+      {:ok, %Object{} = object} = ActivityPub.upload(file)
+      assert object.data["name"] == "an_image.jpg"
+    end
+  end
 end
index 5325110e142ff346e4631d10afe8d1d15196675e..dcffab2b87907fd03d58785aab89ed3c826c8efc 100644 (file)
@@ -116,4 +116,12 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do
     assert Enum.at(statuses, 0)["id"] == activity.id
     assert Enum.at(statuses, 1)["id"] == activity_two.id
   end
+
+  test "upload a file" do
+    file = %Plug.Upload{content_type: "image/jpg", path: Path.absname("test/fixtures/image.jpg"), filename: "an_image.jpg"}
+
+    response = TwitterAPI.upload(file)
+
+    assert is_binary(response)
+  end
 end