Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 46c8a85

Browse files
committed
Add tests for spam checker.
1 parent bc84745 commit 46c8a85

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

tests/handlers/test_register.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,21 @@
1717

1818
from twisted.internet import defer
1919

20+
from synapse.api.auth import Auth
2021
from synapse.api.constants import UserTypes
2122
from synapse.api.errors import Codes, ResourceLimitError, SynapseError
2223
from synapse.handlers.register import RegistrationHandler
24+
from synapse.spam_checker_api import RegistrationBehaviour
2325
from synapse.types import RoomAlias, UserID, create_requester
2426

2527
from tests.test_utils import make_awaitable
2628
from tests.unittest import override_config
29+
from tests.utils import mock_getRawHeaders
2730

2831
from .. import unittest
2932

3033

31-
class RegistrationHandlers(object):
34+
class RegistrationHandlers:
3235
def __init__(self, hs):
3336
self.registration_handler = RegistrationHandler(hs)
3437

@@ -475,6 +478,53 @@ def test_invalid_user_id_length(self):
475478
self.handler.register_user(localpart=invalid_user_id), SynapseError
476479
)
477480

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+
478528
async def get_or_create_user(
479529
self, requester, localpart, displayname, password_hash=None
480530
):

tests/handlers/test_user_directory.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ def test_encrypted_by_default_config_option_off(self):
238238

239239
def test_spam_checker(self):
240240
"""
241-
A user which fails to the spam checks will not appear in search results.
241+
A user which fails the spam checks will not appear in search results.
242242
"""
243243
u1 = self.register_user("user1", "pass")
244244
u1_token = self.login(u1, "pass")
@@ -269,7 +269,7 @@ def test_spam_checker(self):
269269
# Configure a spam checker that does not filter any users.
270270
spam_checker = self.hs.get_spam_checker()
271271

272-
class AllowAll(object):
272+
class AllowAll:
273273
def check_username_for_spam(self, user_profile):
274274
# Allow all users.
275275
return False
@@ -282,7 +282,7 @@ def check_username_for_spam(self, user_profile):
282282
self.assertEqual(len(s["results"]), 1)
283283

284284
# Configure a spam checker that filters all users.
285-
class BlockAll(object):
285+
class BlockAll:
286286
def check_username_for_spam(self, user_profile):
287287
# All users are spammy.
288288
return True

0 commit comments

Comments
 (0)