diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 12eeb7c4cd..60391d07c4 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -1350,7 +1350,9 @@ class FederationHandler(BaseHandler):
"""Returns the state at the event. i.e. not including said event.
"""
- yield self._verify_events_in_room([event_id], room_id)
+ event = yield self.store.get_event(
+ event_id, allow_none=False, check_room_id=room_id,
+ )
state_groups = yield self.store.get_state_groups(
room_id, [event_id]
@@ -1362,8 +1364,7 @@ class FederationHandler(BaseHandler):
(e.type, e.state_key): e for e in state
}
- event = yield self.store.get_event(event_id)
- if event and event.is_state():
+ if event.is_state():
# Get previous state
if "replaces_state" in event.unsigned:
prev_id = event.unsigned["replaces_state"]
@@ -1394,8 +1395,9 @@ class FederationHandler(BaseHandler):
def get_state_ids_for_pdu(self, room_id, event_id):
"""Returns the state at the event. i.e. not including said event.
"""
-
- yield self._verify_events_in_room([event_id], room_id)
+ event = yield self.store.get_event(
+ event_id, allow_none=False, check_room_id=room_id,
+ )
state_groups = yield self.store.get_state_groups_ids(
room_id, [event_id]
@@ -1405,8 +1407,7 @@ class FederationHandler(BaseHandler):
_, state = state_groups.items().pop()
results = state
- event = yield self.store.get_event(event_id)
- if event and event.is_state():
+ if event.is_state():
# Get previous state
if "replaces_state" in event.unsigned:
prev_id = event.unsigned["replaces_state"]
@@ -1426,8 +1427,6 @@ class FederationHandler(BaseHandler):
if not in_room:
raise AuthError(403, "Host not in room.")
- yield self._verify_events_in_room(pdu_list, room_id)
-
events = yield self.store.get_backfill_events(
room_id,
pdu_list,
@@ -1723,7 +1722,9 @@ class FederationHandler(BaseHandler):
if not in_room:
raise AuthError(403, "Host not in room.")
- yield self._verify_events_in_room([event_id], room_id)
+ event = yield self.store.get_event(
+ event_id, allow_none=False, check_room_id=room_id
+ )
# Just go through and process each event in `remote_auth_chain`. We
# don't want to fall into the trap of `missing` being wrong.
@@ -1734,7 +1735,6 @@ class FederationHandler(BaseHandler):
pass
# Now get the current auth_chain for the event.
- event = yield self.store.get_event(event_id)
local_auth_chain = yield self.store.get_auth_chain(
[auth_id for auth_id, _ in event.auth_events],
include_given=True
@@ -2385,19 +2385,3 @@ class FederationHandler(BaseHandler):
)
if "valid" not in response or not response["valid"]:
raise AuthError(403, "Third party certificate was invalid")
-
- @defer.inlineCallbacks
- def _verify_events_in_room(self, pdu_ids, room_id):
- """Checks whether the given PDU IDs are in the given room or not.
-
- Args:
- pdu_ids (list): list of PDU IDs
- room_id (str): the room ID that the PDUs should be in
-
- Raises:
- AuthError: if one or more of the PDUs does not belong to the
- given room.
- """
- room_ids = yield self.store.get_room_ids_for_events(pdu_ids)
- if len(room_ids) != 1 or room_ids[0] != room_id:
- raise AuthError(403, "Events must belong to the given room")
diff --git a/synapse/storage/event_federation.py b/synapse/storage/event_federation.py
index e860fe1a1e..7cd77c1c29 100644
--- a/synapse/storage/event_federation.py
+++ b/synapse/storage/event_federation.py
@@ -295,35 +295,6 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore,
get_forward_extremeties_for_room_txn
)
- def get_room_ids_for_events(self, event_ids):
- """Get a list of room IDs for which the given events belong.
-
- Args:
- event_ids (list): the events to look up the room of
-
- Returns:
- list, the room IDs for the events
- """
- return self.runInteraction(
- "get_room_ids_for_events",
- self._get_room_ids_for_events, event_ids
- )
-
- def _get_room_ids_for_events(self, txn, event_ids):
- logger.debug("_get_room_ids_for_events: %s", repr(event_ids))
-
- base_sql = (
- "SELECT DISTINCT room_id FROM events"
- " WHERE event_id IN (%s)"
- )
-
- txn.execute(
- base_sql % (",".join(["?"] * len(event_ids)),),
- event_ids
- )
-
- return [r[0] for r in txn]
-
def get_backfill_events(self, room_id, event_list, limit):
"""Get a list of Events for a given topic that occurred before (and
including) the events in event_list. Return a list of max size `limit`
@@ -372,6 +343,7 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore,
table="events",
keyvalues={
"event_id": event_id,
+ "room_id": room_id,
},
retcol="depth",
allow_none=True,
diff --git a/synapse/storage/events_worker.py b/synapse/storage/events_worker.py
index 67433606c6..6b8a8e908f 100644
--- a/synapse/storage/events_worker.py
+++ b/synapse/storage/events_worker.py
@@ -19,7 +19,7 @@ from canonicaljson import json
from twisted.internet import defer
-from synapse.api.errors import SynapseError
+from synapse.api.errors import NotFoundError
# these are only included to make the type annotations work
from synapse.events import EventBase # noqa: F401
from synapse.events import FrozenEvent
@@ -76,7 +76,7 @@ class EventsWorkerStore(SQLBaseStore):
@defer.inlineCallbacks
def get_event(self, event_id, check_redacted=True,
get_prev_content=False, allow_rejected=False,
- allow_none=False):
+ allow_none=False, check_room_id=None):
"""Get an event from the database by event_id.
Args:
@@ -87,7 +87,9 @@ class EventsWorkerStore(SQLBaseStore):
include the previous states content in the unsigned field.
allow_rejected (bool): If True return rejected events.
allow_none (bool): If True, return None if no event found, if
- False throw an exception.
+ False throw a NotFoundError
+ check_room_id (str|None): if not None, check the room of the found event.
+ If there is a mismatch, behave as per allow_none.
Returns:
Deferred : A FrozenEvent.
@@ -99,10 +101,16 @@ class EventsWorkerStore(SQLBaseStore):
allow_rejected=allow_rejected,
)
- if not events and not allow_none:
- raise SynapseError(404, "Could not find event %s" % (event_id,))
+ event = events[0] if events else None
- defer.returnValue(events[0] if events else None)
+ if event is not None and check_room_id is not None:
+ if event.room_id != check_room_id:
+ event = None
+
+ if event is None and not allow_none:
+ raise NotFoundError("Could not find event %s" % (event_id,))
+
+ defer.returnValue(event)
@defer.inlineCallbacks
def get_events(self, event_ids, check_redacted=True,
|