Replace room_invite_state_types with room_prejoin_state (#9700)

`room_invite_state_types` was inconvenient as a configuration setting, because
anyone that ever set it would not receive any new types that were added to the
defaults. Here, we deprecate the old setting, and replace it with a couple of
new settings under `room_prejoin_state`.
This commit is contained in:
Richard van der Hoff 2021-03-30 12:12:44 +01:00 committed by GitHub
parent 963f4309fe
commit f02663c4dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 144 additions and 43 deletions

1
changelog.d/9700.feature Normal file
View File

@ -0,0 +1 @@
Replace the `room_invite_state_types` configuration setting with `room_prejoin_state`.

View File

@ -173,18 +173,10 @@ report_stats: False
## API Configuration ## ## API Configuration ##
room_invite_state_types:
- "m.room.join_rules"
- "m.room.canonical_alias"
- "m.room.avatar"
- "m.room.name"
{% if SYNAPSE_APPSERVICES %} {% if SYNAPSE_APPSERVICES %}
app_service_config_files: app_service_config_files:
{% for appservice in SYNAPSE_APPSERVICES %} - "{{ appservice }}" {% for appservice in SYNAPSE_APPSERVICES %} - "{{ appservice }}"
{% endfor %} {% endfor %}
{% else %}
app_service_config_files: []
{% endif %} {% endif %}
macaroon_secret_key: "{{ SYNAPSE_MACAROON_SECRET_KEY }}" macaroon_secret_key: "{{ SYNAPSE_MACAROON_SECRET_KEY }}"

View File

@ -128,6 +128,9 @@ Some guidelines follow:
will be if no sub-options are enabled). will be if no sub-options are enabled).
- Lines should be wrapped at 80 characters. - Lines should be wrapped at 80 characters.
- Use two-space indents. - Use two-space indents.
- `true` and `false` are spelt thus (as opposed to `True`, etc.)
- Use single quotes (`'`) rather than double-quotes (`"`) or backticks
(`` ` ``) to refer to configuration options.
Example: Example:

View File

@ -1451,14 +1451,31 @@ metrics_flags:
## API Configuration ## ## API Configuration ##
# A list of event types that will be included in the room_invite_state # Controls for the state that is shared with users who receive an invite
# to a room
# #
#room_invite_state_types: room_prejoin_state:
# - "m.room.join_rules" # By default, the following state event types are shared with users who
# - "m.room.canonical_alias" # receive invites to the room:
# - "m.room.avatar" #
# - "m.room.encryption" # - m.room.join_rules
# - "m.room.name" # - m.room.canonical_alias
# - m.room.avatar
# - m.room.encryption
# - m.room.name
#
# Uncomment the following to disable these defaults (so that only the event
# types listed in 'additional_event_types' are shared). Defaults to 'false'.
#
#disable_default_event_types: true
# Additional state event types to share with users when they are invited
# to a room.
#
# By default, this list is empty (so only the default event types are shared).
#
#additional_event_types:
# - org.example.custom.event.type
# A list of application service config files to use # A list of application service config files to use

View File

@ -1,4 +1,4 @@
# Copyright 2015, 2016 OpenMarket Ltd # Copyright 2015-2021 The Matrix.org Foundation C.I.C.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -12,38 +12,127 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from synapse.api.constants import EventTypes import logging
from typing import Iterable
from ._base import Config from synapse.api.constants import EventTypes
from synapse.config._base import Config, ConfigError
from synapse.config._util import validate_config
from synapse.types import JsonDict
logger = logging.getLogger(__name__)
class ApiConfig(Config): class ApiConfig(Config):
section = "api" section = "api"
def read_config(self, config, **kwargs): def read_config(self, config: JsonDict, **kwargs):
self.room_invite_state_types = config.get( validate_config(_MAIN_SCHEMA, config, ())
"room_invite_state_types", self.room_prejoin_state = list(self._get_prejoin_state_types(config))
[
EventTypes.JoinRules, def generate_config_section(cls, **kwargs) -> str:
EventTypes.CanonicalAlias, formatted_default_state_types = "\n".join(
EventTypes.RoomAvatar, " # - %s" % (t,) for t in _DEFAULT_PREJOIN_STATE_TYPES
EventTypes.RoomEncryption,
EventTypes.Name,
],
) )
def generate_config_section(cls, **kwargs):
return """\ return """\
## API Configuration ## ## API Configuration ##
# A list of event types that will be included in the room_invite_state # Controls for the state that is shared with users who receive an invite
# to a room
# #
#room_invite_state_types: room_prejoin_state:
# - "{JoinRules}" # By default, the following state event types are shared with users who
# - "{CanonicalAlias}" # receive invites to the room:
# - "{RoomAvatar}" #
# - "{RoomEncryption}" %(formatted_default_state_types)s
# - "{Name}" #
""".format( # Uncomment the following to disable these defaults (so that only the event
**vars(EventTypes) # types listed in 'additional_event_types' are shared). Defaults to 'false'.
) #
#disable_default_event_types: true
# Additional state event types to share with users when they are invited
# to a room.
#
# By default, this list is empty (so only the default event types are shared).
#
#additional_event_types:
# - org.example.custom.event.type
""" % {
"formatted_default_state_types": formatted_default_state_types
}
def _get_prejoin_state_types(self, config: JsonDict) -> Iterable[str]:
"""Get the event types to include in the prejoin state
Parses the config and returns an iterable of the event types to be included.
"""
room_prejoin_state_config = config.get("room_prejoin_state") or {}
# backwards-compatibility support for room_invite_state_types
if "room_invite_state_types" in config:
# if both "room_invite_state_types" and "room_prejoin_state" are set, then
# we don't really know what to do.
if room_prejoin_state_config:
raise ConfigError(
"Can't specify both 'room_invite_state_types' and 'room_prejoin_state' "
"in config"
)
logger.warning(_ROOM_INVITE_STATE_TYPES_WARNING)
yield from config["room_invite_state_types"]
return
if not room_prejoin_state_config.get("disable_default_event_types"):
yield from _DEFAULT_PREJOIN_STATE_TYPES
yield from room_prejoin_state_config.get("additional_event_types", [])
_ROOM_INVITE_STATE_TYPES_WARNING = """\
WARNING: The 'room_invite_state_types' configuration setting is now deprecated,
and replaced with 'room_prejoin_state'. New features may not work correctly
unless 'room_invite_state_types' is removed. See the sample configuration file for
details of 'room_prejoin_state'.
--------------------------------------------------------------------------------
"""
_DEFAULT_PREJOIN_STATE_TYPES = [
EventTypes.JoinRules,
EventTypes.CanonicalAlias,
EventTypes.RoomAvatar,
EventTypes.RoomEncryption,
EventTypes.Name,
]
# room_prejoin_state can either be None (as it is in the default config), or
# an object containing other config settings
_ROOM_PREJOIN_STATE_CONFIG_SCHEMA = {
"oneOf": [
{
"type": "object",
"properties": {
"disable_default_event_types": {"type": "boolean"},
"additional_event_types": {
"type": "array",
"items": {"type": "string"},
},
},
},
{"type": "null"},
]
}
# the legacy room_invite_state_types setting
_ROOM_INVITE_STATE_TYPES_SCHEMA = {"type": "array", "items": {"type": "string"}}
_MAIN_SCHEMA = {
"type": "object",
"properties": {
"room_prejoin_state": _ROOM_PREJOIN_STATE_CONFIG_SCHEMA,
"room_invite_state_types": _ROOM_INVITE_STATE_TYPES_SCHEMA,
},
}

View File

@ -385,7 +385,7 @@ class EventCreationHandler:
self._events_shard_config = self.config.worker.events_shard_config self._events_shard_config = self.config.worker.events_shard_config
self._instance_name = hs.get_instance_name() self._instance_name = hs.get_instance_name()
self.room_invite_state_types = self.hs.config.room_invite_state_types self.room_invite_state_types = self.hs.config.api.room_prejoin_state
self.membership_types_to_include_profile_data_in = ( self.membership_types_to_include_profile_data_in = (
{Membership.JOIN, Membership.INVITE} {Membership.JOIN, Membership.INVITE}

View File

@ -16,7 +16,7 @@
import logging import logging
import threading import threading
from collections import namedtuple from collections import namedtuple
from typing import Dict, Iterable, List, Optional, Tuple, overload from typing import Container, Dict, Iterable, List, Optional, Tuple, overload
from constantly import NamedConstant, Names from constantly import NamedConstant, Names
from typing_extensions import Literal from typing_extensions import Literal
@ -544,7 +544,7 @@ class EventsWorkerStore(SQLBaseStore):
async def get_stripped_room_state_from_event_context( async def get_stripped_room_state_from_event_context(
self, self,
context: EventContext, context: EventContext,
state_types_to_include: List[EventTypes], state_types_to_include: Container[str],
membership_user_id: Optional[str] = None, membership_user_id: Optional[str] = None,
) -> List[JsonDict]: ) -> List[JsonDict]:
""" """

View File

@ -122,7 +122,6 @@ def default_config(name, parse=False):
"enable_registration_captcha": False, "enable_registration_captcha": False,
"macaroon_secret_key": "not even a little secret", "macaroon_secret_key": "not even a little secret",
"trusted_third_party_id_servers": [], "trusted_third_party_id_servers": [],
"room_invite_state_types": [],
"password_providers": [], "password_providers": [],
"worker_replication_url": "", "worker_replication_url": "",
"worker_app": None, "worker_app": None,