Merge branch 'static-accept-missing' into 'develop'
[akkoma] / lib / pleroma / plugs / rate_limiter / rate_limiter.ex
index d2067060d6e0d1f1113ce125aa713160d25b5ba5..c3f6351c87cafe5ae60dfc7278a259b9274f5eaf 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Plugs.RateLimiter do
@@ -121,6 +121,8 @@ defmodule Pleroma.Plugs.RateLimiter do
     localhost_or_socket and remote_ip_disabled
   end
 
+  @inspect_bucket_not_found {:error, :not_found}
+
   def inspect_bucket(conn, bucket_name_root, plug_opts) do
     with %{name: _} = action_settings <- action_settings(plug_opts) do
       action_settings = incorporate_conn_info(action_settings, conn)
@@ -130,7 +132,7 @@ defmodule Pleroma.Plugs.RateLimiter do
 
       case Cachex.get(bucket_name, key_name) do
         {:error, :no_cache} ->
-          {:err, :not_found}
+          @inspect_bucket_not_found
 
         {:ok, nil} ->
           {0, limit}
@@ -139,12 +141,12 @@ defmodule Pleroma.Plugs.RateLimiter do
           {value, limit - value}
       end
     else
-      _ -> {:err, :not_found}
+      _ -> @inspect_bucket_not_found
     end
   end
 
   def action_settings(plug_opts) do
-    with limiter_name when not is_nil(limiter_name) <- plug_opts[:name],
+    with limiter_name when is_atom(limiter_name) <- plug_opts[:name],
          limits when not is_nil(limits) <- Config.get([:rate_limit, limiter_name]) do
       bucket_name_root = Keyword.get(plug_opts, :bucket_name, limiter_name)
 
@@ -169,7 +171,7 @@ defmodule Pleroma.Plugs.RateLimiter do
         {:error, value}
 
       {:error, :no_cache} ->
-        initialize_buckets(action_settings)
+        initialize_buckets!(action_settings)
         check_rate(action_settings)
     end
   end
@@ -248,11 +250,16 @@ defmodule Pleroma.Plugs.RateLimiter do
     |> String.replace_leading(":", "")
   end
 
-  defp initialize_buckets(%{name: _name, limits: nil}), do: :ok
+  defp initialize_buckets!(%{name: _name, limits: nil}), do: :ok
+
+  defp initialize_buckets!(%{name: name, limits: limits}) do
+    {:ok, _pid} =
+      LimiterSupervisor.add_or_return_limiter(anon_bucket_name(name), get_scale(:anon, limits))
+
+    {:ok, _pid} =
+      LimiterSupervisor.add_or_return_limiter(user_bucket_name(name), get_scale(:user, limits))
 
-  defp initialize_buckets(%{name: name, limits: limits}) do
-    LimiterSupervisor.add_limiter(anon_bucket_name(name), get_scale(:anon, limits))
-    LimiterSupervisor.add_limiter(user_bucket_name(name), get_scale(:user, limits))
+    :ok
   end
 
   defp attach_identity(base, %{mode: :user, conn_info: conn_info}),