Skip to content

Commit cd05be3

Browse files
authored
Support MSC4446: Move fully read markers backwards (#59)
1 parent 5ef5d4d commit cd05be3

5 files changed

Lines changed: 44 additions & 1 deletion

File tree

synapse/config/experimental.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,3 +600,6 @@ def read_config(
600600
"beeper_user_notification_counts_enabled",
601601
False,
602602
)
603+
604+
# MSC4446: Allow moving the fully read marker backwards.
605+
self.msc4446_enabled: bool = experimental.get("msc4446_enabled", False)

synapse/handlers/read_marker.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ async def received_client_read_marker(
4444
room_id: str,
4545
user_id: str,
4646
event_id: str,
47+
allow_backward: bool = False,
4748
extra_content: Optional[JsonDict] = None,
4849
) -> None:
4950
"""Updates the read marker for a given user in a given room if the event ID given
@@ -62,7 +63,7 @@ async def received_client_read_marker(
6263
# Get event ordering, this also ensures we know about the event
6364
event_ordering = await self.store.get_event_ordering(event_id, room_id)
6465

65-
if existing_read_marker:
66+
if existing_read_marker and not allow_backward:
6667
try:
6768
old_event_ordering = await self.store.get_event_ordering(
6869
existing_read_marker["event_id"], room_id

synapse/rest/client/read_marker.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from typing import TYPE_CHECKING, Tuple
2424

2525
from synapse.api.constants import ReceiptTypes
26+
from synapse.api.errors import Codes, SynapseError
2627
from synapse.http.server import HttpServer
2728
from synapse.http.servlet import RestServlet, parse_json_object_from_request
2829
from synapse.http.site import SynapseRequest
@@ -73,6 +74,19 @@ async def handle_read_marker(
7374
)
7475

7576
unrecognized_types = set(body.keys()) - self._known_receipt_types
77+
78+
if self.config.experimental.msc4446_enabled:
79+
allow_backward = body.get("com.beeper.allow_backward", False)
80+
if not isinstance(allow_backward, bool):
81+
raise SynapseError(
82+
400,
83+
"com.beeper.allow_backward must be a boolean.",
84+
Codes.INVALID_PARAM,
85+
)
86+
unrecognized_types -= {"com.beeper.allow_backward"}
87+
else:
88+
allow_backward = False
89+
7690
if unrecognized_types:
7791
# It's fine if there are unrecognized receipt types, but let's log
7892
# it to help debug clients that have typoed the receipt type.
@@ -93,6 +107,7 @@ async def handle_read_marker(
93107
room_id,
94108
user_id=requester.user.to_string(),
95109
event_id=event_id,
110+
allow_backward=allow_backward,
96111
extra_content=body.get("com.beeper.fully_read.extra", None),
97112
)
98113
else:

synapse/rest/client/receipts.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#
2121

2222
import logging
23+
from http import HTTPStatus
2324
from typing import TYPE_CHECKING, Tuple
2425

2526
from synapse.api.constants import MAIN_TIMELINE, ReceiptTypes
@@ -50,6 +51,7 @@ def __init__(self, hs: "HomeServer"):
5051
self.read_marker_handler = hs.get_read_marker_handler()
5152
self.presence_handler = hs.get_presence_handler()
5253
self._main_store = hs.get_datastores().main
54+
self._msc4446_enabled = hs.config.experimental.msc4446_enabled
5355

5456
self._known_receipt_types = {
5557
ReceiptTypes.READ,
@@ -74,6 +76,25 @@ async def on_POST(
7476

7577
body = parse_json_object_from_request(request, allow_empty_body=False)
7678

79+
if self._msc4446_enabled:
80+
allow_backward = body.get("com.beeper.allow_backward", False)
81+
if not isinstance(allow_backward, bool):
82+
raise SynapseError(
83+
HTTPStatus.BAD_REQUEST,
84+
"com.beeper.allow_backward must be a boolean.",
85+
Codes.INVALID_PARAM,
86+
)
87+
88+
if allow_backward and receipt_type != ReceiptTypes.FULLY_READ:
89+
raise SynapseError(
90+
HTTPStatus.BAD_REQUEST,
91+
"com.beeper.allow_backward is only allowed to be true for "
92+
f"{ReceiptTypes.FULLY_READ}.",
93+
Codes.INVALID_PARAM,
94+
)
95+
else:
96+
allow_backward = False
97+
7798
# Pull the thread ID, if one exists.
7899
thread_id = None
79100
if "thread_id" in body:
@@ -109,6 +130,7 @@ async def on_POST(
109130
room_id,
110131
user_id=requester.user.to_string(),
111132
event_id=event_id,
133+
allow_backward=allow_backward,
112134
extra_content=body,
113135
)
114136
else:

synapse/rest/client/versions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
180180
"org.matrix.msc4155": self.config.experimental.msc4155_enabled,
181181
# MSC4306: Support for thread subscriptions
182182
"org.matrix.msc4306": self.config.experimental.msc4306_enabled,
183+
# MSC4446: Allow moving the fully read marker backwards.
184+
"com.beeper.msc4446": self.config.experimental.msc4446_enabled,
183185
# MSC4169: Backwards-compatible redaction sending using `/send`
184186
"com.beeper.msc4169": self.config.experimental.msc4169_enabled,
185187
},

0 commit comments

Comments
 (0)