22
22
import math
23
23
import string
24
24
from collections import OrderedDict
25
- from typing import Awaitable , Optional , Tuple
25
+ from typing import TYPE_CHECKING , Any , Awaitable , Dict , List , Optional , Tuple
26
26
27
27
from synapse .api .constants import (
28
28
EventTypes ,
32
32
RoomEncryptionAlgorithms ,
33
33
)
34
34
from synapse .api .errors import AuthError , Codes , NotFoundError , StoreError , SynapseError
35
+ from synapse .api .filtering import Filter
35
36
from synapse .api .room_versions import KNOWN_ROOM_VERSIONS , RoomVersion
37
+ from synapse .events import EventBase
36
38
from synapse .events .utils import copy_power_levels_contents
37
39
from synapse .http .endpoint import parse_and_validate_server_name
38
40
from synapse .storage .state import StateFilter
39
41
from synapse .types import (
42
+ JsonDict ,
40
43
Requester ,
41
44
RoomAlias ,
42
45
RoomID ,
53
56
54
57
from ._base import BaseHandler
55
58
59
+ if TYPE_CHECKING :
60
+ from synapse .server import HomeServer
61
+
56
62
logger = logging .getLogger (__name__ )
57
63
58
64
id_server_scheme = "https://"
61
67
62
68
63
69
class RoomCreationHandler (BaseHandler ):
64
- def __init__ (self , hs ):
70
+ def __init__ (self , hs : "HomeServer" ):
65
71
super (RoomCreationHandler , self ).__init__ (hs )
66
72
67
73
self .spam_checker = hs .get_spam_checker ()
@@ -92,7 +98,7 @@ def __init__(self, hs):
92
98
"guest_can_join" : False ,
93
99
"power_level_content_override" : {},
94
100
},
95
- }
101
+ } # type: Dict[str, Dict[str, Any]]
96
102
97
103
# Modify presets to selectively enable encryption by default per homeserver config
98
104
for preset_name , preset_config in self ._presets_dict .items ():
@@ -215,6 +221,9 @@ async def _upgrade_room(
215
221
216
222
old_room_state = await tombstone_context .get_current_state_ids ()
217
223
224
+ # We know the tombstone event isn't an outlier so it has current state.
225
+ assert old_room_state is not None
226
+
218
227
# update any aliases
219
228
await self ._move_aliases_to_new_room (
220
229
requester , old_room_id , new_room_id , old_room_state
@@ -528,17 +537,21 @@ async def _move_aliases_to_new_room(
528
537
logger .error ("Unable to send updated alias events in new room: %s" , e )
529
538
530
539
async def create_room (
531
- self , requester , config , ratelimit = True , creator_join_profile = None
540
+ self ,
541
+ requester : Requester ,
542
+ config : JsonDict ,
543
+ ratelimit : bool = True ,
544
+ creator_join_profile : Optional [JsonDict ] = None ,
532
545
) -> Tuple [dict , int ]:
533
546
""" Creates a new room.
534
547
535
548
Args:
536
- requester (synapse.types.Requester) :
549
+ requester:
537
550
The user who requested the room creation.
538
- config (dict) : A dict of configuration options.
539
- ratelimit (bool) : set to False to disable the rate limiter
551
+ config : A dict of configuration options.
552
+ ratelimit: set to False to disable the rate limiter
540
553
541
- creator_join_profile (dict|None) :
554
+ creator_join_profile:
542
555
Set to override the displayname and avatar for the creating
543
556
user in this room. If unset, displayname and avatar will be
544
557
derived from the user's profile. If set, should contain the
@@ -601,6 +614,7 @@ async def create_room(
601
614
Codes .UNSUPPORTED_ROOM_VERSION ,
602
615
)
603
616
617
+ room_alias = None
604
618
if "room_alias_name" in config :
605
619
for wchar in string .whitespace :
606
620
if wchar in config ["room_alias_name" ]:
@@ -611,8 +625,6 @@ async def create_room(
611
625
612
626
if mapping :
613
627
raise SynapseError (400 , "Room alias already taken" , Codes .ROOM_IN_USE )
614
- else :
615
- room_alias = None
616
628
617
629
invite_list = config .get ("invite" , [])
618
630
for i in invite_list :
@@ -771,31 +783,38 @@ async def create_room(
771
783
772
784
async def _send_events_for_new_room (
773
785
self ,
774
- creator , # A Requester object.
775
- room_id ,
776
- preset_config ,
777
- invite_list ,
778
- initial_state ,
779
- creation_content ,
780
- room_alias = None ,
781
- power_level_content_override = None , # Doesn't apply when initial state has power level state event content
782
- creator_join_profile = None ,
786
+ creator : Requester ,
787
+ room_id : str ,
788
+ preset_config : str ,
789
+ invite_list : List [ str ] ,
790
+ initial_state : StateMap ,
791
+ creation_content : JsonDict ,
792
+ room_alias : Optional [ RoomAlias ] = None ,
793
+ power_level_content_override : Optional [ JsonDict ] = None ,
794
+ creator_join_profile : Optional [ JsonDict ] = None ,
783
795
) -> int :
784
796
"""Sends the initial events into a new room.
785
797
798
+ `power_level_content_override` doesn't apply when initial state has
799
+ power level state event content.
800
+
786
801
Returns:
787
802
The stream_id of the last event persisted.
788
803
"""
789
804
790
- def create (etype , content , ** kwargs ):
805
+ creator_id = creator .user .to_string ()
806
+
807
+ event_keys = {"room_id" : room_id , "sender" : creator_id , "state_key" : "" }
808
+
809
+ def create (etype : str , content : JsonDict , ** kwargs ) -> JsonDict :
791
810
e = {"type" : etype , "content" : content }
792
811
793
812
e .update (event_keys )
794
813
e .update (kwargs )
795
814
796
815
return e
797
816
798
- async def send (etype , content , ** kwargs ) -> int :
817
+ async def send (etype : str , content : JsonDict , ** kwargs ) -> int :
799
818
event = create (etype , content , ** kwargs )
800
819
logger .debug ("Sending %s in new room" , etype )
801
820
(
@@ -808,10 +827,6 @@ async def send(etype, content, **kwargs) -> int:
808
827
809
828
config = self ._presets_dict [preset_config ]
810
829
811
- creator_id = creator .user .to_string ()
812
-
813
- event_keys = {"room_id" : room_id , "sender" : creator_id , "state_key" : "" }
814
-
815
830
creation_content .update ({"creator" : creator_id })
816
831
await send (etype = EventTypes .Create , content = creation_content )
817
832
@@ -852,7 +867,7 @@ async def send(etype, content, **kwargs) -> int:
852
867
"kick" : 50 ,
853
868
"redact" : 50 ,
854
869
"invite" : 50 ,
855
- }
870
+ } # type: JsonDict
856
871
857
872
if config ["original_invitees_have_ops" ]:
858
873
for invitee in invite_list :
@@ -906,7 +921,7 @@ async def send(etype, content, **kwargs) -> int:
906
921
return last_sent_stream_id
907
922
908
923
async def _generate_room_id (
909
- self , creator_id : str , is_public : str , room_version : RoomVersion ,
924
+ self , creator_id : str , is_public : bool , room_version : RoomVersion ,
910
925
):
911
926
# autogen room IDs and try to create it. We may clash, so just
912
927
# try a few times till one goes through, giving up eventually.
@@ -930,23 +945,30 @@ async def _generate_room_id(
930
945
931
946
932
947
class RoomContextHandler (object ):
933
- def __init__ (self , hs ):
948
+ def __init__ (self , hs : "HomeServer" ):
934
949
self .hs = hs
935
950
self .store = hs .get_datastore ()
936
951
self .storage = hs .get_storage ()
937
952
self .state_store = self .storage .state
938
953
939
- async def get_event_context (self , user , room_id , event_id , limit , event_filter ):
954
+ async def get_event_context (
955
+ self ,
956
+ user : UserID ,
957
+ room_id : str ,
958
+ event_id : str ,
959
+ limit : int ,
960
+ event_filter : Optional [Filter ],
961
+ ) -> Optional [JsonDict ]:
940
962
"""Retrieves events, pagination tokens and state around a given event
941
963
in a room.
942
964
943
965
Args:
944
- user (UserID)
945
- room_id (str)
946
- event_id (str)
947
- limit (int) : The maximum number of events to return in total
966
+ user
967
+ room_id
968
+ event_id
969
+ limit: The maximum number of events to return in total
948
970
(excluding state).
949
- event_filter (Filter|None) : the filter to apply to the events returned
971
+ event_filter: the filter to apply to the events returned
950
972
(excluding the target event_id)
951
973
952
974
Returns:
@@ -1033,12 +1055,18 @@ def filter_evts(events):
1033
1055
1034
1056
1035
1057
class RoomEventSource (object ):
1036
- def __init__ (self , hs ):
1058
+ def __init__ (self , hs : "HomeServer" ):
1037
1059
self .store = hs .get_datastore ()
1038
1060
1039
1061
async def get_new_events (
1040
- self , user , from_key , limit , room_ids , is_guest , explicit_room_id = None
1041
- ):
1062
+ self ,
1063
+ user : UserID ,
1064
+ from_key : str ,
1065
+ limit : int ,
1066
+ room_ids : List [str ],
1067
+ is_guest : bool ,
1068
+ explicit_room_id : Optional [str ] = None ,
1069
+ ) -> Tuple [List [EventBase ], str ]:
1042
1070
# We just ignore the key for now.
1043
1071
1044
1072
to_key = self .get_current_key ()
@@ -1096,7 +1124,7 @@ class RoomShutdownHandler(object):
1096
1124
)
1097
1125
DEFAULT_ROOM_NAME = "Content Violation Notification"
1098
1126
1099
- def __init__ (self , hs ):
1127
+ def __init__ (self , hs : "HomeServer" ):
1100
1128
self .hs = hs
1101
1129
self .room_member_handler = hs .get_room_member_handler ()
1102
1130
self ._room_creation_handler = hs .get_room_creation_handler ()
0 commit comments