|
17 | 17 | from twisted.internet.defer import succeed
|
18 | 18 |
|
19 | 19 | from synapse.api.errors import FederationError
|
| 20 | +from synapse.api.room_versions import RoomVersions |
20 | 21 | from synapse.events import make_event_from_dict
|
| 22 | +from synapse.federation.federation_base import event_from_pdu_json |
21 | 23 | from synapse.logging.context import LoggingContext
|
22 | 24 | from synapse.types import UserID, create_requester
|
23 | 25 | from synapse.util import Clock
|
@@ -276,3 +278,73 @@ def test_cross_signing_keys_retry(self):
|
276 | 278 | "ed25519:" + remote_self_signing_key in self_signing_key["keys"].keys(),
|
277 | 279 | )
|
278 | 280 | self.assertTrue(remote_self_signing_key in self_signing_key["keys"].values())
|
| 281 | + |
| 282 | + |
| 283 | +class StripUnsignedFromEventsTestCase(unittest.TestCase): |
| 284 | + def test_strip_unauthorized_unsigned_values(self): |
| 285 | + event1 = { |
| 286 | + "sender": "@baduser:test.serv", |
| 287 | + "state_key": "@baduser:test.serv", |
| 288 | + "event_id": "$event1:test.serv", |
| 289 | + "depth": 1000, |
| 290 | + "origin_server_ts": 1, |
| 291 | + "type": "m.room.member", |
| 292 | + "origin": "test.servx", |
| 293 | + "content": {"membership": "join"}, |
| 294 | + "auth_events": [], |
| 295 | + "unsigned": {"malicious garbage": "hackz", "more warez": "more hackz"}, |
| 296 | + } |
| 297 | + filtered_event = event_from_pdu_json(event1, RoomVersions.V1) |
| 298 | + # Make sure unauthorized fields are stripped from unsigned |
| 299 | + self.assertNotIn("more warez", filtered_event.unsigned) |
| 300 | + |
| 301 | + def test_strip_event_maintains_allowed_fields(self): |
| 302 | + event2 = { |
| 303 | + "sender": "@baduser:test.serv", |
| 304 | + "state_key": "@baduser:test.serv", |
| 305 | + "event_id": "$event2:test.serv", |
| 306 | + "depth": 1000, |
| 307 | + "origin_server_ts": 1, |
| 308 | + "type": "m.room.member", |
| 309 | + "origin": "test.servx", |
| 310 | + "auth_events": [], |
| 311 | + "content": {"membership": "join"}, |
| 312 | + "unsigned": { |
| 313 | + "malicious garbage": "hackz", |
| 314 | + "more warez": "more hackz", |
| 315 | + "age": 14, |
| 316 | + "invite_room_state": [], |
| 317 | + }, |
| 318 | + } |
| 319 | + |
| 320 | + filtered_event2 = event_from_pdu_json(event2, RoomVersions.V1) |
| 321 | + self.assertIn("age", filtered_event2.unsigned) |
| 322 | + self.assertEqual(14, filtered_event2.unsigned["age"]) |
| 323 | + self.assertNotIn("more warez", filtered_event2.unsigned) |
| 324 | + # Invite_room_state is allowed in events of type m.room.member |
| 325 | + self.assertIn("invite_room_state", filtered_event2.unsigned) |
| 326 | + self.assertEqual([], filtered_event2.unsigned["invite_room_state"]) |
| 327 | + |
| 328 | + def test_strip_event_removes_fields_based_on_event_type(self): |
| 329 | + event3 = { |
| 330 | + "sender": "@baduser:test.serv", |
| 331 | + "state_key": "@baduser:test.serv", |
| 332 | + "event_id": "$event3:test.serv", |
| 333 | + "depth": 1000, |
| 334 | + "origin_server_ts": 1, |
| 335 | + "type": "m.room.power_levels", |
| 336 | + "origin": "test.servx", |
| 337 | + "content": {}, |
| 338 | + "auth_events": [], |
| 339 | + "unsigned": { |
| 340 | + "malicious garbage": "hackz", |
| 341 | + "more warez": "more hackz", |
| 342 | + "age": 14, |
| 343 | + "invite_room_state": [], |
| 344 | + }, |
| 345 | + } |
| 346 | + filtered_event3 = event_from_pdu_json(event3, RoomVersions.V1) |
| 347 | + self.assertIn("age", filtered_event3.unsigned) |
| 348 | + # Invite_room_state field is only permitted in event type m.room.member |
| 349 | + self.assertNotIn("invite_room_state", filtered_event3.unsigned) |
| 350 | + self.assertNotIn("more warez", filtered_event3.unsigned) |
0 commit comments