Add a test room version which updates event ID format (#5210)

Implements MSC1884
This commit is contained in:
Richard van der Hoff 2019-05-20 15:54:42 +01:00 committed by GitHub
parent edef6d29ae
commit 5206648a4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 3 deletions

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

@ -0,0 +1 @@
Add a new room version which uses a new event ID format.

View File

@ -19,13 +19,15 @@ class EventFormatVersions(object):
"""This is an internal enum for tracking the version of the event format, """This is an internal enum for tracking the version of the event format,
independently from the room version. independently from the room version.
""" """
V1 = 1 # $id:server format V1 = 1 # $id:server event id format
V2 = 2 # MSC1659-style $hash format: introduced for room v3 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 = { KNOWN_EVENT_FORMAT_VERSIONS = {
EventFormatVersions.V1, EventFormatVersions.V1,
EventFormatVersions.V2, EventFormatVersions.V2,
EventFormatVersions.V3,
} }
@ -75,6 +77,12 @@ class RoomVersions(object):
EventFormatVersions.V2, EventFormatVersions.V2,
StateResolutionVersions.V2, StateResolutionVersions.V2,
) )
EVENTID_NOSLASH_TEST = RoomVersion(
"eventid-noslash-test",
RoomDisposition.UNSTABLE,
EventFormatVersions.V3,
StateResolutionVersions.V2,
)
# the version we will give rooms which are created on this server # the version we will give rooms which are created on this server
@ -87,5 +95,6 @@ KNOWN_ROOM_VERSIONS = {
RoomVersions.V2, RoomVersions.V2,
RoomVersions.V3, RoomVersions.V3,
RoomVersions.STATE_V2_TEST, RoomVersions.STATE_V2_TEST,
RoomVersions.EVENTID_NOSLASH_TEST,
) )
} # type: dict[str, RoomVersion] } # type: dict[str, RoomVersion]

View File

@ -335,13 +335,32 @@ class FrozenEventV2(EventBase):
return self.__repr__() return self.__repr__()
def __repr__(self): def __repr__(self):
return "<FrozenEventV2 event_id='%s', type='%s', state_key='%s'>" % ( return "<%s event_id='%s', type='%s', state_key='%s'>" % (
self.__class__.__name__,
self.event_id, self.event_id,
self.get("type", None), self.get("type", None),
self.get("state_key", None), self.get("state_key", None),
) )
class FrozenEventV3(FrozenEventV2):
"""FrozenEventV3, which differs from FrozenEventV2 only in the event_id format"""
format_version = EventFormatVersions.V3 # All events of this type are V3
@property
def event_id(self):
# We have to import this here as otherwise we get an import loop which
# is hard to break.
from synapse.crypto.event_signing import compute_event_reference_hash
if self._event_id:
return self._event_id
self._event_id = "$" + encode_base64(
compute_event_reference_hash(self)[1], urlsafe=True
)
return self._event_id
def room_version_to_event_format(room_version): def room_version_to_event_format(room_version):
"""Converts a room version string to the event format """Converts a room version string to the event format
@ -376,6 +395,8 @@ def event_type_from_format_version(format_version):
return FrozenEvent return FrozenEvent
elif format_version == EventFormatVersions.V2: elif format_version == EventFormatVersions.V2:
return FrozenEventV2 return FrozenEventV2
elif format_version == EventFormatVersions.V3:
return FrozenEventV3
else: else:
raise Exception( raise Exception(
"No event format %r" % (format_version,) "No event format %r" % (format_version,)