|
25 | 25 |
|
26 | 26 | from twisted.test.proto_helpers import MemoryReactor
|
27 | 27 |
|
28 |
| -from synapse.api.room_versions import KNOWN_ROOM_VERSIONS |
| 28 | +from synapse.api.constants import EventTypes |
| 29 | +from synapse.api.errors import NotFoundError |
| 30 | +from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersions |
29 | 31 | from synapse.config.server import DEFAULT_ROOM_VERSION
|
30 | 32 | from synapse.events import EventBase, make_event_from_dict
|
31 | 33 | from synapse.rest import admin
|
@@ -84,6 +86,55 @@ async def failing_handler(_origin: str, _content: JsonDict) -> None:
|
84 | 86 | )
|
85 | 87 | self.assertEqual(500, channel.code, channel.result)
|
86 | 88 |
|
| 89 | + def test_accept_valid_pdus_and_ignore_invalid(self) -> None: |
| 90 | + user = self.register_user("nex", "test") |
| 91 | + tok = self.login("nex", "test") |
| 92 | + room_id = self.helper.create_room_as("nex", tok=tok) |
| 93 | + |
| 94 | + builder = self.hs.get_event_builder_factory().for_room_version( |
| 95 | + RoomVersions.V10, |
| 96 | + { |
| 97 | + "type": EventTypes.Message, |
| 98 | + "sender": user, |
| 99 | + "room_id": room_id, |
| 100 | + "content": {"body": "hello i am nexy", "msgtype": "m.text"}, |
| 101 | + }, |
| 102 | + ) |
| 103 | + event1, _ = self.get_success( |
| 104 | + self.hs.get_event_creation_handler().create_new_client_event(builder) |
| 105 | + ) |
| 106 | + event2, _ = self.get_success( |
| 107 | + self.hs.get_event_creation_handler().create_new_client_event( |
| 108 | + builder, prev_event_ids=[event1.event_id] |
| 109 | + ) |
| 110 | + ) |
| 111 | + |
| 112 | + event1_json = event1.get_pdu_json() |
| 113 | + event2_json = event2.get_pdu_json() |
| 114 | + |
| 115 | + logging.info("Purposefully adding event id that shouldn't be there") |
| 116 | + event2_json["event_id"] = event2.event_id |
| 117 | + |
| 118 | + channel = self.make_signed_federation_request( |
| 119 | + "PUT", |
| 120 | + "/_matrix/federation/v1/send/txn", |
| 121 | + {"pdus": [event1_json, event2_json]}, |
| 122 | + ) |
| 123 | + body = channel.json_body |
| 124 | + logging.info(f"Response body: {body}") |
| 125 | + self.assertTrue(body["pdus"][event1.event_id] == {}) |
| 126 | + self.assertTrue(body["pdus"][event2.event_id]["error"] != "") |
| 127 | + result = self.get_success( |
| 128 | + self.hs.get_storage_controllers().main.get_event(event1.event_id) |
| 129 | + ) |
| 130 | + self.assertEqual(result.event_id, event1.event_id) |
| 131 | + |
| 132 | + # Make sure the corrupt event isn't persisted |
| 133 | + self.get_failure( |
| 134 | + self.hs.get_storage_controllers().main.get_event(event2.event_id), |
| 135 | + NotFoundError, |
| 136 | + ) |
| 137 | + |
87 | 138 |
|
88 | 139 | class ServerACLsTestCase(unittest.TestCase):
|
89 | 140 | def test_blocked_server(self) -> None:
|
|
0 commit comments