mirror of
https://github.com/element-hq/synapse.git
synced 2025-12-11 01:40:27 +00:00
Compare commits
2 Commits
v1.75.0rc2
...
erikj/syna
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b143e6c688 | ||
|
|
83ae89a7bc |
@@ -24,10 +24,15 @@
|
|||||||
import abc
|
import abc
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
from functools import wraps
|
||||||
|
from typing import Any, Callable, Dict, List, Optional, TypeVar, cast
|
||||||
|
|
||||||
|
from twisted.internet import tcp
|
||||||
from twisted.mail.smtp import sendmail
|
from twisted.mail.smtp import sendmail
|
||||||
from twisted.web.client import BrowserLikePolicyForHTTPS
|
from twisted.web.client import BrowserLikePolicyForHTTPS
|
||||||
|
from twisted.web.iweb import IPolicyForHTTPS
|
||||||
|
|
||||||
|
import synapse
|
||||||
from synapse.api.auth import Auth
|
from synapse.api.auth import Auth
|
||||||
from synapse.api.filtering import Filtering
|
from synapse.api.filtering import Filtering
|
||||||
from synapse.api.ratelimiting import Ratelimiter
|
from synapse.api.ratelimiting import Ratelimiter
|
||||||
@@ -104,6 +109,43 @@ from synapse.util.distributor import Distributor
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
FuncType = Callable[..., Any]
|
||||||
|
F = TypeVar("F", bound=FuncType)
|
||||||
|
|
||||||
|
|
||||||
|
def builder(f: F) -> F:
|
||||||
|
"""Decorator to wrap a HomeServer method to cache result and detect
|
||||||
|
cyclical dependencies.
|
||||||
|
"""
|
||||||
|
if not f.__name__.startswith("get_"):
|
||||||
|
raise Exception("Function must be named `get_*`")
|
||||||
|
|
||||||
|
depname = f.__name__[len("get_") :] # type: str
|
||||||
|
|
||||||
|
@wraps(f)
|
||||||
|
def _get(self):
|
||||||
|
try:
|
||||||
|
return getattr(self, depname)
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Prevent cyclic dependencies from deadlocking
|
||||||
|
if depname in self._building:
|
||||||
|
raise ValueError("Cyclic dependency while building %s" % (depname,))
|
||||||
|
|
||||||
|
try:
|
||||||
|
self._building[depname] = True
|
||||||
|
dep = f(self)
|
||||||
|
finally:
|
||||||
|
self._building.pop(depname, None)
|
||||||
|
|
||||||
|
setattr(self, self.depname, dep)
|
||||||
|
|
||||||
|
return dep
|
||||||
|
|
||||||
|
return cast(F, _get)
|
||||||
|
|
||||||
|
|
||||||
class HomeServer(object):
|
class HomeServer(object):
|
||||||
"""A basic homeserver object without lazy component builders.
|
"""A basic homeserver object without lazy component builders.
|
||||||
|
|
||||||
@@ -111,17 +153,6 @@ class HomeServer(object):
|
|||||||
constructor arguments, or the relevant methods overriding to create them.
|
constructor arguments, or the relevant methods overriding to create them.
|
||||||
Typically this would only be used for unit tests.
|
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.
|
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
config (synapse.config.homeserver.HomeserverConfig):
|
config (synapse.config.homeserver.HomeserverConfig):
|
||||||
_listening_services (list[twisted.internet.tcp.Port]): TCP ports that
|
_listening_services (list[twisted.internet.tcp.Port]): TCP ports that
|
||||||
@@ -130,77 +161,6 @@ class HomeServer(object):
|
|||||||
|
|
||||||
__metaclass__ = abc.ABCMeta
|
__metaclass__ = abc.ABCMeta
|
||||||
|
|
||||||
DEPENDENCIES = [
|
|
||||||
"http_client",
|
|
||||||
"federation_client",
|
|
||||||
"federation_server",
|
|
||||||
"handlers",
|
|
||||||
"auth",
|
|
||||||
"room_creation_handler",
|
|
||||||
"state_handler",
|
|
||||||
"state_resolution_handler",
|
|
||||||
"presence_handler",
|
|
||||||
"sync_handler",
|
|
||||||
"typing_handler",
|
|
||||||
"room_list_handler",
|
|
||||||
"acme_handler",
|
|
||||||
"auth_handler",
|
|
||||||
"device_handler",
|
|
||||||
"stats_handler",
|
|
||||||
"e2e_keys_handler",
|
|
||||||
"e2e_room_keys_handler",
|
|
||||||
"event_handler",
|
|
||||||
"event_stream_handler",
|
|
||||||
"initial_sync_handler",
|
|
||||||
"application_service_api",
|
|
||||||
"application_service_scheduler",
|
|
||||||
"application_service_handler",
|
|
||||||
"device_message_handler",
|
|
||||||
"profile_handler",
|
|
||||||
"event_creation_handler",
|
|
||||||
"deactivate_account_handler",
|
|
||||||
"set_password_handler",
|
|
||||||
"notifier",
|
|
||||||
"event_sources",
|
|
||||||
"keyring",
|
|
||||||
"pusherpool",
|
|
||||||
"event_builder_factory",
|
|
||||||
"filtering",
|
|
||||||
"http_client_context_factory",
|
|
||||||
"simple_http_client",
|
|
||||||
"proxied_http_client",
|
|
||||||
"media_repository",
|
|
||||||
"media_repository_resource",
|
|
||||||
"federation_transport_client",
|
|
||||||
"federation_sender",
|
|
||||||
"receipts_handler",
|
|
||||||
"macaroon_generator",
|
|
||||||
"tcp_replication",
|
|
||||||
"read_marker_handler",
|
|
||||||
"action_generator",
|
|
||||||
"user_directory_handler",
|
|
||||||
"groups_local_handler",
|
|
||||||
"groups_server_handler",
|
|
||||||
"groups_attestation_signing",
|
|
||||||
"groups_attestation_renewer",
|
|
||||||
"secrets",
|
|
||||||
"spam_checker",
|
|
||||||
"third_party_event_rules",
|
|
||||||
"room_member_handler",
|
|
||||||
"federation_registry",
|
|
||||||
"server_notices_manager",
|
|
||||||
"server_notices_sender",
|
|
||||||
"message_handler",
|
|
||||||
"pagination_handler",
|
|
||||||
"room_context_handler",
|
|
||||||
"sendmail",
|
|
||||||
"registration_handler",
|
|
||||||
"account_validity_handler",
|
|
||||||
"saml_handler",
|
|
||||||
"event_client_serializer",
|
|
||||||
"storage",
|
|
||||||
]
|
|
||||||
|
|
||||||
REQUIRED_ON_MASTER_STARTUP = ["user_directory_handler", "stats_handler"]
|
REQUIRED_ON_MASTER_STARTUP = ["user_directory_handler", "stats_handler"]
|
||||||
|
|
||||||
# This is overridden in derived application classes
|
# This is overridden in derived application classes
|
||||||
@@ -215,14 +175,16 @@ class HomeServer(object):
|
|||||||
config: The full config for the homeserver.
|
config: The full config for the homeserver.
|
||||||
"""
|
"""
|
||||||
if not reactor:
|
if not reactor:
|
||||||
from twisted.internet import reactor
|
from twisted import internet
|
||||||
|
|
||||||
|
reactor = internet.reactor
|
||||||
|
|
||||||
self._reactor = reactor
|
self._reactor = reactor
|
||||||
self.hostname = hostname
|
self.hostname = hostname
|
||||||
self.config = config
|
self.config = config
|
||||||
self._building = {}
|
self._building = {} # type: Dict[str, bool]
|
||||||
self._listening_services = []
|
self._listening_services = [] # type: List[tcp.Port]
|
||||||
self.start_time = None
|
self.start_time = None # type: Optional[int]
|
||||||
|
|
||||||
self.clock = Clock(reactor)
|
self.clock = Clock(reactor)
|
||||||
self.distributor = Distributor()
|
self.distributor = Distributor()
|
||||||
@@ -230,7 +192,7 @@ class HomeServer(object):
|
|||||||
self.admin_redaction_ratelimiter = Ratelimiter()
|
self.admin_redaction_ratelimiter = Ratelimiter()
|
||||||
self.registration_ratelimiter = Ratelimiter()
|
self.registration_ratelimiter = Ratelimiter()
|
||||||
|
|
||||||
self.datastores = None
|
self.datastores = None # type: Optional[DataStores]
|
||||||
|
|
||||||
# Other kwargs are explicit dependencies
|
# Other kwargs are explicit dependencies
|
||||||
for depname in kwargs:
|
for depname in kwargs:
|
||||||
@@ -261,182 +223,231 @@ class HomeServer(object):
|
|||||||
# X-Forwarded-For is handled by our custom request type.
|
# X-Forwarded-For is handled by our custom request type.
|
||||||
return request.getClientIP()
|
return request.getClientIP()
|
||||||
|
|
||||||
def is_mine(self, domain_specific_string):
|
def is_mine(self, domain_specific_string) -> bool:
|
||||||
return domain_specific_string.domain == self.hostname
|
return domain_specific_string.domain == self.hostname
|
||||||
|
|
||||||
def is_mine_id(self, string):
|
def is_mine_id(self, string: str) -> bool:
|
||||||
return string.split(":", 1)[1] == self.hostname
|
return string.split(":", 1)[1] == self.hostname
|
||||||
|
|
||||||
def get_clock(self):
|
def get_clock(self) -> Clock:
|
||||||
return self.clock
|
return self.clock
|
||||||
|
|
||||||
def get_datastore(self):
|
def get_datastore(self):
|
||||||
|
if not self.datastores:
|
||||||
|
raise Exception("HomeServer has not been set up yet")
|
||||||
|
|
||||||
return self.datastores.main
|
return self.datastores.main
|
||||||
|
|
||||||
def get_datastores(self):
|
def get_datastores(self) -> DataStores:
|
||||||
|
if not self.datastores:
|
||||||
|
raise Exception("HomeServer has not been set up yet")
|
||||||
|
|
||||||
return self.datastores
|
return self.datastores
|
||||||
|
|
||||||
def get_config(self):
|
def get_config(self) -> HomeServerConfig:
|
||||||
return self.config
|
return self.config
|
||||||
|
|
||||||
def get_distributor(self):
|
def get_distributor(self) -> Distributor:
|
||||||
return self.distributor
|
return self.distributor
|
||||||
|
|
||||||
def get_ratelimiter(self):
|
def get_ratelimiter(self) -> Ratelimiter:
|
||||||
return self.ratelimiter
|
return self.ratelimiter
|
||||||
|
|
||||||
def get_registration_ratelimiter(self):
|
def get_registration_ratelimiter(self) -> Ratelimiter:
|
||||||
return self.registration_ratelimiter
|
return self.registration_ratelimiter
|
||||||
|
|
||||||
def get_admin_redaction_ratelimiter(self):
|
def get_admin_redaction_ratelimiter(self) -> Ratelimiter:
|
||||||
return self.admin_redaction_ratelimiter
|
return self.admin_redaction_ratelimiter
|
||||||
|
|
||||||
def build_federation_client(self):
|
@builder
|
||||||
|
def get_federation_client(self) -> FederationClient:
|
||||||
return FederationClient(self)
|
return FederationClient(self)
|
||||||
|
|
||||||
def build_federation_server(self):
|
@builder
|
||||||
|
def get_federation_server(self) -> FederationServer:
|
||||||
return FederationServer(self)
|
return FederationServer(self)
|
||||||
|
|
||||||
def build_handlers(self):
|
@builder
|
||||||
|
def get_handlers(self) -> Handlers:
|
||||||
return Handlers(self)
|
return Handlers(self)
|
||||||
|
|
||||||
def build_notifier(self):
|
@builder
|
||||||
|
def get_notifier(self) -> Notifier:
|
||||||
return Notifier(self)
|
return Notifier(self)
|
||||||
|
|
||||||
def build_auth(self):
|
@builder
|
||||||
|
def get_auth(self) -> Auth:
|
||||||
return Auth(self)
|
return Auth(self)
|
||||||
|
|
||||||
def build_http_client_context_factory(self):
|
@builder
|
||||||
|
def get_http_client_context_factory(self) -> IPolicyForHTTPS:
|
||||||
return (
|
return (
|
||||||
InsecureInterceptableContextFactory()
|
InsecureInterceptableContextFactory()
|
||||||
if self.config.use_insecure_ssl_client_just_for_testing_do_not_use
|
if self.config.use_insecure_ssl_client_just_for_testing_do_not_use
|
||||||
else BrowserLikePolicyForHTTPS()
|
else BrowserLikePolicyForHTTPS()
|
||||||
)
|
)
|
||||||
|
|
||||||
def build_simple_http_client(self):
|
@builder
|
||||||
|
def get_simple_http_client(self) -> SimpleHttpClient:
|
||||||
return SimpleHttpClient(self)
|
return SimpleHttpClient(self)
|
||||||
|
|
||||||
def build_proxied_http_client(self):
|
@builder
|
||||||
|
def get_proxied_http_client(self) -> SimpleHttpClient:
|
||||||
return SimpleHttpClient(
|
return SimpleHttpClient(
|
||||||
self,
|
self,
|
||||||
http_proxy=os.getenvb(b"http_proxy"),
|
http_proxy=os.getenvb(b"http_proxy"),
|
||||||
https_proxy=os.getenvb(b"HTTPS_PROXY"),
|
https_proxy=os.getenvb(b"HTTPS_PROXY"),
|
||||||
)
|
)
|
||||||
|
|
||||||
def build_room_creation_handler(self):
|
@builder
|
||||||
|
def get_room_creation_handler(self) -> RoomCreationHandler:
|
||||||
return RoomCreationHandler(self)
|
return RoomCreationHandler(self)
|
||||||
|
|
||||||
def build_sendmail(self):
|
@builder
|
||||||
|
def get_sendmail(self) -> sendmail:
|
||||||
return sendmail
|
return sendmail
|
||||||
|
|
||||||
def build_state_handler(self):
|
@builder
|
||||||
|
def get_state_handler(self) -> StateHandler:
|
||||||
return StateHandler(self)
|
return StateHandler(self)
|
||||||
|
|
||||||
def build_state_resolution_handler(self):
|
@builder
|
||||||
|
def get_state_resolution_handler(self) -> StateResolutionHandler:
|
||||||
return StateResolutionHandler(self)
|
return StateResolutionHandler(self)
|
||||||
|
|
||||||
def build_presence_handler(self):
|
@builder
|
||||||
|
def get_presence_handler(self) -> PresenceHandler:
|
||||||
return PresenceHandler(self)
|
return PresenceHandler(self)
|
||||||
|
|
||||||
def build_typing_handler(self):
|
@builder
|
||||||
|
def get_typing_handler(self) -> TypingHandler:
|
||||||
return TypingHandler(self)
|
return TypingHandler(self)
|
||||||
|
|
||||||
def build_sync_handler(self):
|
@builder
|
||||||
|
def get_sync_handler(self) -> SyncHandler:
|
||||||
return SyncHandler(self)
|
return SyncHandler(self)
|
||||||
|
|
||||||
def build_room_list_handler(self):
|
@builder
|
||||||
|
def get_room_list_handler(self) -> RoomListHandler:
|
||||||
return RoomListHandler(self)
|
return RoomListHandler(self)
|
||||||
|
|
||||||
def build_auth_handler(self):
|
@builder
|
||||||
|
def get_auth_handler(self) -> AuthHandler:
|
||||||
return AuthHandler(self)
|
return AuthHandler(self)
|
||||||
|
|
||||||
def build_macaroon_generator(self):
|
@builder
|
||||||
|
def get_macaroon_generator(self) -> MacaroonGenerator:
|
||||||
return MacaroonGenerator(self)
|
return MacaroonGenerator(self)
|
||||||
|
|
||||||
def build_device_handler(self):
|
@builder
|
||||||
|
def get_device_handler(self) -> DeviceWorkerHandler:
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
return DeviceWorkerHandler(self)
|
return DeviceWorkerHandler(self)
|
||||||
else:
|
else:
|
||||||
return DeviceHandler(self)
|
return DeviceHandler(self)
|
||||||
|
|
||||||
def build_device_message_handler(self):
|
@builder
|
||||||
|
def get_device_message_handler(self) -> DeviceMessageHandler:
|
||||||
return DeviceMessageHandler(self)
|
return DeviceMessageHandler(self)
|
||||||
|
|
||||||
def build_e2e_keys_handler(self):
|
@builder
|
||||||
|
def get_e2e_keys_handler(self) -> E2eKeysHandler:
|
||||||
return E2eKeysHandler(self)
|
return E2eKeysHandler(self)
|
||||||
|
|
||||||
def build_e2e_room_keys_handler(self):
|
@builder
|
||||||
|
def get_e2e_room_keys_handler(self) -> E2eRoomKeysHandler:
|
||||||
return E2eRoomKeysHandler(self)
|
return E2eRoomKeysHandler(self)
|
||||||
|
|
||||||
def build_acme_handler(self):
|
@builder
|
||||||
|
def get_acme_handler(self) -> AcmeHandler:
|
||||||
return AcmeHandler(self)
|
return AcmeHandler(self)
|
||||||
|
|
||||||
def build_application_service_api(self):
|
@builder
|
||||||
|
def get_application_service_api(self) -> ApplicationServiceApi:
|
||||||
return ApplicationServiceApi(self)
|
return ApplicationServiceApi(self)
|
||||||
|
|
||||||
def build_application_service_scheduler(self):
|
@builder
|
||||||
|
def get_application_service_scheduler(self) -> ApplicationServiceScheduler:
|
||||||
return ApplicationServiceScheduler(self)
|
return ApplicationServiceScheduler(self)
|
||||||
|
|
||||||
def build_application_service_handler(self):
|
@builder
|
||||||
|
def get_application_service_handler(self) -> ApplicationServicesHandler:
|
||||||
return ApplicationServicesHandler(self)
|
return ApplicationServicesHandler(self)
|
||||||
|
|
||||||
def build_event_handler(self):
|
@builder
|
||||||
|
def get_event_handler(self) -> EventHandler:
|
||||||
return EventHandler(self)
|
return EventHandler(self)
|
||||||
|
|
||||||
def build_event_stream_handler(self):
|
@builder
|
||||||
|
def get_event_stream_handler(self) -> EventStreamHandler:
|
||||||
return EventStreamHandler(self)
|
return EventStreamHandler(self)
|
||||||
|
|
||||||
def build_initial_sync_handler(self):
|
@builder
|
||||||
|
def get_initial_sync_handler(self) -> InitialSyncHandler:
|
||||||
return InitialSyncHandler(self)
|
return InitialSyncHandler(self)
|
||||||
|
|
||||||
def build_profile_handler(self):
|
@builder
|
||||||
|
def get_profile_handler(self):
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
return BaseProfileHandler(self)
|
return BaseProfileHandler(self)
|
||||||
else:
|
else:
|
||||||
return MasterProfileHandler(self)
|
return MasterProfileHandler(self)
|
||||||
|
|
||||||
def build_event_creation_handler(self):
|
@builder
|
||||||
|
def get_event_creation_handler(self) -> EventCreationHandler:
|
||||||
return EventCreationHandler(self)
|
return EventCreationHandler(self)
|
||||||
|
|
||||||
def build_deactivate_account_handler(self):
|
@builder
|
||||||
|
def get_deactivate_account_handler(self) -> DeactivateAccountHandler:
|
||||||
return DeactivateAccountHandler(self)
|
return DeactivateAccountHandler(self)
|
||||||
|
|
||||||
def build_set_password_handler(self):
|
@builder
|
||||||
|
def get_set_password_handler(self) -> SetPasswordHandler:
|
||||||
return SetPasswordHandler(self)
|
return SetPasswordHandler(self)
|
||||||
|
|
||||||
def build_event_sources(self):
|
@builder
|
||||||
|
def get_event_sources(self) -> EventSources:
|
||||||
return EventSources(self)
|
return EventSources(self)
|
||||||
|
|
||||||
def build_keyring(self):
|
@builder
|
||||||
|
def get_keyring(self) -> Keyring:
|
||||||
return Keyring(self)
|
return Keyring(self)
|
||||||
|
|
||||||
def build_event_builder_factory(self):
|
@builder
|
||||||
|
def get_event_builder_factory(self) -> EventBuilderFactory:
|
||||||
return EventBuilderFactory(self)
|
return EventBuilderFactory(self)
|
||||||
|
|
||||||
def build_filtering(self):
|
@builder
|
||||||
|
def get_filtering(self) -> Filtering:
|
||||||
return Filtering(self)
|
return Filtering(self)
|
||||||
|
|
||||||
def build_pusherpool(self):
|
@builder
|
||||||
|
def get_pusherpool(self) -> PusherPool:
|
||||||
return PusherPool(self)
|
return PusherPool(self)
|
||||||
|
|
||||||
def build_http_client(self):
|
@builder
|
||||||
|
def get_http_client(self) -> MatrixFederationHttpClient:
|
||||||
tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
|
tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
|
||||||
self.config
|
self.config
|
||||||
)
|
)
|
||||||
return MatrixFederationHttpClient(self, tls_client_options_factory)
|
return MatrixFederationHttpClient(self, tls_client_options_factory)
|
||||||
|
|
||||||
def build_media_repository_resource(self):
|
@builder
|
||||||
|
def get_media_repository_resource(self) -> MediaRepositoryResource:
|
||||||
# build the media repo resource. This indirects through the HomeServer
|
# build the media repo resource. This indirects through the HomeServer
|
||||||
# to ensure that we only have a single instance of
|
# to ensure that we only have a single instance of
|
||||||
return MediaRepositoryResource(self)
|
return MediaRepositoryResource(self)
|
||||||
|
|
||||||
def build_media_repository(self):
|
@builder
|
||||||
|
def get_media_repository(self) -> MediaRepository:
|
||||||
return MediaRepository(self)
|
return MediaRepository(self)
|
||||||
|
|
||||||
def build_federation_transport_client(self):
|
@builder
|
||||||
|
def get_federation_transport_client(self) -> TransportLayerClient:
|
||||||
return TransportLayerClient(self)
|
return TransportLayerClient(self)
|
||||||
|
|
||||||
def build_federation_sender(self):
|
@builder
|
||||||
|
def get_federation_sender(self):
|
||||||
if self.should_send_federation():
|
if self.should_send_federation():
|
||||||
return FederationSender(self)
|
return FederationSender(self)
|
||||||
elif not self.config.worker_app:
|
elif not self.config.worker_app:
|
||||||
@@ -444,135 +455,126 @@ class HomeServer(object):
|
|||||||
else:
|
else:
|
||||||
raise Exception("Workers cannot send federation traffic")
|
raise Exception("Workers cannot send federation traffic")
|
||||||
|
|
||||||
def build_receipts_handler(self):
|
@builder
|
||||||
|
def get_receipts_handler(self) -> ReceiptsHandler:
|
||||||
return ReceiptsHandler(self)
|
return ReceiptsHandler(self)
|
||||||
|
|
||||||
def build_read_marker_handler(self):
|
@builder
|
||||||
|
def get_read_marker_handler(self) -> ReadMarkerHandler:
|
||||||
return ReadMarkerHandler(self)
|
return ReadMarkerHandler(self)
|
||||||
|
|
||||||
def build_tcp_replication(self):
|
@builder
|
||||||
|
def get_tcp_replication(self):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def build_action_generator(self):
|
@builder
|
||||||
|
def get_action_generator(self) -> ActionGenerator:
|
||||||
return ActionGenerator(self)
|
return ActionGenerator(self)
|
||||||
|
|
||||||
def build_user_directory_handler(self):
|
@builder
|
||||||
|
def get_user_directory_handler(self) -> UserDirectoryHandler:
|
||||||
return UserDirectoryHandler(self)
|
return UserDirectoryHandler(self)
|
||||||
|
|
||||||
def build_groups_local_handler(self):
|
@builder
|
||||||
|
def get_groups_local_handler(self) -> GroupsLocalHandler:
|
||||||
return GroupsLocalHandler(self)
|
return GroupsLocalHandler(self)
|
||||||
|
|
||||||
def build_groups_server_handler(self):
|
@builder
|
||||||
|
def get_groups_server_handler(self) -> GroupsServerHandler:
|
||||||
return GroupsServerHandler(self)
|
return GroupsServerHandler(self)
|
||||||
|
|
||||||
def build_groups_attestation_signing(self):
|
@builder
|
||||||
|
def get_groups_attestation_signing(self) -> GroupAttestationSigning:
|
||||||
return GroupAttestationSigning(self)
|
return GroupAttestationSigning(self)
|
||||||
|
|
||||||
def build_groups_attestation_renewer(self):
|
@builder
|
||||||
|
def get_groups_attestation_renewer(self) -> GroupAttestionRenewer:
|
||||||
return GroupAttestionRenewer(self)
|
return GroupAttestionRenewer(self)
|
||||||
|
|
||||||
def build_secrets(self):
|
@builder
|
||||||
|
def get_secrets(self):
|
||||||
return Secrets()
|
return Secrets()
|
||||||
|
|
||||||
def build_stats_handler(self):
|
@builder
|
||||||
|
def get_stats_handler(self) -> StatsHandler:
|
||||||
return StatsHandler(self)
|
return StatsHandler(self)
|
||||||
|
|
||||||
def build_spam_checker(self):
|
@builder
|
||||||
|
def get_spam_checker(self) -> SpamChecker:
|
||||||
return SpamChecker(self)
|
return SpamChecker(self)
|
||||||
|
|
||||||
def build_third_party_event_rules(self):
|
@builder
|
||||||
|
def get_third_party_event_rules(self) -> ThirdPartyEventRules:
|
||||||
return ThirdPartyEventRules(self)
|
return ThirdPartyEventRules(self)
|
||||||
|
|
||||||
def build_room_member_handler(self):
|
@builder
|
||||||
|
def get_room_member_handler(self):
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
return RoomMemberWorkerHandler(self)
|
return RoomMemberWorkerHandler(self)
|
||||||
return RoomMemberMasterHandler(self)
|
return RoomMemberMasterHandler(self)
|
||||||
|
|
||||||
def build_federation_registry(self):
|
@builder
|
||||||
|
def get_federation_registry(self):
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
return ReplicationFederationHandlerRegistry(self)
|
return ReplicationFederationHandlerRegistry(self)
|
||||||
else:
|
else:
|
||||||
return FederationHandlerRegistry()
|
return FederationHandlerRegistry()
|
||||||
|
|
||||||
def build_server_notices_manager(self):
|
@builder
|
||||||
|
def get_server_notices_manager(self) -> ServerNoticesManager:
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
raise Exception("Workers cannot send server notices")
|
raise Exception("Workers cannot send server notices")
|
||||||
return ServerNoticesManager(self)
|
return ServerNoticesManager(self)
|
||||||
|
|
||||||
def build_server_notices_sender(self):
|
@builder
|
||||||
|
def get_server_notices_sender(self):
|
||||||
if self.config.worker_app:
|
if self.config.worker_app:
|
||||||
return WorkerServerNoticesSender(self)
|
return WorkerServerNoticesSender(self)
|
||||||
return ServerNoticesSender(self)
|
return ServerNoticesSender(self)
|
||||||
|
|
||||||
def build_message_handler(self):
|
@builder
|
||||||
|
def get_message_handler(self) -> MessageHandler:
|
||||||
return MessageHandler(self)
|
return MessageHandler(self)
|
||||||
|
|
||||||
def build_pagination_handler(self):
|
@builder
|
||||||
|
def get_pagination_handler(self) -> PaginationHandler:
|
||||||
return PaginationHandler(self)
|
return PaginationHandler(self)
|
||||||
|
|
||||||
def build_room_context_handler(self):
|
@builder
|
||||||
|
def get_room_context_handler(self) -> RoomContextHandler:
|
||||||
return RoomContextHandler(self)
|
return RoomContextHandler(self)
|
||||||
|
|
||||||
def build_registration_handler(self):
|
@builder
|
||||||
|
def get_registration_handler(self) -> RegistrationHandler:
|
||||||
return RegistrationHandler(self)
|
return RegistrationHandler(self)
|
||||||
|
|
||||||
def build_account_validity_handler(self):
|
@builder
|
||||||
|
def get_account_validity_handler(self) -> AccountValidityHandler:
|
||||||
return AccountValidityHandler(self)
|
return AccountValidityHandler(self)
|
||||||
|
|
||||||
def build_saml_handler(self):
|
@builder
|
||||||
|
def get_saml_handler(self) -> "synapse.handlers.saml_handler.SamlHandler":
|
||||||
from synapse.handlers.saml_handler import SamlHandler
|
from synapse.handlers.saml_handler import SamlHandler
|
||||||
|
|
||||||
return SamlHandler(self)
|
return SamlHandler(self)
|
||||||
|
|
||||||
def build_event_client_serializer(self):
|
@builder
|
||||||
|
def get_event_client_serializer(self) -> EventClientSerializer:
|
||||||
return EventClientSerializer(self)
|
return EventClientSerializer(self)
|
||||||
|
|
||||||
def build_storage(self) -> Storage:
|
@builder
|
||||||
|
def get_storage(self) -> Storage:
|
||||||
|
if self.datastores is None:
|
||||||
|
raise Exception("HomeServer has not been set up yet")
|
||||||
|
|
||||||
return Storage(self, self.datastores)
|
return Storage(self, self.datastores)
|
||||||
|
|
||||||
def remove_pusher(self, app_id, push_key, user_id):
|
def remove_pusher(self, app_id: str, push_key: str, user_id: str):
|
||||||
return self.get_pusherpool().remove_pusher(app_id, push_key, user_id)
|
return self.get_pusherpool().remove_pusher(app_id, push_key, user_id)
|
||||||
|
|
||||||
def should_send_federation(self):
|
def should_send_federation(self) -> bool:
|
||||||
"Should this server be sending federation traffic directly?"
|
"Should this server be sending federation traffic directly?"
|
||||||
return self.config.send_federation and (
|
return self.config.send_federation and (
|
||||||
not self.config.worker_app
|
not self.config.worker_app
|
||||||
or self.config.worker_app == "synapse.app.federation_sender"
|
or self.config.worker_app == "synapse.app.federation_sender"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
import twisted.internet
|
|
||||||
|
|
||||||
import synapse.api.auth
|
|
||||||
import synapse.config.homeserver
|
|
||||||
import synapse.federation.sender
|
|
||||||
import synapse.federation.transaction_queue
|
|
||||||
import synapse.federation.transport.client
|
|
||||||
import synapse.handlers
|
|
||||||
import synapse.handlers.auth
|
|
||||||
import synapse.handlers.deactivate_account
|
|
||||||
import synapse.handlers.device
|
|
||||||
import synapse.handlers.e2e_keys
|
|
||||||
import synapse.handlers.message
|
|
||||||
import synapse.handlers.presence
|
|
||||||
import synapse.handlers.room
|
|
||||||
import synapse.handlers.room_member
|
|
||||||
import synapse.handlers.set_password
|
|
||||||
import synapse.http.client
|
|
||||||
import synapse.notifier
|
|
||||||
import synapse.rest.media.v1.media_repository
|
|
||||||
import synapse.server_notices.server_notices_manager
|
|
||||||
import synapse.server_notices.server_notices_sender
|
|
||||||
import synapse.state
|
|
||||||
import synapse.storage
|
|
||||||
|
|
||||||
class HomeServer(object):
|
|
||||||
@property
|
|
||||||
def config(self) -> synapse.config.homeserver.HomeServerConfig:
|
|
||||||
pass
|
|
||||||
def get_auth(self) -> synapse.api.auth.Auth:
|
|
||||||
pass
|
|
||||||
def get_auth_handler(self) -> synapse.handlers.auth.AuthHandler:
|
|
||||||
pass
|
|
||||||
def get_datastore(self) -> synapse.storage.DataStore:
|
|
||||||
pass
|
|
||||||
def get_device_handler(self) -> synapse.handlers.device.DeviceHandler:
|
|
||||||
pass
|
|
||||||
def get_e2e_keys_handler(self) -> synapse.handlers.e2e_keys.E2eKeysHandler:
|
|
||||||
pass
|
|
||||||
def get_handlers(self) -> synapse.handlers.Handlers:
|
|
||||||
pass
|
|
||||||
def get_state_handler(self) -> synapse.state.StateHandler:
|
|
||||||
pass
|
|
||||||
def get_state_resolution_handler(self) -> synapse.state.StateResolutionHandler:
|
|
||||||
pass
|
|
||||||
def get_simple_http_client(self) -> synapse.http.client.SimpleHttpClient:
|
|
||||||
"""Fetch an HTTP client implementation which doesn't do any blacklisting
|
|
||||||
or support any HTTP_PROXY settings"""
|
|
||||||
pass
|
|
||||||
def get_proxied_http_client(self) -> synapse.http.client.SimpleHttpClient:
|
|
||||||
"""Fetch an HTTP client implementation which doesn't do any blacklisting
|
|
||||||
but does support HTTP_PROXY settings"""
|
|
||||||
pass
|
|
||||||
def get_deactivate_account_handler(
|
|
||||||
self,
|
|
||||||
) -> synapse.handlers.deactivate_account.DeactivateAccountHandler:
|
|
||||||
pass
|
|
||||||
def get_room_creation_handler(self) -> synapse.handlers.room.RoomCreationHandler:
|
|
||||||
pass
|
|
||||||
def get_room_member_handler(self) -> synapse.handlers.room_member.RoomMemberHandler:
|
|
||||||
pass
|
|
||||||
def get_event_creation_handler(
|
|
||||||
self,
|
|
||||||
) -> synapse.handlers.message.EventCreationHandler:
|
|
||||||
pass
|
|
||||||
def get_set_password_handler(
|
|
||||||
self,
|
|
||||||
) -> synapse.handlers.set_password.SetPasswordHandler:
|
|
||||||
pass
|
|
||||||
def get_federation_sender(self) -> synapse.federation.sender.FederationSender:
|
|
||||||
pass
|
|
||||||
def get_federation_transport_client(
|
|
||||||
self,
|
|
||||||
) -> synapse.federation.transport.client.TransportLayerClient:
|
|
||||||
pass
|
|
||||||
def get_media_repository_resource(
|
|
||||||
self,
|
|
||||||
) -> synapse.rest.media.v1.media_repository.MediaRepositoryResource:
|
|
||||||
pass
|
|
||||||
def get_media_repository(
|
|
||||||
self,
|
|
||||||
) -> synapse.rest.media.v1.media_repository.MediaRepository:
|
|
||||||
pass
|
|
||||||
def get_server_notices_manager(
|
|
||||||
self,
|
|
||||||
) -> synapse.server_notices.server_notices_manager.ServerNoticesManager:
|
|
||||||
pass
|
|
||||||
def get_server_notices_sender(
|
|
||||||
self,
|
|
||||||
) -> synapse.server_notices.server_notices_sender.ServerNoticesSender:
|
|
||||||
pass
|
|
||||||
def get_notifier(self) -> synapse.notifier.Notifier:
|
|
||||||
pass
|
|
||||||
def get_presence_handler(self) -> synapse.handlers.presence.PresenceHandler:
|
|
||||||
pass
|
|
||||||
def get_clock(self) -> synapse.util.Clock:
|
|
||||||
pass
|
|
||||||
def get_reactor(self) -> twisted.internet.base.ReactorBase:
|
|
||||||
pass
|
|
||||||
Reference in New Issue
Block a user