ability to set and reset avatar, profile banner and backgroud in Mastodon API
[akkoma] / lib / pleroma / plugs / rate_limit_plug.ex
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