Skip to content
Snippets Groups Projects
room_versions.py 5.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • # -*- coding: utf-8 -*-
    # Copyright 2019 New Vector Ltd
    #
    # 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 typing import Dict
    
    
    class EventFormatVersions:
    
        """This is an internal enum for tracking the version of the event format,
        independently from the room version.
        """
    
    Amber Brown's avatar
    Amber Brown committed
    
        V1 = 1  # $id:server event id format
        V2 = 2  # MSC1659-style $hash event id format: introduced for room v3
        V3 = 3  # MSC1884-style $hash format: introduced for room v4
    
    
    
    KNOWN_EVENT_FORMAT_VERSIONS = {
        EventFormatVersions.V1,
        EventFormatVersions.V2,
    
    class StateResolutionVersions:
    
        """Enum to identify the state resolution algorithms"""
    
    Amber Brown's avatar
    Amber Brown committed
    
        V1 = 1  # room v1 state res
        V2 = 2  # MSC1442 state res: room v2 and later
    
    class RoomDisposition:
    
        STABLE = "stable"
        UNSTABLE = "unstable"
    
    
    @attr.s(slots=True, frozen=True)
    
    class RoomVersion:
    
        """An object which describes the unique attributes of a room version."""
    
    
        identifier = attr.ib(type=str)  # the identifier for this version
        disposition = attr.ib(type=str)  # one of the RoomDispositions
        event_format = attr.ib(type=int)  # one of the EventFormatVersions
        state_res = attr.ib(type=int)  # one of the StateResolutionVersions
        enforce_key_validity = attr.ib(type=bool)
    
        # Before MSC2261/MSC2432, m.room.aliases had special auth rules and redaction rules
    
        special_case_aliases_auth = attr.ib(type=bool)
    
        # Strictly enforce canonicaljson, do not allow:
        # * Integers outside the range of [-2 ^ 53 + 1, 2 ^ 53 - 1]
        # * Floats
        # * NaN, Infinity, -Infinity
        strict_canonicaljson = attr.ib(type=bool)
    
        # MSC2209: Check 'notifications' key while verifying
    
        # m.room.power_levels auth rules.
        limit_notifications_power_levels = attr.ib(type=bool)
    
        # MSC2174/MSC2176: Apply updated redaction rules algorithm.
        msc2176_redaction_rules = attr.ib(type=bool)
    
        # MSC3083: Support the 'restricted' join_rule.
        msc3083_join_rules = attr.ib(type=bool)
    
    class RoomVersions:
    
        V1 = RoomVersion(
            "1",
            RoomDisposition.STABLE,
            EventFormatVersions.V1,
            StateResolutionVersions.V1,
    
            special_case_aliases_auth=True,
    
            limit_notifications_power_levels=False,
    
            msc2176_redaction_rules=False,
    
        )
        V2 = RoomVersion(
            "2",
            RoomDisposition.STABLE,
            EventFormatVersions.V1,
            StateResolutionVersions.V2,
    
            special_case_aliases_auth=True,
    
            limit_notifications_power_levels=False,
    
            msc2176_redaction_rules=False,
    
        )
        V3 = RoomVersion(
            "3",
            RoomDisposition.STABLE,
            EventFormatVersions.V2,
            StateResolutionVersions.V2,
    
            special_case_aliases_auth=True,
    
            limit_notifications_power_levels=False,
    
            msc2176_redaction_rules=False,
    
        V4 = RoomVersion(
            "4",
            RoomDisposition.STABLE,
    
            EventFormatVersions.V3,
            StateResolutionVersions.V2,
    
            special_case_aliases_auth=True,
    
            limit_notifications_power_levels=False,
    
            msc2176_redaction_rules=False,
    
        V5 = RoomVersion(
            "5",
            RoomDisposition.STABLE,
    
            EventFormatVersions.V3,
            StateResolutionVersions.V2,
    
            special_case_aliases_auth=True,
    
            limit_notifications_power_levels=False,
    
            msc2176_redaction_rules=False,
    
        V6 = RoomVersion(
            "6",
            RoomDisposition.STABLE,
    
            EventFormatVersions.V3,
            StateResolutionVersions.V2,
            enforce_key_validity=True,
    
            limit_notifications_power_levels=True,
    
            msc2176_redaction_rules=False,
    
        )
        MSC2176 = RoomVersion(
            "org.matrix.msc2176",
            RoomDisposition.UNSTABLE,
            EventFormatVersions.V3,
            StateResolutionVersions.V2,
            enforce_key_validity=True,
            special_case_aliases_auth=False,
            strict_canonicaljson=True,
            limit_notifications_power_levels=True,
            msc2176_redaction_rules=True,
    
            msc3083_join_rules=False,
        )
        MSC3083 = RoomVersion(
            "org.matrix.msc3083",
            RoomDisposition.UNSTABLE,
            EventFormatVersions.V3,
            StateResolutionVersions.V2,
            enforce_key_validity=True,
            special_case_aliases_auth=False,
            strict_canonicaljson=True,
            limit_notifications_power_levels=True,
            msc2176_redaction_rules=False,
            msc3083_join_rules=True,
    
    Amber Brown's avatar
    Amber Brown committed
        v.identifier: v
        for v in (
    
            RoomVersions.V1,
            RoomVersions.V2,
            RoomVersions.V3,
    
            RoomVersions.V6,
    
            RoomVersions.MSC2176,
    
        # Note that we do not include MSC3083 here unless it is enabled in the config.
    
    }  # type: Dict[str, RoomVersion]