2014-08-12 08:10:52 -06:00
|
|
|
# -*- coding: utf-8 -*-
|
2016-01-06 21:26:29 -07:00
|
|
|
# Copyright 2014-2016 OpenMarket Ltd
|
2014-08-12 08:10:52 -06: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 20:14:34 -06:00
|
|
|
|
2014-08-12 08:10:52 -06: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 10:10:43 -06:00
|
|
|
import abc
|
2016-08-01 11:02:07 -06:00
|
|
|
import logging
|
|
|
|
|
2016-01-26 06:52:29 -07:00
|
|
|
from twisted.enterprise import adbapi
|
2018-10-30 06:55:43 -06:00
|
|
|
from twisted.mail.smtp import sendmail
|
2016-08-01 11:02:07 -06:00
|
|
|
from twisted.web.client import BrowserLikePolicyForHTTPS
|
2016-01-26 06:52:29 -07:00
|
|
|
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.api.auth import Auth
|
|
|
|
from synapse.api.filtering import Filtering
|
|
|
|
from synapse.api.ratelimiting import Ratelimiter
|
2016-05-31 06:53:48 -06:00
|
|
|
from synapse.appservice.api import ApplicationServiceApi
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.appservice.scheduler import ApplicationServiceScheduler
|
|
|
|
from synapse.crypto.keyring import Keyring
|
|
|
|
from synapse.events.builder import EventBuilderFactory
|
2017-09-26 12:20:23 -06:00
|
|
|
from synapse.events.spamcheck import SpamChecker
|
2018-03-12 08:34:31 -06:00
|
|
|
from synapse.federation.federation_client import FederationClient
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.federation.federation_server import (
|
|
|
|
FederationHandlerRegistry,
|
|
|
|
FederationServer,
|
2018-07-26 04:44:22 -06:00
|
|
|
ReplicationFederationHandlerRegistry,
|
2018-07-09 00:09:20 -06:00
|
|
|
)
|
2016-11-16 10:34:44 -07:00
|
|
|
from synapse.federation.send_queue import FederationRemoteSendQueue
|
2016-11-16 07:15:50 -07:00
|
|
|
from synapse.federation.transaction_queue import TransactionQueue
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.federation.transport.client import TransportLayerClient
|
|
|
|
from synapse.groups.attestations import GroupAttestationSigning, GroupAttestionRenewer
|
|
|
|
from synapse.groups.groups_server import GroupsServerHandler
|
2014-08-12 08:10:52 -06:00
|
|
|
from synapse.handlers import Handlers
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.handlers.appservice import ApplicationServicesHandler
|
2018-06-22 02:37:10 -06:00
|
|
|
from synapse.handlers.auth import AuthHandler, MacaroonGenerator
|
2017-11-29 04:48:43 -07:00
|
|
|
from synapse.handlers.deactivate_account import DeactivateAccountHandler
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.handlers.device import DeviceHandler
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.handlers.devicemessage import DeviceMessageHandler
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.handlers.e2e_keys import E2eKeysHandler
|
2017-12-05 14:44:25 -07:00
|
|
|
from synapse.handlers.e2e_room_keys import E2eRoomKeysHandler
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.handlers.events import EventHandler, EventStreamHandler
|
|
|
|
from synapse.handlers.groups_local import GroupsLocalHandler
|
|
|
|
from synapse.handlers.initial_sync import InitialSyncHandler
|
2018-07-20 08:32:23 -06:00
|
|
|
from synapse.handlers.message import EventCreationHandler, MessageHandler
|
|
|
|
from synapse.handlers.pagination import PaginationHandler
|
2016-05-16 11:56:37 -06:00
|
|
|
from synapse.handlers.presence import PresenceHandler
|
2018-08-22 03:13:40 -06:00
|
|
|
from synapse.handlers.profile import BaseProfileHandler, MasterProfileHandler
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.handlers.read_marker import ReadMarkerHandler
|
|
|
|
from synapse.handlers.receipts import ReceiptsHandler
|
2018-07-18 08:29:45 -06:00
|
|
|
from synapse.handlers.room import RoomContextHandler, RoomCreationHandler
|
2016-09-14 07:07:37 -06:00
|
|
|
from synapse.handlers.room_list import RoomListHandler
|
2018-03-14 05:41:45 -06:00
|
|
|
from synapse.handlers.room_member import RoomMemberMasterHandler
|
|
|
|
from synapse.handlers.room_member_worker import RoomMemberWorkerHandler
|
2017-11-29 07:10:46 -07:00
|
|
|
from synapse.handlers.set_password import SetPasswordHandler
|
2016-05-16 13:19:26 -06:00
|
|
|
from synapse.handlers.sync import SyncHandler
|
2016-05-17 08:58:46 -06:00
|
|
|
from synapse.handlers.typing import TypingHandler
|
2017-11-29 09:46:45 -07:00
|
|
|
from synapse.handlers.user_directory import UserDirectoryHandler
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.http.client import InsecureInterceptableContextFactory, SimpleHttpClient
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
|
|
|
from synapse.notifier import Notifier
|
2017-05-18 11:17:40 -06:00
|
|
|
from synapse.push.action_generator import ActionGenerator
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.push.pusherpool import PusherPool
|
2017-11-21 04:08:08 -07:00
|
|
|
from synapse.rest.media.v1.media_repository import (
|
|
|
|
MediaRepository,
|
|
|
|
MediaRepositoryResource,
|
|
|
|
)
|
2018-07-20 06:41:13 -06:00
|
|
|
from synapse.secrets import Secrets
|
2018-05-17 04:34:28 -06:00
|
|
|
from synapse.server_notices.server_notices_manager import ServerNoticesManager
|
2018-05-17 10:35:31 -06:00
|
|
|
from synapse.server_notices.server_notices_sender import ServerNoticesSender
|
2018-07-09 00:09:20 -06:00
|
|
|
from synapse.server_notices.worker_server_notices_sender import WorkerServerNoticesSender
|
2018-01-27 02:15:45 -07:00
|
|
|
from synapse.state import StateHandler, StateResolutionHandler
|
2016-08-01 11:02:07 -06:00
|
|
|
from synapse.streams.events import EventSources
|
2014-08-12 08:10:52 -06:00
|
|
|
from synapse.util import Clock
|
|
|
|
from synapse.util.distributor import Distributor
|
2016-01-26 08:51:06 -07:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2014-08-12 08:10:52 -06:00
|
|
|
|
2016-01-26 06:52:29 -07:00
|
|
|
class HomeServer(object):
|
2014-08-12 08:10:52 -06: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.
|
|
|
|
|
|
|
|
For every dependency in the DEPENDENCIES list below, this class creates one
|
|
|
|
method,
|
|
|
|
def get_DEPENDENCY(self)
|
|
|
|
which returns the value of that dependency. If no value has yet been set
|
|
|
|
nor was provided to the constructor, it will attempt to call a lazy builder
|
|
|
|
method called
|
|
|
|
def build_DEPENDENCY(self)
|
|
|
|
which must be implemented by the subclass. This code may call any of the
|
|
|
|
required "get" methods on the instance to obtain the sub-dependencies that
|
|
|
|
one requires.
|
2018-05-10 17:17:11 -06:00
|
|
|
|
|
|
|
Attributes:
|
|
|
|
config (synapse.config.homeserver.HomeserverConfig):
|
2014-08-12 08:10:52 -06:00
|
|
|
"""
|
|
|
|
|
2018-08-28 10:10:43 -06:00
|
|
|
__metaclass__ = abc.ABCMeta
|
|
|
|
|
2014-08-12 08:10:52 -06:00
|
|
|
DEPENDENCIES = [
|
|
|
|
'http_client',
|
|
|
|
'db_pool',
|
2018-03-13 07:26:52 -06:00
|
|
|
'federation_client',
|
2018-03-13 07:22:21 -06:00
|
|
|
'federation_server',
|
2014-08-12 08:10:52 -06:00
|
|
|
'handlers',
|
|
|
|
'auth',
|
2018-05-17 02:01:09 -06:00
|
|
|
'room_creation_handler',
|
2014-08-12 08:10:52 -06:00
|
|
|
'state_handler',
|
2018-01-27 02:15:45 -07:00
|
|
|
'state_resolution_handler',
|
2016-05-16 11:56:37 -06:00
|
|
|
'presence_handler',
|
2016-05-16 13:19:26 -06:00
|
|
|
'sync_handler',
|
2016-05-17 08:58:46 -06:00
|
|
|
'typing_handler',
|
2016-05-31 04:05:16 -06:00
|
|
|
'room_list_handler',
|
2016-06-02 06:31:45 -06:00
|
|
|
'auth_handler',
|
2016-07-15 06:19:07 -06:00
|
|
|
'device_handler',
|
2016-08-01 11:02:07 -06:00
|
|
|
'e2e_keys_handler',
|
2017-12-05 14:44:25 -07:00
|
|
|
'e2e_room_keys_handler',
|
2016-08-12 08:31:44 -06:00
|
|
|
'event_handler',
|
|
|
|
'event_stream_handler',
|
2016-09-21 04:46:28 -06:00
|
|
|
'initial_sync_handler',
|
2016-05-31 06:53:48 -06:00
|
|
|
'application_service_api',
|
|
|
|
'application_service_scheduler',
|
|
|
|
'application_service_handler',
|
2016-09-06 11:16:20 -06:00
|
|
|
'device_message_handler',
|
2017-08-25 07:34:56 -06:00
|
|
|
'profile_handler',
|
2018-01-15 09:52:07 -07:00
|
|
|
'event_creation_handler',
|
2017-11-29 04:48:43 -07:00
|
|
|
'deactivate_account_handler',
|
2017-11-29 07:10:46 -07:00
|
|
|
'set_password_handler',
|
2014-08-12 08:10:52 -06:00
|
|
|
'notifier',
|
2014-08-26 11:57:46 -06:00
|
|
|
'event_sources',
|
2014-09-30 08:15:10 -06:00
|
|
|
'keyring',
|
2014-12-18 08:15:22 -07:00
|
|
|
'pusherpool',
|
2014-12-04 08:50:01 -07:00
|
|
|
'event_builder_factory',
|
2015-01-27 07:28:56 -07:00
|
|
|
'filtering',
|
2015-09-09 05:02:07 -06:00
|
|
|
'http_client_context_factory',
|
|
|
|
'simple_http_client',
|
2016-06-29 07:57:59 -06:00
|
|
|
'media_repository',
|
2017-11-21 04:08:08 -07:00
|
|
|
'media_repository_resource',
|
2016-11-16 07:15:50 -07:00
|
|
|
'federation_transport_client',
|
|
|
|
'federation_sender',
|
2016-11-23 08:14:24 -07:00
|
|
|
'receipts_handler',
|
2017-02-02 03:53:36 -07:00
|
|
|
'macaroon_generator',
|
2017-03-27 09:33:44 -06:00
|
|
|
'tcp_replication',
|
2017-04-11 08:01:39 -06:00
|
|
|
'read_marker_handler',
|
2017-05-18 11:17:40 -06:00
|
|
|
'action_generator',
|
2017-05-31 04:51:01 -06:00
|
|
|
'user_directory_handler',
|
2017-07-10 07:52:27 -06:00
|
|
|
'groups_local_handler',
|
2017-07-10 08:44:15 -06:00
|
|
|
'groups_server_handler',
|
|
|
|
'groups_attestation_signing',
|
|
|
|
'groups_attestation_renewer',
|
2018-07-20 06:41:13 -06:00
|
|
|
'secrets',
|
2017-09-26 12:20:23 -06:00
|
|
|
'spam_checker',
|
2018-03-01 03:54:37 -07:00
|
|
|
'room_member_handler',
|
2018-03-12 10:17:08 -06:00
|
|
|
'federation_registry',
|
2018-05-17 04:34:28 -06:00
|
|
|
'server_notices_manager',
|
2018-05-17 10:35:31 -06:00
|
|
|
'server_notices_sender',
|
2018-07-18 08:22:02 -06:00
|
|
|
'message_handler',
|
|
|
|
'pagination_handler',
|
2018-07-18 08:29:45 -06:00
|
|
|
'room_context_handler',
|
2018-10-30 06:55:43 -06:00
|
|
|
'sendmail',
|
2014-08-12 08:10:52 -06:00
|
|
|
]
|
|
|
|
|
2018-08-28 06:39:49 -06: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 10:10:43 -06:00
|
|
|
DATASTORE_CLASS = abc.abstractproperty()
|
2018-08-28 06:39:49 -06:00
|
|
|
|
2018-06-22 02:37:10 -06:00
|
|
|
def __init__(self, hostname, reactor=None, **kwargs):
|
2014-08-12 08:10:52 -06:00
|
|
|
"""
|
|
|
|
Args:
|
|
|
|
hostname : The hostname for the server.
|
|
|
|
"""
|
2018-06-22 02:37:10 -06:00
|
|
|
if not reactor:
|
|
|
|
from twisted.internet import reactor
|
|
|
|
|
|
|
|
self._reactor = reactor
|
2014-08-12 08:10:52 -06:00
|
|
|
self.hostname = hostname
|
|
|
|
self._building = {}
|
|
|
|
|
2018-06-22 02:37:10 -06:00
|
|
|
self.clock = Clock(reactor)
|
2016-01-26 08:51:06 -07:00
|
|
|
self.distributor = Distributor()
|
|
|
|
self.ratelimiter = Ratelimiter()
|
|
|
|
|
2018-08-28 06:39:49 -06:00
|
|
|
self.datastore = None
|
|
|
|
|
2014-08-12 08:10:52 -06:00
|
|
|
# Other kwargs are explicit dependencies
|
|
|
|
for depname in kwargs:
|
|
|
|
setattr(self, depname, kwargs[depname])
|
|
|
|
|
2016-01-26 08:51:06 -07:00
|
|
|
def setup(self):
|
|
|
|
logger.info("Setting up.")
|
2018-08-28 06:39:49 -06:00
|
|
|
with self.get_db_conn() as conn:
|
|
|
|
self.datastore = self.DATASTORE_CLASS(conn, self)
|
2018-10-24 10:17:30 -06:00
|
|
|
conn.commit()
|
2016-01-26 08:51:06 -07:00
|
|
|
logger.info("Finished setting up.")
|
|
|
|
|
2018-06-22 02:37:10 -06:00
|
|
|
def get_reactor(self):
|
|
|
|
"""
|
|
|
|
Fetch the Twisted reactor in use by this HomeServer.
|
|
|
|
"""
|
|
|
|
return self._reactor
|
|
|
|
|
2014-09-26 09:36:24 -06:00
|
|
|
def get_ip_from_request(self, request):
|
2015-06-12 10:13:23 -06:00
|
|
|
# X-Forwarded-For is handled by our custom request type.
|
|
|
|
return request.getClientIP()
|
2014-09-26 09:36:24 -06:00
|
|
|
|
2014-12-02 03:42:28 -07:00
|
|
|
def is_mine(self, domain_specific_string):
|
|
|
|
return domain_specific_string.domain == self.hostname
|
|
|
|
|
2016-01-19 09:01:05 -07:00
|
|
|
def is_mine_id(self, string):
|
2016-01-19 09:11:39 -07:00
|
|
|
return string.split(":", 1)[1] == self.hostname
|
2016-01-19 09:01:05 -07:00
|
|
|
|
2017-11-21 03:50:23 -07:00
|
|
|
def get_clock(self):
|
|
|
|
return self.clock
|
|
|
|
|
|
|
|
def get_datastore(self):
|
|
|
|
return self.datastore
|
|
|
|
|
|
|
|
def get_config(self):
|
|
|
|
return self.config
|
|
|
|
|
|
|
|
def get_distributor(self):
|
|
|
|
return self.distributor
|
|
|
|
|
|
|
|
def get_ratelimiter(self):
|
|
|
|
return self.ratelimiter
|
|
|
|
|
2018-03-13 07:26:52 -06:00
|
|
|
def build_federation_client(self):
|
2018-03-12 08:34:31 -06:00
|
|
|
return FederationClient(self)
|
|
|
|
|
2018-03-13 07:22:21 -06:00
|
|
|
def build_federation_server(self):
|
2018-03-12 08:34:31 -06:00
|
|
|
return FederationServer(self)
|
2014-08-12 08:10:52 -06:00
|
|
|
|
|
|
|
def build_handlers(self):
|
|
|
|
return Handlers(self)
|
|
|
|
|
|
|
|
def build_notifier(self):
|
|
|
|
return Notifier(self)
|
|
|
|
|
|
|
|
def build_auth(self):
|
|
|
|
return Auth(self)
|
|
|
|
|
2015-09-09 05:02:07 -06:00
|
|
|
def build_http_client_context_factory(self):
|
|
|
|
return (
|
2015-09-15 08:50:13 -06:00
|
|
|
InsecureInterceptableContextFactory()
|
2016-01-26 08:51:06 -07:00
|
|
|
if self.config.use_insecure_ssl_client_just_for_testing_do_not_use
|
2015-09-09 05:02:07 -06:00
|
|
|
else BrowserLikePolicyForHTTPS()
|
|
|
|
)
|
|
|
|
|
|
|
|
def build_simple_http_client(self):
|
|
|
|
return SimpleHttpClient(self)
|
|
|
|
|
2018-05-17 02:01:09 -06:00
|
|
|
def build_room_creation_handler(self):
|
|
|
|
return RoomCreationHandler(self)
|
|
|
|
|
2018-10-30 06:55:43 -06:00
|
|
|
def build_sendmail(self):
|
|
|
|
return sendmail
|
|
|
|
|
2014-08-12 08:10:52 -06:00
|
|
|
def build_state_handler(self):
|
|
|
|
return StateHandler(self)
|
|
|
|
|
2018-01-27 02:15:45 -07:00
|
|
|
def build_state_resolution_handler(self):
|
|
|
|
return StateResolutionHandler(self)
|
|
|
|
|
2016-05-16 11:56:37 -06:00
|
|
|
def build_presence_handler(self):
|
|
|
|
return PresenceHandler(self)
|
|
|
|
|
2016-05-17 08:58:46 -06:00
|
|
|
def build_typing_handler(self):
|
|
|
|
return TypingHandler(self)
|
|
|
|
|
2016-05-16 13:19:26 -06:00
|
|
|
def build_sync_handler(self):
|
|
|
|
return SyncHandler(self)
|
|
|
|
|
2016-05-31 04:05:16 -06:00
|
|
|
def build_room_list_handler(self):
|
|
|
|
return RoomListHandler(self)
|
|
|
|
|
2016-06-02 06:31:45 -06:00
|
|
|
def build_auth_handler(self):
|
|
|
|
return AuthHandler(self)
|
|
|
|
|
2017-02-02 03:53:36 -07:00
|
|
|
def build_macaroon_generator(self):
|
2018-06-22 02:37:10 -06:00
|
|
|
return MacaroonGenerator(self)
|
2017-02-02 03:53:36 -07:00
|
|
|
|
2016-07-15 06:19:07 -06:00
|
|
|
def build_device_handler(self):
|
|
|
|
return DeviceHandler(self)
|
|
|
|
|
2016-09-06 11:16:20 -06:00
|
|
|
def build_device_message_handler(self):
|
|
|
|
return DeviceMessageHandler(self)
|
|
|
|
|
2016-08-01 11:02:07 -06:00
|
|
|
def build_e2e_keys_handler(self):
|
|
|
|
return E2eKeysHandler(self)
|
2017-12-05 14:44:25 -07:00
|
|
|
|
|
|
|
def build_e2e_room_keys_handler(self):
|
|
|
|
return E2eRoomKeysHandler(self)
|
2016-08-01 11:02:07 -06:00
|
|
|
|
2016-05-31 06:53:48 -06:00
|
|
|
def build_application_service_api(self):
|
|
|
|
return ApplicationServiceApi(self)
|
|
|
|
|
|
|
|
def build_application_service_scheduler(self):
|
|
|
|
return ApplicationServiceScheduler(self)
|
|
|
|
|
|
|
|
def build_application_service_handler(self):
|
|
|
|
return ApplicationServicesHandler(self)
|
|
|
|
|
2016-08-12 08:31:44 -06:00
|
|
|
def build_event_handler(self):
|
|
|
|
return EventHandler(self)
|
|
|
|
|
|
|
|
def build_event_stream_handler(self):
|
|
|
|
return EventStreamHandler(self)
|
|
|
|
|
2016-09-21 04:46:28 -06:00
|
|
|
def build_initial_sync_handler(self):
|
|
|
|
return InitialSyncHandler(self)
|
|
|
|
|
2017-08-25 07:34:56 -06:00
|
|
|
def build_profile_handler(self):
|
2018-08-17 04:43:16 -06:00
|
|
|
if self.config.worker_app:
|
2018-08-22 03:13:40 -06:00
|
|
|
return BaseProfileHandler(self)
|
2018-08-17 04:43:16 -06:00
|
|
|
else:
|
|
|
|
return MasterProfileHandler(self)
|
2017-08-25 07:34:56 -06:00
|
|
|
|
2018-01-15 09:52:07 -07:00
|
|
|
def build_event_creation_handler(self):
|
|
|
|
return EventCreationHandler(self)
|
|
|
|
|
2017-11-29 04:48:43 -07:00
|
|
|
def build_deactivate_account_handler(self):
|
|
|
|
return DeactivateAccountHandler(self)
|
|
|
|
|
2017-11-29 07:10:46 -07:00
|
|
|
def build_set_password_handler(self):
|
|
|
|
return SetPasswordHandler(self)
|
|
|
|
|
2014-08-26 11:57:46 -06:00
|
|
|
def build_event_sources(self):
|
|
|
|
return EventSources(self)
|
|
|
|
|
2014-09-30 08:15:10 -06:00
|
|
|
def build_keyring(self):
|
|
|
|
return Keyring(self)
|
|
|
|
|
2014-12-04 08:50:01 -07:00
|
|
|
def build_event_builder_factory(self):
|
|
|
|
return EventBuilderFactory(
|
|
|
|
clock=self.get_clock(),
|
|
|
|
hostname=self.hostname,
|
|
|
|
)
|
2015-01-27 07:28:56 -07:00
|
|
|
|
|
|
|
def build_filtering(self):
|
|
|
|
return Filtering(self)
|
2015-01-29 07:55:27 -07:00
|
|
|
|
2014-11-19 11:20:59 -07:00
|
|
|
def build_pusherpool(self):
|
|
|
|
return PusherPool(self)
|
2016-01-26 06:52:29 -07:00
|
|
|
|
|
|
|
def build_http_client(self):
|
|
|
|
return MatrixFederationHttpClient(self)
|
|
|
|
|
|
|
|
def build_db_pool(self):
|
|
|
|
name = self.db_config["name"]
|
|
|
|
|
|
|
|
return adbapi.ConnectionPool(
|
|
|
|
name,
|
2018-06-22 02:37:10 -06:00
|
|
|
cp_reactor=self.get_reactor(),
|
2016-01-26 06:52:29 -07:00
|
|
|
**self.db_config.get("args", {})
|
|
|
|
)
|
|
|
|
|
2018-01-25 15:01:02 -07:00
|
|
|
def get_db_conn(self, run_new_connection=True):
|
|
|
|
"""Makes a new connection to the database, skipping the db pool
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Connection: a connection object implementing the PEP-249 spec
|
|
|
|
"""
|
|
|
|
# Any param beginning with cp_ is a parameter for adbapi, and should
|
|
|
|
# not be passed to the database engine.
|
|
|
|
db_params = {
|
|
|
|
k: v for k, v in self.db_config.get("args", {}).items()
|
|
|
|
if not k.startswith("cp_")
|
|
|
|
}
|
|
|
|
db_conn = self.database_engine.module.connect(**db_params)
|
|
|
|
if run_new_connection:
|
|
|
|
self.database_engine.on_new_connection(db_conn)
|
|
|
|
return db_conn
|
|
|
|
|
2017-11-21 04:08:08 -07:00
|
|
|
def build_media_repository_resource(self):
|
|
|
|
# build the media repo resource. This indirects through the HomeServer
|
|
|
|
# to ensure that we only have a single instance of
|
|
|
|
return MediaRepositoryResource(self)
|
|
|
|
|
2016-06-29 07:57:59 -06:00
|
|
|
def build_media_repository(self):
|
|
|
|
return MediaRepository(self)
|
|
|
|
|
2016-11-16 07:15:50 -07:00
|
|
|
def build_federation_transport_client(self):
|
|
|
|
return TransportLayerClient(self)
|
|
|
|
|
|
|
|
def build_federation_sender(self):
|
2016-11-23 07:09:47 -07:00
|
|
|
if self.should_send_federation():
|
2016-11-16 10:34:44 -07:00
|
|
|
return TransactionQueue(self)
|
2016-11-23 07:09:47 -07:00
|
|
|
elif not self.config.worker_app:
|
2016-11-16 10:34:44 -07:00
|
|
|
return FederationRemoteSendQueue(self)
|
2016-11-23 07:09:47 -07:00
|
|
|
else:
|
|
|
|
raise Exception("Workers cannot send federation traffic")
|
2016-11-16 07:15:50 -07:00
|
|
|
|
2016-11-23 08:14:24 -07:00
|
|
|
def build_receipts_handler(self):
|
|
|
|
return ReceiptsHandler(self)
|
|
|
|
|
2017-04-11 08:01:39 -06:00
|
|
|
def build_read_marker_handler(self):
|
|
|
|
return ReadMarkerHandler(self)
|
|
|
|
|
2017-03-27 09:33:44 -06:00
|
|
|
def build_tcp_replication(self):
|
|
|
|
raise NotImplementedError()
|
|
|
|
|
2017-05-18 11:17:40 -06:00
|
|
|
def build_action_generator(self):
|
|
|
|
return ActionGenerator(self)
|
|
|
|
|
2017-05-31 04:51:01 -06:00
|
|
|
def build_user_directory_handler(self):
|
2017-11-29 09:46:45 -07:00
|
|
|
return UserDirectoryHandler(self)
|
2017-05-31 04:51:01 -06:00
|
|
|
|
2017-07-10 07:52:27 -06:00
|
|
|
def build_groups_local_handler(self):
|
|
|
|
return GroupsLocalHandler(self)
|
|
|
|
|
2017-07-10 08:44:15 -06:00
|
|
|
def build_groups_server_handler(self):
|
|
|
|
return GroupsServerHandler(self)
|
|
|
|
|
|
|
|
def build_groups_attestation_signing(self):
|
|
|
|
return GroupAttestationSigning(self)
|
|
|
|
|
|
|
|
def build_groups_attestation_renewer(self):
|
|
|
|
return GroupAttestionRenewer(self)
|
|
|
|
|
2018-07-20 06:41:13 -06:00
|
|
|
def build_secrets(self):
|
|
|
|
return Secrets()
|
|
|
|
|
2017-09-26 12:20:23 -06:00
|
|
|
def build_spam_checker(self):
|
|
|
|
return SpamChecker(self)
|
|
|
|
|
2018-03-01 03:54:37 -07:00
|
|
|
def build_room_member_handler(self):
|
2018-03-13 07:49:13 -06:00
|
|
|
if self.config.worker_app:
|
2018-03-13 10:32:37 -06:00
|
|
|
return RoomMemberWorkerHandler(self)
|
2018-03-13 07:49:13 -06:00
|
|
|
return RoomMemberMasterHandler(self)
|
2018-03-01 03:54:37 -07:00
|
|
|
|
2018-03-12 10:17:08 -06:00
|
|
|
def build_federation_registry(self):
|
2018-07-26 04:44:22 -06:00
|
|
|
if self.config.worker_app:
|
|
|
|
return ReplicationFederationHandlerRegistry(self)
|
|
|
|
else:
|
|
|
|
return FederationHandlerRegistry()
|
2018-03-12 10:17:08 -06:00
|
|
|
|
2018-05-17 04:34:28 -06:00
|
|
|
def build_server_notices_manager(self):
|
2018-05-22 03:57:56 -06:00
|
|
|
if self.config.worker_app:
|
|
|
|
raise Exception("Workers cannot send server notices")
|
2018-05-17 04:34:28 -06:00
|
|
|
return ServerNoticesManager(self)
|
|
|
|
|
2018-05-17 10:35:31 -06:00
|
|
|
def build_server_notices_sender(self):
|
2018-05-22 03:57:56 -06:00
|
|
|
if self.config.worker_app:
|
|
|
|
return WorkerServerNoticesSender(self)
|
2018-05-17 10:35:31 -06:00
|
|
|
return ServerNoticesSender(self)
|
|
|
|
|
2018-07-18 08:22:02 -06:00
|
|
|
def build_message_handler(self):
|
|
|
|
return MessageHandler(self)
|
|
|
|
|
|
|
|
def build_pagination_handler(self):
|
|
|
|
return PaginationHandler(self)
|
|
|
|
|
2018-07-18 08:29:45 -06:00
|
|
|
def build_room_context_handler(self):
|
|
|
|
return RoomContextHandler(self)
|
|
|
|
|
2016-04-21 10:21:02 -06:00
|
|
|
def remove_pusher(self, app_id, push_key, user_id):
|
|
|
|
return self.get_pusherpool().remove_pusher(app_id, push_key, user_id)
|
|
|
|
|
2016-11-23 07:09:47 -07:00
|
|
|
def should_send_federation(self):
|
|
|
|
"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"
|
|
|
|
)
|
|
|
|
|
2016-01-26 06:52:29 -07:00
|
|
|
|
|
|
|
def _make_dependency_method(depname):
|
|
|
|
def _get(hs):
|
|
|
|
try:
|
|
|
|
return getattr(hs, depname)
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
try:
|
|
|
|
builder = getattr(hs, "build_%s" % (depname))
|
|
|
|
except AttributeError:
|
|
|
|
builder = None
|
|
|
|
|
|
|
|
if builder:
|
|
|
|
# Prevent cyclic dependencies from deadlocking
|
|
|
|
if depname in hs._building:
|
|
|
|
raise ValueError("Cyclic dependency while building %s" % (
|
|
|
|
depname,
|
|
|
|
))
|
|
|
|
hs._building[depname] = 1
|
|
|
|
|
|
|
|
dep = builder()
|
|
|
|
setattr(hs, depname, dep)
|
|
|
|
|
|
|
|
del hs._building[depname]
|
|
|
|
|
|
|
|
return dep
|
|
|
|
|
|
|
|
raise NotImplementedError(
|
|
|
|
"%s has no %s nor a builder for it" % (
|
|
|
|
type(hs).__name__, depname,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
setattr(HomeServer, "get_%s" % (depname), _get)
|
|
|
|
|
|
|
|
|
|
|
|
# Build magic accessors for every dependency
|
|
|
|
for depname in HomeServer.DEPENDENCIES:
|
|
|
|
_make_dependency_method(depname)
|