[#2497] Media preview proxy: misc. improvements (`static` param support, dynamic...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Wed, 16 Sep 2020 19:30:42 +0000 (22:30 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Wed, 16 Sep 2020 19:30:42 +0000 (22:30 +0300)
CHANGELOG.md
lib/pleroma/helpers/media_helper.ex
lib/pleroma/helpers/uri_helper.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/media_proxy/media_proxy.ex
lib/pleroma/web/media_proxy/media_proxy_controller.ex
lib/pleroma/web/oauth/oauth_controller.ex

index f7a372e1110dc3587054fc52d71fb598d9cf681e..adea6d01924cd7d90cbe92f57669f8a33de0a82a 100644 (file)
@@ -11,6 +11,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated.
 - Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option).
 
+### Added
+- Media preview proxy (requires media proxy be enabled; see `:media_preview_proxy` config for more details).
+
 ### Removed
 
 - **Breaking:** `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab` (moved to a simpler implementation).
index d834b4a0782cc9ea8de449b64dbfca9f23112ce7..9b7348ee21e6557e6cffd3c8fc32492477d5daef 100644 (file)
@@ -9,8 +9,6 @@ defmodule Pleroma.Helpers.MediaHelper do
 
   alias Pleroma.HTTP
 
-  @tmp_base "/tmp/pleroma-media_preview-pipe"
-
   def image_resize(url, options) do
     with executable when is_binary(executable) <- System.find_executable("convert"),
          {:ok, args} <- prepare_image_resize_args(options),
@@ -103,7 +101,7 @@ defmodule Pleroma.Helpers.MediaHelper do
   end
 
   defp mkfifo do
-    path = "#{@tmp_base}#{to_charlist(:erlang.phash2(self()))}"
+    path = Path.join(System.tmp_dir!(), "pleroma-media-preview-pipe-#{Ecto.UUID.generate()}")
 
     case System.cmd("mkfifo", [path]) do
       {_, 0} ->
index 9c9e534479a80b539921017f9fdeec16016d3a61..f1301f055d3efae303ef284a00ad0e104a96c025 100644 (file)
@@ -3,14 +3,17 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Helpers.UriHelper do
-  def append_uri_params(uri, appended_params) do
+  def modify_uri_params(uri, overridden_params, deleted_params \\ []) do
     uri = URI.parse(uri)
-    appended_params = for {k, v} <- appended_params, into: %{}, do: {to_string(k), v}
-    existing_params = URI.query_decoder(uri.query || "") |> Enum.into(%{})
-    updated_params_keys = Enum.uniq(Map.keys(existing_params) ++ Map.keys(appended_params))
+
+    existing_params = URI.query_decoder(uri.query || "") |> Map.new()
+    overridden_params = Map.new(overridden_params, fn {k, v} -> {to_string(k), v} end)
+    deleted_params = Enum.map(deleted_params, &to_string/1)
 
     updated_params =
-      for k <- updated_params_keys, do: {k, appended_params[k] || existing_params[k]}
+      existing_params
+      |> Map.merge(overridden_params)
+      |> Map.drop(deleted_params)
 
     uri
     |> Map.put(:query, URI.encode_query(updated_params))
index a811f81c25ce00ed5d59b4f5cf628f457a6492ed..121ba1693155adf30f4c17b9be4d0c9b111bf001 100644 (file)
@@ -182,9 +182,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
     display_name = user.name || user.nickname
 
     avatar = User.avatar_url(user) |> MediaProxy.url()
-    avatar_static = User.avatar_url(user) |> MediaProxy.preview_url(output_format: "jpeg")
+    avatar_static = User.avatar_url(user) |> MediaProxy.preview_url(static: true)
     header = User.banner_url(user) |> MediaProxy.url()
-    header_static = User.banner_url(user) |> MediaProxy.preview_url(output_format: "jpeg")
+    header_static = User.banner_url(user) |> MediaProxy.preview_url(static: true)
 
     following_count =
       if !user.hide_follows_count or !user.hide_follows or opts[:for] == user do
index ba553998b40b4293b88126c45d0568b22524f892..8656b8cad31eb12910d10556ee58f741c34f48a8 100644 (file)
@@ -157,7 +157,7 @@ defmodule Pleroma.Web.MediaProxy do
   def build_preview_url(sig_base64, url_base64, filename \\ nil, preview_params \\ []) do
     uri = proxy_url("proxy/preview", sig_base64, url_base64, filename)
 
-    UriHelper.append_uri_params(uri, preview_params)
+    UriHelper.modify_uri_params(uri, preview_params)
   end
 
   def verify_request_path_and_url(
index 78df7763ee30d093d0aa1b6aaf591737969a140a..fe279e96496bee4f6c187873afd88ea9cb0d2d2f 100644 (file)
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
 
   alias Pleroma.Config
   alias Pleroma.Helpers.MediaHelper
+  alias Pleroma.Helpers.UriHelper
   alias Pleroma.ReverseProxy
   alias Pleroma.Web.MediaProxy
   alias Plug.Conn
@@ -74,14 +75,26 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
   end
 
   defp handle_preview(
-         "image/" <> _ = _content_type,
+         "image/gif" = _content_type,
          _content_length,
-         %{params: %{"output_format" => "jpeg"}} = conn,
+         %{params: %{"static" => static}} = conn,
          media_proxy_url
-       ) do
+       )
+       when static in ["true", true] do
     handle_jpeg_preview(conn, media_proxy_url)
   end
 
+  defp handle_preview(
+         _content_type,
+         _content_length,
+         %{params: %{"static" => static}} = conn,
+         _media_proxy_url
+       )
+       when static in ["true", true] do
+    uri_without_static_param = UriHelper.modify_uri_params(current_url(conn), %{}, ["static"])
+    redirect(conn, external: uri_without_static_param)
+  end
+
   defp handle_preview("image/gif" = _content_type, _content_length, conn, media_proxy_url) do
     redirect(conn, external: media_proxy_url)
   end
index 26e68be428461fb56af9f1aca878dc74e5ef1d98..a4152e84090426b8e396e1f10f4a68d3d6611baf 100644 (file)
@@ -119,7 +119,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
       redirect_uri = redirect_uri(conn, redirect_uri)
       url_params = %{access_token: token.token}
       url_params = Maps.put_if_present(url_params, :state, params["state"])
-      url = UriHelper.append_uri_params(redirect_uri, url_params)
+      url = UriHelper.modify_uri_params(redirect_uri, url_params)
       redirect(conn, external: url)
     else
       conn
@@ -161,7 +161,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do
       redirect_uri = redirect_uri(conn, redirect_uri)
       url_params = %{code: auth.token}
       url_params = Maps.put_if_present(url_params, :state, auth_attrs["state"])
-      url = UriHelper.append_uri_params(redirect_uri, url_params)
+      url = UriHelper.modify_uri_params(redirect_uri, url_params)
       redirect(conn, external: url)
     else
       conn