VYPR
Moderate severityNVD Advisory· Published Feb 26, 2021· Updated Aug 3, 2024

Open redirects on some federation and push requests

CVE-2021-21273

Description

Synapse is a Matrix reference homeserver written in python (pypi package matrix-synapse). Matrix is an ecosystem for open federated Instant Messaging and VoIP. In Synapse before version 1.25.0, requests to user provided domains were not restricted to external IP addresses when calculating the key validity for third-party invite events and sending push notifications. This could cause Synapse to make requests to internal infrastructure. The type of request was not controlled by the user, although limited modification of request bodies was possible. For the most thorough protection server administrators should remove the deprecated federation_ip_range_blacklist from their settings after upgrading to Synapse v1.25.0 which will result in Synapse using the improved default IP address restrictions. See the new ip_range_blacklist and ip_range_whitelist settings if more specific control is necessary.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Synapse before 1.25.0 did not restrict outgoing requests to internal IPs when validating third-party invites or sending push notifications, enabling SSRF.

CVE-2021-21273 is a server-side request forgery (SSRF) vulnerability in Synapse, the reference Matrix homeserver written in Python. The root cause is that Synapse did not apply IP address restrictions to outgoing requests made when calculating key validity for third-party invite events and when sending push notifications [1][4]. While some protections existed via the IPBlacklistingResolver, these were not consistently enforced for these specific request types, leaving a gap [1].

An attacker can exploit this by crafting a federation request that causes Synapse to make a request to an attacker-controlled domain that resolves to an internal IP address, or by sending a push notification that triggers a similar request [1][4]. The attack does not require authentication, as third-party invites can be sent from any federated server, and the attacker has limited control over the request body but can influence the target host [4].

The impact is that an unauthenticated attacker can force the Synapse server to make HTTP requests to internal infrastructure, such as cloud metadata endpoints, internal services, or other hosts on the local network [4]. This SSRF can be used to probe internal networks, access sensitive data, or potentially pivot to further attacks on internal systems.

The vulnerability is fixed in Synapse version 1.25.0, released on 2021-01-13 [2]. The fix applies the federation_ip_range_blacklist (and the newer ip_range_blacklist settings) to these requests, ensuring they cannot target private or reserved IP ranges [1][2]. Administrators are strongly advised to upgrade and to remove the deprecated federation_ip_range_blacklist in favor of the improved defaults [4].

AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
matrix-synapsePyPI
< 1.25.01.25.0

Affected products

2

Patches

1
30fba6210834

Apply an IP range blacklist to push and key revocation requests. (#8821)

https://github.com/matrix-org/synapsePatrick ClokeDec 2, 2020via ghsa
43 files changed · +176 115
  • changelog.d/8821.bugfix+1 0 added
    @@ -0,0 +1 @@
    +Apply the `federation_ip_range_blacklist` to push and key revocation requests.
    
  • docs/sample_config.yaml+8 6 modified
    @@ -642,17 +642,19 @@ acme:
     #  - nyc.example.com
     #  - syd.example.com
     
    -# Prevent federation requests from being sent to the following
    -# blacklist IP address CIDR ranges. If this option is not specified, or
    -# specified with an empty list, no ip range blacklist will be enforced.
    +# Prevent outgoing requests from being sent to the following blacklisted IP address
    +# CIDR ranges. If this option is not specified, or specified with an empty list,
    +# no IP range blacklist will be enforced.
     #
    -# As of Synapse v1.4.0 this option also affects any outbound requests to identity
    -# servers provided by user input.
    +# The blacklist applies to the outbound requests for federation, identity servers,
    +# push servers, and for checking key validitity for third-party invite events.
     #
     # (0.0.0.0 and :: are always blacklisted, whether or not they are explicitly
     # listed here, since they correspond to unroutable addresses.)
     #
    -federation_ip_range_blacklist:
    +# This option replaces federation_ip_range_blacklist in Synapse v1.24.0.
    +#
    +ip_range_blacklist:
       - '127.0.0.0/8'
       - '10.0.0.0/8'
       - '172.16.0.0/12'
    
  • synapse/app/generic_worker.py+0 1 modified
    @@ -266,7 +266,6 @@ def __init__(self, hs):
             super().__init__(hs)
             self.hs = hs
             self.is_mine_id = hs.is_mine_id
    -        self.http_client = hs.get_simple_http_client()
     
             self._presence_enabled = hs.config.use_presence
     
    
  • synapse/config/federation.py+25 15 modified
    @@ -36,22 +36,30 @@ def read_config(self, config, **kwargs):
                 for domain in federation_domain_whitelist:
                     self.federation_domain_whitelist[domain] = True
     
    -        self.federation_ip_range_blacklist = config.get(
    -            "federation_ip_range_blacklist", []
    -        )
    +        ip_range_blacklist = config.get("ip_range_blacklist", [])
     
             # Attempt to create an IPSet from the given ranges
             try:
    -            self.federation_ip_range_blacklist = IPSet(
    -                self.federation_ip_range_blacklist
    -            )
    -
    -            # Always blacklist 0.0.0.0, ::
    -            self.federation_ip_range_blacklist.update(["0.0.0.0", "::"])
    +            self.ip_range_blacklist = IPSet(ip_range_blacklist)
    +        except Exception as e:
    +            raise ConfigError("Invalid range(s) provided in ip_range_blacklist: %s" % e)
    +        # Always blacklist 0.0.0.0, ::
    +        self.ip_range_blacklist.update(["0.0.0.0", "::"])
    +
    +        # The federation_ip_range_blacklist is used for backwards-compatibility
    +        # and only applies to federation and identity servers. If it is not given,
    +        # default to ip_range_blacklist.
    +        federation_ip_range_blacklist = config.get(
    +            "federation_ip_range_blacklist", ip_range_blacklist
    +        )
    +        try:
    +            self.federation_ip_range_blacklist = IPSet(federation_ip_range_blacklist)
             except Exception as e:
                 raise ConfigError(
                     "Invalid range(s) provided in federation_ip_range_blacklist: %s" % e
                 )
    +        # Always blacklist 0.0.0.0, ::
    +        self.federation_ip_range_blacklist.update(["0.0.0.0", "::"])
     
             federation_metrics_domains = config.get("federation_metrics_domains") or []
             validate_config(
    @@ -76,17 +84,19 @@ def generate_config_section(self, config_dir_path, server_name, **kwargs):
             #  - nyc.example.com
             #  - syd.example.com
     
    -        # Prevent federation requests from being sent to the following
    -        # blacklist IP address CIDR ranges. If this option is not specified, or
    -        # specified with an empty list, no ip range blacklist will be enforced.
    +        # Prevent outgoing requests from being sent to the following blacklisted IP address
    +        # CIDR ranges. If this option is not specified, or specified with an empty list,
    +        # no IP range blacklist will be enforced.
             #
    -        # As of Synapse v1.4.0 this option also affects any outbound requests to identity
    -        # servers provided by user input.
    +        # The blacklist applies to the outbound requests for federation, identity servers,
    +        # push servers, and for checking key validitity for third-party invite events.
             #
             # (0.0.0.0 and :: are always blacklisted, whether or not they are explicitly
             # listed here, since they correspond to unroutable addresses.)
             #
    -        federation_ip_range_blacklist:
    +        # This option replaces federation_ip_range_blacklist in Synapse v1.24.0.
    +        #
    +        ip_range_blacklist:
               - '127.0.0.0/8'
               - '10.0.0.0/8'
               - '172.16.0.0/12'
    
  • synapse/crypto/keyring.py+2 2 modified
    @@ -578,7 +578,7 @@ class PerspectivesKeyFetcher(BaseV2KeyFetcher):
         def __init__(self, hs):
             super().__init__(hs)
             self.clock = hs.get_clock()
    -        self.client = hs.get_http_client()
    +        self.client = hs.get_federation_http_client()
             self.key_servers = self.config.key_servers
     
         async def get_keys(self, keys_to_fetch):
    @@ -748,7 +748,7 @@ class ServerKeyFetcher(BaseV2KeyFetcher):
         def __init__(self, hs):
             super().__init__(hs)
             self.clock = hs.get_clock()
    -        self.client = hs.get_http_client()
    +        self.client = hs.get_federation_http_client()
     
         async def get_keys(self, keys_to_fetch):
             """
    
  • synapse/federation/federation_server.py+0 1 modified
    @@ -845,7 +845,6 @@ class FederationHandlerRegistry:
     
         def __init__(self, hs: "HomeServer"):
             self.config = hs.config
    -        self.http_client = hs.get_simple_http_client()
             self.clock = hs.get_clock()
             self._instance_name = hs.get_instance_name()
     
    
  • synapse/federation/transport/client.py+1 1 modified
    @@ -35,7 +35,7 @@ class TransportLayerClient:
     
         def __init__(self, hs):
             self.server_name = hs.hostname
    -        self.client = hs.get_http_client()
    +        self.client = hs.get_federation_http_client()
     
         @log_function
         def get_room_state_ids(self, destination, room_id, event_id):
    
  • synapse/handlers/federation.py+1 1 modified
    @@ -140,7 +140,7 @@ def __init__(self, hs: "HomeServer"):
             self._message_handler = hs.get_message_handler()
             self._server_notices_mxid = hs.config.server_notices_mxid
             self.config = hs.config
    -        self.http_client = hs.get_simple_http_client()
    +        self.http_client = hs.get_proxied_blacklisted_http_client()
             self._instance_name = hs.get_instance_name()
             self._replication = hs.get_replication_data_handler()
     
    
  • synapse/handlers/identity.py+3 3 modified
    @@ -46,13 +46,13 @@ class IdentityHandler(BaseHandler):
         def __init__(self, hs):
             super().__init__(hs)
     
    +        # An HTTP client for contacting trusted URLs.
             self.http_client = SimpleHttpClient(hs)
    -        # We create a blacklisting instance of SimpleHttpClient for contacting identity
    -        # servers specified by clients
    +        # An HTTP client for contacting identity servers specified by clients.
             self.blacklisting_http_client = SimpleHttpClient(
                 hs, ip_blacklist=hs.config.federation_ip_range_blacklist
             )
    -        self.federation_http_client = hs.get_http_client()
    +        self.federation_http_client = hs.get_federation_http_client()
             self.hs = hs
     
         async def threepid_from_creds(
    
  • synapse/http/client.py+32 14 modified
    @@ -125,7 +125,7 @@ def _scheduler(x):
         return _scheduler
     
     
    -class IPBlacklistingResolver:
    +class _IPBlacklistingResolver:
         """
         A proxy for reactor.nameResolver which only produces non-blacklisted IP
         addresses, preventing DNS rebinding attacks on URL preview.
    @@ -199,6 +199,35 @@ def resolutionComplete() -> None:
             return r
     
     
    +@implementer(IReactorPluggableNameResolver)
    +class BlacklistingReactorWrapper:
    +    """
    +    A Reactor wrapper which will prevent DNS resolution to blacklisted IP
    +    addresses, to prevent DNS rebinding.
    +    """
    +
    +    def __init__(
    +        self,
    +        reactor: IReactorPluggableNameResolver,
    +        ip_whitelist: Optional[IPSet],
    +        ip_blacklist: IPSet,
    +    ):
    +        self._reactor = reactor
    +
    +        # We need to use a DNS resolver which filters out blacklisted IP
    +        # addresses, to prevent DNS rebinding.
    +        self._nameResolver = _IPBlacklistingResolver(
    +            self._reactor, ip_whitelist, ip_blacklist
    +        )
    +
    +    def __getattr__(self, attr: str) -> Any:
    +        # Passthrough to the real reactor except for the DNS resolver.
    +        if attr == "nameResolver":
    +            return self._nameResolver
    +        else:
    +            return getattr(self._reactor, attr)
    +
    +
     class BlacklistingAgentWrapper(Agent):
         """
         An Agent wrapper which will prevent access to IP addresses being accessed
    @@ -292,22 +321,11 @@ def __init__(
             self.user_agent = self.user_agent.encode("ascii")
     
             if self._ip_blacklist:
    -            real_reactor = hs.get_reactor()
                 # If we have an IP blacklist, we need to use a DNS resolver which
                 # filters out blacklisted IP addresses, to prevent DNS rebinding.
    -            nameResolver = IPBlacklistingResolver(
    -                real_reactor, self._ip_whitelist, self._ip_blacklist
    +            self.reactor = BlacklistingReactorWrapper(
    +                hs.get_reactor(), self._ip_whitelist, self._ip_blacklist
                 )
    -
    -            @implementer(IReactorPluggableNameResolver)
    -            class Reactor:
    -                def __getattr__(_self, attr):
    -                    if attr == "nameResolver":
    -                        return nameResolver
    -                    else:
    -                        return getattr(real_reactor, attr)
    -
    -            self.reactor = Reactor()
             else:
                 self.reactor = hs.get_reactor()
     
    
  • synapse/http/federation/matrix_federation_agent.py+12 4 modified
    @@ -16,7 +16,7 @@
     import urllib.parse
     from typing import List, Optional
     
    -from netaddr import AddrFormatError, IPAddress
    +from netaddr import AddrFormatError, IPAddress, IPSet
     from zope.interface import implementer
     
     from twisted.internet import defer
    @@ -31,6 +31,7 @@
     from twisted.web.iweb import IAgent, IAgentEndpointFactory, IBodyProducer
     
     from synapse.crypto.context_factory import FederationPolicyForHTTPS
    +from synapse.http.client import BlacklistingAgentWrapper
     from synapse.http.federation.srv_resolver import Server, SrvResolver
     from synapse.http.federation.well_known_resolver import WellKnownResolver
     from synapse.logging.context import make_deferred_yieldable, run_in_background
    @@ -70,6 +71,7 @@ def __init__(
             reactor: IReactorCore,
             tls_client_options_factory: Optional[FederationPolicyForHTTPS],
             user_agent: bytes,
    +        ip_blacklist: IPSet,
             _srv_resolver: Optional[SrvResolver] = None,
             _well_known_resolver: Optional[WellKnownResolver] = None,
         ):
    @@ -90,12 +92,18 @@ def __init__(
             self.user_agent = user_agent
     
             if _well_known_resolver is None:
    +            # Note that the name resolver has already been wrapped in a
    +            # IPBlacklistingResolver by MatrixFederationHttpClient.
                 _well_known_resolver = WellKnownResolver(
                     self._reactor,
    -                agent=Agent(
    +                agent=BlacklistingAgentWrapper(
    +                    Agent(
    +                        self._reactor,
    +                        pool=self._pool,
    +                        contextFactory=tls_client_options_factory,
    +                    ),
                         self._reactor,
    -                    pool=self._pool,
    -                    contextFactory=tls_client_options_factory,
    +                    ip_blacklist=ip_blacklist,
                     ),
                     user_agent=self.user_agent,
                 )
    
  • synapse/http/matrixfederationclient.py+8 18 modified
    @@ -26,11 +26,10 @@
     from canonicaljson import encode_canonical_json
     from prometheus_client import Counter
     from signedjson.sign import sign_json
    -from zope.interface import implementer
     
     from twisted.internet import defer
     from twisted.internet.error import DNSLookupError
    -from twisted.internet.interfaces import IReactorPluggableNameResolver, IReactorTime
    +from twisted.internet.interfaces import IReactorTime
     from twisted.internet.task import _EPSILON, Cooperator
     from twisted.web.http_headers import Headers
     from twisted.web.iweb import IBodyProducer, IResponse
    @@ -45,7 +44,7 @@
     from synapse.http import QuieterFileBodyProducer
     from synapse.http.client import (
         BlacklistingAgentWrapper,
    -    IPBlacklistingResolver,
    +    BlacklistingReactorWrapper,
         encode_query_args,
         readBodyToFile,
     )
    @@ -221,31 +220,22 @@ def __init__(self, hs, tls_client_options_factory):
             self.signing_key = hs.signing_key
             self.server_name = hs.hostname
     
    -        real_reactor = hs.get_reactor()
    -
             # We need to use a DNS resolver which filters out blacklisted IP
             # addresses, to prevent DNS rebinding.
    -        nameResolver = IPBlacklistingResolver(
    -            real_reactor, None, hs.config.federation_ip_range_blacklist
    +        self.reactor = BlacklistingReactorWrapper(
    +            hs.get_reactor(), None, hs.config.federation_ip_range_blacklist
             )
     
    -        @implementer(IReactorPluggableNameResolver)
    -        class Reactor:
    -            def __getattr__(_self, attr):
    -                if attr == "nameResolver":
    -                    return nameResolver
    -                else:
    -                    return getattr(real_reactor, attr)
    -
    -        self.reactor = Reactor()
    -
             user_agent = hs.version_string
             if hs.config.user_agent_suffix:
                 user_agent = "%s %s" % (user_agent, hs.config.user_agent_suffix)
             user_agent = user_agent.encode("ascii")
     
             self.agent = MatrixFederationAgent(
    -            self.reactor, tls_client_options_factory, user_agent
    +            self.reactor,
    +            tls_client_options_factory,
    +            user_agent,
    +            hs.config.federation_ip_range_blacklist,
             )
     
             # Use a BlacklistingAgentWrapper to prevent circumventing the IP
    
  • synapse/push/httppusher.py+1 1 modified
    @@ -100,7 +100,7 @@ def __init__(self, hs, pusherdict):
             if "url" not in self.data:
                 raise PusherConfigException("'url' required in data for HTTP pusher")
             self.url = self.data["url"]
    -        self.http_client = hs.get_proxied_http_client()
    +        self.http_client = hs.get_proxied_blacklisted_http_client()
             self.data_minus_url = {}
             self.data_minus_url.update(self.data)
             del self.data_minus_url["url"]
    
  • synapse/rest/media/v1/media_repository.py+1 1 modified
    @@ -66,7 +66,7 @@ class MediaRepository:
         def __init__(self, hs):
             self.hs = hs
             self.auth = hs.get_auth()
    -        self.client = hs.get_http_client()
    +        self.client = hs.get_federation_http_client()
             self.clock = hs.get_clock()
             self.server_name = hs.hostname
             self.store = hs.get_datastore()
    
  • synapse/server.py+29 7 modified
    @@ -350,16 +350,45 @@ def get_http_client_context_factory(self) -> IPolicyForHTTPS:
     
         @cache_in_self
         def get_simple_http_client(self) -> SimpleHttpClient:
    +        """
    +        An HTTP client with no special configuration.
    +        """
             return SimpleHttpClient(self)
     
         @cache_in_self
         def get_proxied_http_client(self) -> SimpleHttpClient:
    +        """
    +        An HTTP client that uses configured HTTP(S) proxies.
    +        """
    +        return SimpleHttpClient(
    +            self,
    +            http_proxy=os.getenvb(b"http_proxy"),
    +            https_proxy=os.getenvb(b"HTTPS_PROXY"),
    +        )
    +
    +    @cache_in_self
    +    def get_proxied_blacklisted_http_client(self) -> SimpleHttpClient:
    +        """
    +        An HTTP client that uses configured HTTP(S) proxies and blacklists IPs
    +        based on the IP range blacklist.
    +        """
             return SimpleHttpClient(
                 self,
    +            ip_blacklist=self.config.ip_range_blacklist,
                 http_proxy=os.getenvb(b"http_proxy"),
                 https_proxy=os.getenvb(b"HTTPS_PROXY"),
             )
     
    +    @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)
    +
         @cache_in_self
         def get_room_creation_handler(self) -> RoomCreationHandler:
             return RoomCreationHandler(self)
    @@ -514,13 +543,6 @@ def get_filtering(self) -> Filtering:
         def get_pusherpool(self) -> PusherPool:
             return PusherPool(self)
     
    -    @cache_in_self
    -    def get_http_client(self) -> MatrixFederationHttpClient:
    -        tls_client_options_factory = context_factory.FederationPolicyForHTTPS(
    -            self.config
    -        )
    -        return MatrixFederationHttpClient(self, tls_client_options_factory)
    -
         @cache_in_self
         def get_media_repository_resource(self) -> MediaRepositoryResource:
             # build the media repo resource. This indirects through the HomeServer
    
  • tests/api/test_filtering.py+3 1 modified
    @@ -50,7 +50,9 @@ def setUp(self):
             self.mock_http_client.put_json = DeferredMockCallable()
     
             hs = yield setup_test_homeserver(
    -            self.addCleanup, http_client=self.mock_http_client, keyring=Mock(),
    +            self.addCleanup,
    +            federation_http_client=self.mock_http_client,
    +            keyring=Mock(),
             )
     
             self.filtering = hs.get_filtering()
    
  • tests/app/test_frontend_proxy.py+1 1 modified
    @@ -23,7 +23,7 @@ class FrontendProxyTests(HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
     
             hs = self.setup_test_homeserver(
    -            http_client=None, homeserver_to_use=GenericWorkerServer
    +            federation_http_client=None, homeserver_to_use=GenericWorkerServer
             )
     
             return hs
    
  • tests/app/test_openid_listener.py+2 2 modified
    @@ -27,7 +27,7 @@
     class FederationReaderOpenIDListenerTests(HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
             hs = self.setup_test_homeserver(
    -            http_client=None, homeserver_to_use=GenericWorkerServer
    +            federation_http_client=None, homeserver_to_use=GenericWorkerServer
             )
             return hs
     
    @@ -84,7 +84,7 @@ def test_openid_listener(self, names, expectation):
     class SynapseHomeserverOpenIDListenerTests(HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
             hs = self.setup_test_homeserver(
    -            http_client=None, homeserver_to_use=SynapseHomeServer
    +            federation_http_client=None, homeserver_to_use=SynapseHomeServer
             )
             return hs
     
    
  • tests/crypto/test_keyring.py+4 2 modified
    @@ -315,7 +315,7 @@ async def get_keys2(keys_to_fetch):
     class ServerKeyFetcherTestCase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
             self.http_client = Mock()
    -        hs = self.setup_test_homeserver(http_client=self.http_client)
    +        hs = self.setup_test_homeserver(federation_http_client=self.http_client)
             return hs
     
         def test_get_keys_from_server(self):
    @@ -395,7 +395,9 @@ def make_homeserver(self, reactor, clock):
                 }
             ]
     
    -        return self.setup_test_homeserver(http_client=self.http_client, config=config)
    +        return self.setup_test_homeserver(
    +            federation_http_client=self.http_client, config=config
    +        )
     
         def build_perspectives_response(
             self, server_name: str, signing_key: SigningKey, valid_until_ts: int,
    
  • tests/handlers/test_device.py+2 2 modified
    @@ -27,7 +27,7 @@
     
     class DeviceTestCase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
    -        hs = self.setup_test_homeserver("server", http_client=None)
    +        hs = self.setup_test_homeserver("server", federation_http_client=None)
             self.handler = hs.get_device_handler()
             self.store = hs.get_datastore()
             return hs
    @@ -229,7 +229,7 @@ def _record_user(
     
     class DehydrationTestCase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
    -        hs = self.setup_test_homeserver("server", http_client=None)
    +        hs = self.setup_test_homeserver("server", federation_http_client=None)
             self.handler = hs.get_device_handler()
             self.registration = hs.get_registration_handler()
             self.auth = hs.get_auth()
    
  • tests/handlers/test_directory.py+1 1 modified
    @@ -42,7 +42,7 @@ def register_query_handler(query_type, handler):
             self.mock_registry.register_query_handler = register_query_handler
     
             hs = self.setup_test_homeserver(
    -            http_client=None,
    +            federation_http_client=None,
                 resource_for_federation=Mock(),
                 federation_client=self.mock_federation,
                 federation_registry=self.mock_registry,
    
  • tests/handlers/test_federation.py+1 1 modified
    @@ -37,7 +37,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
         ]
     
         def make_homeserver(self, reactor, clock):
    -        hs = self.setup_test_homeserver(http_client=None)
    +        hs = self.setup_test_homeserver(federation_http_client=None)
             self.handler = hs.get_federation_handler()
             self.store = hs.get_datastore()
             return hs
    
  • tests/handlers/test_presence.py+1 1 modified
    @@ -463,7 +463,7 @@ class PresenceJoinTestCase(unittest.HomeserverTestCase):
     
         def make_homeserver(self, reactor, clock):
             hs = self.setup_test_homeserver(
    -            "server", http_client=None, federation_sender=Mock()
    +            "server", federation_http_client=None, federation_sender=Mock()
             )
             return hs
     
    
  • tests/handlers/test_profile.py+1 1 modified
    @@ -44,7 +44,7 @@ def register_query_handler(query_type, handler):
     
             hs = yield setup_test_homeserver(
                 self.addCleanup,
    -            http_client=None,
    +            federation_http_client=None,
                 resource_for_federation=Mock(),
                 federation_client=self.mock_federation,
                 federation_server=Mock(),
    
  • tests/handlers/test_typing.py+3 3 modified
    @@ -70,7 +70,7 @@ def make_homeserver(self, reactor, clock):
     
             hs = self.setup_test_homeserver(
                 notifier=Mock(),
    -            http_client=mock_federation_client,
    +            federation_http_client=mock_federation_client,
                 keyring=mock_keyring,
                 replication_streams={},
             )
    @@ -192,7 +192,7 @@ def test_started_typing_remote_send(self):
                 )
             )
     
    -        put_json = self.hs.get_http_client().put_json
    +        put_json = self.hs.get_federation_http_client().put_json
             put_json.assert_called_once_with(
                 "farm",
                 path="/_matrix/federation/v1/send/1000000",
    @@ -270,7 +270,7 @@ def test_stopped_typing(self):
     
             self.on_new_event.assert_has_calls([call("typing_key", 1, rooms=[ROOM_ID])])
     
    -        put_json = self.hs.get_http_client().put_json
    +        put_json = self.hs.get_federation_http_client().put_json
             put_json.assert_called_once_with(
                 "farm",
                 path="/_matrix/federation/v1/send/1000000",
    
  • tests/http/federation/test_matrix_federation_agent.py+3 0 modified
    @@ -17,6 +17,7 @@
     from mock import Mock
     
     import treq
    +from netaddr import IPSet
     from service_identity import VerificationError
     from zope.interface import implementer
     
    @@ -103,6 +104,7 @@ def setUp(self):
                 reactor=self.reactor,
                 tls_client_options_factory=self.tls_factory,
                 user_agent="test-agent",  # Note that this is unused since _well_known_resolver is provided.
    +            ip_blacklist=IPSet(),
                 _srv_resolver=self.mock_resolver,
                 _well_known_resolver=self.well_known_resolver,
             )
    @@ -736,6 +738,7 @@ def test_get_well_known_unsigned_cert(self):
                 reactor=self.reactor,
                 tls_client_options_factory=tls_factory,
                 user_agent=b"test-agent",  # This is unused since _well_known_resolver is passed below.
    +            ip_blacklist=IPSet(),
                 _srv_resolver=self.mock_resolver,
                 _well_known_resolver=WellKnownResolver(
                     self.reactor,
    
  • tests/push/test_http.py+3 1 modified
    @@ -49,7 +49,9 @@ def post_json_get_json(url, body):
             config = self.default_config()
             config["start_pushers"] = True
     
    -        hs = self.setup_test_homeserver(config=config, proxied_http_client=m)
    +        hs = self.setup_test_homeserver(
    +            config=config, proxied_blacklisted_http_client=m
    +        )
     
             return hs
     
    
  • tests/replication/_base.py+2 2 modified
    @@ -67,7 +67,7 @@ def prepare(self, reactor, clock, hs):
             # Make a new HomeServer object for the worker
             self.reactor.lookups["testserv"] = "1.2.3.4"
             self.worker_hs = self.setup_test_homeserver(
    -            http_client=None,
    +            federation_http_client=None,
                 homeserver_to_use=GenericWorkerServer,
                 config=self._get_worker_hs_config(),
                 reactor=self.reactor,
    @@ -264,7 +264,7 @@ def make_worker_hs(
                 worker_app: Type of worker, e.g. `synapse.app.federation_sender`.
                 extra_config: Any extra config to use for this instances.
                 **kwargs: Options that get passed to `self.setup_test_homeserver`,
    -                useful to e.g. pass some mocks for things like `http_client`
    +                useful to e.g. pass some mocks for things like `federation_http_client`
     
             Returns:
                 The new worker HomeServer instance.
    
  • tests/replication/test_federation_sender_shard.py+5 5 modified
    @@ -50,7 +50,7 @@ def test_send_event_single_sender(self):
             self.make_worker_hs(
                 "synapse.app.federation_sender",
                 {"send_federation": True},
    -            http_client=mock_client,
    +            federation_http_client=mock_client,
             )
     
             user = self.register_user("user", "pass")
    @@ -81,7 +81,7 @@ def test_send_event_sharded(self):
                     "worker_name": "sender1",
                     "federation_sender_instances": ["sender1", "sender2"],
                 },
    -            http_client=mock_client1,
    +            federation_http_client=mock_client1,
             )
     
             mock_client2 = Mock(spec=["put_json"])
    @@ -93,7 +93,7 @@ def test_send_event_sharded(self):
                     "worker_name": "sender2",
                     "federation_sender_instances": ["sender1", "sender2"],
                 },
    -            http_client=mock_client2,
    +            federation_http_client=mock_client2,
             )
     
             user = self.register_user("user2", "pass")
    @@ -144,7 +144,7 @@ def test_send_typing_sharded(self):
                     "worker_name": "sender1",
                     "federation_sender_instances": ["sender1", "sender2"],
                 },
    -            http_client=mock_client1,
    +            federation_http_client=mock_client1,
             )
     
             mock_client2 = Mock(spec=["put_json"])
    @@ -156,7 +156,7 @@ def test_send_typing_sharded(self):
                     "worker_name": "sender2",
                     "federation_sender_instances": ["sender1", "sender2"],
                 },
    -            http_client=mock_client2,
    +            federation_http_client=mock_client2,
             )
     
             user = self.register_user("user3", "pass")
    
  • tests/replication/test_pusher_shard.py+3 3 modified
    @@ -98,7 +98,7 @@ def test_send_push_single_worker(self):
             self.make_worker_hs(
                 "synapse.app.pusher",
                 {"start_pushers": True},
    -            proxied_http_client=http_client_mock,
    +            proxied_blacklisted_http_client=http_client_mock,
             )
     
             event_id = self._create_pusher_and_send_msg("user")
    @@ -133,7 +133,7 @@ def test_send_push_multiple_workers(self):
                     "worker_name": "pusher1",
                     "pusher_instances": ["pusher1", "pusher2"],
                 },
    -            proxied_http_client=http_client_mock1,
    +            proxied_blacklisted_http_client=http_client_mock1,
             )
     
             http_client_mock2 = Mock(spec_set=["post_json_get_json"])
    @@ -148,7 +148,7 @@ def test_send_push_multiple_workers(self):
                     "worker_name": "pusher2",
                     "pusher_instances": ["pusher1", "pusher2"],
                 },
    -            proxied_http_client=http_client_mock2,
    +            proxied_blacklisted_http_client=http_client_mock2,
             )
     
             # We choose a user name that we know should go to pusher1.
    
  • tests/rest/admin/test_admin.py+1 1 modified
    @@ -210,7 +210,7 @@ def write_to(r):
             }
             config["media_storage_providers"] = [provider_config]
     
    -        hs = self.setup_test_homeserver(config=config, http_client=client)
    +        hs = self.setup_test_homeserver(config=config, federation_http_client=client)
     
             return hs
     
    
  • tests/rest/client/v1/test_presence.py+1 1 modified
    @@ -38,7 +38,7 @@ def make_homeserver(self, reactor, clock):
     
             hs = self.setup_test_homeserver(
                 "red",
    -            http_client=None,
    +            federation_http_client=None,
                 federation_client=Mock(),
                 presence_handler=presence_handler,
             )
    
  • tests/rest/client/v1/test_profile.py+1 1 modified
    @@ -63,7 +63,7 @@ def setUp(self):
             hs = yield setup_test_homeserver(
                 self.addCleanup,
                 "test",
    -            http_client=None,
    +            federation_http_client=None,
                 resource_for_client=self.mock_resource,
                 federation=Mock(),
                 federation_client=Mock(),
    
  • tests/rest/client/v1/test_rooms.py+1 1 modified
    @@ -45,7 +45,7 @@ class RoomBase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
     
             self.hs = self.setup_test_homeserver(
    -            "red", http_client=None, federation_client=Mock(),
    +            "red", federation_http_client=None, federation_client=Mock(),
             )
     
             self.hs.get_federation_handler = Mock()
    
  • tests/rest/client/v1/test_typing.py+1 1 modified
    @@ -39,7 +39,7 @@ class RoomTypingTestCase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
     
             hs = self.setup_test_homeserver(
    -            "red", http_client=None, federation_client=Mock(),
    +            "red", federation_http_client=None, federation_client=Mock(),
             )
     
             self.event_source = hs.get_event_sources().sources["typing"]
    
  • tests/rest/key/v2/test_remote_key_resource.py+2 2 modified
    @@ -39,7 +39,7 @@
     class BaseRemoteKeyResourceTestCase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
             self.http_client = Mock()
    -        return self.setup_test_homeserver(http_client=self.http_client)
    +        return self.setup_test_homeserver(federation_http_client=self.http_client)
     
         def create_test_resource(self):
             return create_resource_tree(
    @@ -172,7 +172,7 @@ def prepare(self, reactor, clock, homeserver):
                 }
             ]
             self.hs2 = self.setup_test_homeserver(
    -            http_client=self.http_client2, config=config
    +            federation_http_client=self.http_client2, config=config
             )
     
             # wire up outbound POST /key/v2/query requests from hs2 so that they
    
  • tests/rest/media/v1/test_media_storage.py+1 1 modified
    @@ -214,7 +214,7 @@ def write_to(r):
             }
             config["media_storage_providers"] = [provider_config]
     
    -        hs = self.setup_test_homeserver(config=config, http_client=client)
    +        hs = self.setup_test_homeserver(config=config, federation_http_client=client)
     
             return hs
     
    
  • tests/storage/test_e2e_room_keys.py+1 1 modified
    @@ -26,7 +26,7 @@
     
     class E2eRoomKeysHandlerTestCase(unittest.HomeserverTestCase):
         def make_homeserver(self, reactor, clock):
    -        hs = self.setup_test_homeserver("server", http_client=None)
    +        hs = self.setup_test_homeserver("server", federation_http_client=None)
             self.store = hs.get_datastore()
             return hs
     
    
  • tests/storage/test_purge.py+1 1 modified
    @@ -27,7 +27,7 @@ class PurgeTests(HomeserverTestCase):
         servlets = [room.register_servlets]
     
         def make_homeserver(self, reactor, clock):
    -        hs = self.setup_test_homeserver("server", http_client=None)
    +        hs = self.setup_test_homeserver("server", federation_http_client=None)
             return hs
     
         def prepare(self, reactor, clock, hs):
    
  • tests/storage/test_redaction.py+1 1 modified
    @@ -34,7 +34,7 @@ def make_homeserver(self, reactor, clock):
             config = self.default_config()
             config["redaction_retention_period"] = "30d"
             return self.setup_test_homeserver(
    -            resource_for_federation=Mock(), http_client=None, config=config
    +            resource_for_federation=Mock(), federation_http_client=None, config=config
             )
     
         def prepare(self, reactor, clock, hs):
    
  • tests/storage/test_roommember.py+1 1 modified
    @@ -36,7 +36,7 @@ class RoomMemberStoreTestCase(unittest.HomeserverTestCase):
     
         def make_homeserver(self, reactor, clock):
             hs = self.setup_test_homeserver(
    -            resource_for_federation=Mock(), http_client=None
    +            resource_for_federation=Mock(), federation_http_client=None
             )
             return hs
     
    
  • tests/test_federation.py+1 1 modified
    @@ -37,7 +37,7 @@ def setUp(self):
             self.hs_clock = Clock(self.reactor)
             self.homeserver = setup_test_homeserver(
                 self.addCleanup,
    -            http_client=self.http_client,
    +            federation_http_client=self.http_client,
                 clock=self.hs_clock,
                 reactor=self.reactor,
             )
    
  • tests/test_server.py+4 1 modified
    @@ -38,7 +38,10 @@ def setUp(self):
             self.reactor = ThreadedMemoryReactorClock()
             self.hs_clock = Clock(self.reactor)
             self.homeserver = setup_test_homeserver(
    -            self.addCleanup, http_client=None, clock=self.hs_clock, reactor=self.reactor
    +            self.addCleanup,
    +            federation_http_client=None,
    +            clock=self.hs_clock,
    +            reactor=self.reactor,
             )
     
         def test_handler_for_request(self):
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

9

News mentions

0

No linked articles in our index yet.