|
23 | 23 | import hmac
|
24 | 24 | import json
|
25 | 25 | import os
|
| 26 | +import time |
26 | 27 | import urllib.parse
|
27 | 28 | from binascii import unhexlify
|
28 | 29 | from http import HTTPStatus
|
|
56 | 57 | from synapse.util import Clock
|
57 | 58 |
|
58 | 59 | from tests import unittest
|
| 60 | +from tests.replication._base import BaseMultiWorkerStreamTestCase |
59 | 61 | from tests.test_utils import SMALL_PNG
|
60 | 62 | from tests.unittest import override_config
|
61 | 63 |
|
@@ -5127,7 +5129,6 @@ def test_redact_messages_all_rooms(self) -> None:
|
5127 | 5129 | """
|
5128 | 5130 | Test that request to redact events in all rooms user is member of is successful
|
5129 | 5131 | """
|
5130 |
| - |
5131 | 5132 | # join rooms, send some messages
|
5132 | 5133 | originals = []
|
5133 | 5134 | for rm in [self.rm1, self.rm2, self.rm3]:
|
@@ -5404,3 +5405,98 @@ def test_admin_redact_works_if_user_kicked_or_banned(self) -> None:
|
5404 | 5405 | matches.append((event_id, event))
|
5405 | 5406 | # we redacted 6 messages
|
5406 | 5407 | self.assertEqual(len(matches), 6)
|
| 5408 | + |
| 5409 | + |
| 5410 | +class UserRedactionBackgroundTaskTestCase(BaseMultiWorkerStreamTestCase): |
| 5411 | + servlets = [ |
| 5412 | + synapse.rest.admin.register_servlets, |
| 5413 | + login.register_servlets, |
| 5414 | + admin.register_servlets, |
| 5415 | + room.register_servlets, |
| 5416 | + sync.register_servlets, |
| 5417 | + ] |
| 5418 | + |
| 5419 | + def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None: |
| 5420 | + self.admin = self.register_user("thomas", "pass", True) |
| 5421 | + self.admin_tok = self.login("thomas", "pass") |
| 5422 | + |
| 5423 | + self.bad_user = self.register_user("teresa", "pass") |
| 5424 | + self.bad_user_tok = self.login("teresa", "pass") |
| 5425 | + |
| 5426 | + # create rooms - room versions 11+ store the `redacts` key in content while |
| 5427 | + # earlier ones don't so we use a mix of room versions |
| 5428 | + self.rm1 = self.helper.create_room_as( |
| 5429 | + self.admin, tok=self.admin_tok, room_version="7" |
| 5430 | + ) |
| 5431 | + self.rm2 = self.helper.create_room_as(self.admin, tok=self.admin_tok) |
| 5432 | + self.rm3 = self.helper.create_room_as( |
| 5433 | + self.admin, tok=self.admin_tok, room_version="11" |
| 5434 | + ) |
| 5435 | + |
| 5436 | + @override_config({"run_background_tasks_on": "worker1"}) |
| 5437 | + def test_redact_messages_all_rooms(self) -> None: |
| 5438 | + """ |
| 5439 | + Test that redact task successfully runs when `run_background_tasks_on` is specified |
| 5440 | + """ |
| 5441 | + self.make_worker_hs( |
| 5442 | + "synapse.app.generic_worker", |
| 5443 | + extra_config={ |
| 5444 | + "worker_name": "worker1", |
| 5445 | + "run_background_tasks_on": "worker1", |
| 5446 | + "redis": {"enabled": True}, |
| 5447 | + }, |
| 5448 | + ) |
| 5449 | + |
| 5450 | + # join rooms, send some messages |
| 5451 | + original_event_ids = set() |
| 5452 | + for rm in [self.rm1, self.rm2, self.rm3]: |
| 5453 | + join = self.helper.join(rm, self.bad_user, tok=self.bad_user_tok) |
| 5454 | + original_event_ids.add(join["event_id"]) |
| 5455 | + for i in range(15): |
| 5456 | + event = {"body": f"hello{i}", "msgtype": "m.text"} |
| 5457 | + res = self.helper.send_event( |
| 5458 | + rm, "m.room.message", event, tok=self.bad_user_tok, expect_code=200 |
| 5459 | + ) |
| 5460 | + original_event_ids.add(res["event_id"]) |
| 5461 | + |
| 5462 | + # redact all events in all rooms |
| 5463 | + channel = self.make_request( |
| 5464 | + "POST", |
| 5465 | + f"/_synapse/admin/v1/user/{self.bad_user}/redact", |
| 5466 | + content={"rooms": []}, |
| 5467 | + access_token=self.admin_tok, |
| 5468 | + ) |
| 5469 | + self.assertEqual(channel.code, 200) |
| 5470 | + id = channel.json_body.get("redact_id") |
| 5471 | + |
| 5472 | + timeout_s = 10 |
| 5473 | + start_time = time.time() |
| 5474 | + redact_result = "" |
| 5475 | + while redact_result != "complete": |
| 5476 | + if start_time + timeout_s < time.time(): |
| 5477 | + self.fail("Timed out waiting for redactions.") |
| 5478 | + |
| 5479 | + channel2 = self.make_request( |
| 5480 | + "GET", |
| 5481 | + f"/_synapse/admin/v1/user/redact_status/{id}", |
| 5482 | + access_token=self.admin_tok, |
| 5483 | + ) |
| 5484 | + redact_result = channel2.json_body["status"] |
| 5485 | + if redact_result == "failed": |
| 5486 | + self.fail("Redaction task failed.") |
| 5487 | + |
| 5488 | + redaction_ids = set() |
| 5489 | + for rm in [self.rm1, self.rm2, self.rm3]: |
| 5490 | + filter = json.dumps({"types": [EventTypes.Redaction]}) |
| 5491 | + channel = self.make_request( |
| 5492 | + "GET", |
| 5493 | + f"rooms/{rm}/messages?filter={filter}&limit=50", |
| 5494 | + access_token=self.admin_tok, |
| 5495 | + ) |
| 5496 | + self.assertEqual(channel.code, 200) |
| 5497 | + |
| 5498 | + for event in channel.json_body["chunk"]: |
| 5499 | + if event["type"] == "m.room.redaction": |
| 5500 | + redaction_ids.add(event["redacts"]) |
| 5501 | + |
| 5502 | + self.assertIncludes(redaction_ids, original_event_ids, exact=True) |
0 commit comments