summary refs log tree commit diff
path: root/synapse/federation/federation_server.py
diff options
context:
space:
mode:
authorAndrew Morgan <andrew@amorgan.xyz>2021-04-23 14:12:47 +0100
committerAndrew Morgan <andrew@amorgan.xyz>2021-04-23 14:12:47 +0100
commitd2b3c47ba31fec1df4d06f1c2aa7ed29e309498d (patch)
tree7a80e170fdec14dfd3e78cd4984ff39c89beb48a /synapse/federation/federation_server.py
parentMerge commit 'd9f1dccba' into anoa/dinsic_release_1_31_0 (diff)
parentClean up the user directory sample config section (#9385) (diff)
downloadsynapse-d2b3c47ba31fec1df4d06f1c2aa7ed29e309498d.tar.xz
Merge commit 'e22b71810' into anoa/dinsic_release_1_31_0
Diffstat (limited to 'synapse/federation/federation_server.py')
-rw-r--r--synapse/federation/federation_server.py20
1 files changed, 18 insertions, 2 deletions
diff --git a/synapse/federation/federation_server.py b/synapse/federation/federation_server.py

index e84fad9d77..de7c2e5f77 100644 --- a/synapse/federation/federation_server.py +++ b/synapse/federation/federation_server.py
@@ -34,7 +34,7 @@ from twisted.internet import defer from twisted.internet.abstract import isIPAddress from twisted.python import failure -from synapse.api.constants import EventTypes, Membership +from synapse.api.constants import EduTypes, EventTypes, Membership from synapse.api.errors import ( AuthError, Codes, @@ -44,6 +44,7 @@ from synapse.api.errors import ( SynapseError, UnsupportedRoomVersionError, ) +from synapse.api.ratelimiting import Ratelimiter from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.config.api import DEFAULT_ROOM_STATE_TYPES from synapse.events import EventBase @@ -945,6 +946,13 @@ class FederationHandlerRegistry: # EDU received. self._edu_type_to_instance = {} # type: Dict[str, List[str]] + # A rate limiter for incoming room key requests per origin. + self._room_key_request_rate_limiter = Ratelimiter( + clock=self.clock, + rate_hz=self.config.rc_key_requests.per_second, + burst_count=self.config.rc_key_requests.burst_count, + ) + def register_edu_handler( self, edu_type: str, handler: Callable[[str, JsonDict], Awaitable[None]] ): @@ -993,7 +1001,15 @@ class FederationHandlerRegistry: self._edu_type_to_instance[edu_type] = instance_names async def on_edu(self, edu_type: str, origin: str, content: dict): - if not self.config.use_presence and edu_type == "m.presence": + if not self.config.use_presence and edu_type == EduTypes.Presence: + return + + # If the incoming room key requests from a particular origin are over + # the limit, drop them. + if ( + edu_type == EduTypes.RoomKeyRequest + and not self._room_key_request_rate_limiter.can_do_action(origin) + ): return # Check if we have a handler on this instance