From d72b9fb70a002530745ae3b5814f292f8a42d208 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 14 Aug 2020 10:15:29 +0100 Subject: [PATCH 1/5] Add type hints to synapse.handlers.room --- synapse/handlers/room.py | 27 ++++++++++++++++----------- tox.ini | 3 ++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index a8545255b1ca..2f03ce402839 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -22,7 +22,7 @@ import math import string from collections import OrderedDict -from typing import Awaitable, Optional, Tuple +from typing import TYPE_CHECKING, Any, Awaitable, Dict, Optional, Tuple from synapse.api.constants import ( EventTypes, @@ -53,6 +53,9 @@ from ._base import BaseHandler +if TYPE_CHECKING: + from synapse.server import HomeServer + logger = logging.getLogger(__name__) id_server_scheme = "https://" @@ -61,7 +64,7 @@ class RoomCreationHandler(BaseHandler): - def __init__(self, hs): + def __init__(self, hs: "HomeServer"): super(RoomCreationHandler, self).__init__(hs) self.spam_checker = hs.get_spam_checker() @@ -92,7 +95,7 @@ def __init__(self, hs): "guest_can_join": False, "power_level_content_override": {}, }, - } + } # type: Dict[str, Dict[str, Any]] # Modify presets to selectively enable encryption by default per homeserver config for preset_name, preset_config in self._presets_dict.items(): @@ -215,6 +218,9 @@ async def _upgrade_room( old_room_state = await tombstone_context.get_current_state_ids() + # We know the tombstone event isn't an outlier so it has current state. + assert old_room_state is not None + # update any aliases await self._move_aliases_to_new_room( requester, old_room_id, new_room_id, old_room_state @@ -601,6 +607,7 @@ async def create_room( Codes.UNSUPPORTED_ROOM_VERSION, ) + room_alias = None if "room_alias_name" in config: for wchar in string.whitespace: if wchar in config["room_alias_name"]: @@ -611,8 +618,6 @@ async def create_room( if mapping: raise SynapseError(400, "Room alias already taken", Codes.ROOM_IN_USE) - else: - room_alias = None invite_list = config.get("invite", []) for i in invite_list: @@ -787,6 +792,10 @@ async def _send_events_for_new_room( The stream_id of the last event persisted. """ + creator_id = creator.user.to_string() + + event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""} + def create(etype, content, **kwargs): e = {"type": etype, "content": content} @@ -808,10 +817,6 @@ async def send(etype, content, **kwargs) -> int: config = self._presets_dict[preset_config] - creator_id = creator.user.to_string() - - event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""} - creation_content.update({"creator": creator_id}) await send(etype=EventTypes.Create, content=creation_content) @@ -852,7 +857,7 @@ async def send(etype, content, **kwargs) -> int: "kick": 50, "redact": 50, "invite": 50, - } + } # type: Dict[str, Any] if config["original_invitees_have_ops"]: for invitee in invite_list: @@ -906,7 +911,7 @@ async def send(etype, content, **kwargs) -> int: return last_sent_stream_id async def _generate_room_id( - self, creator_id: str, is_public: str, room_version: RoomVersion, + self, creator_id: str, is_public: bool, room_version: RoomVersion, ): # autogen room IDs and try to create it. We may clash, so just # try a few times till one goes through, giving up eventually. diff --git a/tox.ini b/tox.ini index e5413eb1102a..ea804108b598 100644 --- a/tox.ini +++ b/tox.ini @@ -169,7 +169,7 @@ commands= skip_install = True deps = {[base]deps} - mypy==0.750 + mypy==0.782 mypy-zope env = MYPYPATH = stubs/ @@ -190,6 +190,7 @@ commands = mypy \ synapse/handlers/message.py \ synapse/handlers/oidc_handler.py \ synapse/handlers/presence.py \ + synapse/handlers/room.py \ synapse/handlers/room_member.py \ synapse/handlers/room_member_worker.py \ synapse/handlers/saml_handler.py \ From c10bb61e330c7f2f5c9be14f1d159512494c39bf Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 14 Aug 2020 10:17:05 +0100 Subject: [PATCH 2/5] Newsfile --- changelog.d/8090.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8090.misc diff --git a/changelog.d/8090.misc b/changelog.d/8090.misc new file mode 100644 index 000000000000..725a03ae881b --- /dev/null +++ b/changelog.d/8090.misc @@ -0,0 +1 @@ +Add type hints to `synapse.handlers.room`. From 86cb2f3fb9168a52218acdf48b0b625274935d28 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 14 Aug 2020 10:37:25 +0100 Subject: [PATCH 3/5] Actually add the type hints --- synapse/handlers/room.py | 78 +++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 2f03ce402839..61ecc39c9286 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -22,7 +22,7 @@ import math import string from collections import OrderedDict -from typing import TYPE_CHECKING, Any, Awaitable, Dict, Optional, Tuple +from typing import TYPE_CHECKING, Any, Awaitable, Dict, List, Optional, Tuple from synapse.api.constants import ( EventTypes, @@ -32,11 +32,14 @@ RoomEncryptionAlgorithms, ) from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError +from synapse.api.filtering import Filter from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion +from synapse.events import EventBase from synapse.events.utils import copy_power_levels_contents from synapse.http.endpoint import parse_and_validate_server_name from synapse.storage.state import StateFilter from synapse.types import ( + JsonDict, Requester, RoomAlias, RoomID, @@ -534,17 +537,21 @@ async def _move_aliases_to_new_room( logger.error("Unable to send updated alias events in new room: %s", e) async def create_room( - self, requester, config, ratelimit=True, creator_join_profile=None + self, + requester: Requester, + config: JsonDict, + ratelimit: bool = True, + creator_join_profile: Optional[JsonDict] = None, ) -> Tuple[dict, int]: """ Creates a new room. Args: - requester (synapse.types.Requester): + requester: The user who requested the room creation. - config (dict) : A dict of configuration options. - ratelimit (bool): set to False to disable the rate limiter + config : A dict of configuration options. + ratelimit: set to False to disable the rate limiter - creator_join_profile (dict|None): + creator_join_profile: Set to override the displayname and avatar for the creating user in this room. If unset, displayname and avatar will be derived from the user's profile. If set, should contain the @@ -776,15 +783,17 @@ async def create_room( async def _send_events_for_new_room( self, - creator, # A Requester object. - room_id, - preset_config, - invite_list, - initial_state, - creation_content, - room_alias=None, - power_level_content_override=None, # Doesn't apply when initial state has power level state event content - creator_join_profile=None, + creator: Requester, + room_id: str, + preset_config: str, + invite_list: List[str], + initial_state: StateMap, + creation_content: JsonDict, + room_alias: Optional[RoomAlias] = None, + power_level_content_override: Optional[ + JsonDict + ] = None, # Doesn't apply when initial state has power level state event content + creator_join_profile: Optional[JsonDict] = None, ) -> int: """Sends the initial events into a new room. @@ -796,7 +805,7 @@ async def _send_events_for_new_room( event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""} - def create(etype, content, **kwargs): + def create(etype: str, content: JsonDict, **kwargs) -> JsonDict: e = {"type": etype, "content": content} e.update(event_keys) @@ -804,7 +813,7 @@ def create(etype, content, **kwargs): return e - async def send(etype, content, **kwargs) -> int: + async def send(etype: str, content: JsonDict, **kwargs) -> int: event = create(etype, content, **kwargs) logger.debug("Sending %s in new room", etype) ( @@ -935,23 +944,30 @@ async def _generate_room_id( class RoomContextHandler(object): - def __init__(self, hs): + def __init__(self, hs: "HomeServer"): self.hs = hs self.store = hs.get_datastore() self.storage = hs.get_storage() self.state_store = self.storage.state - async def get_event_context(self, user, room_id, event_id, limit, event_filter): + async def get_event_context( + self, + user: UserID, + room_id: str, + event_id: str, + limit: int, + event_filter: Optional[Filter], + ) -> Optional[JsonDict]: """Retrieves events, pagination tokens and state around a given event in a room. Args: - user (UserID) - room_id (str) - event_id (str) - limit (int): The maximum number of events to return in total + user + room_id + event_id + limit: The maximum number of events to return in total (excluding state). - event_filter (Filter|None): the filter to apply to the events returned + event_filter: the filter to apply to the events returned (excluding the target event_id) Returns: @@ -1038,12 +1054,18 @@ def filter_evts(events): class RoomEventSource(object): - def __init__(self, hs): + def __init__(self, hs: "HomeServer"): self.store = hs.get_datastore() async def get_new_events( - self, user, from_key, limit, room_ids, is_guest, explicit_room_id=None - ): + self, + user: UserID, + from_key: str, + limit: int, + room_ids: List[str], + is_guest: bool, + explicit_room_id: Optional[str] = None, + ) -> Tuple[List[EventBase], str]: # We just ignore the key for now. to_key = self.get_current_key() @@ -1101,7 +1123,7 @@ class RoomShutdownHandler(object): ) DEFAULT_ROOM_NAME = "Content Violation Notification" - def __init__(self, hs): + def __init__(self, hs: "HomeServer"): self.hs = hs self.room_member_handler = hs.get_room_member_handler() self._room_creation_handler = hs.get_room_creation_handler() From 764ddc46179757b7e1537dc365a4d56276387c33 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 14 Aug 2020 12:17:00 +0100 Subject: [PATCH 4/5] Review comments --- synapse/handlers/room.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 61ecc39c9286..52174f74906b 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -790,13 +790,14 @@ async def _send_events_for_new_room( initial_state: StateMap, creation_content: JsonDict, room_alias: Optional[RoomAlias] = None, - power_level_content_override: Optional[ - JsonDict - ] = None, # Doesn't apply when initial state has power level state event content + power_level_content_override: Optional[JsonDict] = None, # creator_join_profile: Optional[JsonDict] = None, ) -> int: """Sends the initial events into a new room. + `power_level_content_override` doesn't apply when initial state has + power level state event content. + Returns: The stream_id of the last event persisted. """ @@ -866,7 +867,7 @@ async def send(etype: str, content: JsonDict, **kwargs) -> int: "kick": 50, "redact": 50, "invite": 50, - } # type: Dict[str, Any] + } # type: JsonDict if config["original_invitees_have_ops"]: for invitee in invite_list: From d3c2aa9e9a8e8f540d6894eb95b612b9562cd761 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 14 Aug 2020 12:33:58 +0100 Subject: [PATCH 5/5] Update synapse/handlers/room.py Co-authored-by: Patrick Cloke --- synapse/handlers/room.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 52174f74906b..442cca28e6b5 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -790,7 +790,7 @@ async def _send_events_for_new_room( initial_state: StateMap, creation_content: JsonDict, room_alias: Optional[RoomAlias] = None, - power_level_content_override: Optional[JsonDict] = None, # + power_level_content_override: Optional[JsonDict] = None, creator_join_profile: Optional[JsonDict] = None, ) -> int: """Sends the initial events into a new room.