From c7a7cdf7346c9268b1d4f483b31e1fdc39b6d7e0 Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Tue, 2 Sep 2014 17:57:04 +0100 Subject: Add ratelimiting function to basehandler --- synapse/config/homeserver.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'synapse/config') diff --git a/synapse/config/homeserver.py b/synapse/config/homeserver.py index 18072e3196..a9aa4c735c 100644 --- a/synapse/config/homeserver.py +++ b/synapse/config/homeserver.py @@ -17,8 +17,10 @@ from .tls import TlsConfig from .server import ServerConfig from .logger import LoggingConfig from .database import DatabaseConfig +from .ratelimiting import RatelimitConfig -class HomeServerConfig(TlsConfig, ServerConfig, DatabaseConfig, LoggingConfig): +class HomeServerConfig(TlsConfig, ServerConfig, DatabaseConfig, LoggingConfig, + RatelimitConfig): pass if __name__=='__main__': -- cgit 1.5.1 From 0a1260b03a4522a41105478c9b123eed36f40a25 Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Tue, 2 Sep 2014 18:00:15 +0100 Subject: Add ratelimiting config --- synapse/config/ratelimiting.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 synapse/config/ratelimiting.py (limited to 'synapse/config') diff --git a/synapse/config/ratelimiting.py b/synapse/config/ratelimiting.py new file mode 100644 index 0000000000..6c41d55d74 --- /dev/null +++ b/synapse/config/ratelimiting.py @@ -0,0 +1,21 @@ +from ._base import Config + +class RatelimitConfig(Config): + + def __init__(self, args): + super(RatelimitConfig, self).__init__(args) + self.rc_messages_per_second = args.rc_messages_per_second + self.rc_message_burst_count = args.rc_message_burst_count + + @classmethod + def add_arguments(cls, parser): + super(RatelimitConfig, cls).add_arguments(parser) + rc_group = parser.add_argument_group("ratelimiting") + rc_group.add_argument( + "--rc-messages-per-second", type=float, default=0.2 + help="number of messages a client can send per second" + ) + rc_group.add_argument( + "--rc_messsage_burst_count", type=float, default=10 + help="number of message a client can send before being throttled" + ) -- cgit 1.5.1 From 780548b577f5e59cd4f3aa03cf20dbf66a790a39 Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Tue, 2 Sep 2014 18:22:15 +0100 Subject: rate limiting for message sending --- synapse/config/ratelimiting.py | 4 ++-- synapse/handlers/_base.py | 4 ++-- synapse/handlers/message.py | 2 ++ synapse/handlers/room.py | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) (limited to 'synapse/config') diff --git a/synapse/config/ratelimiting.py b/synapse/config/ratelimiting.py index 6c41d55d74..a64aeeb6b2 100644 --- a/synapse/config/ratelimiting.py +++ b/synapse/config/ratelimiting.py @@ -12,10 +12,10 @@ class RatelimitConfig(Config): super(RatelimitConfig, cls).add_arguments(parser) rc_group = parser.add_argument_group("ratelimiting") rc_group.add_argument( - "--rc-messages-per-second", type=float, default=0.2 + "--rc-messages-per-second", type=float, default=0.2, help="number of messages a client can send per second" ) rc_group.add_argument( - "--rc_messsage_burst_count", type=float, default=10 + "--rc-message-burst-count", type=float, default=10, help="number of message a client can send before being throttled" ) diff --git a/synapse/handlers/_base.py b/synapse/handlers/_base.py index dc1298366e..c150b60e07 100644 --- a/synapse/handlers/_base.py +++ b/synapse/handlers/_base.py @@ -35,12 +35,12 @@ class BaseHandler(object): allowed, time_allowed = self.ratelimiter.send_message( user_id, time_now, msg_rate_hz=self.hs.config.rc_messages_per_second, - burst_count=self.hs.config.rc_messsage_burst_count, + burst_count=self.hs.config.rc_message_burst_count, ) if not allowed: raise cs_error( "Limit exceeded", - Codes.M_LIMIT_EXCEEDED, + Codes.LIMIT_EXCEEDED, retry_after_ms=1000*(time_allowed - time_now), ) diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py index 4aeb2089f5..c9e3c4e451 100644 --- a/synapse/handlers/message.py +++ b/synapse/handlers/message.py @@ -76,6 +76,8 @@ class MessageHandler(BaseRoomHandler): Raises: SynapseError if something went wrong. """ + + self.ratelimit(event.user_id) # TODO(paul): Why does 'event' not have a 'user' object? user = self.hs.parse_userid(event.user_id) assert user.is_mine, "User must be our own: %s" % (user,) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 048b719307..b0c94d35af 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -49,6 +49,7 @@ class RoomCreationHandler(BaseRoomHandler): SynapseError if the room ID was taken, couldn't be stored, or something went horribly wrong. """ + self.ratelimit(user_id) if "room_alias_name" in config: room_alias = RoomAlias.create_local( -- cgit 1.5.1