From 407cf076469907029c165b295b98f192f08ac8d0 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 16:36:33 +0100 Subject: [PATCH 01/16] Add config option for setting homeserver's default room version --- synapse/api/room_versions.py | 8 ++-- synapse/config/homeserver.py | 3 +- synapse/config/room.py | 43 +++++++++++++++++++ synapse/handlers/room.py | 6 ++- synapse/rest/client/v2_alpha/capabilities.py | 5 ++- .../rest/client/v2_alpha/test_capabilities.py | 7 ++- 6 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 synapse/config/room.py diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index 485b3d0237b9..f62f28109e26 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -85,10 +85,6 @@ class RoomVersions(object): ) -# the version we will give rooms which are created on this server -DEFAULT_ROOM_VERSION = RoomVersions.V1 - - KNOWN_ROOM_VERSIONS = { v.identifier: v for v in ( RoomVersions.V1, @@ -98,3 +94,7 @@ class RoomVersions(object): RoomVersions.EVENTID_NOSLASH_TEST, ) } # type: dict[str, RoomVersion] + +# the version we will give rooms which are created on this server +def get_default_room_version(config): + return KNOWN_ROOM_VERSIONS[config.default_room_version] diff --git a/synapse/config/homeserver.py b/synapse/config/homeserver.py index 727fdc54d8b9..cf1d41339734 100644 --- a/synapse/config/homeserver.py +++ b/synapse/config/homeserver.py @@ -32,6 +32,7 @@ from .registration import RegistrationConfig from .repository import ContentRepositoryConfig from .room_directory import RoomDirectoryConfig +from .room import RoomConfig from .saml2_config import SAML2Config from .server import ServerConfig from .server_notices_config import ServerNoticesConfig @@ -50,6 +51,6 @@ class HomeServerConfig(ServerConfig, TlsConfig, DatabaseConfig, LoggingConfig, WorkerConfig, PasswordAuthProviderConfig, PushConfig, SpamCheckerConfig, GroupsConfig, UserDirectoryConfig, ConsentConfig, - ServerNoticesConfig, RoomDirectoryConfig, + ServerNoticesConfig, RoomDirectoryConfig, RoomConfig, ): pass diff --git a/synapse/config/room.py b/synapse/config/room.py new file mode 100644 index 000000000000..e7c5317ac2a3 --- /dev/null +++ b/synapse/config/room.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 The Matrix.org Foundation C.I.C. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._base import Config, ConfigError + +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS + + +class RoomConfig(Config): + def read_config(self, config): + self.default_room_version = config.get( + "default_room_version", "1", + ) + + if self.default_room_version not in KNOWN_ROOM_VERSIONS: + raise ConfigError( + "Unknown default_room_version: %s, known room versions: %s" % + (self.default_room_version, KNOWN_ROOM_VERSIONS.keys) + ) + + def default_config(self, config_dir_path, server_name, **kwargs): + return """ + # The default room version for newly created rooms. + # + # Known room versions are listed here: + # https://matrix.org/docs/spec/#complete-list-of-room-versions + # + # For example, for room version 1, default_room_version should be set + # to "1". + default_room_version: "1" + """ diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index e37ae968998a..3997ecaaca0e 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -27,7 +27,7 @@ from synapse.api.constants import EventTypes, JoinRules, RoomCreationPreset from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError -from synapse.api.room_versions import DEFAULT_ROOM_VERSION, KNOWN_ROOM_VERSIONS +from synapse.api.room_versions import get_default_room_version, KNOWN_ROOM_VERSIONS from synapse.storage.state import StateFilter from synapse.types import RoomAlias, RoomID, RoomStreamToken, StreamToken, UserID from synapse.util import stringutils @@ -70,6 +70,7 @@ def __init__(self, hs): self.spam_checker = hs.get_spam_checker() self.event_creation_handler = hs.get_event_creation_handler() self.room_member_handler = hs.get_room_member_handler() + self.config = hs.config # linearizer to stop two upgrades happening at once self._upgrade_linearizer = Linearizer("room_upgrade_linearizer") @@ -475,7 +476,8 @@ def create_room(self, requester, config, ratelimit=True, if ratelimit: yield self.ratelimit(requester) - room_version = config.get("room_version", DEFAULT_ROOM_VERSION.identifier) + default_room_version = get_default_room_version(self.config) + room_version = config.get("room_version", default_room_version.identifier) if not isinstance(room_version, string_types): raise SynapseError( 400, diff --git a/synapse/rest/client/v2_alpha/capabilities.py b/synapse/rest/client/v2_alpha/capabilities.py index a868d06098b1..4dcc02f97371 100644 --- a/synapse/rest/client/v2_alpha/capabilities.py +++ b/synapse/rest/client/v2_alpha/capabilities.py @@ -16,7 +16,7 @@ from twisted.internet import defer -from synapse.api.room_versions import DEFAULT_ROOM_VERSION, KNOWN_ROOM_VERSIONS +from synapse.api.room_versions import get_default_room_version, KNOWN_ROOM_VERSIONS from synapse.http.servlet import RestServlet from ._base import client_v2_patterns @@ -36,6 +36,7 @@ def __init__(self, hs): """ super(CapabilitiesRestServlet, self).__init__() self.hs = hs + self.config = hs.config self.auth = hs.get_auth() self.store = hs.get_datastore() @@ -48,7 +49,7 @@ def on_GET(self, request): response = { "capabilities": { "m.room_versions": { - "default": DEFAULT_ROOM_VERSION.identifier, + "default": get_default_room_version(self.config).identifier, "available": { v.identifier: v.disposition for v in KNOWN_ROOM_VERSIONS.values() diff --git a/tests/rest/client/v2_alpha/test_capabilities.py b/tests/rest/client/v2_alpha/test_capabilities.py index f3ef977404ab..484fd7b7527c 100644 --- a/tests/rest/client/v2_alpha/test_capabilities.py +++ b/tests/rest/client/v2_alpha/test_capabilities.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import synapse.rest.admin -from synapse.api.room_versions import DEFAULT_ROOM_VERSION, KNOWN_ROOM_VERSIONS +from synapse.api.room_versions import get_default_room_version, KNOWN_ROOM_VERSIONS from synapse.rest.client.v1 import login from synapse.rest.client.v2_alpha import capabilities @@ -32,6 +32,7 @@ def make_homeserver(self, reactor, clock): self.url = b"/_matrix/client/r0/capabilities" hs = self.setup_test_homeserver() self.store = hs.get_datastore() + self.config = hs.config() return hs def test_check_auth_required(self): @@ -51,8 +52,10 @@ def test_get_room_version_capabilities(self): self.assertEqual(channel.code, 200) for room_version in capabilities['m.room_versions']['available'].keys(): self.assertTrue(room_version in KNOWN_ROOM_VERSIONS, "" + room_version) + + default_room_version = get_default_room_version(self.config) self.assertEqual( - DEFAULT_ROOM_VERSION.identifier, capabilities['m.room_versions']['default'] + default_room_version.identifier, capabilities['m.room_versions']['default'] ) def test_get_change_password_capabilities(self): From 92c2f73cc048d70914c977a82436af7b727ebd59 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 16:39:36 +0100 Subject: [PATCH 02/16] Add changelog --- changelog.d/5223.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/5223.feature diff --git a/changelog.d/5223.feature b/changelog.d/5223.feature new file mode 100644 index 000000000000..cfdf1ad41ba5 --- /dev/null +++ b/changelog.d/5223.feature @@ -0,0 +1 @@ +Ability to configure default room version. From 7efcd3efbc2fad39c7d60df83e8ce11a53601148 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 16:40:43 +0100 Subject: [PATCH 03/16] lint --- synapse/api/room_versions.py | 2 ++ synapse/config/homeserver.py | 2 +- synapse/config/room.py | 4 ++-- synapse/handlers/room.py | 2 +- synapse/rest/client/v2_alpha/capabilities.py | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index f62f28109e26..319ff21c569c 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -95,6 +95,8 @@ class RoomVersions(object): ) } # type: dict[str, RoomVersion] + # the version we will give rooms which are created on this server +# can be overridden by the config def get_default_room_version(config): return KNOWN_ROOM_VERSIONS[config.default_room_version] diff --git a/synapse/config/homeserver.py b/synapse/config/homeserver.py index cf1d41339734..d5d27346293a 100644 --- a/synapse/config/homeserver.py +++ b/synapse/config/homeserver.py @@ -31,8 +31,8 @@ from .ratelimiting import RatelimitConfig from .registration import RegistrationConfig from .repository import ContentRepositoryConfig -from .room_directory import RoomDirectoryConfig from .room import RoomConfig +from .room_directory import RoomDirectoryConfig from .saml2_config import SAML2Config from .server import ServerConfig from .server_notices_config import ServerNoticesConfig diff --git a/synapse/config/room.py b/synapse/config/room.py index e7c5317ac2a3..6a3ae9b8228b 100644 --- a/synapse/config/room.py +++ b/synapse/config/room.py @@ -13,10 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from ._base import Config, ConfigError - from synapse.api.room_versions import KNOWN_ROOM_VERSIONS +from ._base import Config, ConfigError + class RoomConfig(Config): def read_config(self, config): diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 3997ecaaca0e..45bcfcce5633 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -27,7 +27,7 @@ from synapse.api.constants import EventTypes, JoinRules, RoomCreationPreset from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError -from synapse.api.room_versions import get_default_room_version, KNOWN_ROOM_VERSIONS +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, get_default_room_version from synapse.storage.state import StateFilter from synapse.types import RoomAlias, RoomID, RoomStreamToken, StreamToken, UserID from synapse.util import stringutils diff --git a/synapse/rest/client/v2_alpha/capabilities.py b/synapse/rest/client/v2_alpha/capabilities.py index 4dcc02f97371..90733cc785d2 100644 --- a/synapse/rest/client/v2_alpha/capabilities.py +++ b/synapse/rest/client/v2_alpha/capabilities.py @@ -16,7 +16,7 @@ from twisted.internet import defer -from synapse.api.room_versions import get_default_room_version, KNOWN_ROOM_VERSIONS +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, get_default_room_version from synapse.http.servlet import RestServlet from ._base import client_v2_patterns From d345b22d0fc7256841168b0e9c3362526465dbac Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 16:42:48 +0100 Subject: [PATCH 04/16] lint2 --- tests/rest/client/v2_alpha/test_capabilities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/rest/client/v2_alpha/test_capabilities.py b/tests/rest/client/v2_alpha/test_capabilities.py index 484fd7b7527c..cbf90903cdf9 100644 --- a/tests/rest/client/v2_alpha/test_capabilities.py +++ b/tests/rest/client/v2_alpha/test_capabilities.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import synapse.rest.admin -from synapse.api.room_versions import get_default_room_version, KNOWN_ROOM_VERSIONS +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, get_default_room_version from synapse.rest.client.v1 import login from synapse.rest.client.v2_alpha import capabilities From 78e8e58be594df138b150b018855e1ef88243bbd Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 16:53:57 +0100 Subject: [PATCH 05/16] Single lookup. Remove separate RoomConfig --- synapse/api/room_versions.py | 7 ++++-- synapse/config/homeserver.py | 3 +-- synapse/config/room.py | 43 ------------------------------------ synapse/config/server.py | 19 ++++++++++++++++ 4 files changed, 25 insertions(+), 47 deletions(-) delete mode 100644 synapse/config/room.py diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index 319ff21c569c..1c3bab51782b 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -95,8 +95,11 @@ class RoomVersions(object): ) } # type: dict[str, RoomVersion] - # the version we will give rooms which are created on this server # can be overridden by the config +_default_room_version = None def get_default_room_version(config): - return KNOWN_ROOM_VERSIONS[config.default_room_version] + if _default_room_version: + _default_room_version = KNOWN_ROOM_VERSIONS[config.default_room_version] + + return _default_room_version diff --git a/synapse/config/homeserver.py b/synapse/config/homeserver.py index d5d27346293a..727fdc54d8b9 100644 --- a/synapse/config/homeserver.py +++ b/synapse/config/homeserver.py @@ -31,7 +31,6 @@ from .ratelimiting import RatelimitConfig from .registration import RegistrationConfig from .repository import ContentRepositoryConfig -from .room import RoomConfig from .room_directory import RoomDirectoryConfig from .saml2_config import SAML2Config from .server import ServerConfig @@ -51,6 +50,6 @@ class HomeServerConfig(ServerConfig, TlsConfig, DatabaseConfig, LoggingConfig, WorkerConfig, PasswordAuthProviderConfig, PushConfig, SpamCheckerConfig, GroupsConfig, UserDirectoryConfig, ConsentConfig, - ServerNoticesConfig, RoomDirectoryConfig, RoomConfig, + ServerNoticesConfig, RoomDirectoryConfig, ): pass diff --git a/synapse/config/room.py b/synapse/config/room.py deleted file mode 100644 index 6a3ae9b8228b..000000000000 --- a/synapse/config/room.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 The Matrix.org Foundation C.I.C. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from synapse.api.room_versions import KNOWN_ROOM_VERSIONS - -from ._base import Config, ConfigError - - -class RoomConfig(Config): - def read_config(self, config): - self.default_room_version = config.get( - "default_room_version", "1", - ) - - if self.default_room_version not in KNOWN_ROOM_VERSIONS: - raise ConfigError( - "Unknown default_room_version: %s, known room versions: %s" % - (self.default_room_version, KNOWN_ROOM_VERSIONS.keys) - ) - - def default_config(self, config_dir_path, server_name, **kwargs): - return """ - # The default room version for newly created rooms. - # - # Known room versions are listed here: - # https://matrix.org/docs/spec/#complete-list-of-room-versions - # - # For example, for room version 1, default_room_version should be set - # to "1". - default_room_version: "1" - """ diff --git a/synapse/config/server.py b/synapse/config/server.py index f34aa42afa20..cd1921e4c44d 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -88,6 +88,16 @@ def read_config(self, config): "restrict_public_rooms_to_local_users", False, ) + self.default_room_version = config.get( + "default_room_version", "1", + ) + + if self.default_room_version not in KNOWN_ROOM_VERSIONS: + raise ConfigError( + "Unknown default_room_version: %s, known room versions: %s" % + (self.default_room_version, KNOWN_ROOM_VERSIONS.keys) + ) + # whether to enable search. If disabled, new entries will not be inserted # into the search tables and they will not be indexed. Users will receive # errors when attempting to search for messages. @@ -384,6 +394,15 @@ def default_config(self, server_name, data_dir_path, **kwargs): # #restrict_public_rooms_to_local_users: true + # The default room version for newly created rooms. + # + # Known room versions are listed here: + # https://matrix.org/docs/spec/#complete-list-of-room-versions + # + # For example, for room version 1, default_room_version should be set + # to "1". + default_room_version: "1" + # The GC threshold parameters to pass to `gc.set_threshold`, if defined # #gc_thresholds: [700, 10, 10] From b0daa728f1498ea4318c6c49f84e8ef88e3adaeb Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 17:08:51 +0100 Subject: [PATCH 06/16] lint and clean --- synapse/api/room_versions.py | 7 ++----- synapse/config/server.py | 4 ++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index 1c3bab51782b..4c70e1b09588 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -95,11 +95,8 @@ class RoomVersions(object): ) } # type: dict[str, RoomVersion] + # the version we will give rooms which are created on this server # can be overridden by the config -_default_room_version = None def get_default_room_version(config): - if _default_room_version: - _default_room_version = KNOWN_ROOM_VERSIONS[config.default_room_version] - - return _default_room_version + return config.default_room_version diff --git a/synapse/config/server.py b/synapse/config/server.py index cd1921e4c44d..0c906a4d1d48 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -20,6 +20,7 @@ from netaddr import IPSet +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.http.endpoint import parse_and_validate_server_name from synapse.python_dependencies import DependencyException, check_requirements @@ -98,6 +99,9 @@ def read_config(self, config): (self.default_room_version, KNOWN_ROOM_VERSIONS.keys) ) + # Get the actual room version object rather than just the identifier + self.default_room_version = KNOWN_ROOM_VERSIONS[self.default_room_version] + # whether to enable search. If disabled, new entries will not be inserted # into the search tables and they will not be indexed. Users will receive # errors when attempting to search for messages. From 52f926b901a50e7400c37fe8f8ec15021f55ef01 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 17:17:01 +0100 Subject: [PATCH 07/16] sample config --- docs/sample_config.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index f658ec8ecdb0..43da8e28eaef 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -83,6 +83,15 @@ pid_file: DATADIR/homeserver.pid # #restrict_public_rooms_to_local_users: true +# The default room version for newly created rooms. +# +# Known room versions are listed here: +# https://matrix.org/docs/spec/#complete-list-of-room-versions +# +# For example, for room version 1, default_room_version should be set +# to "1". +default_room_version: "1" + # The GC threshold parameters to pass to `gc.set_threshold`, if defined # #gc_thresholds: [700, 10, 10] From bd6bb52c911b10e43f988598e86e343ed1730ca6 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 17:32:07 +0100 Subject: [PATCH 08/16] typo --- tests/rest/client/v2_alpha/test_capabilities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/rest/client/v2_alpha/test_capabilities.py b/tests/rest/client/v2_alpha/test_capabilities.py index cbf90903cdf9..a27f2251057f 100644 --- a/tests/rest/client/v2_alpha/test_capabilities.py +++ b/tests/rest/client/v2_alpha/test_capabilities.py @@ -32,7 +32,7 @@ def make_homeserver(self, reactor, clock): self.url = b"/_matrix/client/r0/capabilities" hs = self.setup_test_homeserver() self.store = hs.get_datastore() - self.config = hs.config() + self.config = hs.config return hs def test_check_auth_required(self): From add13751e49ee3d678d146e0300d235cb77ee77c Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 21 May 2019 19:57:22 +0100 Subject: [PATCH 09/16] Single, simple point for default room version change --- synapse/config/server.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/synapse/config/server.py b/synapse/config/server.py index 0c906a4d1d48..b4369a958f05 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -36,6 +36,8 @@ # in the list. DEFAULT_BIND_ADDRESSES = ['::', '0.0.0.0'] +DEFAULT_ROOM_VERSION = "1" + class ServerConfig(Config): @@ -90,7 +92,7 @@ def read_config(self, config): ) self.default_room_version = config.get( - "default_room_version", "1", + "default_room_version", DEFAULT_ROOM_VERSION, ) if self.default_room_version not in KNOWN_ROOM_VERSIONS: @@ -405,7 +407,7 @@ def default_config(self, server_name, data_dir_path, **kwargs): # # For example, for room version 1, default_room_version should be set # to "1". - default_room_version: "1" + default_room_version: %(DEFAULT_ROOM_VERSION)s # The GC threshold parameters to pass to `gc.set_threshold`, if defined # From 4d31165086b9f51ba46523bfb2320bf08ba14c30 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Wed, 22 May 2019 09:30:36 +0100 Subject: [PATCH 10/16] Punctuation --- synapse/api/room_versions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index 4c70e1b09588..f8dd28cd5418 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -96,7 +96,7 @@ class RoomVersions(object): } # type: dict[str, RoomVersion] -# the version we will give rooms which are created on this server +# the version we will give rooms which are created on this server. # can be overridden by the config def get_default_room_version(config): return config.default_room_version From d56c059f22b7792c1db64fbddc10c9b624c7d40e Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Wed, 22 May 2019 09:52:51 +0100 Subject: [PATCH 11/16] Fix config file --- docs/sample_config.yaml | 4 ++-- synapse/config/server.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index 43da8e28eaef..fe63a9367cfa 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -89,8 +89,8 @@ pid_file: DATADIR/homeserver.pid # https://matrix.org/docs/spec/#complete-list-of-room-versions # # For example, for room version 1, default_room_version should be set -# to "1". -default_room_version: "1" +# to "1". Make sure the value is wrapped in quotes. +default_room_version: '1' # The GC threshold parameters to pass to `gc.set_threshold`, if defined # diff --git a/synapse/config/server.py b/synapse/config/server.py index b4369a958f05..31a66bf24469 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -23,6 +23,7 @@ from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.http.endpoint import parse_and_validate_server_name from synapse.python_dependencies import DependencyException, check_requirements +from synapse.util.dictutils import merge_dicts from ._base import Config, ConfigError @@ -98,7 +99,7 @@ def read_config(self, config): if self.default_room_version not in KNOWN_ROOM_VERSIONS: raise ConfigError( "Unknown default_room_version: %s, known room versions: %s" % - (self.default_room_version, KNOWN_ROOM_VERSIONS.keys) + (self.default_room_version, list(KNOWN_ROOM_VERSIONS.keys())) ) # Get the actual room version object rather than just the identifier @@ -406,8 +407,8 @@ def default_config(self, server_name, data_dir_path, **kwargs): # https://matrix.org/docs/spec/#complete-list-of-room-versions # # For example, for room version 1, default_room_version should be set - # to "1". - default_room_version: %(DEFAULT_ROOM_VERSION)s + # to "1". Make sure the value is wrapped in quotes. + default_room_version: '%(DEFAULT_ROOM_VERSION)s' # The GC threshold parameters to pass to `gc.set_threshold`, if defined # @@ -607,7 +608,7 @@ def default_config(self, server_name, data_dir_path, **kwargs): # Defaults to 'true'. # #allow_per_room_profiles: false - """ % locals() + """ % merge_dicts(locals(), globals()) def read_arguments(self, args): if args.manhole is not None: @@ -694,7 +695,6 @@ def _warn_if_webclient_configured(listeners): 'webclient', ) - def _check_resource_config(listeners): resource_names = set( res_name From 94677c98626041e60ccb578007f34d7ae1599d5c Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Wed, 22 May 2019 09:54:59 +0100 Subject: [PATCH 12/16] lint --- synapse/config/server.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/synapse/config/server.py b/synapse/config/server.py index 31a66bf24469..0530de1f0461 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -408,7 +408,7 @@ def default_config(self, server_name, data_dir_path, **kwargs): # # For example, for room version 1, default_room_version should be set # to "1". Make sure the value is wrapped in quotes. - default_room_version: '%(DEFAULT_ROOM_VERSION)s' + default_room_version: "%(DEFAULT_ROOM_VERSION)s" # The GC threshold parameters to pass to `gc.set_threshold`, if defined # @@ -695,6 +695,7 @@ def _warn_if_webclient_configured(listeners): 'webclient', ) + def _check_resource_config(listeners): resource_names = set( res_name From a080a3ad662da2319e067b1d27dfdc5d937cc9b7 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Wed, 22 May 2019 10:03:46 +0100 Subject: [PATCH 13/16] Address review comments --- docs/sample_config.yaml | 4 ++-- synapse/api/room_versions.py | 6 ------ synapse/config/server.py | 15 +++++++++------ synapse/handlers/room.py | 9 ++++++--- synapse/rest/client/v2_alpha/capabilities.py | 4 ++-- tests/rest/client/v2_alpha/test_capabilities.py | 6 +++--- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml index fe63a9367cfa..f392de36077c 100644 --- a/docs/sample_config.yaml +++ b/docs/sample_config.yaml @@ -89,8 +89,8 @@ pid_file: DATADIR/homeserver.pid # https://matrix.org/docs/spec/#complete-list-of-room-versions # # For example, for room version 1, default_room_version should be set -# to "1". Make sure the value is wrapped in quotes. -default_room_version: '1' +# to "1". +#default_room_version: "1" # The GC threshold parameters to pass to `gc.set_threshold`, if defined # diff --git a/synapse/api/room_versions.py b/synapse/api/room_versions.py index f8dd28cd5418..dbb3ab1e7f3e 100644 --- a/synapse/api/room_versions.py +++ b/synapse/api/room_versions.py @@ -94,9 +94,3 @@ class RoomVersions(object): RoomVersions.EVENTID_NOSLASH_TEST, ) } # type: dict[str, RoomVersion] - - -# the version we will give rooms which are created on this server. -# can be overridden by the config -def get_default_room_version(config): - return config.default_room_version diff --git a/synapse/config/server.py b/synapse/config/server.py index 0530de1f0461..2a9ef30b1b5b 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -92,18 +92,21 @@ def read_config(self, config): "restrict_public_rooms_to_local_users", False, ) - self.default_room_version = config.get( + default_room_version = config.get( "default_room_version", DEFAULT_ROOM_VERSION, ) - if self.default_room_version not in KNOWN_ROOM_VERSIONS: + # Ensure room version is a str + default_room_version = str(default_room_version) + + if default_room_version not in KNOWN_ROOM_VERSIONS: raise ConfigError( "Unknown default_room_version: %s, known room versions: %s" % - (self.default_room_version, list(KNOWN_ROOM_VERSIONS.keys())) + (default_room_version, list(KNOWN_ROOM_VERSIONS.keys())) ) # Get the actual room version object rather than just the identifier - self.default_room_version = KNOWN_ROOM_VERSIONS[self.default_room_version] + self.default_room_version = KNOWN_ROOM_VERSIONS[default_room_version] # whether to enable search. If disabled, new entries will not be inserted # into the search tables and they will not be indexed. Users will receive @@ -407,8 +410,8 @@ def default_config(self, server_name, data_dir_path, **kwargs): # https://matrix.org/docs/spec/#complete-list-of-room-versions # # For example, for room version 1, default_room_version should be set - # to "1". Make sure the value is wrapped in quotes. - default_room_version: "%(DEFAULT_ROOM_VERSION)s" + # to "1". + #default_room_version: "%(DEFAULT_ROOM_VERSION)s" # The GC threshold parameters to pass to `gc.set_threshold`, if defined # diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index 45bcfcce5633..4a17911a87fa 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -27,7 +27,7 @@ from synapse.api.constants import EventTypes, JoinRules, RoomCreationPreset from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError -from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, get_default_room_version +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.storage.state import StateFilter from synapse.types import RoomAlias, RoomID, RoomStreamToken, StreamToken, UserID from synapse.util import stringutils @@ -476,8 +476,11 @@ def create_room(self, requester, config, ratelimit=True, if ratelimit: yield self.ratelimit(requester) - default_room_version = get_default_room_version(self.config) - room_version = config.get("room_version", default_room_version.identifier) + room_version = config.get( + "room_version", + self.config.default_room_version.identifier, + ) + if not isinstance(room_version, string_types): raise SynapseError( 400, diff --git a/synapse/rest/client/v2_alpha/capabilities.py b/synapse/rest/client/v2_alpha/capabilities.py index 90733cc785d2..2b4892330c4d 100644 --- a/synapse/rest/client/v2_alpha/capabilities.py +++ b/synapse/rest/client/v2_alpha/capabilities.py @@ -16,7 +16,7 @@ from twisted.internet import defer -from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, get_default_room_version +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.http.servlet import RestServlet from ._base import client_v2_patterns @@ -49,7 +49,7 @@ def on_GET(self, request): response = { "capabilities": { "m.room_versions": { - "default": get_default_room_version(self.config).identifier, + "default": self.config.default_room_version.identifier, "available": { v.identifier: v.disposition for v in KNOWN_ROOM_VERSIONS.values() diff --git a/tests/rest/client/v2_alpha/test_capabilities.py b/tests/rest/client/v2_alpha/test_capabilities.py index a27f2251057f..bce5b0cf4c70 100644 --- a/tests/rest/client/v2_alpha/test_capabilities.py +++ b/tests/rest/client/v2_alpha/test_capabilities.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import synapse.rest.admin -from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, get_default_room_version +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.rest.client.v1 import login from synapse.rest.client.v2_alpha import capabilities @@ -53,9 +53,9 @@ def test_get_room_version_capabilities(self): for room_version in capabilities['m.room_versions']['available'].keys(): self.assertTrue(room_version in KNOWN_ROOM_VERSIONS, "" + room_version) - default_room_version = get_default_room_version(self.config) self.assertEqual( - default_room_version.identifier, capabilities['m.room_versions']['default'] + self.config.default_room_version.identifier, + capabilities['m.room_versions']['default'], ) def test_get_change_password_capabilities(self): From e783dddcfd5c92b523e3e49fb6f5f63b714d7d44 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Wed, 22 May 2019 10:13:56 +0100 Subject: [PATCH 14/16] Add files --- synapse/util/dictutils.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 synapse/util/dictutils.py diff --git a/synapse/util/dictutils.py b/synapse/util/dictutils.py new file mode 100644 index 000000000000..71a5ddbe2a93 --- /dev/null +++ b/synapse/util/dictutils.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 The Matrix.org Foundation C.I.C. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def merge_dicts(*dicts): + """Merge multiple dictionaries together and return the result. + + Args: + dicts: Variable list of dictionary arguments. + + Returns: + Dict: A single dictionary as a result of merging the provided + dictionaries. + """ + merged = {} + for d in dicts: + merged.update(d) + return merged From 687501a6b3c9b7be63200d93d58f7fa4b8a56c6c Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Thu, 23 May 2019 14:02:51 +0100 Subject: [PATCH 15/16] less magic --- synapse/config/server.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/synapse/config/server.py b/synapse/config/server.py index 2a9ef30b1b5b..e9120d4d75e0 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -23,7 +23,6 @@ from synapse.api.room_versions import KNOWN_ROOM_VERSIONS from synapse.http.endpoint import parse_and_validate_server_name from synapse.python_dependencies import DependencyException, check_requirements -from synapse.util.dictutils import merge_dicts from ._base import Config, ConfigError @@ -330,6 +329,10 @@ def default_config(self, server_name, data_dir_path, **kwargs): unsecure_port = 8008 pid_file = os.path.join(data_dir_path, "homeserver.pid") + + # Bring DEFAULT_ROOM_VERSION into the local-scope for use in the + # default config string + default_room_version = DEFAULT_ROOM_VERSION return """\ ## Server ## @@ -411,7 +414,7 @@ def default_config(self, server_name, data_dir_path, **kwargs): # # For example, for room version 1, default_room_version should be set # to "1". - #default_room_version: "%(DEFAULT_ROOM_VERSION)s" + #default_room_version: "%(default_room_version)s" # The GC threshold parameters to pass to `gc.set_threshold`, if defined # @@ -611,7 +614,7 @@ def default_config(self, server_name, data_dir_path, **kwargs): # Defaults to 'true'. # #allow_per_room_profiles: false - """ % merge_dicts(locals(), globals()) + """ % locals() def read_arguments(self, args): if args.manhole is not None: From a807f7fb34405a2d0c99f122ced6bba6a272db3b Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Thu, 23 May 2019 14:17:37 +0100 Subject: [PATCH 16/16] bye bye dictutils --- synapse/util/dictutils.py | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 synapse/util/dictutils.py diff --git a/synapse/util/dictutils.py b/synapse/util/dictutils.py deleted file mode 100644 index 71a5ddbe2a93..000000000000 --- a/synapse/util/dictutils.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 The Matrix.org Foundation C.I.C. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -def merge_dicts(*dicts): - """Merge multiple dictionaries together and return the result. - - Args: - dicts: Variable list of dictionary arguments. - - Returns: - Dict: A single dictionary as a result of merging the provided - dictionaries. - """ - merged = {} - for d in dicts: - merged.update(d) - return merged