1616import logging
1717import random
1818from http import HTTPStatus
19- from typing import TYPE_CHECKING
19+ from typing import TYPE_CHECKING , Optional , Tuple
2020from urllib .parse import urlparse
2121
22+ from twisted .web .server import Request
23+
2224from synapse .api .constants import LoginType
2325from synapse .api .errors import (
2426 Codes ,
2830)
2931from synapse .config .emailconfig import ThreepidBehaviour
3032from synapse .handlers .ui_auth import UIAuthSessionDataConstants
31- from synapse .http .server import finish_request , respond_with_html
33+ from synapse .http .server import HttpServer , finish_request , respond_with_html
3234from synapse .http .servlet import (
3335 RestServlet ,
3436 assert_params_in_dict ,
3537 parse_json_object_from_request ,
3638 parse_string ,
3739)
40+ from synapse .http .site import SynapseRequest
3841from synapse .metrics import threepid_send_requests
3942from synapse .push .mailer import Mailer
43+ from synapse .types import JsonDict
4044from synapse .util .msisdn import phone_number_to_msisdn
4145from synapse .util .stringutils import assert_valid_client_secret , random_string
4246from synapse .util .threepids import check_3pid_allowed , validate_email
@@ -68,7 +72,7 @@ def __init__(self, hs: "HomeServer"):
6872 template_text = self .config .email_password_reset_template_text ,
6973 )
7074
71- async def on_POST (self , request ) :
75+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
7276 if self .config .threepid_behaviour_email == ThreepidBehaviour .OFF :
7377 if self .config .local_threepid_handling_disabled_due_to_email_config :
7478 logger .warning (
@@ -159,7 +163,7 @@ async def on_POST(self, request):
159163class PasswordRestServlet (RestServlet ):
160164 PATTERNS = client_patterns ("/account/password$" )
161165
162- def __init__ (self , hs ):
166+ def __init__ (self , hs : "HomeServer" ):
163167 super ().__init__ ()
164168 self .hs = hs
165169 self .auth = hs .get_auth ()
@@ -169,7 +173,7 @@ def __init__(self, hs):
169173 self ._set_password_handler = hs .get_set_password_handler ()
170174
171175 @interactive_auth_handler
172- async def on_POST (self , request ) :
176+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
173177 body = parse_json_object_from_request (request )
174178
175179 # we do basic sanity checks here because the auth layer will store these
@@ -190,6 +194,7 @@ async def on_POST(self, request):
190194 #
191195 # In the second case, we require a password to confirm their identity.
192196
197+ requester = None
193198 if self .auth .has_access_token (request ):
194199 requester = await self .auth .get_user_by_req (request )
195200 try :
@@ -206,16 +211,15 @@ async def on_POST(self, request):
206211 # If a password is available now, hash the provided password and
207212 # store it for later.
208213 if new_password :
209- password_hash = await self .auth_handler .hash (new_password )
214+ new_password_hash = await self .auth_handler .hash (new_password )
210215 await self .auth_handler .set_session_data (
211216 e .session_id ,
212217 UIAuthSessionDataConstants .PASSWORD_HASH ,
213- password_hash ,
218+ new_password_hash ,
214219 )
215220 raise
216221 user_id = requester .user .to_string ()
217222 else :
218- requester = None
219223 try :
220224 result , params , session_id = await self .auth_handler .check_ui_auth (
221225 [[LoginType .EMAIL_IDENTITY ]],
@@ -230,11 +234,11 @@ async def on_POST(self, request):
230234 # If a password is available now, hash the provided password and
231235 # store it for later.
232236 if new_password :
233- password_hash = await self .auth_handler .hash (new_password )
237+ new_password_hash = await self .auth_handler .hash (new_password )
234238 await self .auth_handler .set_session_data (
235239 e .session_id ,
236240 UIAuthSessionDataConstants .PASSWORD_HASH ,
237- password_hash ,
241+ new_password_hash ,
238242 )
239243 raise
240244
@@ -264,7 +268,7 @@ async def on_POST(self, request):
264268 # If we have a password in this request, prefer it. Otherwise, use the
265269 # password hash from an earlier request.
266270 if new_password :
267- password_hash = await self .auth_handler .hash (new_password )
271+ password_hash : Optional [ str ] = await self .auth_handler .hash (new_password )
268272 elif session_id is not None :
269273 password_hash = await self .auth_handler .get_session_data (
270274 session_id , UIAuthSessionDataConstants .PASSWORD_HASH , None
@@ -288,15 +292,15 @@ async def on_POST(self, request):
288292class DeactivateAccountRestServlet (RestServlet ):
289293 PATTERNS = client_patterns ("/account/deactivate$" )
290294
291- def __init__ (self , hs ):
295+ def __init__ (self , hs : "HomeServer" ):
292296 super ().__init__ ()
293297 self .hs = hs
294298 self .auth = hs .get_auth ()
295299 self .auth_handler = hs .get_auth_handler ()
296300 self ._deactivate_account_handler = hs .get_deactivate_account_handler ()
297301
298302 @interactive_auth_handler
299- async def on_POST (self , request ) :
303+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
300304 body = parse_json_object_from_request (request )
301305 erase = body .get ("erase" , False )
302306 if not isinstance (erase , bool ):
@@ -338,7 +342,7 @@ async def on_POST(self, request):
338342class EmailThreepidRequestTokenRestServlet (RestServlet ):
339343 PATTERNS = client_patterns ("/account/3pid/email/requestToken$" )
340344
341- def __init__ (self , hs ):
345+ def __init__ (self , hs : "HomeServer" ):
342346 super ().__init__ ()
343347 self .hs = hs
344348 self .config = hs .config
@@ -353,7 +357,7 @@ def __init__(self, hs):
353357 template_text = self .config .email_add_threepid_template_text ,
354358 )
355359
356- async def on_POST (self , request ) :
360+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
357361 if self .config .threepid_behaviour_email == ThreepidBehaviour .OFF :
358362 if self .config .local_threepid_handling_disabled_due_to_email_config :
359363 logger .warning (
@@ -449,7 +453,7 @@ def __init__(self, hs: "HomeServer"):
449453 self .store = self .hs .get_datastore ()
450454 self .identity_handler = hs .get_identity_handler ()
451455
452- async def on_POST (self , request ) :
456+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
453457 body = parse_json_object_from_request (request )
454458 assert_params_in_dict (
455459 body , ["client_secret" , "country" , "phone_number" , "send_attempt" ]
@@ -525,11 +529,7 @@ class AddThreepidEmailSubmitTokenServlet(RestServlet):
525529 "/add_threepid/email/submit_token$" , releases = (), unstable = True
526530 )
527531
528- def __init__ (self , hs ):
529- """
530- Args:
531- hs (synapse.server.HomeServer): server
532- """
532+ def __init__ (self , hs : "HomeServer" ):
533533 super ().__init__ ()
534534 self .config = hs .config
535535 self .clock = hs .get_clock ()
@@ -539,7 +539,7 @@ def __init__(self, hs):
539539 self .config .email_add_threepid_template_failure_html
540540 )
541541
542- async def on_GET (self , request ) :
542+ async def on_GET (self , request : Request ) -> None :
543543 if self .config .threepid_behaviour_email == ThreepidBehaviour .OFF :
544544 if self .config .local_threepid_handling_disabled_due_to_email_config :
545545 logger .warning (
@@ -596,18 +596,14 @@ class AddThreepidMsisdnSubmitTokenServlet(RestServlet):
596596 "/add_threepid/msisdn/submit_token$" , releases = (), unstable = True
597597 )
598598
599- def __init__ (self , hs ):
600- """
601- Args:
602- hs (synapse.server.HomeServer): server
603- """
599+ def __init__ (self , hs : "HomeServer" ):
604600 super ().__init__ ()
605601 self .config = hs .config
606602 self .clock = hs .get_clock ()
607603 self .store = hs .get_datastore ()
608604 self .identity_handler = hs .get_identity_handler ()
609605
610- async def on_POST (self , request ) :
606+ async def on_POST (self , request : Request ) -> Tuple [ int , JsonDict ] :
611607 if not self .config .account_threepid_delegate_msisdn :
612608 raise SynapseError (
613609 400 ,
@@ -632,22 +628,22 @@ async def on_POST(self, request):
632628class ThreepidRestServlet (RestServlet ):
633629 PATTERNS = client_patterns ("/account/3pid$" )
634630
635- def __init__ (self , hs ):
631+ def __init__ (self , hs : "HomeServer" ):
636632 super ().__init__ ()
637633 self .hs = hs
638634 self .identity_handler = hs .get_identity_handler ()
639635 self .auth = hs .get_auth ()
640636 self .auth_handler = hs .get_auth_handler ()
641637 self .datastore = self .hs .get_datastore ()
642638
643- async def on_GET (self , request ) :
639+ async def on_GET (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
644640 requester = await self .auth .get_user_by_req (request )
645641
646642 threepids = await self .datastore .user_get_threepids (requester .user .to_string ())
647643
648644 return 200 , {"threepids" : threepids }
649645
650- async def on_POST (self , request ) :
646+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
651647 if not self .hs .config .enable_3pid_changes :
652648 raise SynapseError (
653649 400 , "3PID changes are disabled on this server" , Codes .FORBIDDEN
@@ -688,15 +684,15 @@ async def on_POST(self, request):
688684class ThreepidAddRestServlet (RestServlet ):
689685 PATTERNS = client_patterns ("/account/3pid/add$" )
690686
691- def __init__ (self , hs ):
687+ def __init__ (self , hs : "HomeServer" ):
692688 super ().__init__ ()
693689 self .hs = hs
694690 self .identity_handler = hs .get_identity_handler ()
695691 self .auth = hs .get_auth ()
696692 self .auth_handler = hs .get_auth_handler ()
697693
698694 @interactive_auth_handler
699- async def on_POST (self , request ) :
695+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
700696 if not self .hs .config .enable_3pid_changes :
701697 raise SynapseError (
702698 400 , "3PID changes are disabled on this server" , Codes .FORBIDDEN
@@ -738,13 +734,13 @@ async def on_POST(self, request):
738734class ThreepidBindRestServlet (RestServlet ):
739735 PATTERNS = client_patterns ("/account/3pid/bind$" )
740736
741- def __init__ (self , hs ):
737+ def __init__ (self , hs : "HomeServer" ):
742738 super ().__init__ ()
743739 self .hs = hs
744740 self .identity_handler = hs .get_identity_handler ()
745741 self .auth = hs .get_auth ()
746742
747- async def on_POST (self , request ) :
743+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
748744 body = parse_json_object_from_request (request )
749745
750746 assert_params_in_dict (body , ["id_server" , "sid" , "client_secret" ])
@@ -767,14 +763,14 @@ async def on_POST(self, request):
767763class ThreepidUnbindRestServlet (RestServlet ):
768764 PATTERNS = client_patterns ("/account/3pid/unbind$" )
769765
770- def __init__ (self , hs ):
766+ def __init__ (self , hs : "HomeServer" ):
771767 super ().__init__ ()
772768 self .hs = hs
773769 self .identity_handler = hs .get_identity_handler ()
774770 self .auth = hs .get_auth ()
775771 self .datastore = self .hs .get_datastore ()
776772
777- async def on_POST (self , request ) :
773+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
778774 """Unbind the given 3pid from a specific identity server, or identity servers that are
779775 known to have this 3pid bound
780776 """
@@ -798,13 +794,13 @@ async def on_POST(self, request):
798794class ThreepidDeleteRestServlet (RestServlet ):
799795 PATTERNS = client_patterns ("/account/3pid/delete$" )
800796
801- def __init__ (self , hs ):
797+ def __init__ (self , hs : "HomeServer" ):
802798 super ().__init__ ()
803799 self .hs = hs
804800 self .auth = hs .get_auth ()
805801 self .auth_handler = hs .get_auth_handler ()
806802
807- async def on_POST (self , request ) :
803+ async def on_POST (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
808804 if not self .hs .config .enable_3pid_changes :
809805 raise SynapseError (
810806 400 , "3PID changes are disabled on this server" , Codes .FORBIDDEN
@@ -835,7 +831,7 @@ async def on_POST(self, request):
835831 return 200 , {"id_server_unbind_result" : id_server_unbind_result }
836832
837833
838- def assert_valid_next_link (hs : "HomeServer" , next_link : str ):
834+ def assert_valid_next_link (hs : "HomeServer" , next_link : str ) -> None :
839835 """
840836 Raises a SynapseError if a given next_link value is invalid
841837
@@ -877,11 +873,11 @@ def assert_valid_next_link(hs: "HomeServer", next_link: str):
877873class WhoamiRestServlet (RestServlet ):
878874 PATTERNS = client_patterns ("/account/whoami$" )
879875
880- def __init__ (self , hs ):
876+ def __init__ (self , hs : "HomeServer" ):
881877 super ().__init__ ()
882878 self .auth = hs .get_auth ()
883879
884- async def on_GET (self , request ) :
880+ async def on_GET (self , request : SynapseRequest ) -> Tuple [ int , JsonDict ] :
885881 requester = await self .auth .get_user_by_req (request )
886882
887883 response = {"user_id" : requester .user .to_string ()}
@@ -894,7 +890,7 @@ async def on_GET(self, request):
894890 return 200 , response
895891
896892
897- def register_servlets (hs , http_server ) :
893+ def register_servlets (hs : "HomeServer" , http_server : HttpServer ) -> None :
898894 EmailPasswordRequestTokenRestServlet (hs ).register (http_server )
899895 PasswordRestServlet (hs ).register (http_server )
900896 DeactivateAccountRestServlet (hs ).register (http_server )
0 commit comments