rate_limit_plug.ex (994B)
1 # Pleroma: A lightweight social networking server 2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> 3 # SPDX-License-Identifier: AGPL-3.0-only 4 5 defmodule Pleroma.Plugs.RateLimitPlug do 6 import Phoenix.Controller, only: [json: 2] 7 import Plug.Conn 8 9 def init(opts), do: opts 10 11 def call(conn, opts) do 12 enabled? = Pleroma.Config.get([:app_account_creation, :enabled]) 13 14 case check_rate(conn, Map.put(opts, :enabled, enabled?)) do 15 {:ok, _count} -> conn 16 {:error, _count} -> render_error(conn) 17 %Plug.Conn{} = conn -> conn 18 end 19 end 20 21 defp check_rate(conn, %{enabled: true} = opts) do 22 max_requests = opts[:max_requests] 23 bucket_name = conn.remote_ip |> Tuple.to_list() |> Enum.join(".") 24 25 ExRated.check_rate(bucket_name, opts[:interval] * 1000, max_requests) 26 end 27 28 defp check_rate(conn, _), do: conn 29 30 defp render_error(conn) do 31 conn 32 |> put_status(:forbidden) 33 |> json(%{error: "Rate limit exceeded."}) 34 |> halt() 35 end 36 end