Skip to content

Commit 82189cb

Browse files
authored
Export RatelimitOverride from ModuleApi (element-hq#18513)
1 parent e80bc4b commit 82189cb

File tree

7 files changed

+28
-6
lines changed

7 files changed

+28
-6
lines changed

changelog.d/18513.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Support the import of the `RatelimitOverride` type from `synapse.module_api` in modules and rename `messages_per_second` to `per_second`.

docs/modules/ratelimit_callbacks.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ The available ratelimit callbacks are:
1111
_First introduced in Synapse v1.132.0_
1212

1313
```python
14-
async def get_ratelimit_override_for_user(user: str, limiter_name: str) -> Optional[RatelimitOverride]
14+
async def get_ratelimit_override_for_user(user: str, limiter_name: str) -> Optional[synapse.module_api.RatelimitOverride]
1515
```
1616

1717
Called when constructing a ratelimiter of a particular type for a user. The module can
@@ -26,6 +26,11 @@ The limiters that are currently supported are:
2626
- `rc_invites.per_user`
2727
- `rc_invites.per_issuer`
2828

29+
The `RatelimitOverride` return type has the following fields:
30+
31+
- `per_second: float`. The number of actions that can be performed in a second. `0.0` means that ratelimiting is disabled.
32+
- `burst_count: int`. The number of actions that can be performed before being limited.
33+
2934
If multiple modules implement this callback, they will be considered in order. If a
3035
callback returns `None`, Synapse falls through to the next one. The value of the first
3136
callback that does not return `None` will be used. If this happens, Synapse will not call

synapse/api/ratelimiting.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ async def can_do_action(
184184
)
185185

186186
if module_override:
187-
rate_hz = module_override.messages_per_second
187+
rate_hz = module_override.per_second
188188
burst_count = module_override.burst_count
189189

190190
# Override default values if set

synapse/module_api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
)
9797
from synapse.module_api.callbacks.ratelimit_callbacks import (
9898
GET_RATELIMIT_OVERRIDE_FOR_USER_CALLBACK,
99+
RatelimitOverride,
99100
)
100101
from synapse.module_api.callbacks.spamchecker_callbacks import (
101102
CHECK_EVENT_FOR_SPAM_CALLBACK,
@@ -197,6 +198,7 @@
197198
"ProfileInfo",
198199
"RoomAlias",
199200
"UserProfile",
201+
"RatelimitOverride",
200202
]
201203

202204
logger = logging.getLogger(__name__)

synapse/module_api/callbacks/ratelimit_callbacks.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
import logging
1616
from typing import TYPE_CHECKING, Awaitable, Callable, List, Optional
1717

18-
from synapse.storage.databases.main.room import RatelimitOverride
18+
import attr
19+
1920
from synapse.util.async_helpers import delay_cancellation
2021
from synapse.util.metrics import Measure
2122

@@ -24,6 +25,17 @@
2425

2526
logger = logging.getLogger(__name__)
2627

28+
29+
@attr.s(auto_attribs=True)
30+
class RatelimitOverride:
31+
"""Represents a ratelimit being overridden."""
32+
33+
per_second: float
34+
"""The number of actions that can be performed in a second. `0.0` means that ratelimiting is disabled."""
35+
burst_count: int
36+
"""How many actions that can be performed before being limited."""
37+
38+
2739
GET_RATELIMIT_OVERRIDE_FOR_USER_CALLBACK = Callable[
2840
[str, str], Awaitable[Optional[RatelimitOverride]]
2941
]

synapse/storage/databases/main/room.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@
7777

7878
@attr.s(slots=True, frozen=True, auto_attribs=True)
7979
class RatelimitOverride:
80-
messages_per_second: float
80+
# n.b. elsewhere in Synapse messages_per_second is represented as a float, but it is
81+
# an integer in the database
82+
messages_per_second: int
8183
burst_count: int
8284

8385

tests/api/test_ratelimiting.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from synapse.api.ratelimiting import LimitExceededError, Ratelimiter
44
from synapse.appservice import ApplicationService
55
from synapse.config.ratelimiting import RatelimitSettings
6+
from synapse.module_api import RatelimitOverride
67
from synapse.module_api.callbacks.ratelimit_callbacks import RatelimitModuleApiCallbacks
7-
from synapse.storage.databases.main.room import RatelimitOverride
88
from synapse.types import create_requester
99

1010
from tests import unittest
@@ -477,7 +477,7 @@ async def get_ratelimit_override_for_user(
477477
) -> Optional[RatelimitOverride]:
478478
if user_id == test_user_id:
479479
return RatelimitOverride(
480-
messages_per_second=0.1,
480+
per_second=0.1,
481481
burst_count=10,
482482
)
483483
return None

0 commit comments

Comments
 (0)