Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/18513.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support the import of the `RatelimitOverride` type from `synapse.module_api` in modules.
10 changes: 10 additions & 0 deletions synapse/module_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,16 @@ class UserIpAndAgent:
last_seen: int


@attr.s(auto_attribs=True)
class RatelimitOverride:
"""Represents a ratelimit being overridden."""

messages_per_second: float
"""The number of actions that can be performed in a second. `0.0` mean that ratelimiting is disabled."""
burst_count: int
"""How many actions that can be performed before being limited."""


def cached(
*,
max_entries: int = 1000,
Expand Down
8 changes: 4 additions & 4 deletions synapse/module_api/callbacks/ratelimit_callbacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@
import logging
from typing import TYPE_CHECKING, Awaitable, Callable, List, Optional

from synapse.storage.databases.main.room import RatelimitOverride
from synapse.util.async_helpers import delay_cancellation
from synapse.util.metrics import Measure

if TYPE_CHECKING:
from synapse.module_api import RatelimitOverride
from synapse.server import HomeServer

logger = logging.getLogger(__name__)

GET_RATELIMIT_OVERRIDE_FOR_USER_CALLBACK = Callable[
[str, str], Awaitable[Optional[RatelimitOverride]]
[str, str], Awaitable[Optional["RatelimitOverride"]]
]


Expand All @@ -50,10 +50,10 @@ def register_callbacks(

async def get_ratelimit_override_for_user(
self, user_id: str, limiter_name: str
) -> Optional[RatelimitOverride]:
) -> Optional["RatelimitOverride"]:
for callback in self._get_ratelimit_override_for_user_callbacks:
with Measure(self.clock, f"{callback.__module__}.{callback.__qualname__}"):
res: Optional[RatelimitOverride] = await delay_cancellation(
res: Optional["RatelimitOverride"] = await delay_cancellation(
callback(user_id, limiter_name)
)
if res:
Expand Down
4 changes: 3 additions & 1 deletion synapse/storage/databases/main/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@

@attr.s(slots=True, frozen=True, auto_attribs=True)
class RatelimitOverride:
messages_per_second: float
# n.b. elsewhere in Synapse messages_per_second is represented as a float, but it is
# an integer in the database
messages_per_second: int
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

burst_count: int


Expand Down
2 changes: 1 addition & 1 deletion tests/api/test_ratelimiting.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from synapse.api.ratelimiting import LimitExceededError, Ratelimiter
from synapse.appservice import ApplicationService
from synapse.config.ratelimiting import RatelimitSettings
from synapse.module_api import RatelimitOverride
from synapse.module_api.callbacks.ratelimit_callbacks import RatelimitModuleApiCallbacks
from synapse.storage.databases.main.room import RatelimitOverride
from synapse.types import create_requester

from tests import unittest
Expand Down
Loading