From 4ee15e991efb5bd5bf69d84d27dbbee81443d1dc Mon Sep 17 00:00:00 2001
From: Ivan Tashkinov <ivantashkinov@gmail.com>
Date: Wed, 19 Aug 2020 21:36:26 +0300
Subject: [PATCH] [#2497] Media preview proxy config refactoring &
 documentation.

---
 config/config.exs                             |  3 +-
 config/description.exs                        | 51 +++++++++++++++++++
 .../web/media_proxy/media_proxy_controller.ex | 20 ++++----
 3 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/config/config.exs b/config/config.exs
index 029f8ec20..6e6231cf8 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -444,8 +444,7 @@ config :pleroma, :media_preview_proxy,
   thumbnail_max_width: 400,
   thumbnail_max_height: 200,
   proxy_opts: [
-    head_request_max_read_duration: 5_000,
-    max_read_duration: 10_000
+    head_request_max_read_duration: 5_000
   ]
 
 config :pleroma, :chat, enabled: true
diff --git a/config/description.exs b/config/description.exs
index e27abf40f..90d8eca65 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -1831,6 +1831,7 @@ config :pleroma, :config_description, [
         suggestions: [
           redirect_on_failure: false,
           max_body_length: 25 * 1_048_576,
+          max_read_duration: 30_000,
           http: [
             follow_redirect: true,
             pool: :media
@@ -1851,6 +1852,11 @@ config :pleroma, :config_description, [
               "Limits the content length to be approximately the " <>
                 "specified length. It is validated with the `content-length` header and also verified when proxying."
           },
+          %{
+            key: :max_read_duration,
+            type: :integer,
+            description: "Timeout (in milliseconds) of GET request to remote URI."
+          },
           %{
             key: :http,
             label: "HTTP",
@@ -1897,6 +1903,51 @@ config :pleroma, :config_description, [
       }
     ]
   },
+  %{
+    group: :pleroma,
+    key: :media_preview_proxy,
+    type: :group,
+    description: "Media preview proxy",
+    children: [
+      %{
+        key: :enabled,
+        type: :boolean,
+        description:
+          "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
+      },
+      %{
+        key: :thumbnail_max_width,
+        type: :integer,
+        description: "Max width of preview thumbnail."
+      },
+      %{
+        key: :thumbnail_max_height,
+        type: :integer,
+        description: "Max height of preview thumbnail."
+      },
+      %{
+        key: :proxy_opts,
+        type: :keyword,
+        description: "Media proxy options",
+        suggestions: [
+          head_request_max_read_duration: 5_000
+        ],
+        children: [
+          %{
+            key: :head_request_max_read_duration,
+            type: :integer,
+            description: "Timeout (in milliseconds) of HEAD request to remote URI."
+          }
+        ]
+      },
+      %{
+        key: :whitelist,
+        type: {:list, :string},
+        description: "List of hosts with scheme to bypass the mediaproxy",
+        suggestions: ["http://example.com"]
+      }
+    ]
+  },
   %{
     group: :pleroma,
     key: Pleroma.Web.MediaProxy.Invalidation.Http,
diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex
index 8861398dd..31d18c119 100644
--- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex
+++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex
@@ -15,8 +15,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
          {:ok, url} <- MediaProxy.decode_url(sig64, url64),
          {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)},
          :ok <- MediaProxy.verify_request_path_and_url(conn, url) do
-      proxy_opts = Config.get([:media_proxy, :proxy_opts], [])
-      ReverseProxy.call(conn, url, proxy_opts)
+      ReverseProxy.call(conn, url, media_proxy_opts())
     else
       {:enabled, false} ->
         send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404))
@@ -116,13 +115,16 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do
   end
 
   defp preview_head_request_timeout do
-    Config.get([:media_preview_proxy, :proxy_opts, :head_request_max_read_duration]) ||
-      preview_timeout()
-  end
-
-  defp preview_timeout do
-    Config.get([:media_preview_proxy, :proxy_opts, :max_read_duration]) ||
-      Config.get([:media_proxy, :proxy_opts, :max_read_duration]) ||
+    Keyword.get(media_preview_proxy_opts(), :head_request_max_read_duration) ||
+      Keyword.get(media_proxy_opts(), :max_read_duration) ||
       ReverseProxy.max_read_duration_default()
   end
+
+  defp media_proxy_opts do
+    Config.get([:media_proxy, :proxy_opts], [])
+  end
+
+  defp media_preview_proxy_opts do
+    Config.get([:media_preview_proxy, :proxy_opts], [])
+  end
 end