mirror of
https://mau.dev/maunium/synapse.git
synced 2024-11-15 22:42:23 +01:00
Prevent historical state from being pushed to an application service via /transactions
(MSC2716) (#11265)
Mark historical state from the MSC2716 `/batch_send` endpoint as `historical` which makes it `backfilled` and have a negative `stream_ordering` so it doesn't get queried by `/transactions`. Fix https://github.com/matrix-org/synapse/issues/11241 Complement tests: https://github.com/matrix-org/complement/pull/221
This commit is contained in:
parent
92b75388f5
commit
7ffddd819c
4 changed files with 39 additions and 2 deletions
1
changelog.d/11265.bugfix
Normal file
1
changelog.d/11265.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Prevent [MSC2716](https://github.com/matrix-org/matrix-doc/pull/2716) historical state events from being pushed to an application service via `/transactions`.
|
|
@ -231,13 +231,32 @@ class ApplicationServiceApi(SimpleHttpClient):
|
||||||
json_body=body,
|
json_body=body,
|
||||||
args={"access_token": service.hs_token},
|
args={"access_token": service.hs_token},
|
||||||
)
|
)
|
||||||
|
if logger.isEnabledFor(logging.DEBUG):
|
||||||
|
logger.debug(
|
||||||
|
"push_bulk to %s succeeded! events=%s",
|
||||||
|
uri,
|
||||||
|
[event.get("event_id") for event in events],
|
||||||
|
)
|
||||||
sent_transactions_counter.labels(service.id).inc()
|
sent_transactions_counter.labels(service.id).inc()
|
||||||
sent_events_counter.labels(service.id).inc(len(events))
|
sent_events_counter.labels(service.id).inc(len(events))
|
||||||
return True
|
return True
|
||||||
except CodeMessageException as e:
|
except CodeMessageException as e:
|
||||||
logger.warning("push_bulk to %s received %s", uri, e.code)
|
logger.warning(
|
||||||
|
"push_bulk to %s received code=%s msg=%s",
|
||||||
|
uri,
|
||||||
|
e.code,
|
||||||
|
e.msg,
|
||||||
|
exc_info=logger.isEnabledFor(logging.DEBUG),
|
||||||
|
)
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
logger.warning("push_bulk to %s threw exception %s", uri, ex)
|
logger.warning(
|
||||||
|
"push_bulk to %s threw exception(%s) %s args=%s",
|
||||||
|
uri,
|
||||||
|
type(ex).__name__,
|
||||||
|
ex,
|
||||||
|
ex.args,
|
||||||
|
exc_info=logger.isEnabledFor(logging.DEBUG),
|
||||||
|
)
|
||||||
failed_transactions_counter.labels(service.id).inc()
|
failed_transactions_counter.labels(service.id).inc()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,7 @@ class RoomBatchHandler:
|
||||||
action=membership,
|
action=membership,
|
||||||
content=event_dict["content"],
|
content=event_dict["content"],
|
||||||
outlier=True,
|
outlier=True,
|
||||||
|
historical=True,
|
||||||
prev_event_ids=[prev_event_id_for_state_chain],
|
prev_event_ids=[prev_event_id_for_state_chain],
|
||||||
# Make sure to use a copy of this list because we modify it
|
# Make sure to use a copy of this list because we modify it
|
||||||
# later in the loop here. Otherwise it will be the same
|
# later in the loop here. Otherwise it will be the same
|
||||||
|
@ -240,6 +241,7 @@ class RoomBatchHandler:
|
||||||
),
|
),
|
||||||
event_dict,
|
event_dict,
|
||||||
outlier=True,
|
outlier=True,
|
||||||
|
historical=True,
|
||||||
prev_event_ids=[prev_event_id_for_state_chain],
|
prev_event_ids=[prev_event_id_for_state_chain],
|
||||||
# Make sure to use a copy of this list because we modify it
|
# Make sure to use a copy of this list because we modify it
|
||||||
# later in the loop here. Otherwise it will be the same
|
# later in the loop here. Otherwise it will be the same
|
||||||
|
|
|
@ -268,6 +268,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
content: Optional[dict] = None,
|
content: Optional[dict] = None,
|
||||||
require_consent: bool = True,
|
require_consent: bool = True,
|
||||||
outlier: bool = False,
|
outlier: bool = False,
|
||||||
|
historical: bool = False,
|
||||||
) -> Tuple[str, int]:
|
) -> Tuple[str, int]:
|
||||||
"""
|
"""
|
||||||
Internal membership update function to get an existing event or create
|
Internal membership update function to get an existing event or create
|
||||||
|
@ -293,6 +294,9 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
outlier: Indicates whether the event is an `outlier`, i.e. if
|
outlier: Indicates whether the event is an `outlier`, i.e. if
|
||||||
it's from an arbitrary point and floating in the DAG as
|
it's from an arbitrary point and floating in the DAG as
|
||||||
opposed to being inline with the current DAG.
|
opposed to being inline with the current DAG.
|
||||||
|
historical: Indicates whether the message is being inserted
|
||||||
|
back in time around some existing events. This is used to skip
|
||||||
|
a few checks and mark the event as backfilled.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Tuple of event ID and stream ordering position
|
Tuple of event ID and stream ordering position
|
||||||
|
@ -337,6 +341,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
auth_event_ids=auth_event_ids,
|
auth_event_ids=auth_event_ids,
|
||||||
require_consent=require_consent,
|
require_consent=require_consent,
|
||||||
outlier=outlier,
|
outlier=outlier,
|
||||||
|
historical=historical,
|
||||||
)
|
)
|
||||||
|
|
||||||
prev_state_ids = await context.get_prev_state_ids()
|
prev_state_ids = await context.get_prev_state_ids()
|
||||||
|
@ -433,6 +438,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
new_room: bool = False,
|
new_room: bool = False,
|
||||||
require_consent: bool = True,
|
require_consent: bool = True,
|
||||||
outlier: bool = False,
|
outlier: bool = False,
|
||||||
|
historical: bool = False,
|
||||||
prev_event_ids: Optional[List[str]] = None,
|
prev_event_ids: Optional[List[str]] = None,
|
||||||
auth_event_ids: Optional[List[str]] = None,
|
auth_event_ids: Optional[List[str]] = None,
|
||||||
) -> Tuple[str, int]:
|
) -> Tuple[str, int]:
|
||||||
|
@ -454,6 +460,9 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
outlier: Indicates whether the event is an `outlier`, i.e. if
|
outlier: Indicates whether the event is an `outlier`, i.e. if
|
||||||
it's from an arbitrary point and floating in the DAG as
|
it's from an arbitrary point and floating in the DAG as
|
||||||
opposed to being inline with the current DAG.
|
opposed to being inline with the current DAG.
|
||||||
|
historical: Indicates whether the message is being inserted
|
||||||
|
back in time around some existing events. This is used to skip
|
||||||
|
a few checks and mark the event as backfilled.
|
||||||
prev_event_ids: The event IDs to use as the prev events
|
prev_event_ids: The event IDs to use as the prev events
|
||||||
auth_event_ids:
|
auth_event_ids:
|
||||||
The event ids to use as the auth_events for the new event.
|
The event ids to use as the auth_events for the new event.
|
||||||
|
@ -487,6 +496,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
new_room=new_room,
|
new_room=new_room,
|
||||||
require_consent=require_consent,
|
require_consent=require_consent,
|
||||||
outlier=outlier,
|
outlier=outlier,
|
||||||
|
historical=historical,
|
||||||
prev_event_ids=prev_event_ids,
|
prev_event_ids=prev_event_ids,
|
||||||
auth_event_ids=auth_event_ids,
|
auth_event_ids=auth_event_ids,
|
||||||
)
|
)
|
||||||
|
@ -507,6 +517,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
new_room: bool = False,
|
new_room: bool = False,
|
||||||
require_consent: bool = True,
|
require_consent: bool = True,
|
||||||
outlier: bool = False,
|
outlier: bool = False,
|
||||||
|
historical: bool = False,
|
||||||
prev_event_ids: Optional[List[str]] = None,
|
prev_event_ids: Optional[List[str]] = None,
|
||||||
auth_event_ids: Optional[List[str]] = None,
|
auth_event_ids: Optional[List[str]] = None,
|
||||||
) -> Tuple[str, int]:
|
) -> Tuple[str, int]:
|
||||||
|
@ -530,6 +541,9 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
outlier: Indicates whether the event is an `outlier`, i.e. if
|
outlier: Indicates whether the event is an `outlier`, i.e. if
|
||||||
it's from an arbitrary point and floating in the DAG as
|
it's from an arbitrary point and floating in the DAG as
|
||||||
opposed to being inline with the current DAG.
|
opposed to being inline with the current DAG.
|
||||||
|
historical: Indicates whether the message is being inserted
|
||||||
|
back in time around some existing events. This is used to skip
|
||||||
|
a few checks and mark the event as backfilled.
|
||||||
prev_event_ids: The event IDs to use as the prev events
|
prev_event_ids: The event IDs to use as the prev events
|
||||||
auth_event_ids:
|
auth_event_ids:
|
||||||
The event ids to use as the auth_events for the new event.
|
The event ids to use as the auth_events for the new event.
|
||||||
|
@ -657,6 +671,7 @@ class RoomMemberHandler(metaclass=abc.ABCMeta):
|
||||||
content=content,
|
content=content,
|
||||||
require_consent=require_consent,
|
require_consent=require_consent,
|
||||||
outlier=outlier,
|
outlier=outlier,
|
||||||
|
historical=historical,
|
||||||
)
|
)
|
||||||
|
|
||||||
latest_event_ids = await self.store.get_prev_events_for_room(room_id)
|
latest_event_ids = await self.store.get_prev_events_for_room(room_id)
|
||||||
|
|
Loading…
Reference in a new issue