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:
parent
963f4309fe
commit
f02663c4dd
|
@ -0,0 +1 @@
|
||||||
|
Replace the `room_invite_state_types` configuration setting with `room_prejoin_state`.
|
|
@ -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 }}"
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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]:
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue