summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Robertson <davidr@element.io>2023-03-01 18:32:24 +0000
committerDavid Robertson <davidr@element.io>2023-03-02 16:19:33 +0000
commit4acecc5ea0855da2cd78052a5d1074d689ae218f (patch)
treed7fb31e5f59c7e68f2444fb7ef54fd26b50963c4
parentDefine new config (diff)
downloadsynapse-4acecc5ea0855da2cd78052a5d1074d689ae218f.tar.xz
Parse new config
-rw-r--r--synapse/config/server.py1
-rw-r--r--synapse/config/workers.py37
2 files changed, 37 insertions, 1 deletions
diff --git a/synapse/config/server.py b/synapse/config/server.py
index 0e46b849cf..2222cc9f78 100644
--- a/synapse/config/server.py
+++ b/synapse/config/server.py
@@ -171,6 +171,7 @@ KNOWN_LISTENER_TYPES = {
     "http",
     "metrics",
     "manhole",
+    "outbound_federation_proxy",
 }
 
 KNOWN_RESOURCES = {
diff --git a/synapse/config/workers.py b/synapse/config/workers.py
index 2580660b6c..b79ce7ab5b 100644
--- a/synapse/config/workers.py
+++ b/synapse/config/workers.py
@@ -15,7 +15,7 @@
 
 import argparse
 import logging
-from typing import Any, Dict, List, Union
+from typing import Any, Dict, List, Mapping, Union
 
 import attr
 
@@ -276,6 +276,8 @@ class WorkerConfig(Config):
             new_option_name="update_user_directory_from_worker",
         )
 
+        self.outbound_fed_restricted_to = self._get_outbound_fed_restrictions(config)
+
     def _should_this_worker_perform_duty(
         self,
         config: Dict[str, Any],
@@ -426,6 +428,39 @@ class WorkerConfig(Config):
 
         return worker_instances
 
+    def _get_outbound_fed_restrictions(
+        self, config: Dict[str, Any]
+    ) -> Mapping[str, InstanceLocationConfig]:
+        proxied_via = config.get("outbound_federation_proxied_via", {})
+        if not isinstance(proxied_via, dict):
+            raise ConfigError(
+                f"outbound_federation_restricted_to should be a mapping, "
+                f"not {type(proxied_via)}"
+            )
+
+        for instance_name, listener_location in proxied_via.items():
+            if "host" not in listener_location:
+                raise ConfigError(
+                    f"outbound_federation_restricted_to/{instance_name} is missing a host"
+                )
+            if "port" not in listener_location:
+                raise ConfigError(
+                    f"outbound_federation_restricted_to/{instance_name} is missing a port"
+                )
+            if not isinstance(listener_location["host"], str):
+                raise ConfigError(
+                    f"outbound_federation_restricted_to/{instance_name} should be a string"
+                )
+            if not isinstance(listener_location["port"], int):
+                raise ConfigError(
+                    f"outbound_federation_restricted_to/{instance_name} should be an integer"
+                )
+
+        return {
+            instance_name: InstanceLocationConfig(listener["host"], listener["port"])
+            for instance_name, listener in proxied_via.items()
+        }
+
     def read_arguments(self, args: argparse.Namespace) -> None:
         # We support a bunch of command line arguments that override options in
         # the config. A lot of these options have a worker_* prefix when running