diff --git a/synapse/rest/client/notifications.py b/synapse/rest/client/notifications.py
index ff040de6b8..24bc7c9095 100644
--- a/synapse/rest/client/notifications.py
+++ b/synapse/rest/client/notifications.py
@@ -58,7 +58,7 @@ class NotificationsServlet(RestServlet):
)
receipts_by_room = await self.store.get_receipts_for_user_with_orderings(
- user_id, ReceiptTypes.READ
+ user_id, [ReceiptTypes.READ, ReceiptTypes.READ_PRIVATE]
)
notif_event_ids = [pa.event_id for pa in push_actions]
diff --git a/synapse/rest/client/read_marker.py b/synapse/rest/client/read_marker.py
index f51be511d1..1583e903cd 100644
--- a/synapse/rest/client/read_marker.py
+++ b/synapse/rest/client/read_marker.py
@@ -15,8 +15,8 @@
import logging
from typing import TYPE_CHECKING, Tuple
-from synapse.api.constants import ReadReceiptEventFields, ReceiptTypes
-from synapse.api.errors import Codes, SynapseError
+from synapse.api.constants import ReceiptTypes
+from synapse.api.errors import SynapseError
from synapse.http.server import HttpServer
from synapse.http.servlet import RestServlet, parse_json_object_from_request
from synapse.http.site import SynapseRequest
@@ -36,6 +36,7 @@ class ReadMarkerRestServlet(RestServlet):
def __init__(self, hs: "HomeServer"):
super().__init__()
self.auth = hs.get_auth()
+ self.config = hs.config
self.receipts_handler = hs.get_receipts_handler()
self.read_marker_handler = hs.get_read_marker_handler()
self.presence_handler = hs.get_presence_handler()
@@ -48,27 +49,38 @@ class ReadMarkerRestServlet(RestServlet):
await self.presence_handler.bump_presence_active_time(requester.user)
body = parse_json_object_from_request(request)
- read_event_id = body.get(ReceiptTypes.READ, None)
- hidden = body.get(ReadReceiptEventFields.MSC2285_HIDDEN, False)
- if not isinstance(hidden, bool):
+ valid_receipt_types = {ReceiptTypes.READ, ReceiptTypes.FULLY_READ}
+ if self.config.experimental.msc2285_enabled:
+ valid_receipt_types.add(ReceiptTypes.READ_PRIVATE)
+
+ if set(body.keys()) > valid_receipt_types:
raise SynapseError(
400,
- "Param %s must be a boolean, if given"
- % ReadReceiptEventFields.MSC2285_HIDDEN,
- Codes.BAD_JSON,
+ "Receipt type must be 'm.read', 'org.matrix.msc2285.read.private' or 'm.fully_read'"
+ if self.config.experimental.msc2285_enabled
+ else "Receipt type must be 'm.read' or 'm.fully_read'",
)
+ read_event_id = body.get(ReceiptTypes.READ, None)
if read_event_id:
await self.receipts_handler.received_client_receipt(
room_id,
ReceiptTypes.READ,
user_id=requester.user.to_string(),
event_id=read_event_id,
- hidden=hidden,
)
- read_marker_event_id = body.get("m.fully_read", None)
+ read_private_event_id = body.get(ReceiptTypes.READ_PRIVATE, None)
+ if read_private_event_id and self.config.experimental.msc2285_enabled:
+ await self.receipts_handler.received_client_receipt(
+ room_id,
+ ReceiptTypes.READ_PRIVATE,
+ user_id=requester.user.to_string(),
+ event_id=read_private_event_id,
+ )
+
+ read_marker_event_id = body.get(ReceiptTypes.FULLY_READ, None)
if read_marker_event_id:
await self.read_marker_handler.received_client_read_marker(
room_id,
diff --git a/synapse/rest/client/receipts.py b/synapse/rest/client/receipts.py
index b24ad2d1be..f9caab6635 100644
--- a/synapse/rest/client/receipts.py
+++ b/synapse/rest/client/receipts.py
@@ -16,8 +16,8 @@ import logging
import re
from typing import TYPE_CHECKING, Tuple
-from synapse.api.constants import ReadReceiptEventFields, ReceiptTypes
-from synapse.api.errors import Codes, SynapseError
+from synapse.api.constants import ReceiptTypes
+from synapse.api.errors import SynapseError
from synapse.http import get_request_user_agent
from synapse.http.server import HttpServer
from synapse.http.servlet import RestServlet, parse_json_object_from_request
@@ -46,6 +46,7 @@ class ReceiptRestServlet(RestServlet):
self.hs = hs
self.auth = hs.get_auth()
self.receipts_handler = hs.get_receipts_handler()
+ self.read_marker_handler = hs.get_read_marker_handler()
self.presence_handler = hs.get_presence_handler()
async def on_POST(
@@ -53,7 +54,19 @@ class ReceiptRestServlet(RestServlet):
) -> Tuple[int, JsonDict]:
requester = await self.auth.get_user_by_req(request)
- if receipt_type != ReceiptTypes.READ:
+ if self.hs.config.experimental.msc2285_enabled and receipt_type not in [
+ ReceiptTypes.READ,
+ ReceiptTypes.READ_PRIVATE,
+ ReceiptTypes.FULLY_READ,
+ ]:
+ raise SynapseError(
+ 400,
+ "Receipt type must be 'm.read', 'org.matrix.msc2285.read.private' or 'm.fully_read'",
+ )
+ elif (
+ not self.hs.config.experimental.msc2285_enabled
+ and receipt_type != ReceiptTypes.READ
+ ):
raise SynapseError(400, "Receipt type must be 'm.read'")
# Do not allow older SchildiChat and Element Android clients (prior to Element/1.[012].x) to send an empty body.
@@ -62,26 +75,24 @@ class ReceiptRestServlet(RestServlet):
if "Android" in user_agent:
if pattern.match(user_agent) or "Riot" in user_agent:
allow_empty_body = True
- body = parse_json_object_from_request(request, allow_empty_body)
- hidden = body.get(ReadReceiptEventFields.MSC2285_HIDDEN, False)
-
- if not isinstance(hidden, bool):
- raise SynapseError(
- 400,
- "Param %s must be a boolean, if given"
- % ReadReceiptEventFields.MSC2285_HIDDEN,
- Codes.BAD_JSON,
- )
+ # This call makes sure possible empty body is handled correctly
+ parse_json_object_from_request(request, allow_empty_body)
await self.presence_handler.bump_presence_active_time(requester.user)
- await self.receipts_handler.received_client_receipt(
- room_id,
- receipt_type,
- user_id=requester.user.to_string(),
- event_id=event_id,
- hidden=hidden,
- )
+ if receipt_type == ReceiptTypes.FULLY_READ:
+ await self.read_marker_handler.received_client_read_marker(
+ room_id,
+ user_id=requester.user.to_string(),
+ event_id=event_id,
+ )
+ else:
+ await self.receipts_handler.received_client_receipt(
+ room_id,
+ receipt_type,
+ user_id=requester.user.to_string(),
+ event_id=event_id,
+ )
return 200, {}
|