2727
2828from synapse .api .constants import ProfileFields
2929from synapse .api .errors import Codes , SynapseError
30+ from synapse .api .ratelimiting import Ratelimiter
3031from synapse .handlers .profile import MAX_CUSTOM_FIELD_LEN
3132from synapse .http .server import HttpServer
3233from synapse .http .servlet import (
@@ -67,22 +68,26 @@ def __init__(self, hs: "HomeServer"):
6768 self .profile_handler = hs .get_profile_handler ()
6869 self .auth = hs .get_auth ()
6970
71+ self ._per_user_limiter = Ratelimiter (
72+ store = hs .get_datastores ().main ,
73+ clock = hs .get_clock (),
74+ cfg = hs .config .ratelimiting .rc_profile ,
75+ )
76+
7077 async def on_GET (
7178 self , request : SynapseRequest , user_id : str
7279 ) -> tuple [int , JsonDict ]:
73- requester_user = None
74-
75- if self .hs .config .server .require_auth_for_profile_requests :
76- requester = await self .auth .get_user_by_req (request )
77- requester_user = requester .user
78-
7980 if not UserID .is_valid (user_id ):
8081 raise SynapseError (
8182 HTTPStatus .BAD_REQUEST , "Invalid user id" , Codes .INVALID_PARAM
8283 )
8384
8485 user = UserID .from_string (user_id )
85- await self .profile_handler .check_profile_query_allowed (user , requester_user )
86+
87+ requester = await self .auth .get_user_by_req (request )
88+ await self ._per_user_limiter .ratelimit (requester )
89+ if self .hs .config .server .require_auth_for_profile_requests :
90+ await self .profile_handler .check_profile_query_allowed (user , requester .user )
8691
8792 ret = await self .profile_handler .get_profile (user_id )
8893
@@ -116,15 +121,15 @@ def __init__(self, hs: "HomeServer"):
116121 )
117122 )
118123
124+ self ._per_user_limiter = Ratelimiter (
125+ store = hs .get_datastores ().main ,
126+ clock = hs .get_clock (),
127+ cfg = hs .config .ratelimiting .rc_profile ,
128+ )
129+
119130 async def on_GET (
120131 self , request : SynapseRequest , user_id : str , field_name : str
121132 ) -> tuple [int , JsonDict ]:
122- requester_user = None
123-
124- if self .hs .config .server .require_auth_for_profile_requests :
125- requester = await self .auth .get_user_by_req (request )
126- requester_user = requester .user
127-
128133 if not UserID .is_valid (user_id ):
129134 raise SynapseError (
130135 HTTPStatus .BAD_REQUEST , "Invalid user id" , Codes .INVALID_PARAM
@@ -143,7 +148,11 @@ async def on_GET(
143148 )
144149
145150 user = UserID .from_string (user_id )
146- await self .profile_handler .check_profile_query_allowed (user , requester_user )
151+
152+ requester = await self .auth .get_user_by_req (request )
153+ await self ._per_user_limiter .ratelimit (requester )
154+ if self .hs .config .server .require_auth_for_profile_requests :
155+ await self .profile_handler .check_profile_query_allowed (user , requester .user )
147156
148157 if field_name == ProfileFields .DISPLAYNAME :
149158 field_value : JsonValue = await self .profile_handler .get_displayname (user )
0 commit comments