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
@@ -540,17 +549,21 @@ async def _move_aliases_to_new_room(
540
549
logger .error ("Unable to send updated alias events in new room: %s" , e )
541
550
542
551
async def create_room (
543
- self , requester , config , ratelimit = True , creator_join_profile = None
552
+ self ,
553
+ requester : Requester ,
554
+ config : JsonDict ,
555
+ ratelimit : bool = True ,
556
+ creator_join_profile : Optional [JsonDict ] = None ,
544
557
) -> Tuple [dict , int ]:
545
558
""" Creates a new room.
546
559
547
560
Args:
548
- requester (synapse.types.Requester) :
561
+ requester:
549
562
The user who requested the room creation.
550
- config (dict) : A dict of configuration options.
551
- ratelimit (bool) : set to False to disable the rate limiter
563
+ config : A dict of configuration options.
564
+ ratelimit: set to False to disable the rate limiter
552
565
553
- creator_join_profile (dict|None) :
566
+ creator_join_profile:
554
567
Set to override the displayname and avatar for the creating
555
568
user in this room. If unset, displayname and avatar will be
556
569
derived from the user's profile. If set, should contain the
@@ -619,6 +632,7 @@ async def create_room(
619
632
Codes .UNSUPPORTED_ROOM_VERSION ,
620
633
)
621
634
635
+ room_alias = None
622
636
if "room_alias_name" in config :
623
637
for wchar in string .whitespace :
624
638
if wchar in config ["room_alias_name" ]:
@@ -629,8 +643,6 @@ async def create_room(
629
643
630
644
if mapping :
631
645
raise SynapseError (400 , "Room alias already taken" , Codes .ROOM_IN_USE )
632
- else :
633
- room_alias = None
634
646
635
647
for i in invite_list :
636
648
try :
@@ -797,31 +809,38 @@ async def create_room(
797
809
798
810
async def _send_events_for_new_room (
799
811
self ,
800
- creator , # A Requester object.
801
- room_id ,
802
- preset_config ,
803
- invite_list ,
804
- initial_state ,
805
- creation_content ,
806
- room_alias = None ,
807
- power_level_content_override = None , # Doesn't apply when initial state has power level state event content
808
- creator_join_profile = None ,
812
+ creator : Requester ,
813
+ room_id : str ,
814
+ preset_config : str ,
815
+ invite_list : List [ str ] ,
816
+ initial_state : StateMap ,
817
+ creation_content : JsonDict ,
818
+ room_alias : Optional [ RoomAlias ] = None ,
819
+ power_level_content_override : Optional [ JsonDict ] = None ,
820
+ creator_join_profile : Optional [ JsonDict ] = None ,
809
821
) -> int :
810
822
"""Sends the initial events into a new room.
811
823
824
+ `power_level_content_override` doesn't apply when initial state has
825
+ power level state event content.
826
+
812
827
Returns:
813
828
The stream_id of the last event persisted.
814
829
"""
815
830
816
- def create (etype , content , ** kwargs ):
831
+ creator_id = creator .user .to_string ()
832
+
833
+ event_keys = {"room_id" : room_id , "sender" : creator_id , "state_key" : "" }
834
+
835
+ def create (etype : str , content : JsonDict , ** kwargs ) -> JsonDict :
817
836
e = {"type" : etype , "content" : content }
818
837
819
838
e .update (event_keys )
820
839
e .update (kwargs )
821
840
822
841
return e
823
842
824
- async def send (etype , content , ** kwargs ) -> int :
843
+ async def send (etype : str , content : JsonDict , ** kwargs ) -> int :
825
844
event = create (etype , content , ** kwargs )
826
845
logger .debug ("Sending %s in new room" , etype )
827
846
(
@@ -834,10 +853,6 @@ async def send(etype, content, **kwargs) -> int:
834
853
835
854
config = self ._presets_dict [preset_config ]
836
855
837
- creator_id = creator .user .to_string ()
838
-
839
- event_keys = {"room_id" : room_id , "sender" : creator_id , "state_key" : "" }
840
-
841
856
creation_content .update ({"creator" : creator_id })
842
857
await send (etype = EventTypes .Create , content = creation_content )
843
858
@@ -879,7 +894,7 @@ async def send(etype, content, **kwargs) -> int:
879
894
"kick" : 50 ,
880
895
"redact" : 50 ,
881
896
"invite" : 50 ,
882
- }
897
+ } # type: JsonDict
883
898
884
899
if config ["original_invitees_have_ops" ]:
885
900
for invitee in invite_list :
@@ -933,7 +948,7 @@ async def send(etype, content, **kwargs) -> int:
933
948
return last_sent_stream_id
934
949
935
950
async def _generate_room_id (
936
- self , creator_id : str , is_public : str , room_version : RoomVersion ,
951
+ self , creator_id : str , is_public : bool , room_version : RoomVersion ,
937
952
):
938
953
# autogen room IDs and try to create it. We may clash, so just
939
954
# try a few times till one goes through, giving up eventually.
@@ -957,23 +972,30 @@ async def _generate_room_id(
957
972
958
973
959
974
class RoomContextHandler (object ):
960
- def __init__ (self , hs ):
975
+ def __init__ (self , hs : "HomeServer" ):
961
976
self .hs = hs
962
977
self .store = hs .get_datastore ()
963
978
self .storage = hs .get_storage ()
964
979
self .state_store = self .storage .state
965
980
966
- async def get_event_context (self , user , room_id , event_id , limit , event_filter ):
981
+ async def get_event_context (
982
+ self ,
983
+ user : UserID ,
984
+ room_id : str ,
985
+ event_id : str ,
986
+ limit : int ,
987
+ event_filter : Optional [Filter ],
988
+ ) -> Optional [JsonDict ]:
967
989
"""Retrieves events, pagination tokens and state around a given event
968
990
in a room.
969
991
970
992
Args:
971
- user (UserID)
972
- room_id (str)
973
- event_id (str)
974
- limit (int) : The maximum number of events to return in total
993
+ user
994
+ room_id
995
+ event_id
996
+ limit: The maximum number of events to return in total
975
997
(excluding state).
976
- event_filter (Filter|None) : the filter to apply to the events returned
998
+ event_filter: the filter to apply to the events returned
977
999
(excluding the target event_id)
978
1000
979
1001
Returns:
@@ -1060,12 +1082,18 @@ def filter_evts(events):
1060
1082
1061
1083
1062
1084
class RoomEventSource (object ):
1063
- def __init__ (self , hs ):
1085
+ def __init__ (self , hs : "HomeServer" ):
1064
1086
self .store = hs .get_datastore ()
1065
1087
1066
1088
async def get_new_events (
1067
- self , user , from_key , limit , room_ids , is_guest , explicit_room_id = None
1068
- ):
1089
+ self ,
1090
+ user : UserID ,
1091
+ from_key : str ,
1092
+ limit : int ,
1093
+ room_ids : List [str ],
1094
+ is_guest : bool ,
1095
+ explicit_room_id : Optional [str ] = None ,
1096
+ ) -> Tuple [List [EventBase ], str ]:
1069
1097
# We just ignore the key for now.
1070
1098
1071
1099
to_key = self .get_current_key ()
@@ -1123,7 +1151,7 @@ class RoomShutdownHandler(object):
1123
1151
)
1124
1152
DEFAULT_ROOM_NAME = "Content Violation Notification"
1125
1153
1126
- def __init__ (self , hs ):
1154
+ def __init__ (self , hs : "HomeServer" ):
1127
1155
self .hs = hs
1128
1156
self .room_member_handler = hs .get_room_member_handler ()
1129
1157
self ._room_creation_handler = hs .get_room_creation_handler ()
0 commit comments