2014-08-12 10:10:52 -04:00
|
|
|
# -*- coding: utf-8 -*-
|
2016-01-06 23:26:29 -05:00
|
|
|
# Copyright 2014-2016 OpenMarket Ltd
|
2019-06-12 05:31:37 -04:00
|
|
|
# Copyright 2017-2018 New Vector Ltd
|
|
|
|
# Copyright 2019 The Matrix.org Foundation C.I.C.
|
2014-08-12 10:10:52 -04: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-12 22:14:34 -04:00
|
|
|
|
2014-08-12 10:10:52 -04: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.
|
|
|
|
|
|
|
|
# Imports required for the default HomeServer() implementation
|
2018-08-28 12:10:43 -04:00
|
|
|
import abc
|
2020-08-11 13:00:17 -04:00
|
|
|
import functools
|
2016-08-01 13:02:07 -04:00
|
|
|
import logging
|
2019-11-01 10:07:44 -04:00
|
|
|
import os
|
2020-08-11 13:20:16 -04:00
|
|
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, TypeVar, cast
|
2016-08-01 13:02:07 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
import twisted
|
2018-10-30 08:55:43 -04:00
|
|
|
from twisted.mail.smtp import sendmail
|
2020-08-11 13:00:17 -04:00
|
|
|
from twisted.web.iweb import IPolicyForHTTPS
|
2016-01-26 08:52:29 -05:00
|
|
|
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.api.auth import Auth
|
|
|
|
from synapse.api.filtering import Filtering
|
|
|
|
from synapse.api.ratelimiting import Ratelimiter
|
2016-05-31 08:53:48 -04:00
|
|
|
from synapse.appservice.api import ApplicationServiceApi
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.appservice.scheduler import ApplicationServiceScheduler
|
2019-12-11 12:27:46 -05:00
|
|
|
from synapse.config.homeserver import HomeServerConfig
|
2019-02-11 13:03:30 -05:00
|
|
|
from synapse.crypto import context_factory
|
2020-03-17 17:32:25 -04:00
|
|
|
from synapse.crypto.context_factory import RegularPolicyForHTTPS
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.crypto.keyring import Keyring
|
|
|
|
from synapse.events.builder import EventBuilderFactory
|
2017-09-26 14:20:23 -04:00
|
|
|
from synapse.events.spamcheck import SpamChecker
|
2019-06-12 05:31:37 -04:00
|
|
|
from synapse.events.third_party_rules import ThirdPartyEventRules
|
2019-05-09 08:21:57 -04:00
|
|
|
from synapse.events.utils import EventClientSerializer
|
2018-03-12 10:34:31 -04:00
|
|
|
from synapse.federation.federation_client import FederationClient
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.federation.federation_server import (
|
|
|
|
FederationHandlerRegistry,
|
|
|
|
FederationServer,
|
|
|
|
)
|
2016-11-16 12:34:44 -05:00
|
|
|
from synapse.federation.send_queue import FederationRemoteSendQueue
|
2019-03-13 16:02:56 -04:00
|
|
|
from synapse.federation.sender import FederationSender
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.federation.transport.client import TransportLayerClient
|
|
|
|
from synapse.groups.attestations import GroupAttestationSigning, GroupAttestionRenewer
|
2020-02-07 06:14:19 -05:00
|
|
|
from synapse.groups.groups_server import GroupsServerHandler, GroupsServerWorkerHandler
|
2014-08-12 10:10:52 -04:00
|
|
|
from synapse.handlers import Handlers
|
2019-04-10 12:58:47 -04:00
|
|
|
from synapse.handlers.account_validity import AccountValidityHandler
|
2019-01-23 03:39:06 -05:00
|
|
|
from synapse.handlers.acme import AcmeHandler
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.handlers.appservice import ApplicationServicesHandler
|
2018-06-22 04:37:10 -04:00
|
|
|
from synapse.handlers.auth import AuthHandler, MacaroonGenerator
|
2020-03-26 15:05:26 -04:00
|
|
|
from synapse.handlers.cas_handler import CasHandler
|
2017-11-29 06:48:43 -05:00
|
|
|
from synapse.handlers.deactivate_account import DeactivateAccountHandler
|
2019-03-04 13:24:32 -05:00
|
|
|
from synapse.handlers.device import DeviceHandler, DeviceWorkerHandler
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.handlers.devicemessage import DeviceMessageHandler
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.handlers.e2e_keys import E2eKeysHandler
|
2017-12-05 16:44:25 -05:00
|
|
|
from synapse.handlers.e2e_room_keys import E2eRoomKeysHandler
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.handlers.events import EventHandler, EventStreamHandler
|
2020-02-07 06:14:19 -05:00
|
|
|
from synapse.handlers.groups_local import GroupsLocalHandler, GroupsLocalWorkerHandler
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.handlers.initial_sync import InitialSyncHandler
|
2018-07-20 10:32:23 -04:00
|
|
|
from synapse.handlers.message import EventCreationHandler, MessageHandler
|
|
|
|
from synapse.handlers.pagination import PaginationHandler
|
2020-03-26 12:51:13 -04:00
|
|
|
from synapse.handlers.password_policy import PasswordPolicyHandler
|
2016-05-16 13:56:37 -04:00
|
|
|
from synapse.handlers.presence import PresenceHandler
|
2018-08-22 05:13:40 -04:00
|
|
|
from synapse.handlers.profile import BaseProfileHandler, MasterProfileHandler
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.handlers.read_marker import ReadMarkerHandler
|
|
|
|
from synapse.handlers.receipts import ReceiptsHandler
|
2019-02-20 02:47:31 -05:00
|
|
|
from synapse.handlers.register import RegistrationHandler
|
2020-07-14 07:36:23 -04:00
|
|
|
from synapse.handlers.room import (
|
|
|
|
RoomContextHandler,
|
|
|
|
RoomCreationHandler,
|
|
|
|
RoomShutdownHandler,
|
|
|
|
)
|
2016-09-14 09:07:37 -04:00
|
|
|
from synapse.handlers.room_list import RoomListHandler
|
2018-03-14 07:41:45 -04:00
|
|
|
from synapse.handlers.room_member import RoomMemberMasterHandler
|
|
|
|
from synapse.handlers.room_member_worker import RoomMemberWorkerHandler
|
2017-11-29 09:10:46 -05:00
|
|
|
from synapse.handlers.set_password import SetPasswordHandler
|
2019-05-21 12:36:50 -04:00
|
|
|
from synapse.handlers.stats import StatsHandler
|
2016-05-16 15:19:26 -04:00
|
|
|
from synapse.handlers.sync import SyncHandler
|
2020-07-16 10:12:54 -04:00
|
|
|
from synapse.handlers.typing import FollowerTypingHandler, TypingWriterHandler
|
2017-11-29 11:46:45 -05:00
|
|
|
from synapse.handlers.user_directory import UserDirectoryHandler
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.http.client import InsecureInterceptableContextFactory, SimpleHttpClient
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
|
|
|
from synapse.notifier import Notifier
|
2017-05-18 13:17:40 -04:00
|
|
|
from synapse.push.action_generator import ActionGenerator
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.push.pusherpool import PusherPool
|
2020-04-06 04:58:42 -04:00
|
|
|
from synapse.replication.tcp.client import ReplicationDataHandler
|
|
|
|
from synapse.replication.tcp.handler import ReplicationCommandHandler
|
2020-03-25 10:54:01 -04:00
|
|
|
from synapse.replication.tcp.resource import ReplicationStreamer
|
2020-08-11 13:00:17 -04:00
|
|
|
from synapse.replication.tcp.streams import STREAMS_MAP, Stream
|
2017-11-21 06:08:08 -05:00
|
|
|
from synapse.rest.media.v1.media_repository import (
|
|
|
|
MediaRepository,
|
|
|
|
MediaRepositoryResource,
|
|
|
|
)
|
2018-07-20 08:41:13 -04:00
|
|
|
from synapse.secrets import Secrets
|
2018-05-17 06:34:28 -04:00
|
|
|
from synapse.server_notices.server_notices_manager import ServerNoticesManager
|
2018-05-17 12:35:31 -04:00
|
|
|
from synapse.server_notices.server_notices_sender import ServerNoticesSender
|
2019-06-20 05:32:02 -04:00
|
|
|
from synapse.server_notices.worker_server_notices_sender import (
|
|
|
|
WorkerServerNoticesSender,
|
|
|
|
)
|
2018-01-27 04:15:45 -05:00
|
|
|
from synapse.state import StateHandler, StateResolutionHandler
|
2020-08-05 16:38:57 -04:00
|
|
|
from synapse.storage import Databases, DataStore, Storage
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.streams.events import EventSources
|
2020-08-11 13:00:17 -04:00
|
|
|
from synapse.types import DomainSpecificString
|
2014-08-12 10:10:52 -04:00
|
|
|
from synapse.util import Clock
|
|
|
|
from synapse.util.distributor import Distributor
|
2020-03-30 11:37:24 -04:00
|
|
|
from synapse.util.stringutils import random_string
|
2016-01-26 10:51:06 -05:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2020-08-11 13:20:16 -04:00
|
|
|
if TYPE_CHECKING:
|
|
|
|
from synapse.handlers.oidc_handler import OidcHandler
|
|
|
|
from synapse.handlers.saml_handler import SamlHandler
|
|
|
|
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
T = TypeVar("T", bound=Callable[..., Any])
|
|
|
|
|
|
|
|
|
|
|
|
def cache_in_self(builder: T) -> T:
|
|
|
|
"""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_`"
|
|
|
|
)
|
|
|
|
|
|
|
|
depname = builder.__name__[len("get_") :]
|
|
|
|
|
|
|
|
building = [False]
|
|
|
|
|
|
|
|
@functools.wraps(builder)
|
|
|
|
def _get(self):
|
|
|
|
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
|
|
|
|
|
2020-08-11 17:01:12 -04:00
|
|
|
# We cast here as we need to tell mypy that `_get` has the same signature as
|
|
|
|
# `builder`.
|
2020-08-11 13:00:17 -04:00
|
|
|
return cast(T, _get)
|
|
|
|
|
|
|
|
|
|
|
|
class HomeServer(metaclass=abc.ABCMeta):
|
2014-08-12 10:10:52 -04: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 13:00:17 -04:00
|
|
|
Dependencies should be added by creating a `def get_<depname>(self)`
|
|
|
|
function, wrapping it in `@cache_in_self`.
|
2018-05-10 19:17:11 -04:00
|
|
|
|
|
|
|
Attributes:
|
|
|
|
config (synapse.config.homeserver.HomeserverConfig):
|
2019-02-11 05:36:26 -05:00
|
|
|
_listening_services (list[twisted.internet.tcp.Port]): TCP ports that
|
|
|
|
we are listening on to provide HTTP services.
|
2014-08-12 10:10:52 -04:00
|
|
|
"""
|
|
|
|
|
2019-06-20 05:32:02 -04:00
|
|
|
REQUIRED_ON_MASTER_STARTUP = ["user_directory_handler", "stats_handler"]
|
|
|
|
|
2018-08-28 08:39:49 -04:00
|
|
|
# This is overridden in derived application classes
|
|
|
|
# (such as synapse.app.homeserver.SynapseHomeServer) and gives the class to be
|
|
|
|
# instantiated during setup() for future return by get_datastore()
|
2018-08-28 12:10:43 -04:00
|
|
|
DATASTORE_CLASS = abc.abstractproperty()
|
2018-08-28 08:39:49 -04:00
|
|
|
|
2019-12-11 12:27:46 -05:00
|
|
|
def __init__(self, hostname: str, config: HomeServerConfig, reactor=None, **kwargs):
|
2014-08-12 10:10:52 -04:00
|
|
|
"""
|
|
|
|
Args:
|
|
|
|
hostname : The hostname for the server.
|
2019-12-11 12:27:46 -05:00
|
|
|
config: The full config for the homeserver.
|
2014-08-12 10:10:52 -04:00
|
|
|
"""
|
2018-06-22 04:37:10 -04:00
|
|
|
if not reactor:
|
2020-08-11 13:00:17 -04:00
|
|
|
from twisted.internet import reactor as _reactor
|
|
|
|
|
|
|
|
reactor = _reactor
|
2018-06-22 04:37:10 -04:00
|
|
|
|
|
|
|
self._reactor = reactor
|
2014-08-12 10:10:52 -04:00
|
|
|
self.hostname = hostname
|
2020-07-08 12:51:56 -04:00
|
|
|
# the key we use to sign events and requests
|
|
|
|
self.signing_key = config.key.signing_key[0]
|
2019-12-06 12:42:18 -05:00
|
|
|
self.config = config
|
2020-08-11 13:00:17 -04:00
|
|
|
self._listening_services = [] # type: List[twisted.internet.tcp.Port]
|
|
|
|
self.start_time = None # type: Optional[int]
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2020-04-29 11:23:08 -04:00
|
|
|
self._instance_id = random_string(5)
|
|
|
|
self._instance_name = config.worker_name or "master"
|
2020-03-30 11:37:24 -04:00
|
|
|
|
2018-06-22 04:37:10 -04:00
|
|
|
self.clock = Clock(reactor)
|
2016-01-26 10:51:06 -05:00
|
|
|
self.distributor = Distributor()
|
2020-06-05 05:47:20 -04:00
|
|
|
|
|
|
|
self.registration_ratelimiter = Ratelimiter(
|
|
|
|
clock=self.clock,
|
|
|
|
rate_hz=config.rc_registration.per_second,
|
|
|
|
burst_count=config.rc_registration.burst_count,
|
|
|
|
)
|
2016-01-26 10:51:06 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
self.datastores = None # type: Optional[Databases]
|
2018-08-28 08:39:49 -04:00
|
|
|
|
2014-08-12 10:10:52 -04:00
|
|
|
# Other kwargs are explicit dependencies
|
|
|
|
for depname in kwargs:
|
|
|
|
setattr(self, depname, kwargs[depname])
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_instance_id(self) -> str:
|
2020-03-30 11:37:24 -04:00
|
|
|
"""A unique ID for this synapse process instance.
|
|
|
|
|
|
|
|
This is used to distinguish running instances in worker-based
|
|
|
|
deployments.
|
|
|
|
"""
|
2020-04-29 11:23:08 -04: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 11:37:24 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def setup(self) -> None:
|
2016-01-26 10:51:06 -05:00
|
|
|
logger.info("Setting up.")
|
2019-11-04 13:05:48 -05:00
|
|
|
self.start_time = int(self.get_clock().time())
|
2020-08-05 16:38:57 -04:00
|
|
|
self.datastores = Databases(self.DATASTORE_CLASS, self)
|
2016-01-26 10:51:06 -05:00
|
|
|
logger.info("Finished setting up.")
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def setup_master(self) -> None:
|
2019-03-12 10:17:51 -04: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.
|
|
|
|
"""
|
2019-03-11 06:13:35 -04:00
|
|
|
for i in self.REQUIRED_ON_MASTER_STARTUP:
|
|
|
|
getattr(self, "get_" + i)()
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_reactor(self) -> twisted.internet.base.ReactorBase:
|
2018-06-22 04:37:10 -04:00
|
|
|
"""
|
|
|
|
Fetch the Twisted reactor in use by this HomeServer.
|
|
|
|
"""
|
|
|
|
return self._reactor
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_ip_from_request(self, request) -> str:
|
2015-06-12 12:13:23 -04:00
|
|
|
# X-Forwarded-For is handled by our custom request type.
|
|
|
|
return request.getClientIP()
|
2014-09-26 11:36:24 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def is_mine(self, domain_specific_string: DomainSpecificString) -> bool:
|
2014-12-02 05:42:28 -05:00
|
|
|
return domain_specific_string.domain == self.hostname
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def is_mine_id(self, string: str) -> bool:
|
2016-01-19 11:11:39 -05:00
|
|
|
return string.split(":", 1)[1] == self.hostname
|
2016-01-19 11:01:05 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_clock(self) -> Clock:
|
2017-11-21 05:50:23 -05:00
|
|
|
return self.clock
|
|
|
|
|
2020-07-16 08:52:29 -04:00
|
|
|
def get_datastore(self) -> DataStore:
|
2020-08-11 13:00:17 -04:00
|
|
|
if not self.datastores:
|
|
|
|
raise Exception("HomeServer.setup must be called before getting datastores")
|
|
|
|
|
2019-10-23 07:02:36 -04:00
|
|
|
return self.datastores.main
|
2017-11-21 05:50:23 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_datastores(self) -> Databases:
|
|
|
|
if not self.datastores:
|
|
|
|
raise Exception("HomeServer.setup must be called before getting datastores")
|
|
|
|
|
2019-12-18 05:45:12 -05:00
|
|
|
return self.datastores
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_config(self) -> HomeServerConfig:
|
2017-11-21 05:50:23 -05:00
|
|
|
return self.config
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_distributor(self) -> Distributor:
|
2017-11-21 05:50:23 -05:00
|
|
|
return self.distributor
|
|
|
|
|
2020-06-05 05:47:20 -04:00
|
|
|
def get_registration_ratelimiter(self) -> Ratelimiter:
|
2019-03-06 06:02:42 -05:00
|
|
|
return self.registration_ratelimiter
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_client(self) -> FederationClient:
|
2018-03-12 10:34:31 -04:00
|
|
|
return FederationClient(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_server(self) -> FederationServer:
|
2018-03-12 10:34:31 -04:00
|
|
|
return FederationServer(self)
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_handlers(self) -> Handlers:
|
2014-08-12 10:10:52 -04:00
|
|
|
return Handlers(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_notifier(self) -> Notifier:
|
2014-08-12 10:10:52 -04:00
|
|
|
return Notifier(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth(self) -> Auth:
|
2014-08-12 10:10:52 -04:00
|
|
|
return Auth(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_http_client_context_factory(self) -> IPolicyForHTTPS:
|
2015-09-09 07:02:07 -04:00
|
|
|
return (
|
2015-09-15 10:50:13 -04:00
|
|
|
InsecureInterceptableContextFactory()
|
2016-01-26 10:51:06 -05:00
|
|
|
if self.config.use_insecure_ssl_client_just_for_testing_do_not_use
|
2020-03-17 17:32:25 -04:00
|
|
|
else RegularPolicyForHTTPS()
|
2015-09-09 07:02:07 -04:00
|
|
|
)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_simple_http_client(self) -> SimpleHttpClient:
|
2015-09-09 07:02:07 -04:00
|
|
|
return SimpleHttpClient(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_proxied_http_client(self) -> SimpleHttpClient:
|
2019-11-01 10:07:44 -04:00
|
|
|
return SimpleHttpClient(
|
|
|
|
self,
|
2019-11-26 13:10:50 -05:00
|
|
|
http_proxy=os.getenvb(b"http_proxy"),
|
|
|
|
https_proxy=os.getenvb(b"HTTPS_PROXY"),
|
2019-11-01 10:07:44 -04:00
|
|
|
)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_creation_handler(self) -> RoomCreationHandler:
|
2018-05-17 04:01:09 -04:00
|
|
|
return RoomCreationHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_shutdown_handler(self) -> RoomShutdownHandler:
|
2020-07-14 07:36:23 -04:00
|
|
|
return RoomShutdownHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_sendmail(self) -> sendmail:
|
2018-10-30 08:55:43 -04:00
|
|
|
return sendmail
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_state_handler(self) -> StateHandler:
|
2014-08-12 10:10:52 -04:00
|
|
|
return StateHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_state_resolution_handler(self) -> StateResolutionHandler:
|
2018-01-27 04:15:45 -05:00
|
|
|
return StateResolutionHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_presence_handler(self) -> PresenceHandler:
|
2016-05-16 13:56:37 -04:00
|
|
|
return PresenceHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_typing_handler(self):
|
2020-07-16 10:12:54 -04:00
|
|
|
if self.config.worker.writers.typing == self.get_instance_name():
|
|
|
|
return TypingWriterHandler(self)
|
|
|
|
else:
|
|
|
|
return FollowerTypingHandler(self)
|
2016-05-17 10:58:46 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_sync_handler(self) -> SyncHandler:
|
2016-05-16 15:19:26 -04:00
|
|
|
return SyncHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_list_handler(self) -> RoomListHandler:
|
2016-05-31 06:05:16 -04:00
|
|
|
return RoomListHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth_handler(self) -> AuthHandler:
|
2016-06-02 08:31:45 -04:00
|
|
|
return AuthHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_macaroon_generator(self) -> MacaroonGenerator:
|
2018-06-22 04:37:10 -04:00
|
|
|
return MacaroonGenerator(self)
|
2017-02-02 05:53:36 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_device_handler(self):
|
2019-03-04 13:24:32 -05:00
|
|
|
if self.config.worker_app:
|
|
|
|
return DeviceWorkerHandler(self)
|
|
|
|
else:
|
|
|
|
return DeviceHandler(self)
|
2016-07-15 08:19:07 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_device_message_handler(self) -> DeviceMessageHandler:
|
2016-09-06 13:16:20 -04:00
|
|
|
return DeviceMessageHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_e2e_keys_handler(self) -> E2eKeysHandler:
|
2016-08-01 13:02:07 -04:00
|
|
|
return E2eKeysHandler(self)
|
2017-12-05 16:44:25 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_e2e_room_keys_handler(self) -> E2eRoomKeysHandler:
|
2017-12-05 16:44:25 -05:00
|
|
|
return E2eRoomKeysHandler(self)
|
2016-08-01 13:02:07 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_acme_handler(self) -> AcmeHandler:
|
2019-01-23 03:39:06 -05:00
|
|
|
return AcmeHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_application_service_api(self) -> ApplicationServiceApi:
|
2016-05-31 08:53:48 -04:00
|
|
|
return ApplicationServiceApi(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_application_service_scheduler(self) -> ApplicationServiceScheduler:
|
2016-05-31 08:53:48 -04:00
|
|
|
return ApplicationServiceScheduler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_application_service_handler(self) -> ApplicationServicesHandler:
|
2016-05-31 08:53:48 -04:00
|
|
|
return ApplicationServicesHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_handler(self) -> EventHandler:
|
2016-08-12 10:31:44 -04:00
|
|
|
return EventHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_stream_handler(self) -> EventStreamHandler:
|
2016-08-12 10:31:44 -04:00
|
|
|
return EventStreamHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_initial_sync_handler(self) -> InitialSyncHandler:
|
2016-09-21 06:46:28 -04:00
|
|
|
return InitialSyncHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_profile_handler(self):
|
2018-08-17 06:43:16 -04:00
|
|
|
if self.config.worker_app:
|
2018-08-22 05:13:40 -04:00
|
|
|
return BaseProfileHandler(self)
|
2018-08-17 06:43:16 -04:00
|
|
|
else:
|
|
|
|
return MasterProfileHandler(self)
|
2017-08-25 09:34:56 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_creation_handler(self) -> EventCreationHandler:
|
2018-01-15 11:52:07 -05:00
|
|
|
return EventCreationHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_deactivate_account_handler(self) -> DeactivateAccountHandler:
|
2017-11-29 06:48:43 -05:00
|
|
|
return DeactivateAccountHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_set_password_handler(self) -> SetPasswordHandler:
|
2017-11-29 09:10:46 -05:00
|
|
|
return SetPasswordHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_sources(self) -> EventSources:
|
2014-08-26 13:57:46 -04:00
|
|
|
return EventSources(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_keyring(self) -> Keyring:
|
2014-09-30 10:15:10 -04:00
|
|
|
return Keyring(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_builder_factory(self) -> EventBuilderFactory:
|
2019-01-25 12:19:31 -05:00
|
|
|
return EventBuilderFactory(self)
|
2015-01-27 09:28:56 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_filtering(self) -> Filtering:
|
2015-01-27 09:28:56 -05:00
|
|
|
return Filtering(self)
|
2015-01-29 09:55:27 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_pusherpool(self) -> PusherPool:
|
2014-11-19 13:20:59 -05:00
|
|
|
return PusherPool(self)
|
2016-01-26 08:52:29 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_http_client(self) -> MatrixFederationHttpClient:
|
2020-03-17 17:32:25 -04:00
|
|
|
tls_client_options_factory = context_factory.FederationPolicyForHTTPS(
|
2019-02-11 13:03:30 -05:00
|
|
|
self.config
|
|
|
|
)
|
|
|
|
return MatrixFederationHttpClient(self, tls_client_options_factory)
|
2016-01-26 08:52:29 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_media_repository_resource(self) -> MediaRepositoryResource:
|
2017-11-21 06:08:08 -05: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 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_media_repository(self) -> MediaRepository:
|
2016-06-29 09:57:59 -04:00
|
|
|
return MediaRepository(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_transport_client(self) -> TransportLayerClient:
|
2016-11-16 09:15:50 -05:00
|
|
|
return TransportLayerClient(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_sender(self):
|
2016-11-23 09:09:47 -05:00
|
|
|
if self.should_send_federation():
|
2019-03-13 16:02:56 -04:00
|
|
|
return FederationSender(self)
|
2016-11-23 09:09:47 -05:00
|
|
|
elif not self.config.worker_app:
|
2016-11-16 12:34:44 -05:00
|
|
|
return FederationRemoteSendQueue(self)
|
2016-11-23 09:09:47 -05:00
|
|
|
else:
|
|
|
|
raise Exception("Workers cannot send federation traffic")
|
2016-11-16 09:15:50 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_receipts_handler(self) -> ReceiptsHandler:
|
2016-11-23 10:14:24 -05:00
|
|
|
return ReceiptsHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_read_marker_handler(self) -> ReadMarkerHandler:
|
2017-04-11 10:01:39 -04:00
|
|
|
return ReadMarkerHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_tcp_replication(self) -> ReplicationCommandHandler:
|
2020-04-06 04:58:42 -04:00
|
|
|
return ReplicationCommandHandler(self)
|
2017-03-27 11:33:44 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_action_generator(self) -> ActionGenerator:
|
2017-05-18 13:17:40 -04:00
|
|
|
return ActionGenerator(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_user_directory_handler(self) -> UserDirectoryHandler:
|
2017-11-29 11:46:45 -05:00
|
|
|
return UserDirectoryHandler(self)
|
2017-05-31 06:51:01 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_groups_local_handler(self):
|
2020-02-07 06:14:19 -05:00
|
|
|
if self.config.worker_app:
|
|
|
|
return GroupsLocalWorkerHandler(self)
|
|
|
|
else:
|
|
|
|
return GroupsLocalHandler(self)
|
2017-07-10 09:52:27 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_groups_server_handler(self):
|
2020-02-07 06:14:19 -05:00
|
|
|
if self.config.worker_app:
|
|
|
|
return GroupsServerWorkerHandler(self)
|
|
|
|
else:
|
|
|
|
return GroupsServerHandler(self)
|
2017-07-10 10:44:15 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_groups_attestation_signing(self) -> GroupAttestationSigning:
|
2017-07-10 10:44:15 -04:00
|
|
|
return GroupAttestationSigning(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_groups_attestation_renewer(self) -> GroupAttestionRenewer:
|
2017-07-10 10:44:15 -04:00
|
|
|
return GroupAttestionRenewer(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_secrets(self) -> Secrets:
|
2018-07-20 08:41:13 -04:00
|
|
|
return Secrets()
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_stats_handler(self) -> StatsHandler:
|
2019-05-21 12:36:50 -04:00
|
|
|
return StatsHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_spam_checker(self):
|
2017-09-26 14:20:23 -04:00
|
|
|
return SpamChecker(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_third_party_event_rules(self) -> ThirdPartyEventRules:
|
2019-06-12 05:31:37 -04:00
|
|
|
return ThirdPartyEventRules(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_member_handler(self):
|
2018-03-13 09:49:13 -04:00
|
|
|
if self.config.worker_app:
|
2018-03-13 12:32:37 -04:00
|
|
|
return RoomMemberWorkerHandler(self)
|
2018-03-13 09:49:13 -04:00
|
|
|
return RoomMemberMasterHandler(self)
|
2018-03-01 05:54:37 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_registry(self) -> FederationHandlerRegistry:
|
2020-07-16 10:12:54 -04:00
|
|
|
return FederationHandlerRegistry(self)
|
2018-03-12 12:17:08 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_server_notices_manager(self):
|
2018-05-22 05:57:56 -04:00
|
|
|
if self.config.worker_app:
|
|
|
|
raise Exception("Workers cannot send server notices")
|
2018-05-17 06:34:28 -04:00
|
|
|
return ServerNoticesManager(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_server_notices_sender(self):
|
2018-05-22 05:57:56 -04:00
|
|
|
if self.config.worker_app:
|
|
|
|
return WorkerServerNoticesSender(self)
|
2018-05-17 12:35:31 -04:00
|
|
|
return ServerNoticesSender(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_message_handler(self) -> MessageHandler:
|
2018-07-18 10:22:02 -04:00
|
|
|
return MessageHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_pagination_handler(self) -> PaginationHandler:
|
2018-07-18 10:22:02 -04:00
|
|
|
return PaginationHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_context_handler(self) -> RoomContextHandler:
|
2018-07-18 10:29:45 -04:00
|
|
|
return RoomContextHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_registration_handler(self) -> RegistrationHandler:
|
2019-02-20 02:47:31 -05:00
|
|
|
return RegistrationHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_account_validity_handler(self) -> AccountValidityHandler:
|
2019-04-10 12:58:47 -04:00
|
|
|
return AccountValidityHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_cas_handler(self) -> CasHandler:
|
2020-03-26 15:05:26 -04:00
|
|
|
return CasHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
2020-08-11 13:20:16 -04:00
|
|
|
def get_saml_handler(self) -> "SamlHandler":
|
|
|
|
from synapse.handlers.saml_handler import SamlHandler
|
2019-05-09 08:21:57 -04:00
|
|
|
|
2019-06-26 19:37:41 -04:00
|
|
|
return SamlHandler(self)
|
2019-06-26 17:34:41 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
2020-08-11 13:20:16 -04:00
|
|
|
def get_oidc_handler(self) -> "OidcHandler":
|
|
|
|
from synapse.handlers.oidc_handler import OidcHandler
|
2020-05-08 08:30:40 -04:00
|
|
|
|
|
|
|
return OidcHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_event_client_serializer(self) -> EventClientSerializer:
|
2019-06-26 17:52:02 -04:00
|
|
|
return EventClientSerializer(self)
|
2019-06-10 19:03:57 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_password_policy_handler(self) -> PasswordPolicyHandler:
|
2020-03-26 12:51:13 -04:00
|
|
|
return PasswordPolicyHandler(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_storage(self) -> Storage:
|
|
|
|
return Storage(self, self.get_datastores())
|
2019-10-23 07:02:36 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_streamer(self) -> ReplicationStreamer:
|
2020-03-25 10:54:01 -04:00
|
|
|
return ReplicationStreamer(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_data_handler(self) -> ReplicationDataHandler:
|
2020-05-14 09:01:39 -04:00
|
|
|
return ReplicationDataHandler(self)
|
2020-04-06 04:58:42 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_streams(self) -> Dict[str, Stream]:
|
2020-05-22 09:21:54 -04:00
|
|
|
return {stream.NAME: stream(self) for stream in STREAMS_MAP.values()}
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
async def remove_pusher(self, app_id: str, push_key: str, user_id: str):
|
|
|
|
return await self.get_pusherpool().remove_pusher(app_id, push_key, user_id)
|
2016-04-21 12:21:02 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
def should_send_federation(self) -> bool:
|
2016-11-23 09:09:47 -05:00
|
|
|
"Should this server be sending federation traffic directly?"
|
|
|
|
return self.config.send_federation and (
|
|
|
|
not self.config.worker_app
|
|
|
|
or self.config.worker_app == "synapse.app.federation_sender"
|
|
|
|
)
|