mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-06 09:54:56 -04:00
Do not allow cross-room relations, per MSC2674. (#11516)
This commit is contained in:
parent
0cc3bf97b4
commit
3b8872299a
6 changed files with 161 additions and 17 deletions
|
@ -37,6 +37,7 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
async def get_relations_for_event(
|
||||
self,
|
||||
event_id: str,
|
||||
room_id: str,
|
||||
relation_type: Optional[str] = None,
|
||||
event_type: Optional[str] = None,
|
||||
aggregation_key: Optional[str] = None,
|
||||
|
@ -49,6 +50,7 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
|
||||
Args:
|
||||
event_id: Fetch events that relate to this event ID.
|
||||
room_id: The room the event belongs to.
|
||||
relation_type: Only fetch events with this relation type, if given.
|
||||
event_type: Only fetch events with this event type, if given.
|
||||
aggregation_key: Only fetch events with this aggregation key, if given.
|
||||
|
@ -63,8 +65,8 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
the form `{"event_id": "..."}`.
|
||||
"""
|
||||
|
||||
where_clause = ["relates_to_id = ?"]
|
||||
where_args: List[Union[str, int]] = [event_id]
|
||||
where_clause = ["relates_to_id = ?", "room_id = ?"]
|
||||
where_args: List[Union[str, int]] = [event_id, room_id]
|
||||
|
||||
if relation_type is not None:
|
||||
where_clause.append("relation_type = ?")
|
||||
|
@ -199,6 +201,7 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
async def get_aggregation_groups_for_event(
|
||||
self,
|
||||
event_id: str,
|
||||
room_id: str,
|
||||
event_type: Optional[str] = None,
|
||||
limit: int = 5,
|
||||
direction: str = "b",
|
||||
|
@ -213,6 +216,7 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
|
||||
Args:
|
||||
event_id: Fetch events that relate to this event ID.
|
||||
room_id: The room the event belongs to.
|
||||
event_type: Only fetch events with this event type, if given.
|
||||
limit: Only fetch the `limit` groups.
|
||||
direction: Whether to fetch the highest count first (`"b"`) or
|
||||
|
@ -225,8 +229,12 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
`type`, `key` and `count` fields.
|
||||
"""
|
||||
|
||||
where_clause = ["relates_to_id = ?", "relation_type = ?"]
|
||||
where_args: List[Union[str, int]] = [event_id, RelationTypes.ANNOTATION]
|
||||
where_clause = ["relates_to_id = ?", "room_id = ?", "relation_type = ?"]
|
||||
where_args: List[Union[str, int]] = [
|
||||
event_id,
|
||||
room_id,
|
||||
RelationTypes.ANNOTATION,
|
||||
]
|
||||
|
||||
if event_type:
|
||||
where_clause.append("type = ?")
|
||||
|
@ -288,7 +296,9 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
)
|
||||
|
||||
@cached()
|
||||
async def get_applicable_edit(self, event_id: str) -> Optional[EventBase]:
|
||||
async def get_applicable_edit(
|
||||
self, event_id: str, room_id: str
|
||||
) -> Optional[EventBase]:
|
||||
"""Get the most recent edit (if any) that has happened for the given
|
||||
event.
|
||||
|
||||
|
@ -296,6 +306,7 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
|
||||
Args:
|
||||
event_id: The original event ID
|
||||
room_id: The original event's room ID
|
||||
|
||||
Returns:
|
||||
The most recent edit, if any.
|
||||
|
@ -317,13 +328,14 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
WHERE
|
||||
relates_to_id = ?
|
||||
AND relation_type = ?
|
||||
AND edit.room_id = ?
|
||||
AND edit.type = 'm.room.message'
|
||||
ORDER by edit.origin_server_ts DESC, edit.event_id DESC
|
||||
LIMIT 1
|
||||
"""
|
||||
|
||||
def _get_applicable_edit_txn(txn: LoggingTransaction) -> Optional[str]:
|
||||
txn.execute(sql, (event_id, RelationTypes.REPLACE))
|
||||
txn.execute(sql, (event_id, RelationTypes.REPLACE, room_id))
|
||||
row = txn.fetchone()
|
||||
if row:
|
||||
return row[0]
|
||||
|
@ -340,13 +352,14 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
|
||||
@cached()
|
||||
async def get_thread_summary(
|
||||
self, event_id: str
|
||||
self, event_id: str, room_id: str
|
||||
) -> Tuple[int, Optional[EventBase]]:
|
||||
"""Get the number of threaded replies, the senders of those replies, and
|
||||
the latest reply (if any) for the given event.
|
||||
|
||||
Args:
|
||||
event_id: The original event ID
|
||||
event_id: Summarize the thread related to this event ID.
|
||||
room_id: The room the event belongs to.
|
||||
|
||||
Returns:
|
||||
The number of items in the thread and the most recent response, if any.
|
||||
|
@ -363,12 +376,13 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
INNER JOIN events USING (event_id)
|
||||
WHERE
|
||||
relates_to_id = ?
|
||||
AND room_id = ?
|
||||
AND relation_type = ?
|
||||
ORDER BY topological_ordering DESC, stream_ordering DESC
|
||||
LIMIT 1
|
||||
"""
|
||||
|
||||
txn.execute(sql, (event_id, RelationTypes.THREAD))
|
||||
txn.execute(sql, (event_id, room_id, RelationTypes.THREAD))
|
||||
row = txn.fetchone()
|
||||
if row is None:
|
||||
return 0, None
|
||||
|
@ -378,11 +392,13 @@ class RelationsWorkerStore(SQLBaseStore):
|
|||
sql = """
|
||||
SELECT COALESCE(COUNT(event_id), 0)
|
||||
FROM event_relations
|
||||
INNER JOIN events USING (event_id)
|
||||
WHERE
|
||||
relates_to_id = ?
|
||||
AND room_id = ?
|
||||
AND relation_type = ?
|
||||
"""
|
||||
txn.execute(sql, (event_id, RelationTypes.THREAD))
|
||||
txn.execute(sql, (event_id, room_id, RelationTypes.THREAD))
|
||||
count = txn.fetchone()[0] # type: ignore[index]
|
||||
|
||||
return count, latest_event_id
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue