|
17 | 17 |
|
18 | 18 | from twisted.internet import defer
|
19 | 19 |
|
| 20 | +from synapse.api.auth import Auth |
20 | 21 | from synapse.api.constants import UserTypes
|
21 | 22 | from synapse.api.errors import Codes, ResourceLimitError, SynapseError
|
22 | 23 | from synapse.handlers.register import RegistrationHandler
|
| 24 | +from synapse.spam_checker_api import RegistrationBehaviour |
23 | 25 | from synapse.types import RoomAlias, UserID, create_requester
|
24 | 26 |
|
25 | 27 | from tests.test_utils import make_awaitable
|
26 | 28 | from tests.unittest import override_config
|
| 29 | +from tests.utils import mock_getRawHeaders |
27 | 30 |
|
28 | 31 | from .. import unittest
|
29 | 32 |
|
30 | 33 |
|
31 |
| -class RegistrationHandlers(object): |
| 34 | +class RegistrationHandlers: |
32 | 35 | def __init__(self, hs):
|
33 | 36 | self.registration_handler = RegistrationHandler(hs)
|
34 | 37 |
|
@@ -475,6 +478,53 @@ def test_invalid_user_id_length(self):
|
475 | 478 | self.handler.register_user(localpart=invalid_user_id), SynapseError
|
476 | 479 | )
|
477 | 480 |
|
| 481 | + def test_spam_checker_deny(self): |
| 482 | + """A spam checker can deny registration, which results in an error.""" |
| 483 | + |
| 484 | + class DenyAll: |
| 485 | + def check_registration_for_spam( |
| 486 | + self, email_threepid, username, request_info |
| 487 | + ): |
| 488 | + return RegistrationBehaviour.DENY |
| 489 | + |
| 490 | + # Configure a spam checker that denies all users. |
| 491 | + spam_checker = self.hs.get_spam_checker() |
| 492 | + spam_checker.spam_checkers = [DenyAll()] |
| 493 | + |
| 494 | + self.get_failure(self.handler.register_user(localpart="user"), SynapseError) |
| 495 | + |
| 496 | + def test_spam_checker_shadow_ban(self): |
| 497 | + """A spam checker can choose to shadow-ban a user, which allows registration to succeed.""" |
| 498 | + |
| 499 | + class BanAll: |
| 500 | + def check_registration_for_spam( |
| 501 | + self, email_threepid, username, request_info |
| 502 | + ): |
| 503 | + return RegistrationBehaviour.SHADOW_BAN |
| 504 | + |
| 505 | + # Configure a spam checker that denies all users. |
| 506 | + spam_checker = self.hs.get_spam_checker() |
| 507 | + spam_checker.spam_checkers = [BanAll()] |
| 508 | + |
| 509 | + user_id = self.get_success(self.handler.register_user(localpart="user")) |
| 510 | + |
| 511 | + # Get an access token. |
| 512 | + token = self.macaroon_generator.generate_access_token(user_id) |
| 513 | + self.get_success( |
| 514 | + self.store.add_access_token_to_user( |
| 515 | + user_id=user_id, token=token, device_id=None, valid_until_ms=None |
| 516 | + ) |
| 517 | + ) |
| 518 | + |
| 519 | + # Ensure the user was marked as shadow-banned. |
| 520 | + request = Mock(args={}) |
| 521 | + request.args[b"access_token"] = [token.encode("ascii")] |
| 522 | + request.requestHeaders.getRawHeaders = mock_getRawHeaders() |
| 523 | + auth = Auth(self.hs) |
| 524 | + requester = self.get_success(auth.get_user_by_req(request)) |
| 525 | + |
| 526 | + self.assertTrue(requester.shadow_banned) |
| 527 | + |
478 | 528 | async def get_or_create_user(
|
479 | 529 | self, requester, localpart, displayname, password_hash=None
|
480 | 530 | ):
|
|
0 commit comments