Skip to content
Snippets Groups Projects
spam_checker.md 3.64 KiB

This page of the Synapse documentation is now deprecated. For up to date documentation on setting up or writing a spam checker module, please see this page.

Handling spam in Synapse

Synapse has support to customize spam checking behavior. It can plug into a variety of events and affect how they are presented to users on your homeserver.

The spam checking behavior is implemented as a Python class, which must be able to be imported by the running Synapse.

Python spam checker class

The Python class is instantiated with two objects:

  • Any configuration (see below).
  • An instance of synapse.module_api.ModuleApi.

It then implements methods which return a boolean to alter behavior in Synapse. All the methods must be defined.

There's a generic method for checking every event (check_event_for_spam), as well as some specific methods:

  • user_may_invite
  • user_may_create_room
  • user_may_create_room_alias
  • user_may_publish_room
  • check_username_for_spam
  • check_registration_for_spam
  • check_media_file_for_spam

The details of each of these methods (as well as their inputs and outputs) are documented in the synapse.events.spamcheck.SpamChecker class.

The ModuleApi class provides a way for the custom spam checker class to call back into the homeserver internals.

Additionally, a parse_config method is mandatory and receives the plugin config dictionary. After parsing, It must return an object which will be passed to __init__ later.

Example

from synapse.spam_checker_api import RegistrationBehaviour

class ExampleSpamChecker:
    def __init__(self, config, api):
        self.config = config
        self.api = api

    @staticmethod
    def parse_config(config):
        return config
        
    async def check_event_for_spam(self, foo):
        return False  # allow all events

    async def user_may_invite(self, inviter_userid, invitee_userid, room_id):
        return True  # allow all invites

    async def user_may_create_room(self, userid):
        return True  # allow all room creations

    async def user_may_create_room_alias(self, userid, room_alias):
        return True  # allow all room aliases

    async def user_may_publish_room(self, userid, room_id):
        return True  # allow publishing of all rooms

    async def check_username_for_spam(self, user_profile):
        return False  # allow all usernames

    async def check_registration_for_spam(
        self,
        email_threepid,
        username,
        request_info,
        auth_provider_id,
    ):
        return RegistrationBehaviour.ALLOW  # allow all registrations

    async def check_media_file_for_spam(self, file_wrapper, file_info):
        return False  # allow all media

Configuration

Modify the spam_checker section of your homeserver.yaml in the following manner:

Create a list entry with the keys module and config.

  • module should point to the fully qualified Python class that implements your custom logic, e.g. my_module.ExampleSpamChecker.

  • config is a dictionary that gets passed to the spam checker class.

Example