logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

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