[#1094] Rate-limited follow & unfollow actions.
authorIvan Tashkinov <ivant.business@gmail.com>
Tue, 16 Jul 2019 16:18:30 +0000 (19:18 +0300)
committerIvan Tashkinov <ivant.business@gmail.com>
Tue, 16 Jul 2019 16:18:30 +0000 (19:18 +0300)
config/config.exs
docs/config.md
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex

index 7d539f994fdd43e596135b8064e539439ae9c960..03e0341c863e343f230e70a678eccf9efb41fbf0 100644 (file)
@@ -528,6 +528,8 @@ config :http_signatures,
 config :pleroma, :rate_limit,
   search: [{1000, 10}, {1000, 30}],
   app_account_creation: {1_800_000, 25},
+  relations_actions: {10_000, 10},
+  relation_id_action: {60_000, 2},
   statuses_actions: {10_000, 15},
   status_id_action: {60_000, 3}
 
index 9a64f0ed76d7f61b2063b52d44c96c7dc57e8ede..f595caba57280a5e978315e4c74da58b4fbff6b6 100644 (file)
@@ -647,5 +647,7 @@ Supported rate limiters:
 
 * `:search` for the search requests (account & status search etc.)
 * `:app_account_creation` for registering user accounts from the same IP address
+* `:relations_actions` for actions on relations with other users (follow, unfollow)
+* `:relation_id_action` for actions on relation with specific another user (follow, unfollow)
 * `:statuses_actions` for create / delete / fav / unfav / reblog / unreblog actions on any statuses
 * `:status_id_action` for fav / unfav or reblog / unreblog actions on the same status by the same user
index f4aa576f73463482ccc35aea5c2bfa8acb9315c6..a732a699091e3b88e8006345ce1a5c190f8a7af5 100644 (file)
@@ -47,6 +47,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
 
   require Logger
 
+  @rate_limited_relations_actions ~w(follow unfollow)a
+
   @rate_limited_status_actions ~w(reblog_status unreblog_status fav_status unfav_status
     post_status delete_status)a
 
@@ -62,6 +64,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     when action in ~w(fav_status unfav_status)a
   )
 
+  plug(
+    RateLimiter,
+    {:relations_id_action, params: ["id", "uri"]} when action in @rate_limited_relations_actions
+  )
+
+  plug(RateLimiter, :relations_actions when action in @rate_limited_relations_actions)
   plug(RateLimiter, :statuses_actions when action in @rate_limited_status_actions)
   plug(RateLimiter, :app_account_creation when action == :account_register)
   plug(RateLimiter, :search when action in [:search, :search2, :account_search])