2021-06-18 13:15:52 +02:00
|
|
|
# Copyright 2021 The Matrix.org Foundation C.I.C.
|
2014-08-12 16:10:52 +02:00
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
|
|
|
|
2014-08-13 04:14:34 +02:00
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
# This file provides some classes for setting up (partially-populated)
|
|
|
|
# homeservers; either as a full homeserver as a real application, or a small
|
|
|
|
# partial one for unit test mocking.
|
|
|
|
|
2022-02-23 12:04:02 +01:00
|
|
|
|
2018-08-28 18:10:43 +02:00
|
|
|
import abc
|
2020-08-11 19:00:17 +02:00
|
|
|
import functools
|
2016-08-01 19:02:07 +02:00
|
|
|
import logging
|
2023-02-09 15:49:04 +01:00
|
|
|
from typing import TYPE_CHECKING, Callable, Dict, List, Optional, TypeVar, cast
|
2016-08-01 19:02:07 +02:00
|
|
|
|
2023-03-09 20:12:09 +01:00
|
|
|
from typing_extensions import TypeAlias
|
|
|
|
|
2021-11-10 21:06:54 +01:00
|
|
|
from twisted.internet.interfaces import IOpenSSLContextFactory
|
|
|
|
from twisted.internet.tcp import Port
|
2020-08-11 19:00:17 +02:00
|
|
|
from twisted.web.iweb import IPolicyForHTTPS
|
2021-11-10 21:06:54 +01:00
|
|
|
from twisted.web.resource import Resource
|
2016-01-26 14:52:29 +01:00
|
|
|
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.api.auth import Auth
|
2022-06-17 14:48:55 +02:00
|
|
|
from synapse.api.auth.internal import InternalAuth
|
2022-06-14 10:51:15 +02:00
|
|
|
from synapse.api.auth_blocking import AuthBlocking
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.api.filtering import Filtering
|
2021-10-08 13:44:43 +02:00
|
|
|
from synapse.api.ratelimiting import Ratelimiter, RequestRatelimiter
|
2016-05-31 14:53:48 +02:00
|
|
|
from synapse.appservice.api import ApplicationServiceApi
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.appservice.scheduler import ApplicationServiceScheduler
|
2019-12-11 18:27:46 +01:00
|
|
|
from synapse.config.homeserver import HomeServerConfig
|
2019-02-11 19:03:30 +01:00
|
|
|
from synapse.crypto import context_factory
|
2020-03-17 22:32:25 +01:00
|
|
|
from synapse.crypto.context_factory import RegularPolicyForHTTPS
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.crypto.keyring import Keyring
|
|
|
|
from synapse.events.builder import EventBuilderFactory
|
2021-04-06 15:38:30 +02:00
|
|
|
from synapse.events.presence_router import PresenceRouter
|
2019-05-09 14:21:57 +02:00
|
|
|
from synapse.events.utils import EventClientSerializer
|
2018-03-12 15:34:31 +01:00
|
|
|
from synapse.federation.federation_client import FederationClient
|
2018-07-09 08:09:20 +02:00
|
|
|
from synapse.federation.federation_server import (
|
|
|
|
FederationHandlerRegistry,
|
|
|
|
FederationServer,
|
|
|
|
)
|
2016-11-16 18:34:44 +01:00
|
|
|
from synapse.federation.send_queue import FederationRemoteSendQueue
|
2021-03-29 17:43:20 +02:00
|
|
|
from synapse.federation.sender import AbstractFederationSender, FederationSender
|
2018-07-09 08:09:20 +02:00
|
|
|
from synapse.federation.transport.client import TransportLayerClient
|
2022-02-22 16:10:10 +01:00
|
|
|
from synapse.handlers.account import AccountHandler
|
2021-01-18 16:47:59 +01:00
|
|
|
from synapse.handlers.account_data import AccountDataHandler
|
2019-04-10 18:58:47 +02:00
|
|
|
from synapse.handlers.account_validity import AccountValidityHandler
|
2020-10-09 13:24:34 +02:00
|
|
|
from synapse.handlers.admin import AdminHandler
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.handlers.appservice import ApplicationServicesHandler
|
2022-06-14 15:12:08 +02:00
|
|
|
from synapse.handlers.auth import AuthHandler, PasswordAuthProvider
|
2021-04-20 20:55:20 +02:00
|
|
|
from synapse.handlers.cas import CasHandler
|
2017-11-29 12:48:43 +01:00
|
|
|
from synapse.handlers.deactivate_account import DeactivateAccountHandler
|
2019-03-04 19:24:32 +01:00
|
|
|
from synapse.handlers.device import DeviceHandler, DeviceWorkerHandler
|
2018-07-09 08:09:20 +02:00
|
|
|
from synapse.handlers.devicemessage import DeviceMessageHandler
|
2020-10-09 13:24:34 +02:00
|
|
|
from synapse.handlers.directory import DirectoryHandler
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.handlers.e2e_keys import E2eKeysHandler
|
2017-12-05 22:44:25 +01:00
|
|
|
from synapse.handlers.e2e_room_keys import E2eRoomKeysHandler
|
2021-04-23 13:05:51 +02:00
|
|
|
from synapse.handlers.event_auth import EventAuthHandler
|
2018-07-09 08:09:20 +02:00
|
|
|
from synapse.handlers.events import EventHandler, EventStreamHandler
|
2020-10-09 13:24:34 +02:00
|
|
|
from synapse.handlers.federation import FederationHandler
|
2021-08-26 22:41:44 +02:00
|
|
|
from synapse.handlers.federation_event import FederationEventHandler
|
2020-10-09 13:24:34 +02:00
|
|
|
from synapse.handlers.identity import IdentityHandler
|
2018-07-09 08:09:20 +02:00
|
|
|
from synapse.handlers.initial_sync import InitialSyncHandler
|
2018-07-20 16:32:23 +02:00
|
|
|
from synapse.handlers.message import EventCreationHandler, MessageHandler
|
|
|
|
from synapse.handlers.pagination import PaginationHandler
|
2020-03-26 17:51:13 +01:00
|
|
|
from synapse.handlers.password_policy import PasswordPolicyHandler
|
2021-04-14 18:06:06 +02:00
|
|
|
from synapse.handlers.presence import (
|
|
|
|
BasePresenceHandler,
|
|
|
|
PresenceHandler,
|
|
|
|
WorkerPresenceHandler,
|
|
|
|
)
|
2020-10-13 14:20:32 +02:00
|
|
|
from synapse.handlers.profile import ProfileHandler
|
2022-04-27 15:55:33 +02:00
|
|
|
from synapse.handlers.push_rules import PushRulesHandler
|
2018-07-09 08:09:20 +02:00
|
|
|
from synapse.handlers.read_marker import ReadMarkerHandler
|
|
|
|
from synapse.handlers.receipts import ReceiptsHandler
|
2019-02-20 08:47:31 +01:00
|
|
|
from synapse.handlers.register import RegistrationHandler
|
2022-03-16 15:39:15 +01:00
|
|
|
from synapse.handlers.relations import RelationsHandler
|
2020-07-14 13:36:23 +02:00
|
|
|
from synapse.handlers.room import (
|
|
|
|
RoomContextHandler,
|
|
|
|
RoomCreationHandler,
|
|
|
|
RoomShutdownHandler,
|
2021-12-02 08:02:20 +01:00
|
|
|
TimestampLookupHandler,
|
2020-07-14 13:36:23 +02:00
|
|
|
)
|
2016-09-14 15:07:37 +02:00
|
|
|
from synapse.handlers.room_list import RoomListHandler
|
2023-05-03 13:27:33 +02:00
|
|
|
from synapse.handlers.room_member import (
|
|
|
|
RoomForgetterHandler,
|
|
|
|
RoomMemberHandler,
|
|
|
|
RoomMemberMasterHandler,
|
|
|
|
)
|
2018-03-14 12:41:45 +01:00
|
|
|
from synapse.handlers.room_member_worker import RoomMemberWorkerHandler
|
2021-08-16 16:49:12 +02:00
|
|
|
from synapse.handlers.room_summary import RoomSummaryHandler
|
2020-10-09 13:24:34 +02:00
|
|
|
from synapse.handlers.search import SearchHandler
|
2021-05-17 12:33:38 +02:00
|
|
|
from synapse.handlers.send_email import SendEmailHandler
|
2017-11-29 15:10:46 +01:00
|
|
|
from synapse.handlers.set_password import SetPasswordHandler
|
2020-11-17 15:46:23 +01:00
|
|
|
from synapse.handlers.sso import SsoHandler
|
2019-05-21 18:36:50 +02:00
|
|
|
from synapse.handlers.stats import StatsHandler
|
2016-05-16 21:19:26 +02:00
|
|
|
from synapse.handlers.sync import SyncHandler
|
2020-07-16 16:12:54 +02:00
|
|
|
from synapse.handlers.typing import FollowerTypingHandler, TypingWriterHandler
|
2017-11-29 17:46:45 +01:00
|
|
|
from synapse.handlers.user_directory import UserDirectoryHandler
|
2023-07-31 11:58:03 +02:00
|
|
|
from synapse.handlers.worker_lock import WorkerLocksHandler
|
2023-05-09 20:25:20 +02:00
|
|
|
from synapse.http.client import (
|
|
|
|
InsecureInterceptableContextFactory,
|
|
|
|
ReplicationClient,
|
|
|
|
SimpleHttpClient,
|
|
|
|
)
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
2023-02-27 14:26:05 +01:00
|
|
|
from synapse.media.media_repository import MediaRepository
|
2022-09-05 12:26:43 +02:00
|
|
|
from synapse.metrics.common_usage_metrics import CommonUsageMetricsManager
|
2020-10-07 13:03:26 +02:00
|
|
|
from synapse.module_api import ModuleApi
|
2023-03-16 11:35:31 +01:00
|
|
|
from synapse.module_api.callbacks import ModuleApiCallbacks
|
2023-01-20 19:02:18 +01:00
|
|
|
from synapse.notifier import Notifier, ReplicationNotifier
|
2022-05-11 13:15:21 +02:00
|
|
|
from synapse.push.bulk_push_rule_evaluator import BulkPushRuleEvaluator
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.push.pusherpool import PusherPool
|
2020-04-06 10:58:42 +02:00
|
|
|
from synapse.replication.tcp.client import ReplicationDataHandler
|
2021-01-26 14:57:31 +01:00
|
|
|
from synapse.replication.tcp.external_cache import ExternalCache
|
2020-04-06 10:58:42 +02:00
|
|
|
from synapse.replication.tcp.handler import ReplicationCommandHandler
|
2020-03-25 15:54:01 +01:00
|
|
|
from synapse.replication.tcp.resource import ReplicationStreamer
|
2020-08-11 19:00:17 +02:00
|
|
|
from synapse.replication.tcp.streams import STREAMS_MAP, Stream
|
2023-02-27 14:26:05 +01:00
|
|
|
from synapse.rest.media.media_repository_resource import MediaRepositoryResource
|
2018-05-17 12:34:28 +02:00
|
|
|
from synapse.server_notices.server_notices_manager import ServerNoticesManager
|
2018-05-17 18:35:31 +02:00
|
|
|
from synapse.server_notices.server_notices_sender import ServerNoticesSender
|
2019-06-20 11:32:02 +02:00
|
|
|
from synapse.server_notices.worker_server_notices_sender import (
|
|
|
|
WorkerServerNoticesSender,
|
|
|
|
)
|
2018-01-27 10:15:45 +01:00
|
|
|
from synapse.state import StateHandler, StateResolutionHandler
|
2022-05-31 14:17:50 +02:00
|
|
|
from synapse.storage import Databases
|
|
|
|
from synapse.storage.controllers import StorageControllers
|
2016-08-01 19:02:07 +02:00
|
|
|
from synapse.streams.events import EventSources
|
2021-03-08 14:25:43 +01:00
|
|
|
from synapse.types import DomainSpecificString, ISynapseReactor
|
2014-08-12 16:10:52 +02:00
|
|
|
from synapse.util import Clock
|
|
|
|
from synapse.util.distributor import Distributor
|
2022-06-14 15:12:08 +02:00
|
|
|
from synapse.util.macaroons import MacaroonGenerator
|
2020-09-18 11:49:29 +02:00
|
|
|
from synapse.util.ratelimitutils import FederationRateLimiter
|
2020-03-30 17:37:24 +02:00
|
|
|
from synapse.util.stringutils import random_string
|
2023-08-21 14:17:13 +02:00
|
|
|
from synapse.util.task_scheduler import TaskScheduler
|
2016-01-26 16:51:06 +01:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2020-08-11 19:20:16 +02:00
|
|
|
if TYPE_CHECKING:
|
2022-03-08 13:26:05 +01:00
|
|
|
from txredisapi import ConnectionHandler
|
2021-01-26 14:57:31 +01:00
|
|
|
|
2023-05-19 14:06:54 +02:00
|
|
|
from synapse.handlers.jwt import JwtHandler
|
2021-04-20 20:55:20 +02:00
|
|
|
from synapse.handlers.oidc import OidcHandler
|
|
|
|
from synapse.handlers.saml import SamlHandler
|
2020-08-11 19:20:16 +02:00
|
|
|
|
2014-08-12 16:10:52 +02:00
|
|
|
|
2023-03-09 20:12:09 +01:00
|
|
|
# The annotation for `cache_in_self` used to be
|
|
|
|
# def (builder: Callable[["HomeServer"],T]) -> Callable[["HomeServer"],T]
|
|
|
|
# which mypy was happy with.
|
|
|
|
#
|
|
|
|
# But PyCharm was confused by this. If `foo` was decorated by `@cache_in_self`, then
|
|
|
|
# an expression like `hs.foo()`
|
|
|
|
#
|
|
|
|
# - would erroneously warn that we hadn't provided a `hs` argument to foo (PyCharm
|
|
|
|
# confused about boundmethods and unbound methods?), and
|
|
|
|
# - would be considered to have type `Any`, making for a poor autocomplete and
|
|
|
|
# cross-referencing experience.
|
|
|
|
#
|
|
|
|
# Instead, use a typevar `F` to express that `@cache_in_self` returns exactly the
|
|
|
|
# same type it receives. This isn't strictly true [*], but it's more than good
|
|
|
|
# enough to keep PyCharm and mypy happy.
|
|
|
|
#
|
|
|
|
# [*]: (e.g. `builder` could be an object with a __call__ attribute rather than a
|
|
|
|
# types.FunctionType instance, whereas the return value is always a
|
|
|
|
# types.FunctionType instance.)
|
|
|
|
|
|
|
|
T: TypeAlias = object
|
|
|
|
F = TypeVar("F", bound=Callable[["HomeServer"], T])
|
2020-08-11 19:00:17 +02:00
|
|
|
|
|
|
|
|
2023-03-09 20:12:09 +01:00
|
|
|
def cache_in_self(builder: F) -> F:
|
2020-08-11 19:00:17 +02:00
|
|
|
"""Wraps a function called e.g. `get_foo`, checking if `self.foo` exists and
|
|
|
|
returning if so. If not, calls the given function and sets `self.foo` to it.
|
|
|
|
|
|
|
|
Also ensures that dependency cycles throw an exception correctly, rather
|
|
|
|
than overflowing the stack.
|
|
|
|
"""
|
|
|
|
|
|
|
|
if not builder.__name__.startswith("get_"):
|
|
|
|
raise Exception(
|
|
|
|
"@cache_in_self can only be used on functions starting with `get_`"
|
|
|
|
)
|
|
|
|
|
2020-11-30 19:28:44 +01:00
|
|
|
# get_attr -> _attr
|
|
|
|
depname = builder.__name__[len("get") :]
|
2020-08-11 19:00:17 +02:00
|
|
|
|
|
|
|
building = [False]
|
|
|
|
|
|
|
|
@functools.wraps(builder)
|
2023-02-09 15:49:04 +01:00
|
|
|
def _get(self: "HomeServer") -> T:
|
2020-08-11 19:00:17 +02:00
|
|
|
try:
|
|
|
|
return getattr(self, depname)
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Prevent cyclic dependencies from deadlocking
|
|
|
|
if building[0]:
|
|
|
|
raise ValueError("Cyclic dependency while building %s" % (depname,))
|
|
|
|
|
|
|
|
building[0] = True
|
|
|
|
try:
|
|
|
|
dep = builder(self)
|
|
|
|
setattr(self, depname, dep)
|
|
|
|
finally:
|
|
|
|
building[0] = False
|
|
|
|
|
|
|
|
return dep
|
|
|
|
|
2023-03-09 20:12:09 +01:00
|
|
|
return cast(F, _get)
|
2020-08-11 19:00:17 +02:00
|
|
|
|
|
|
|
|
|
|
|
class HomeServer(metaclass=abc.ABCMeta):
|
2014-08-12 16:10:52 +02:00
|
|
|
"""A basic homeserver object without lazy component builders.
|
|
|
|
|
|
|
|
This will need all of the components it requires to either be passed as
|
|
|
|
constructor arguments, or the relevant methods overriding to create them.
|
|
|
|
Typically this would only be used for unit tests.
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
Dependencies should be added by creating a `def get_<depname>(self)`
|
|
|
|
function, wrapping it in `@cache_in_self`.
|
2018-05-11 01:17:11 +02:00
|
|
|
|
|
|
|
Attributes:
|
|
|
|
config (synapse.config.homeserver.HomeserverConfig):
|
2021-11-10 21:06:54 +01:00
|
|
|
_listening_services (list[Port]): TCP ports that
|
2019-02-11 11:36:26 +01:00
|
|
|
we are listening on to provide HTTP services.
|
2014-08-12 16:10:52 +02:00
|
|
|
"""
|
|
|
|
|
2020-10-02 14:23:15 +02:00
|
|
|
REQUIRED_ON_BACKGROUND_TASK_STARTUP = [
|
2020-10-13 14:20:32 +02:00
|
|
|
"account_validity",
|
2020-10-02 14:23:15 +02:00
|
|
|
"auth",
|
2020-10-13 14:20:32 +02:00
|
|
|
"deactivate_account",
|
|
|
|
"message",
|
|
|
|
"pagination",
|
|
|
|
"profile",
|
2023-05-03 13:27:33 +02:00
|
|
|
"room_forgetter",
|
2020-10-02 14:23:15 +02:00
|
|
|
"stats",
|
|
|
|
]
|
2019-06-20 11:32:02 +02:00
|
|
|
|
2018-08-28 14:39:49 +02:00
|
|
|
# This is overridden in derived application classes
|
|
|
|
# (such as synapse.app.homeserver.SynapseHomeServer) and gives the class to be
|
2022-02-23 12:04:02 +01:00
|
|
|
# instantiated during setup() for future return by get_datastores()
|
2018-08-28 18:10:43 +02:00
|
|
|
DATASTORE_CLASS = abc.abstractproperty()
|
2018-08-28 14:39:49 +02:00
|
|
|
|
2020-10-15 21:29:13 +02:00
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
hostname: str,
|
|
|
|
config: HomeServerConfig,
|
2022-02-11 13:20:16 +01:00
|
|
|
reactor: Optional[ISynapseReactor] = None,
|
|
|
|
version_string: str = "Synapse",
|
2020-10-15 21:29:13 +02:00
|
|
|
):
|
2014-08-12 16:10:52 +02:00
|
|
|
"""
|
|
|
|
Args:
|
|
|
|
hostname : The hostname for the server.
|
2019-12-11 18:27:46 +01:00
|
|
|
config: The full config for the homeserver.
|
2014-08-12 16:10:52 +02:00
|
|
|
"""
|
2018-06-22 10:37:10 +02:00
|
|
|
if not reactor:
|
2020-08-11 19:00:17 +02:00
|
|
|
from twisted.internet import reactor as _reactor
|
|
|
|
|
2022-02-11 13:20:16 +01:00
|
|
|
reactor = cast(ISynapseReactor, _reactor)
|
2018-06-22 10:37:10 +02:00
|
|
|
|
|
|
|
self._reactor = reactor
|
2014-08-12 16:10:52 +02:00
|
|
|
self.hostname = hostname
|
2020-07-08 18:51:56 +02:00
|
|
|
# the key we use to sign events and requests
|
|
|
|
self.signing_key = config.key.signing_key[0]
|
2019-12-06 18:42:18 +01:00
|
|
|
self.config = config
|
2021-11-10 21:06:54 +01:00
|
|
|
self._listening_services: List[Port] = []
|
2021-07-15 12:02:43 +02:00
|
|
|
self.start_time: Optional[int] = None
|
2014-08-12 16:10:52 +02:00
|
|
|
|
2020-04-29 17:23:08 +02:00
|
|
|
self._instance_id = random_string(5)
|
2021-02-24 14:23:18 +01:00
|
|
|
self._instance_name = config.worker.instance_name
|
2020-03-30 17:37:24 +02:00
|
|
|
|
2020-10-15 21:29:13 +02:00
|
|
|
self.version_string = version_string
|
2018-08-28 14:39:49 +02:00
|
|
|
|
2021-07-15 12:02:43 +02:00
|
|
|
self.datastores: Optional[Databases] = None
|
2014-08-12 16:10:52 +02:00
|
|
|
|
2021-11-10 21:06:54 +01:00
|
|
|
self._module_web_resources: Dict[str, Resource] = {}
|
2021-06-18 13:15:52 +02:00
|
|
|
self._module_web_resources_consumed = False
|
|
|
|
|
2022-11-15 17:36:43 +01:00
|
|
|
# This attribute is set by the free function `refresh_certificate`.
|
|
|
|
self.tls_server_context_factory: Optional[IOpenSSLContextFactory] = None
|
|
|
|
|
2022-02-11 13:20:16 +01:00
|
|
|
def register_module_web_resource(self, path: str, resource: Resource) -> None:
|
2021-06-18 13:15:52 +02:00
|
|
|
"""Allows a module to register a web resource to be served at the given path.
|
|
|
|
|
|
|
|
If multiple modules register a resource for the same path, the module that
|
|
|
|
appears the highest in the configuration file takes priority.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
path: The path to register the resource for.
|
|
|
|
resource: The resource to attach to this path.
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
SynapseError(500): A module tried to register a web resource after the HTTP
|
|
|
|
listeners have been started.
|
|
|
|
"""
|
|
|
|
if self._module_web_resources_consumed:
|
|
|
|
raise RuntimeError(
|
|
|
|
"Tried to register a web resource from a module after startup",
|
|
|
|
)
|
|
|
|
|
|
|
|
# Don't register a resource that's already been registered.
|
|
|
|
if path not in self._module_web_resources.keys():
|
|
|
|
self._module_web_resources[path] = resource
|
|
|
|
else:
|
|
|
|
logger.warning(
|
|
|
|
"Module tried to register a web resource for path %s but another module"
|
|
|
|
" has already registered a resource for this path.",
|
|
|
|
path,
|
|
|
|
)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
def get_instance_id(self) -> str:
|
2020-03-30 17:37:24 +02:00
|
|
|
"""A unique ID for this synapse process instance.
|
|
|
|
|
|
|
|
This is used to distinguish running instances in worker-based
|
|
|
|
deployments.
|
|
|
|
"""
|
2020-04-29 17:23:08 +02:00
|
|
|
return self._instance_id
|
|
|
|
|
|
|
|
def get_instance_name(self) -> str:
|
|
|
|
"""A unique name for this synapse process.
|
|
|
|
|
|
|
|
Used to identify the process over replication and in config. Does not
|
|
|
|
change over restarts.
|
|
|
|
"""
|
|
|
|
return self._instance_name
|
2020-03-30 17:37:24 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
def setup(self) -> None:
|
2016-01-26 16:51:06 +01:00
|
|
|
logger.info("Setting up.")
|
2019-11-04 19:05:48 +01:00
|
|
|
self.start_time = int(self.get_clock().time())
|
2020-08-05 22:38:57 +02:00
|
|
|
self.datastores = Databases(self.DATASTORE_CLASS, self)
|
2016-01-26 16:51:06 +01:00
|
|
|
logger.info("Finished setting up.")
|
|
|
|
|
2020-10-02 14:23:15 +02:00
|
|
|
# Register background tasks required by this server. This must be done
|
|
|
|
# somewhat manually due to the background tasks not being registered
|
|
|
|
# unless handlers are instantiated.
|
2021-09-13 19:07:12 +02:00
|
|
|
if self.config.worker.run_background_tasks:
|
2020-10-02 14:23:15 +02:00
|
|
|
self.setup_background_tasks()
|
|
|
|
|
2022-11-04 19:43:14 +01:00
|
|
|
def start_listening(self) -> None: # noqa: B027 (no-op by design)
|
2021-04-23 20:20:44 +02:00
|
|
|
"""Start the HTTP, manhole, metrics, etc listeners
|
|
|
|
|
|
|
|
Does nothing in this base class; overridden in derived classes to start the
|
|
|
|
appropriate listeners.
|
|
|
|
"""
|
|
|
|
|
2020-10-02 14:23:15 +02:00
|
|
|
def setup_background_tasks(self) -> None:
|
2019-03-12 15:17:51 +01:00
|
|
|
"""
|
|
|
|
Some handlers have side effects on instantiation (like registering
|
|
|
|
background updates). This function causes them to be fetched, and
|
|
|
|
therefore instantiated, to run those side effects.
|
|
|
|
"""
|
2020-10-02 14:23:15 +02:00
|
|
|
for i in self.REQUIRED_ON_BACKGROUND_TASK_STARTUP:
|
|
|
|
getattr(self, "get_" + i + "_handler")()
|
2023-08-21 14:17:13 +02:00
|
|
|
self.get_task_scheduler()
|
2019-03-11 11:13:35 +01:00
|
|
|
|
2021-03-08 14:25:43 +01:00
|
|
|
def get_reactor(self) -> ISynapseReactor:
|
2018-06-22 10:37:10 +02:00
|
|
|
"""
|
|
|
|
Fetch the Twisted reactor in use by this HomeServer.
|
|
|
|
"""
|
|
|
|
return self._reactor
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
def is_mine(self, domain_specific_string: DomainSpecificString) -> bool:
|
2014-12-02 11:42:28 +01:00
|
|
|
return domain_specific_string.domain == self.hostname
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
def is_mine_id(self, string: str) -> bool:
|
2022-09-08 16:54:36 +02:00
|
|
|
"""Determines whether a user ID or room alias originates from this homeserver.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
`True` if the hostname part of the user ID or room alias matches this
|
|
|
|
homeserver.
|
|
|
|
`False` otherwise, or if the user ID or room alias is malformed.
|
|
|
|
"""
|
|
|
|
localpart_hostname = string.split(":", 1)
|
|
|
|
if len(localpart_hostname) < 2:
|
|
|
|
return False
|
|
|
|
return localpart_hostname[1] == self.hostname
|
2016-01-19 17:01:05 +01:00
|
|
|
|
2023-05-05 16:06:22 +02:00
|
|
|
def is_mine_server_name(self, server_name: str) -> bool:
|
|
|
|
"""Determines whether a server name refers to this homeserver."""
|
|
|
|
return server_name == self.hostname
|
|
|
|
|
2020-11-30 19:28:44 +01:00
|
|
|
@cache_in_self
|
2020-08-11 19:00:17 +02:00
|
|
|
def get_clock(self) -> Clock:
|
2020-11-30 19:28:44 +01:00
|
|
|
return Clock(self._reactor)
|
2017-11-21 11:50:23 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
def get_datastores(self) -> Databases:
|
|
|
|
if not self.datastores:
|
|
|
|
raise Exception("HomeServer.setup must be called before getting datastores")
|
|
|
|
|
2019-12-18 11:45:12 +01:00
|
|
|
return self.datastores
|
|
|
|
|
2020-11-30 19:28:44 +01:00
|
|
|
@cache_in_self
|
2020-08-11 19:00:17 +02:00
|
|
|
def get_distributor(self) -> Distributor:
|
2020-11-30 19:28:44 +01:00
|
|
|
return Distributor()
|
2017-11-21 11:50:23 +01:00
|
|
|
|
2020-11-30 19:28:44 +01:00
|
|
|
@cache_in_self
|
2020-06-05 11:47:20 +02:00
|
|
|
def get_registration_ratelimiter(self) -> Ratelimiter:
|
2020-11-30 19:28:44 +01:00
|
|
|
return Ratelimiter(
|
2022-02-23 12:04:02 +01:00
|
|
|
store=self.get_datastores().main,
|
2020-11-30 19:28:44 +01:00
|
|
|
clock=self.get_clock(),
|
2023-08-30 01:39:39 +02:00
|
|
|
cfg=self.config.ratelimiting.rc_registration,
|
2020-11-30 19:28:44 +01:00
|
|
|
)
|
2019-03-06 12:02:42 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_client(self) -> FederationClient:
|
2018-03-12 15:34:31 +01:00
|
|
|
return FederationClient(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_server(self) -> FederationServer:
|
2018-03-12 15:34:31 +01:00
|
|
|
return FederationServer(self)
|
2014-08-12 16:10:52 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_notifier(self) -> Notifier:
|
2014-08-12 16:10:52 +02:00
|
|
|
return Notifier(self)
|
|
|
|
|
2023-01-20 19:02:18 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_notifier(self) -> ReplicationNotifier:
|
|
|
|
return ReplicationNotifier()
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth(self) -> Auth:
|
2023-05-09 16:20:04 +02:00
|
|
|
if self.config.experimental.msc3861.enabled:
|
|
|
|
from synapse.api.auth.msc3861_delegated import MSC3861DelegatedAuth
|
2022-09-13 17:54:32 +02:00
|
|
|
|
2023-05-09 16:20:04 +02:00
|
|
|
return MSC3861DelegatedAuth(self)
|
2022-06-17 14:48:55 +02:00
|
|
|
return InternalAuth(self)
|
2014-08-12 16:10:52 +02:00
|
|
|
|
2022-06-14 10:51:15 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth_blocking(self) -> AuthBlocking:
|
|
|
|
return AuthBlocking(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_http_client_context_factory(self) -> IPolicyForHTTPS:
|
2021-09-15 14:34:52 +02:00
|
|
|
if self.config.tls.use_insecure_ssl_client_just_for_testing_do_not_use:
|
2021-03-12 17:37:57 +01:00
|
|
|
return InsecureInterceptableContextFactory()
|
|
|
|
return RegularPolicyForHTTPS()
|
2015-09-09 13:02:07 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_simple_http_client(self) -> SimpleHttpClient:
|
2020-12-02 17:09:24 +01:00
|
|
|
"""
|
|
|
|
An HTTP client with no special configuration.
|
|
|
|
"""
|
2015-09-09 13:02:07 +02:00
|
|
|
return SimpleHttpClient(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_proxied_http_client(self) -> SimpleHttpClient:
|
2020-12-02 17:09:24 +01:00
|
|
|
"""
|
|
|
|
An HTTP client that uses configured HTTP(S) proxies.
|
|
|
|
"""
|
2021-02-26 18:37:57 +01:00
|
|
|
return SimpleHttpClient(self, use_proxy=True)
|
2020-12-02 17:09:24 +01:00
|
|
|
|
|
|
|
@cache_in_self
|
2023-05-19 14:25:25 +02:00
|
|
|
def get_proxied_blocklisted_http_client(self) -> SimpleHttpClient:
|
2020-12-02 17:09:24 +01:00
|
|
|
"""
|
2023-05-19 14:25:25 +02:00
|
|
|
An HTTP client that uses configured HTTP(S) proxies and blocks IPs
|
|
|
|
based on the configured IP ranges.
|
2020-12-02 17:09:24 +01:00
|
|
|
"""
|
2019-11-01 15:07:44 +01:00
|
|
|
return SimpleHttpClient(
|
|
|
|
self,
|
2023-05-19 14:25:25 +02:00
|
|
|
ip_allowlist=self.config.server.ip_range_allowlist,
|
|
|
|
ip_blocklist=self.config.server.ip_range_blocklist,
|
2021-02-26 18:37:57 +01:00
|
|
|
use_proxy=True,
|
2019-11-01 15:07:44 +01:00
|
|
|
)
|
|
|
|
|
2020-12-02 17:09:24 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_http_client(self) -> MatrixFederationHttpClient:
|
|
|
|
"""
|
|
|
|
An HTTP client for federation.
|
|
|
|
"""
|
|
|
|
tls_client_options_factory = context_factory.FederationPolicyForHTTPS(
|
|
|
|
self.config
|
|
|
|
)
|
|
|
|
return MatrixFederationHttpClient(self, tls_client_options_factory)
|
|
|
|
|
2023-05-09 20:25:20 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_client(self) -> ReplicationClient:
|
|
|
|
"""
|
|
|
|
An HTTP client for HTTP replication.
|
|
|
|
"""
|
|
|
|
return ReplicationClient(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_creation_handler(self) -> RoomCreationHandler:
|
2018-05-17 10:01:09 +02:00
|
|
|
return RoomCreationHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_shutdown_handler(self) -> RoomShutdownHandler:
|
2020-07-14 13:36:23 +02:00
|
|
|
return RoomShutdownHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_state_handler(self) -> StateHandler:
|
2014-08-12 16:10:52 +02:00
|
|
|
return StateHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_state_resolution_handler(self) -> StateResolutionHandler:
|
2018-01-27 10:15:45 +01:00
|
|
|
return StateResolutionHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-04-14 18:06:06 +02:00
|
|
|
def get_presence_handler(self) -> BasePresenceHandler:
|
2021-04-23 13:21:55 +02:00
|
|
|
if self.get_instance_name() in self.config.worker.writers.presence:
|
2021-04-14 18:06:06 +02:00
|
|
|
return PresenceHandler(self)
|
2021-04-23 13:21:55 +02:00
|
|
|
else:
|
|
|
|
return WorkerPresenceHandler(self)
|
2016-05-16 19:56:37 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-03-17 16:30:21 +01:00
|
|
|
def get_typing_writer_handler(self) -> TypingWriterHandler:
|
2021-11-03 15:25:47 +01:00
|
|
|
if self.get_instance_name() in self.config.worker.writers.typing:
|
2020-07-16 16:12:54 +02:00
|
|
|
return TypingWriterHandler(self)
|
2021-03-17 16:30:21 +01:00
|
|
|
else:
|
|
|
|
raise Exception("Workers cannot write typing")
|
|
|
|
|
2021-04-06 15:38:30 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_presence_router(self) -> PresenceRouter:
|
|
|
|
return PresenceRouter(self)
|
|
|
|
|
2021-03-17 16:30:21 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_typing_handler(self) -> FollowerTypingHandler:
|
2021-11-03 15:25:47 +01:00
|
|
|
if self.get_instance_name() in self.config.worker.writers.typing:
|
2021-03-17 16:30:21 +01:00
|
|
|
# Use get_typing_writer_handler to ensure that we use the same
|
|
|
|
# cached version.
|
|
|
|
return self.get_typing_writer_handler()
|
2020-07-16 16:12:54 +02:00
|
|
|
else:
|
|
|
|
return FollowerTypingHandler(self)
|
2016-05-17 16:58:46 +02:00
|
|
|
|
2020-11-17 15:46:23 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_sso_handler(self) -> SsoHandler:
|
|
|
|
return SsoHandler(self)
|
|
|
|
|
2023-05-19 14:06:54 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_jwt_handler(self) -> "JwtHandler":
|
|
|
|
from synapse.handlers.jwt import JwtHandler
|
|
|
|
|
|
|
|
return JwtHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_sync_handler(self) -> SyncHandler:
|
2016-05-16 21:19:26 +02:00
|
|
|
return SyncHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_list_handler(self) -> RoomListHandler:
|
2016-05-31 12:05:16 +02:00
|
|
|
return RoomListHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth_handler(self) -> AuthHandler:
|
2016-06-02 14:31:45 +02:00
|
|
|
return AuthHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_macaroon_generator(self) -> MacaroonGenerator:
|
2022-06-14 15:12:08 +02:00
|
|
|
return MacaroonGenerator(
|
|
|
|
self.get_clock(), self.hostname, self.config.key.macaroon_secret_key
|
|
|
|
)
|
2017-02-02 11:53:36 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2022-11-22 20:08:04 +01:00
|
|
|
def get_device_handler(self) -> DeviceWorkerHandler:
|
2021-09-13 19:07:12 +02:00
|
|
|
if self.config.worker.worker_app:
|
2019-03-04 19:24:32 +01:00
|
|
|
return DeviceWorkerHandler(self)
|
|
|
|
else:
|
|
|
|
return DeviceHandler(self)
|
2016-07-15 14:19:07 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_device_message_handler(self) -> DeviceMessageHandler:
|
2016-09-06 19:16:20 +02:00
|
|
|
return DeviceMessageHandler(self)
|
|
|
|
|
2020-10-09 13:24:34 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_directory_handler(self) -> DirectoryHandler:
|
|
|
|
return DirectoryHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_e2e_keys_handler(self) -> E2eKeysHandler:
|
2016-08-01 19:02:07 +02:00
|
|
|
return E2eKeysHandler(self)
|
2017-12-05 22:44:25 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_e2e_room_keys_handler(self) -> E2eRoomKeysHandler:
|
2017-12-05 22:44:25 +01:00
|
|
|
return E2eRoomKeysHandler(self)
|
2016-08-01 19:02:07 +02:00
|
|
|
|
2020-10-09 13:24:34 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_admin_handler(self) -> AdminHandler:
|
|
|
|
return AdminHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_application_service_api(self) -> ApplicationServiceApi:
|
2016-05-31 14:53:48 +02:00
|
|
|
return ApplicationServiceApi(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_application_service_scheduler(self) -> ApplicationServiceScheduler:
|
2016-05-31 14:53:48 +02:00
|
|
|
return ApplicationServiceScheduler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_application_service_handler(self) -> ApplicationServicesHandler:
|
2016-05-31 14:53:48 +02:00
|
|
|
return ApplicationServicesHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_handler(self) -> EventHandler:
|
2016-08-12 16:31:44 +02:00
|
|
|
return EventHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_stream_handler(self) -> EventStreamHandler:
|
2016-08-12 16:31:44 +02:00
|
|
|
return EventStreamHandler(self)
|
|
|
|
|
2020-10-09 13:24:34 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_handler(self) -> FederationHandler:
|
|
|
|
return FederationHandler(self)
|
|
|
|
|
2021-08-26 22:41:44 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_event_handler(self) -> FederationEventHandler:
|
|
|
|
return FederationEventHandler(self)
|
|
|
|
|
2020-10-09 13:24:34 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_identity_handler(self) -> IdentityHandler:
|
|
|
|
return IdentityHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_initial_sync_handler(self) -> InitialSyncHandler:
|
2016-09-21 12:46:28 +02:00
|
|
|
return InitialSyncHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-01-12 22:30:15 +01:00
|
|
|
def get_profile_handler(self) -> ProfileHandler:
|
2020-10-13 14:20:32 +02:00
|
|
|
return ProfileHandler(self)
|
2017-08-25 15:34:56 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_creation_handler(self) -> EventCreationHandler:
|
2018-01-15 17:52:07 +01:00
|
|
|
return EventCreationHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_deactivate_account_handler(self) -> DeactivateAccountHandler:
|
2017-11-29 12:48:43 +01:00
|
|
|
return DeactivateAccountHandler(self)
|
|
|
|
|
2020-10-09 13:24:34 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_search_handler(self) -> SearchHandler:
|
|
|
|
return SearchHandler(self)
|
|
|
|
|
2021-05-17 12:33:38 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_send_email_handler(self) -> SendEmailHandler:
|
|
|
|
return SendEmailHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_set_password_handler(self) -> SetPasswordHandler:
|
2017-11-29 15:10:46 +01:00
|
|
|
return SetPasswordHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_sources(self) -> EventSources:
|
2014-08-26 19:57:46 +02:00
|
|
|
return EventSources(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_keyring(self) -> Keyring:
|
2014-09-30 16:15:10 +02:00
|
|
|
return Keyring(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_builder_factory(self) -> EventBuilderFactory:
|
2019-01-25 18:19:31 +01:00
|
|
|
return EventBuilderFactory(self)
|
2015-01-27 15:28:56 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_filtering(self) -> Filtering:
|
2015-01-27 15:28:56 +01:00
|
|
|
return Filtering(self)
|
2015-01-29 15:55:27 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_pusherpool(self) -> PusherPool:
|
2014-11-19 19:20:59 +01:00
|
|
|
return PusherPool(self)
|
2016-01-26 14:52:29 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_media_repository_resource(self) -> MediaRepositoryResource:
|
2017-11-21 12:08:08 +01:00
|
|
|
# build the media repo resource. This indirects through the HomeServer
|
|
|
|
# to ensure that we only have a single instance of
|
|
|
|
return MediaRepositoryResource(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_media_repository(self) -> MediaRepository:
|
2016-06-29 15:57:59 +02:00
|
|
|
return MediaRepository(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_transport_client(self) -> TransportLayerClient:
|
2016-11-16 15:15:50 +01:00
|
|
|
return TransportLayerClient(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-03-29 17:43:20 +02:00
|
|
|
def get_federation_sender(self) -> AbstractFederationSender:
|
2016-11-23 15:09:47 +01:00
|
|
|
if self.should_send_federation():
|
2019-03-13 21:02:56 +01:00
|
|
|
return FederationSender(self)
|
2021-09-13 19:07:12 +02:00
|
|
|
elif not self.config.worker.worker_app:
|
2016-11-16 18:34:44 +01:00
|
|
|
return FederationRemoteSendQueue(self)
|
2016-11-23 15:09:47 +01:00
|
|
|
else:
|
|
|
|
raise Exception("Workers cannot send federation traffic")
|
2016-11-16 15:15:50 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_receipts_handler(self) -> ReceiptsHandler:
|
2016-11-23 16:14:24 +01:00
|
|
|
return ReceiptsHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_read_marker_handler(self) -> ReadMarkerHandler:
|
2017-04-11 16:01:39 +02:00
|
|
|
return ReadMarkerHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2022-03-10 14:01:56 +01:00
|
|
|
def get_replication_command_handler(self) -> ReplicationCommandHandler:
|
2020-04-06 10:58:42 +02:00
|
|
|
return ReplicationCommandHandler(self)
|
2017-03-27 17:33:44 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2022-05-11 13:15:21 +02:00
|
|
|
def get_bulk_push_rule_evaluator(self) -> BulkPushRuleEvaluator:
|
|
|
|
return BulkPushRuleEvaluator(self)
|
2017-05-18 19:17:40 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_user_directory_handler(self) -> UserDirectoryHandler:
|
2017-11-29 17:46:45 +01:00
|
|
|
return UserDirectoryHandler(self)
|
2017-05-31 12:51:01 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_stats_handler(self) -> StatsHandler:
|
2019-05-21 18:36:50 +02:00
|
|
|
return StatsHandler(self)
|
|
|
|
|
2021-10-13 13:21:52 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_password_auth_provider(self) -> PasswordAuthProvider:
|
|
|
|
return PasswordAuthProvider()
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-03-17 12:14:39 +01:00
|
|
|
def get_room_member_handler(self) -> RoomMemberHandler:
|
2021-09-13 19:07:12 +02:00
|
|
|
if self.config.worker.worker_app:
|
2018-03-13 17:32:37 +01:00
|
|
|
return RoomMemberWorkerHandler(self)
|
2018-03-13 14:49:13 +01:00
|
|
|
return RoomMemberMasterHandler(self)
|
2018-03-01 11:54:37 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_registry(self) -> FederationHandlerRegistry:
|
2020-07-16 16:12:54 +02:00
|
|
|
return FederationHandlerRegistry(self)
|
2018-03-12 17:17:08 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-03-24 11:48:46 +01:00
|
|
|
def get_server_notices_manager(self) -> ServerNoticesManager:
|
2021-09-13 19:07:12 +02:00
|
|
|
if self.config.worker.worker_app:
|
2018-05-22 11:57:56 +02:00
|
|
|
raise Exception("Workers cannot send server notices")
|
2018-05-17 12:34:28 +02:00
|
|
|
return ServerNoticesManager(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2021-03-24 11:48:46 +01:00
|
|
|
def get_server_notices_sender(self) -> WorkerServerNoticesSender:
|
2021-09-13 19:07:12 +02:00
|
|
|
if self.config.worker.worker_app:
|
2018-05-22 11:57:56 +02:00
|
|
|
return WorkerServerNoticesSender(self)
|
2018-05-17 18:35:31 +02:00
|
|
|
return ServerNoticesSender(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_message_handler(self) -> MessageHandler:
|
2018-07-18 16:22:02 +02:00
|
|
|
return MessageHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_pagination_handler(self) -> PaginationHandler:
|
2018-07-18 16:22:02 +02:00
|
|
|
return PaginationHandler(self)
|
|
|
|
|
2022-03-16 15:39:15 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_relations_handler(self) -> RelationsHandler:
|
|
|
|
return RelationsHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_context_handler(self) -> RoomContextHandler:
|
2018-07-18 16:29:45 +02:00
|
|
|
return RoomContextHandler(self)
|
|
|
|
|
2021-12-02 08:02:20 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_timestamp_lookup_handler(self) -> TimestampLookupHandler:
|
|
|
|
return TimestampLookupHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_registration_handler(self) -> RegistrationHandler:
|
2019-02-20 08:47:31 +01:00
|
|
|
return RegistrationHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_account_validity_handler(self) -> AccountValidityHandler:
|
2019-04-10 18:58:47 +02:00
|
|
|
return AccountValidityHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_cas_handler(self) -> CasHandler:
|
2020-03-26 20:05:26 +01:00
|
|
|
return CasHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2020-08-11 19:20:16 +02:00
|
|
|
def get_saml_handler(self) -> "SamlHandler":
|
2021-04-20 20:55:20 +02:00
|
|
|
from synapse.handlers.saml import SamlHandler
|
2019-05-09 14:21:57 +02:00
|
|
|
|
2019-06-27 01:37:41 +02:00
|
|
|
return SamlHandler(self)
|
2019-06-26 23:34:41 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2020-08-11 19:20:16 +02:00
|
|
|
def get_oidc_handler(self) -> "OidcHandler":
|
2021-04-20 20:55:20 +02:00
|
|
|
from synapse.handlers.oidc import OidcHandler
|
2020-05-08 14:30:40 +02:00
|
|
|
|
|
|
|
return OidcHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_client_serializer(self) -> EventClientSerializer:
|
2023-08-04 13:47:18 +02:00
|
|
|
return EventClientSerializer()
|
2019-06-11 01:03:57 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_password_policy_handler(self) -> PasswordPolicyHandler:
|
2020-03-26 17:51:13 +01:00
|
|
|
return PasswordPolicyHandler(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
2022-05-31 14:17:50 +02:00
|
|
|
def get_storage_controllers(self) -> StorageControllers:
|
|
|
|
return StorageControllers(self, self.get_datastores())
|
2019-10-23 13:02:36 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_streamer(self) -> ReplicationStreamer:
|
2020-03-25 15:54:01 +01:00
|
|
|
return ReplicationStreamer(self)
|
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_data_handler(self) -> ReplicationDataHandler:
|
2020-05-14 15:01:39 +02:00
|
|
|
return ReplicationDataHandler(self)
|
2020-04-06 10:58:42 +02:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_streams(self) -> Dict[str, Stream]:
|
2020-05-22 15:21:54 +02:00
|
|
|
return {stream.NAME: stream(self) for stream in STREAMS_MAP.values()}
|
|
|
|
|
2020-09-18 11:49:29 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_ratelimiter(self) -> FederationRateLimiter:
|
2021-09-13 19:07:12 +02:00
|
|
|
return FederationRateLimiter(
|
2022-08-30 13:08:29 +02:00
|
|
|
self.get_clock(),
|
|
|
|
config=self.config.ratelimiting.rc_federation,
|
|
|
|
metrics_name="federation_servlets",
|
2021-09-13 19:07:12 +02:00
|
|
|
)
|
2020-09-18 11:49:29 +02:00
|
|
|
|
2020-10-07 13:03:26 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_module_api(self) -> ModuleApi:
|
|
|
|
return ModuleApi(self, self.get_auth_handler())
|
|
|
|
|
2023-03-16 11:35:31 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_module_api_callbacks(self) -> ModuleApiCallbacks:
|
2023-04-18 02:57:40 +02:00
|
|
|
return ModuleApiCallbacks(self)
|
2023-03-16 11:35:31 +01:00
|
|
|
|
2021-01-18 16:47:59 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_account_data_handler(self) -> AccountDataHandler:
|
|
|
|
return AccountDataHandler(self)
|
|
|
|
|
2021-01-26 14:57:31 +01:00
|
|
|
@cache_in_self
|
2021-08-16 16:49:12 +02:00
|
|
|
def get_room_summary_handler(self) -> RoomSummaryHandler:
|
|
|
|
return RoomSummaryHandler(self)
|
2021-03-18 19:24:16 +01:00
|
|
|
|
|
|
|
@cache_in_self
|
2021-04-23 13:05:51 +02:00
|
|
|
def get_event_auth_handler(self) -> EventAuthHandler:
|
|
|
|
return EventAuthHandler(self)
|
|
|
|
|
|
|
|
@cache_in_self
|
2021-01-26 14:57:31 +01:00
|
|
|
def get_external_cache(self) -> ExternalCache:
|
|
|
|
return ExternalCache(self)
|
|
|
|
|
2022-02-22 16:10:10 +01:00
|
|
|
@cache_in_self
|
|
|
|
def get_account_handler(self) -> AccountHandler:
|
|
|
|
return AccountHandler(self)
|
|
|
|
|
2022-04-27 15:55:33 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_push_rules_handler(self) -> PushRulesHandler:
|
|
|
|
return PushRulesHandler(self)
|
|
|
|
|
2023-05-03 13:27:33 +02:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_forgetter_handler(self) -> RoomForgetterHandler:
|
|
|
|
return RoomForgetterHandler(self)
|
|
|
|
|
2021-01-26 14:57:31 +01:00
|
|
|
@cache_in_self
|
2022-03-08 13:26:05 +01:00
|
|
|
def get_outbound_redis_connection(self) -> "ConnectionHandler":
|
2021-10-22 19:15:41 +02:00
|
|
|
"""
|
|
|
|
The Redis connection used for replication.
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
AssertionError: if Redis is not enabled in the homeserver config.
|
|
|
|
"""
|
|
|
|
assert self.config.redis.redis_enabled
|
2021-01-26 14:57:31 +01:00
|
|
|
|
|
|
|
# We only want to import redis module if we're using it, as we have
|
|
|
|
# `txredisapi` as an optional dependency.
|
2023-05-26 21:28:39 +02:00
|
|
|
from synapse.replication.tcp.redis import lazyConnection, lazyUnixConnection
|
2021-01-26 14:57:31 +01:00
|
|
|
|
2023-05-26 21:28:39 +02:00
|
|
|
if self.config.redis.redis_path is None:
|
|
|
|
logger.info(
|
|
|
|
"Connecting to redis (host=%r port=%r) for external cache",
|
|
|
|
self.config.redis.redis_host,
|
|
|
|
self.config.redis.redis_port,
|
|
|
|
)
|
2021-01-26 14:57:31 +01:00
|
|
|
|
2023-05-26 21:28:39 +02:00
|
|
|
return lazyConnection(
|
|
|
|
hs=self,
|
|
|
|
host=self.config.redis.redis_host,
|
|
|
|
port=self.config.redis.redis_port,
|
|
|
|
dbid=self.config.redis.redis_dbid,
|
|
|
|
password=self.config.redis.redis_password,
|
|
|
|
reconnect=True,
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
logger.info(
|
|
|
|
"Connecting to redis (path=%r) for external cache",
|
|
|
|
self.config.redis.redis_path,
|
|
|
|
)
|
|
|
|
|
|
|
|
return lazyUnixConnection(
|
|
|
|
hs=self,
|
|
|
|
path=self.config.redis.redis_path,
|
|
|
|
dbid=self.config.redis.redis_dbid,
|
|
|
|
password=self.config.redis.redis_password,
|
|
|
|
reconnect=True,
|
|
|
|
)
|
2021-01-26 14:57:31 +01:00
|
|
|
|
2020-08-11 19:00:17 +02:00
|
|
|
def should_send_federation(self) -> bool:
|
2016-11-23 15:09:47 +01:00
|
|
|
"Should this server be sending federation traffic directly?"
|
2021-09-15 14:34:52 +02:00
|
|
|
return self.config.worker.send_federation
|
2021-10-08 13:44:43 +02:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_request_ratelimiter(self) -> RequestRatelimiter:
|
|
|
|
return RequestRatelimiter(
|
2022-02-23 12:04:02 +01:00
|
|
|
self.get_datastores().main,
|
2021-10-08 13:44:43 +02:00
|
|
|
self.get_clock(),
|
|
|
|
self.config.ratelimiting.rc_message,
|
|
|
|
self.config.ratelimiting.rc_admin_redaction,
|
|
|
|
)
|
2022-09-05 12:26:43 +02:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_common_usage_metrics_manager(self) -> CommonUsageMetricsManager:
|
|
|
|
"""Usage metrics shared between phone home stats and the prometheus exporter."""
|
|
|
|
return CommonUsageMetricsManager(self)
|
2023-07-31 11:58:03 +02:00
|
|
|
|
2023-09-01 14:52:57 +02:00
|
|
|
@cache_in_self
|
2023-07-31 11:58:03 +02:00
|
|
|
def get_worker_locks_handler(self) -> WorkerLocksHandler:
|
|
|
|
return WorkerLocksHandler(self)
|
2023-08-21 14:17:13 +02:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_task_scheduler(self) -> TaskScheduler:
|
|
|
|
return TaskScheduler(self)
|