Merge branch 'develop' into stable
[akkoma] / lib / pleroma / web / plugs / rate_limiter.ex
index c51e2c6349e19b35d2ba11c9c2b45309a6a7d908..3c82654b4eb264859c5675d20007a8426a6c9330 100644 (file)
@@ -1,8 +1,8 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
-defmodule Pleroma.Plugs.RateLimiter do
+defmodule Pleroma.Web.Plugs.RateLimiter do
   @moduledoc """
 
   ## Configuration
@@ -35,8 +35,8 @@ defmodule Pleroma.Plugs.RateLimiter do
 
   AllowedSyntax:
 
-      plug(Pleroma.Plugs.RateLimiter, name: :limiter_name)
-      plug(Pleroma.Plugs.RateLimiter, options)   # :name is a required option
+      plug(Pleroma.Web.Plugs.RateLimiter, name: :limiter_name)
+      plug(Pleroma.Web.Plugs.RateLimiter, options)   # :name is a required option
 
   Allowed options:
 
@@ -46,11 +46,11 @@ defmodule Pleroma.Plugs.RateLimiter do
 
   Inside a controller:
 
-      plug(Pleroma.Plugs.RateLimiter, [name: :one] when action == :one)
-      plug(Pleroma.Plugs.RateLimiter, [name: :two] when action in [:two, :three])
+      plug(Pleroma.Web.Plugs.RateLimiter, [name: :one] when action == :one)
+      plug(Pleroma.Web.Plugs.RateLimiter, [name: :two] when action in [:two, :three])
 
       plug(
-        Pleroma.Plugs.RateLimiter,
+        Pleroma.Web.Plugs.RateLimiter,
         [name: :status_id_action, bucket_name: "status_id_action:fav_unfav", params: ["id"]]
         when action in ~w(fav_status unfav_status)a
       )
@@ -59,7 +59,7 @@ defmodule Pleroma.Plugs.RateLimiter do
 
       pipeline :api do
         ...
-        plug(Pleroma.Plugs.RateLimiter, name: :one)
+        plug(Pleroma.Web.Plugs.RateLimiter, name: :one)
         ...
       end
   """
@@ -67,11 +67,13 @@ defmodule Pleroma.Plugs.RateLimiter do
   import Plug.Conn
 
   alias Pleroma.Config
-  alias Pleroma.Plugs.RateLimiter.LimiterSupervisor
   alias Pleroma.User
+  alias Pleroma.Web.Plugs.RateLimiter.LimiterSupervisor
 
   require Logger
 
+  @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
+
   @doc false
   def init(plug_opts) do
     plug_opts
@@ -124,7 +126,7 @@ defmodule Pleroma.Plugs.RateLimiter do
       key_name = make_key_name(action_settings)
       limit = get_limits(action_settings)
 
-      case Cachex.get(bucket_name, key_name) do
+      case @cachex.get(bucket_name, key_name) do
         {:error, :no_cache} ->
           @inspect_bucket_not_found
 
@@ -157,7 +159,7 @@ defmodule Pleroma.Plugs.RateLimiter do
     key_name = make_key_name(action_settings)
     limit = get_limits(action_settings)
 
-    case Cachex.get_and_update(bucket_name, key_name, &increment_value(&1, limit)) do
+    case @cachex.get_and_update(bucket_name, key_name, &increment_value(&1, limit)) do
       {:commit, value} ->
         {:ok, value}
 
@@ -195,12 +197,18 @@ defmodule Pleroma.Plugs.RateLimiter do
     })
   end
 
-  defp ip(%{remote_ip: remote_ip}) do
+  defp ip(%{remote_ip: remote_ip}) when is_binary(remote_ip) do
+    remote_ip
+  end
+
+  defp ip(%{remote_ip: remote_ip}) when is_tuple(remote_ip) do
     remote_ip
     |> Tuple.to_list()
     |> Enum.join(".")
   end
 
+  defp ip(_), do: nil
+
   defp render_throttled_error(conn) do
     conn
     |> render_error(:too_many_requests, "Throttled")