2014-08-12 10:10:52 -04:00
|
|
|
#
|
2023-11-21 15:29:58 -05:00
|
|
|
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
|
|
#
|
2024-01-23 06:26:48 -05:00
|
|
|
# Copyright 2021 The Matrix.org Foundation C.I.C.
|
2024-09-23 08:33:48 -04:00
|
|
|
# Copyright (C) 2023-2024 New Vector, Ltd
|
2023-11-21 15:29:58 -05:00
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU Affero General Public License as
|
|
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
|
|
# License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# See the GNU Affero General Public License for more details:
|
|
|
|
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
|
|
#
|
|
|
|
# Originally licensed under the Apache License, Version 2.0:
|
|
|
|
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
|
|
#
|
|
|
|
# [This file includes modifications made by New Vector Limited]
|
2014-08-12 10:10:52 -04:00
|
|
|
#
|
|
|
|
#
|
|
|
|
|
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.
|
|
|
|
|
2022-02-23 06:04:02 -05:00
|
|
|
|
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
|
2024-07-05 08:35:57 -04:00
|
|
|
from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Type, TypeVar, cast
|
2016-08-01 13:02:07 -04:00
|
|
|
|
2023-03-09 14:12:09 -05:00
|
|
|
from typing_extensions import TypeAlias
|
|
|
|
|
2021-11-10 15:06:54 -05:00
|
|
|
from twisted.internet.interfaces import IOpenSSLContextFactory
|
|
|
|
from twisted.internet.tcp import Port
|
2024-08-13 12:59:47 -04:00
|
|
|
from twisted.python.threadpool import ThreadPool
|
2020-08-11 13:00:17 -04:00
|
|
|
from twisted.web.iweb import IPolicyForHTTPS
|
2021-11-10 15:06:54 -05:00
|
|
|
from twisted.web.resource import Resource
|
2016-01-26 08:52:29 -05:00
|
|
|
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.api.auth import Auth
|
2022-06-17 08:48:55 -04:00
|
|
|
from synapse.api.auth.internal import InternalAuth
|
2022-06-14 04:51:15 -04:00
|
|
|
from synapse.api.auth_blocking import AuthBlocking
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.api.filtering import Filtering
|
2021-10-08 07:44:43 -04:00
|
|
|
from synapse.api.ratelimiting import Ratelimiter, RequestRatelimiter
|
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
|
2021-04-06 09:38:30 -04:00
|
|
|
from synapse.events.presence_router import PresenceRouter
|
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
|
2021-03-29 11:43:20 -04:00
|
|
|
from synapse.federation.sender import AbstractFederationSender, FederationSender
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.federation.transport.client import TransportLayerClient
|
2022-02-22 10:10:10 -05:00
|
|
|
from synapse.handlers.account import AccountHandler
|
2021-01-18 10:47:59 -05:00
|
|
|
from synapse.handlers.account_data import AccountDataHandler
|
2019-04-10 12:58:47 -04:00
|
|
|
from synapse.handlers.account_validity import AccountValidityHandler
|
2020-10-09 07:24:34 -04:00
|
|
|
from synapse.handlers.admin import AdminHandler
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.handlers.appservice import ApplicationServicesHandler
|
2022-06-14 09:12:08 -04:00
|
|
|
from synapse.handlers.auth import AuthHandler, PasswordAuthProvider
|
2021-04-20 14:55:20 -04:00
|
|
|
from synapse.handlers.cas import CasHandler
|
2017-11-29 06:48:43 -05:00
|
|
|
from synapse.handlers.deactivate_account import DeactivateAccountHandler
|
2024-09-23 08:33:48 -04:00
|
|
|
from synapse.handlers.delayed_events import DelayedEventsHandler
|
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
|
2020-10-09 07:24:34 -04:00
|
|
|
from synapse.handlers.directory import DirectoryHandler
|
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
|
2021-04-23 07:05:51 -04:00
|
|
|
from synapse.handlers.event_auth import EventAuthHandler
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.handlers.events import EventHandler, EventStreamHandler
|
2020-10-09 07:24:34 -04:00
|
|
|
from synapse.handlers.federation import FederationHandler
|
2021-08-26 16:41:44 -04:00
|
|
|
from synapse.handlers.federation_event import FederationEventHandler
|
2020-10-09 07:24:34 -04:00
|
|
|
from synapse.handlers.identity import IdentityHandler
|
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
|
2021-04-14 12:06:06 -04:00
|
|
|
from synapse.handlers.presence import (
|
|
|
|
BasePresenceHandler,
|
|
|
|
PresenceHandler,
|
|
|
|
WorkerPresenceHandler,
|
|
|
|
)
|
2020-10-13 08:20:32 -04:00
|
|
|
from synapse.handlers.profile import ProfileHandler
|
2022-04-27 09:55:33 -04:00
|
|
|
from synapse.handlers.push_rules import PushRulesHandler
|
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
|
2022-03-16 10:39:15 -04:00
|
|
|
from synapse.handlers.relations import RelationsHandler
|
2020-07-14 07:36:23 -04:00
|
|
|
from synapse.handlers.room import (
|
|
|
|
RoomContextHandler,
|
|
|
|
RoomCreationHandler,
|
|
|
|
RoomShutdownHandler,
|
2021-12-02 02:02:20 -05:00
|
|
|
TimestampLookupHandler,
|
2020-07-14 07:36:23 -04:00
|
|
|
)
|
2016-09-14 09:07:37 -04:00
|
|
|
from synapse.handlers.room_list import RoomListHandler
|
2023-05-03 07:27:33 -04:00
|
|
|
from synapse.handlers.room_member import (
|
|
|
|
RoomForgetterHandler,
|
|
|
|
RoomMemberHandler,
|
|
|
|
RoomMemberMasterHandler,
|
|
|
|
)
|
2018-03-14 07:41:45 -04:00
|
|
|
from synapse.handlers.room_member_worker import RoomMemberWorkerHandler
|
2021-08-16 10:49:12 -04:00
|
|
|
from synapse.handlers.room_summary import RoomSummaryHandler
|
2020-10-09 07:24:34 -04:00
|
|
|
from synapse.handlers.search import SearchHandler
|
2021-05-17 06:33:38 -04:00
|
|
|
from synapse.handlers.send_email import SendEmailHandler
|
2017-11-29 09:10:46 -05:00
|
|
|
from synapse.handlers.set_password import SetPasswordHandler
|
Add Sliding Sync `/sync` endpoint (initial implementation) (#17187)
Based on [MSC3575](https://github.com/matrix-org/matrix-spec-proposals/pull/3575): Sliding Sync
This iteration only focuses on returning the list of room IDs in the sliding window API (without sorting/filtering).
Rooms appear in the Sliding sync response based on:
- `invite`, `join`, `knock`, `ban` membership events
- Kicks (`leave` membership events where `sender` is different from the `user_id`/`state_key`)
- `newly_left` (rooms that were left during the given token range, > `from_token` and <= `to_token`)
- In order for bans/kicks to not show up, you need to `/forget` those rooms. This doesn't modify the event itself though and only adds the `forgotten` flag to `room_memberships` in Synapse. There isn't a way to tell when a room was forgotten at the moment so we can't factor it into the from/to range.
### Example request
`POST http://localhost:8008/_matrix/client/unstable/org.matrix.msc3575/sync`
```json
{
"lists": {
"foo-list": {
"ranges": [ [0, 99] ],
"sort": [ "by_notification_level", "by_recency", "by_name" ],
"required_state": [
["m.room.join_rules", ""],
["m.room.history_visibility", ""],
["m.space.child", "*"]
],
"timeline_limit": 100
}
}
}
```
Response:
```json
{
"next_pos": "s58_224_0_13_10_1_1_16_0_1",
"lists": {
"foo-list": {
"count": 1,
"ops": [
{
"op": "SYNC",
"range": [0, 99],
"room_ids": [
"!MmgikIyFzsuvtnbvVG:my.synapse.linux.server"
]
}
]
}
},
"rooms": {},
"extensions": {}
}
```
2024-06-06 15:44:32 -04:00
|
|
|
from synapse.handlers.sliding_sync import SlidingSyncHandler
|
2020-11-17 09:46:23 -05:00
|
|
|
from synapse.handlers.sso import SsoHandler
|
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
|
2023-07-31 05:58:03 -04:00
|
|
|
from synapse.handlers.worker_lock import WorkerLocksHandler
|
2023-05-09 14:25:20 -04:00
|
|
|
from synapse.http.client import (
|
|
|
|
InsecureInterceptableContextFactory,
|
|
|
|
ReplicationClient,
|
|
|
|
SimpleHttpClient,
|
|
|
|
)
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.http.matrixfederationclient import MatrixFederationHttpClient
|
2023-02-27 08:26:05 -05:00
|
|
|
from synapse.media.media_repository import MediaRepository
|
2024-08-14 10:11:22 -04:00
|
|
|
from synapse.metrics import register_threadpool
|
2022-09-05 06:26:43 -04:00
|
|
|
from synapse.metrics.common_usage_metrics import CommonUsageMetricsManager
|
2020-10-07 07:03:26 -04:00
|
|
|
from synapse.module_api import ModuleApi
|
2023-03-16 06:35:31 -04:00
|
|
|
from synapse.module_api.callbacks import ModuleApiCallbacks
|
2023-01-20 13:02:18 -05:00
|
|
|
from synapse.notifier import Notifier, ReplicationNotifier
|
2022-05-11 07:15:21 -04:00
|
|
|
from synapse.push.bulk_push_rule_evaluator import BulkPushRuleEvaluator
|
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
|
2021-01-26 08:57:31 -05:00
|
|
|
from synapse.replication.tcp.external_cache import ExternalCache
|
2020-04-06 04:58:42 -04:00
|
|
|
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
|
2023-02-27 08:26:05 -05:00
|
|
|
from synapse.rest.media.media_repository_resource import MediaRepositoryResource
|
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
|
2018-07-09 02:09:20 -04:00
|
|
|
from synapse.server_notices.worker_server_notices_sender import (
|
|
|
|
WorkerServerNoticesSender,
|
2019-06-20 05:32:02 -04:00
|
|
|
)
|
2018-01-27 04:15:45 -05:00
|
|
|
from synapse.state import StateHandler, StateResolutionHandler
|
2022-05-31 08:17:50 -04:00
|
|
|
from synapse.storage import Databases
|
|
|
|
from synapse.storage.controllers import StorageControllers
|
2016-08-01 13:02:07 -04:00
|
|
|
from synapse.streams.events import EventSources
|
2024-04-25 08:50:12 -04:00
|
|
|
from synapse.synapse_rust.rendezvous import RendezvousHandler
|
2021-03-08 08:25:43 -05:00
|
|
|
from synapse.types import DomainSpecificString, ISynapseReactor
|
2014-08-12 10:10:52 -04:00
|
|
|
from synapse.util import Clock
|
|
|
|
from synapse.util.distributor import Distributor
|
2022-06-14 09:12:08 -04:00
|
|
|
from synapse.util.macaroons import MacaroonGenerator
|
2020-09-18 05:49:29 -04:00
|
|
|
from synapse.util.ratelimitutils import FederationRateLimiter
|
2020-03-30 11:37:24 -04:00
|
|
|
from synapse.util.stringutils import random_string
|
2023-08-21 08:17:13 -04:00
|
|
|
from synapse.util.task_scheduler import TaskScheduler
|
2016-01-26 10:51:06 -05:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2020-08-11 13:20:16 -04:00
|
|
|
if TYPE_CHECKING:
|
2022-03-08 07:26:05 -05:00
|
|
|
from txredisapi import ConnectionHandler
|
2021-01-26 08:57:31 -05:00
|
|
|
|
2023-05-19 08:06:54 -04:00
|
|
|
from synapse.handlers.jwt import JwtHandler
|
2021-04-20 14:55:20 -04:00
|
|
|
from synapse.handlers.oidc import OidcHandler
|
|
|
|
from synapse.handlers.saml import SamlHandler
|
2024-07-05 08:35:57 -04:00
|
|
|
from synapse.storage._base import SQLBaseStore
|
2020-08-11 13:20:16 -04:00
|
|
|
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2023-03-09 14:12:09 -05: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 13:00:17 -04:00
|
|
|
|
|
|
|
|
2023-03-09 14:12:09 -05:00
|
|
|
def cache_in_self(builder: F) -> F:
|
2020-08-11 13:00:17 -04: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 13:28:44 -05:00
|
|
|
# get_attr -> _attr
|
|
|
|
depname = builder.__name__[len("get") :]
|
2020-08-11 13:00:17 -04:00
|
|
|
|
|
|
|
building = [False]
|
|
|
|
|
|
|
|
@functools.wraps(builder)
|
2023-02-09 09:49:04 -05:00
|
|
|
def _get(self: "HomeServer") -> T:
|
2020-08-11 13:00:17 -04: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 14:12:09 -05:00
|
|
|
return cast(F, _get)
|
2020-08-11 13:00:17 -04:00
|
|
|
|
|
|
|
|
|
|
|
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):
|
2021-11-10 15:06:54 -05:00
|
|
|
_listening_services (list[Port]): TCP ports that
|
2019-02-11 05:36:26 -05:00
|
|
|
we are listening on to provide HTTP services.
|
2014-08-12 10:10:52 -04:00
|
|
|
"""
|
|
|
|
|
2020-10-02 08:23:15 -04:00
|
|
|
REQUIRED_ON_BACKGROUND_TASK_STARTUP = [
|
2020-10-13 08:20:32 -04:00
|
|
|
"account_validity",
|
2020-10-02 08:23:15 -04:00
|
|
|
"auth",
|
2020-10-13 08:20:32 -04:00
|
|
|
"deactivate_account",
|
2024-09-23 08:33:48 -04:00
|
|
|
"delayed_events",
|
2020-10-13 08:20:32 -04:00
|
|
|
"message",
|
|
|
|
"pagination",
|
|
|
|
"profile",
|
2023-05-03 07:27:33 -04:00
|
|
|
"room_forgetter",
|
2020-10-02 08:23:15 -04:00
|
|
|
"stats",
|
|
|
|
]
|
2019-06-20 05:32:02 -04:00
|
|
|
|
2024-07-05 08:35:57 -04:00
|
|
|
@property
|
|
|
|
@abc.abstractmethod
|
|
|
|
def DATASTORE_CLASS(self) -> Type["SQLBaseStore"]:
|
|
|
|
# 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_datastores()
|
|
|
|
pass
|
2018-08-28 08:39:49 -04:00
|
|
|
|
2020-10-15 15:29:13 -04:00
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
hostname: str,
|
|
|
|
config: HomeServerConfig,
|
2022-02-11 07:20:16 -05:00
|
|
|
reactor: Optional[ISynapseReactor] = None,
|
|
|
|
version_string: str = "Synapse",
|
2020-10-15 15:29:13 -04:00
|
|
|
):
|
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
|
|
|
|
|
2022-02-11 07:20:16 -05:00
|
|
|
reactor = cast(ISynapseReactor, _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
|
2021-11-10 15:06:54 -05:00
|
|
|
self._listening_services: List[Port] = []
|
2021-07-15 06:02:43 -04:00
|
|
|
self.start_time: Optional[int] = None
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2020-04-29 11:23:08 -04:00
|
|
|
self._instance_id = random_string(5)
|
2021-02-24 08:23:18 -05:00
|
|
|
self._instance_name = config.worker.instance_name
|
2020-03-30 11:37:24 -04:00
|
|
|
|
2020-10-15 15:29:13 -04:00
|
|
|
self.version_string = version_string
|
2018-08-28 08:39:49 -04:00
|
|
|
|
2021-07-15 06:02:43 -04:00
|
|
|
self.datastores: Optional[Databases] = None
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2021-11-10 15:06:54 -05:00
|
|
|
self._module_web_resources: Dict[str, Resource] = {}
|
2021-06-18 07:15:52 -04:00
|
|
|
self._module_web_resources_consumed = False
|
|
|
|
|
2022-11-15 11:36:43 -05:00
|
|
|
# This attribute is set by the free function `refresh_certificate`.
|
|
|
|
self.tls_server_context_factory: Optional[IOpenSSLContextFactory] = None
|
|
|
|
|
2022-02-11 07:20:16 -05:00
|
|
|
def register_module_web_resource(self, path: str, resource: Resource) -> None:
|
2021-06-18 07:15:52 -04: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 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-10-02 08:23:15 -04: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 13:07:12 -04:00
|
|
|
if self.config.worker.run_background_tasks:
|
2020-10-02 08:23:15 -04:00
|
|
|
self.setup_background_tasks()
|
|
|
|
|
2022-11-04 14:43:14 -04:00
|
|
|
def start_listening(self) -> None: # noqa: B027 (no-op by design)
|
2021-04-23 14:20:44 -04: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 08:23:15 -04:00
|
|
|
def setup_background_tasks(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.
|
|
|
|
"""
|
2020-10-02 08:23:15 -04:00
|
|
|
for i in self.REQUIRED_ON_BACKGROUND_TASK_STARTUP:
|
|
|
|
getattr(self, "get_" + i + "_handler")()
|
2023-08-21 08:17:13 -04:00
|
|
|
self.get_task_scheduler()
|
2019-03-11 06:13:35 -04:00
|
|
|
|
2021-03-08 08:25:43 -05:00
|
|
|
def get_reactor(self) -> ISynapseReactor:
|
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 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:
|
2022-09-08 10:54:36 -04: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 11:01:05 -05:00
|
|
|
|
2023-05-05 10:06:22 -04: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 13:28:44 -05:00
|
|
|
@cache_in_self
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_clock(self) -> Clock:
|
2020-11-30 13:28:44 -05:00
|
|
|
return Clock(self._reactor)
|
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-11-30 13:28:44 -05:00
|
|
|
@cache_in_self
|
2020-08-11 13:00:17 -04:00
|
|
|
def get_distributor(self) -> Distributor:
|
2020-11-30 13:28:44 -05:00
|
|
|
return Distributor()
|
2017-11-21 05:50:23 -05:00
|
|
|
|
2020-11-30 13:28:44 -05:00
|
|
|
@cache_in_self
|
2020-06-05 05:47:20 -04:00
|
|
|
def get_registration_ratelimiter(self) -> Ratelimiter:
|
2020-11-30 13:28:44 -05:00
|
|
|
return Ratelimiter(
|
2022-02-23 06:04:02 -05:00
|
|
|
store=self.get_datastores().main,
|
2020-11-30 13:28:44 -05:00
|
|
|
clock=self.get_clock(),
|
2023-08-29 19:39:39 -04:00
|
|
|
cfg=self.config.ratelimiting.rc_registration,
|
2020-11-30 13:28:44 -05:00
|
|
|
)
|
2019-03-06 06:02:42 -05:00
|
|
|
|
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_notifier(self) -> Notifier:
|
2014-08-12 10:10:52 -04:00
|
|
|
return Notifier(self)
|
|
|
|
|
2023-01-20 13:02:18 -05:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_notifier(self) -> ReplicationNotifier:
|
|
|
|
return ReplicationNotifier()
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth(self) -> Auth:
|
2023-05-09 10:20:04 -04:00
|
|
|
if self.config.experimental.msc3861.enabled:
|
|
|
|
from synapse.api.auth.msc3861_delegated import MSC3861DelegatedAuth
|
2022-09-13 11:54:32 -04:00
|
|
|
|
2023-05-09 10:20:04 -04:00
|
|
|
return MSC3861DelegatedAuth(self)
|
2022-06-17 08:48:55 -04:00
|
|
|
return InternalAuth(self)
|
2014-08-12 10:10:52 -04:00
|
|
|
|
2022-06-14 04:51:15 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_auth_blocking(self) -> AuthBlocking:
|
|
|
|
return AuthBlocking(self)
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_http_client_context_factory(self) -> IPolicyForHTTPS:
|
2021-09-15 08:34:52 -04:00
|
|
|
if self.config.tls.use_insecure_ssl_client_just_for_testing_do_not_use:
|
2021-03-12 11:37:57 -05:00
|
|
|
return InsecureInterceptableContextFactory()
|
|
|
|
return 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:
|
2020-12-02 11:09:24 -05:00
|
|
|
"""
|
|
|
|
An HTTP client with no special configuration.
|
|
|
|
"""
|
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:
|
2020-12-02 11:09:24 -05:00
|
|
|
"""
|
|
|
|
An HTTP client that uses configured HTTP(S) proxies.
|
|
|
|
"""
|
2021-02-26 12:37:57 -05:00
|
|
|
return SimpleHttpClient(self, use_proxy=True)
|
2020-12-02 11:09:24 -05:00
|
|
|
|
|
|
|
@cache_in_self
|
2023-05-19 08:25:25 -04:00
|
|
|
def get_proxied_blocklisted_http_client(self) -> SimpleHttpClient:
|
2020-12-02 11:09:24 -05:00
|
|
|
"""
|
2023-05-19 08:25:25 -04:00
|
|
|
An HTTP client that uses configured HTTP(S) proxies and blocks IPs
|
|
|
|
based on the configured IP ranges.
|
2020-12-02 11:09:24 -05:00
|
|
|
"""
|
2019-11-01 10:07:44 -04:00
|
|
|
return SimpleHttpClient(
|
|
|
|
self,
|
2023-05-19 08:25:25 -04:00
|
|
|
ip_allowlist=self.config.server.ip_range_allowlist,
|
|
|
|
ip_blocklist=self.config.server.ip_range_blocklist,
|
2021-02-26 12:37:57 -05:00
|
|
|
use_proxy=True,
|
2019-11-01 10:07:44 -04:00
|
|
|
)
|
|
|
|
|
2020-12-02 11:09:24 -05: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 14:25:20 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_replication_client(self) -> ReplicationClient:
|
|
|
|
"""
|
|
|
|
An HTTP client for HTTP replication.
|
|
|
|
"""
|
|
|
|
return ReplicationClient(self)
|
|
|
|
|
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_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
|
2021-04-14 12:06:06 -04:00
|
|
|
def get_presence_handler(self) -> BasePresenceHandler:
|
2021-04-23 07:21:55 -04:00
|
|
|
if self.get_instance_name() in self.config.worker.writers.presence:
|
2021-04-14 12:06:06 -04:00
|
|
|
return PresenceHandler(self)
|
2021-04-23 07:21:55 -04:00
|
|
|
else:
|
|
|
|
return WorkerPresenceHandler(self)
|
2016-05-16 13:56:37 -04:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
2021-03-17 11:30:21 -04:00
|
|
|
def get_typing_writer_handler(self) -> TypingWriterHandler:
|
2021-11-03 10:25:47 -04:00
|
|
|
if self.get_instance_name() in self.config.worker.writers.typing:
|
2020-07-16 10:12:54 -04:00
|
|
|
return TypingWriterHandler(self)
|
2021-03-17 11:30:21 -04:00
|
|
|
else:
|
|
|
|
raise Exception("Workers cannot write typing")
|
|
|
|
|
2021-04-06 09:38:30 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_presence_router(self) -> PresenceRouter:
|
|
|
|
return PresenceRouter(self)
|
|
|
|
|
2021-03-17 11:30:21 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_typing_handler(self) -> FollowerTypingHandler:
|
2021-11-03 10:25:47 -04:00
|
|
|
if self.get_instance_name() in self.config.worker.writers.typing:
|
2021-03-17 11:30:21 -04:00
|
|
|
# Use get_typing_writer_handler to ensure that we use the same
|
|
|
|
# cached version.
|
|
|
|
return self.get_typing_writer_handler()
|
2020-07-16 10:12:54 -04:00
|
|
|
else:
|
|
|
|
return FollowerTypingHandler(self)
|
2016-05-17 10:58:46 -04:00
|
|
|
|
2020-11-17 09:46:23 -05:00
|
|
|
@cache_in_self
|
|
|
|
def get_sso_handler(self) -> SsoHandler:
|
|
|
|
return SsoHandler(self)
|
|
|
|
|
2023-05-19 08:06:54 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_jwt_handler(self) -> "JwtHandler":
|
|
|
|
from synapse.handlers.jwt import JwtHandler
|
|
|
|
|
|
|
|
return JwtHandler(self)
|
|
|
|
|
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)
|
|
|
|
|
2024-07-29 17:45:48 -04:00
|
|
|
@cache_in_self
|
Add Sliding Sync `/sync` endpoint (initial implementation) (#17187)
Based on [MSC3575](https://github.com/matrix-org/matrix-spec-proposals/pull/3575): Sliding Sync
This iteration only focuses on returning the list of room IDs in the sliding window API (without sorting/filtering).
Rooms appear in the Sliding sync response based on:
- `invite`, `join`, `knock`, `ban` membership events
- Kicks (`leave` membership events where `sender` is different from the `user_id`/`state_key`)
- `newly_left` (rooms that were left during the given token range, > `from_token` and <= `to_token`)
- In order for bans/kicks to not show up, you need to `/forget` those rooms. This doesn't modify the event itself though and only adds the `forgotten` flag to `room_memberships` in Synapse. There isn't a way to tell when a room was forgotten at the moment so we can't factor it into the from/to range.
### Example request
`POST http://localhost:8008/_matrix/client/unstable/org.matrix.msc3575/sync`
```json
{
"lists": {
"foo-list": {
"ranges": [ [0, 99] ],
"sort": [ "by_notification_level", "by_recency", "by_name" ],
"required_state": [
["m.room.join_rules", ""],
["m.room.history_visibility", ""],
["m.space.child", "*"]
],
"timeline_limit": 100
}
}
}
```
Response:
```json
{
"next_pos": "s58_224_0_13_10_1_1_16_0_1",
"lists": {
"foo-list": {
"count": 1,
"ops": [
{
"op": "SYNC",
"range": [0, 99],
"room_ids": [
"!MmgikIyFzsuvtnbvVG:my.synapse.linux.server"
]
}
]
}
},
"rooms": {},
"extensions": {}
}
```
2024-06-06 15:44:32 -04:00
|
|
|
def get_sliding_sync_handler(self) -> SlidingSyncHandler:
|
|
|
|
return SlidingSyncHandler(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:
|
2022-06-14 09:12:08 -04:00
|
|
|
return MacaroonGenerator(
|
|
|
|
self.get_clock(), self.hostname, self.config.key.macaroon_secret_key
|
|
|
|
)
|
2017-02-02 05:53:36 -05:00
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
2022-11-22 14:08:04 -05:00
|
|
|
def get_device_handler(self) -> DeviceWorkerHandler:
|
2021-09-13 13:07:12 -04:00
|
|
|
if self.config.worker.worker_app:
|
2019-03-04 13:24:32 -05:00
|
|
|
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-10-09 07:24:34 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_directory_handler(self) -> DirectoryHandler:
|
|
|
|
return DirectoryHandler(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-10-09 07:24:34 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_admin_handler(self) -> AdminHandler:
|
|
|
|
return AdminHandler(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-10-09 07:24:34 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_handler(self) -> FederationHandler:
|
|
|
|
return FederationHandler(self)
|
|
|
|
|
2021-08-26 16:41:44 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_event_handler(self) -> FederationEventHandler:
|
|
|
|
return FederationEventHandler(self)
|
|
|
|
|
2020-10-09 07:24:34 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_identity_handler(self) -> IdentityHandler:
|
|
|
|
return IdentityHandler(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
|
2021-01-12 16:30:15 -05:00
|
|
|
def get_profile_handler(self) -> ProfileHandler:
|
2020-10-13 08:20:32 -04:00
|
|
|
return ProfileHandler(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-10-09 07:24:34 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_search_handler(self) -> SearchHandler:
|
|
|
|
return SearchHandler(self)
|
|
|
|
|
2021-05-17 06:33:38 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_send_email_handler(self) -> SendEmailHandler:
|
|
|
|
return SendEmailHandler(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_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
|
2021-03-29 11:43:20 -04:00
|
|
|
def get_federation_sender(self) -> AbstractFederationSender:
|
2016-11-23 09:09:47 -05:00
|
|
|
if self.should_send_federation():
|
2019-03-13 16:02:56 -04:00
|
|
|
return FederationSender(self)
|
2021-09-13 13:07:12 -04:00
|
|
|
elif not self.config.worker.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
|
2022-03-10 08:01:56 -05:00
|
|
|
def get_replication_command_handler(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
|
2022-05-11 07:15:21 -04:00
|
|
|
def get_bulk_push_rule_evaluator(self) -> BulkPushRuleEvaluator:
|
|
|
|
return BulkPushRuleEvaluator(self)
|
2017-05-18 13:17:40 -04:00
|
|
|
|
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_stats_handler(self) -> StatsHandler:
|
2019-05-21 12:36:50 -04:00
|
|
|
return StatsHandler(self)
|
|
|
|
|
2021-10-13 07:21:52 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_password_auth_provider(self) -> PasswordAuthProvider:
|
|
|
|
return PasswordAuthProvider()
|
|
|
|
|
2020-08-11 13:00:17 -04:00
|
|
|
@cache_in_self
|
2021-03-17 07:14:39 -04:00
|
|
|
def get_room_member_handler(self) -> RoomMemberHandler:
|
2021-09-13 13:07:12 -04:00
|
|
|
if self.config.worker.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
|
2021-03-24 06:48:46 -04:00
|
|
|
def get_server_notices_manager(self) -> ServerNoticesManager:
|
2021-09-13 13:07:12 -04:00
|
|
|
if self.config.worker.worker_app:
|
2018-05-22 05:57:56 -04:00
|
|
|
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
|
2021-03-24 06:48:46 -04:00
|
|
|
def get_server_notices_sender(self) -> WorkerServerNoticesSender:
|
2021-09-13 13:07:12 -04:00
|
|
|
if self.config.worker.worker_app:
|
2018-05-22 05:57:56 -04:00
|
|
|
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)
|
|
|
|
|
2022-03-16 10:39:15 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_relations_handler(self) -> RelationsHandler:
|
|
|
|
return RelationsHandler(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)
|
|
|
|
|
2021-12-02 02:02:20 -05:00
|
|
|
@cache_in_self
|
|
|
|
def get_timestamp_lookup_handler(self) -> TimestampLookupHandler:
|
|
|
|
return TimestampLookupHandler(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":
|
2021-04-20 14:55:20 -04:00
|
|
|
from synapse.handlers.saml 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":
|
2021-04-20 14:55:20 -04:00
|
|
|
from synapse.handlers.oidc 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:
|
2023-10-27 05:04:08 -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
|
2022-05-31 08:17:50 -04:00
|
|
|
def get_storage_controllers(self) -> StorageControllers:
|
|
|
|
return StorageControllers(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-09-18 05:49:29 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_federation_ratelimiter(self) -> FederationRateLimiter:
|
2021-09-13 13:07:12 -04:00
|
|
|
return FederationRateLimiter(
|
2022-08-30 07:08:29 -04:00
|
|
|
self.get_clock(),
|
|
|
|
config=self.config.ratelimiting.rc_federation,
|
|
|
|
metrics_name="federation_servlets",
|
2021-09-13 13:07:12 -04:00
|
|
|
)
|
2020-09-18 05:49:29 -04:00
|
|
|
|
2020-10-07 07:03:26 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_module_api(self) -> ModuleApi:
|
|
|
|
return ModuleApi(self, self.get_auth_handler())
|
|
|
|
|
2023-03-16 06:35:31 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_module_api_callbacks(self) -> ModuleApiCallbacks:
|
2023-04-17 20:57:40 -04:00
|
|
|
return ModuleApiCallbacks(self)
|
2023-03-16 06:35:31 -04:00
|
|
|
|
2021-01-18 10:47:59 -05:00
|
|
|
@cache_in_self
|
|
|
|
def get_account_data_handler(self) -> AccountDataHandler:
|
|
|
|
return AccountDataHandler(self)
|
|
|
|
|
2021-01-26 08:57:31 -05:00
|
|
|
@cache_in_self
|
2021-08-16 10:49:12 -04:00
|
|
|
def get_room_summary_handler(self) -> RoomSummaryHandler:
|
|
|
|
return RoomSummaryHandler(self)
|
2021-03-18 14:24:16 -04:00
|
|
|
|
|
|
|
@cache_in_self
|
2021-04-23 07:05:51 -04:00
|
|
|
def get_event_auth_handler(self) -> EventAuthHandler:
|
|
|
|
return EventAuthHandler(self)
|
|
|
|
|
|
|
|
@cache_in_self
|
2021-01-26 08:57:31 -05:00
|
|
|
def get_external_cache(self) -> ExternalCache:
|
|
|
|
return ExternalCache(self)
|
|
|
|
|
2022-02-22 10:10:10 -05:00
|
|
|
@cache_in_self
|
|
|
|
def get_account_handler(self) -> AccountHandler:
|
|
|
|
return AccountHandler(self)
|
|
|
|
|
2022-04-27 09:55:33 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_push_rules_handler(self) -> PushRulesHandler:
|
|
|
|
return PushRulesHandler(self)
|
|
|
|
|
2023-05-03 07:27:33 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_room_forgetter_handler(self) -> RoomForgetterHandler:
|
|
|
|
return RoomForgetterHandler(self)
|
|
|
|
|
2024-04-25 08:50:12 -04:00
|
|
|
@cache_in_self
|
|
|
|
def get_rendezvous_handler(self) -> RendezvousHandler:
|
|
|
|
return RendezvousHandler(self)
|
|
|
|
|
2021-01-26 08:57:31 -05:00
|
|
|
@cache_in_self
|
2022-03-08 07:26:05 -05:00
|
|
|
def get_outbound_redis_connection(self) -> "ConnectionHandler":
|
2021-10-22 13:15:41 -04: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 08:57:31 -05:00
|
|
|
|
|
|
|
# We only want to import redis module if we're using it, as we have
|
|
|
|
# `txredisapi` as an optional dependency.
|
2023-05-26 15:28:39 -04:00
|
|
|
from synapse.replication.tcp.redis import lazyConnection, lazyUnixConnection
|
2021-01-26 08:57:31 -05:00
|
|
|
|
2023-05-26 15:28:39 -04: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 08:57:31 -05:00
|
|
|
|
2023-05-26 15:28:39 -04: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 08:57:31 -05: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?"
|
2021-09-15 08:34:52 -04:00
|
|
|
return self.config.worker.send_federation
|
2021-10-08 07:44:43 -04:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_request_ratelimiter(self) -> RequestRatelimiter:
|
|
|
|
return RequestRatelimiter(
|
2022-02-23 06:04:02 -05:00
|
|
|
self.get_datastores().main,
|
2021-10-08 07:44:43 -04:00
|
|
|
self.get_clock(),
|
|
|
|
self.config.ratelimiting.rc_message,
|
|
|
|
self.config.ratelimiting.rc_admin_redaction,
|
|
|
|
)
|
2022-09-05 06:26:43 -04: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 05:58:03 -04:00
|
|
|
|
2023-09-01 08:52:57 -04:00
|
|
|
@cache_in_self
|
2023-07-31 05:58:03 -04:00
|
|
|
def get_worker_locks_handler(self) -> WorkerLocksHandler:
|
|
|
|
return WorkerLocksHandler(self)
|
2023-08-21 08:17:13 -04:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_task_scheduler(self) -> TaskScheduler:
|
|
|
|
return TaskScheduler(self)
|
2024-08-13 12:59:47 -04:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_media_sender_thread_pool(self) -> ThreadPool:
|
|
|
|
"""Fetch the threadpool used to read files when responding to media
|
|
|
|
download requests."""
|
|
|
|
|
|
|
|
# We can choose a large threadpool size as these threads predominately
|
|
|
|
# do IO rather than CPU work.
|
|
|
|
media_threadpool = ThreadPool(
|
|
|
|
name="media_threadpool", minthreads=1, maxthreads=50
|
|
|
|
)
|
|
|
|
|
|
|
|
media_threadpool.start()
|
|
|
|
self.get_reactor().addSystemEventTrigger(
|
|
|
|
"during", "shutdown", media_threadpool.stop
|
|
|
|
)
|
|
|
|
|
2024-08-14 10:11:22 -04:00
|
|
|
# Register the threadpool with our metrics.
|
|
|
|
register_threadpool("media", media_threadpool)
|
|
|
|
|
2024-08-13 12:59:47 -04:00
|
|
|
return media_threadpool
|
2024-09-23 08:33:48 -04:00
|
|
|
|
|
|
|
@cache_in_self
|
|
|
|
def get_delayed_events_handler(self) -> DelayedEventsHandler:
|
|
|
|
return DelayedEventsHandler(self)
|