summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <paul@matrix.org>2016-08-18 14:56:02 +0100
committerPaul "LeoNerd" Evans <paul@matrix.org>2016-08-18 14:56:02 +0100
commit434bbf2cb5b31f5a8430a06f53549248f7306cfd (patch)
tree7ef3c6156c6867f85e42de458ff94407911ddad5
parentMerge remote-tracking branch 'origin/develop' into paul/thirdpartylookup (diff)
downloadsynapse-434bbf2cb5b31f5a8430a06f53549248f7306cfd.tar.xz
Filter 3PU lookups by only ASes that declare knowledge of that protocol
-rw-r--r--synapse/appservice/__init__.py9
-rw-r--r--synapse/config/appservice.py10
-rw-r--r--synapse/handlers/appservice.py6
3 files changed, 22 insertions, 3 deletions
diff --git a/synapse/appservice/__init__.py b/synapse/appservice/__init__.py
index b1b91d0a55..bde9b51b2e 100644
--- a/synapse/appservice/__init__.py
+++ b/synapse/appservice/__init__.py
@@ -81,13 +81,17 @@ class ApplicationService(object):
     NS_LIST = [NS_USERS, NS_ALIASES, NS_ROOMS]
 
     def __init__(self, token, url=None, namespaces=None, hs_token=None,
-                 sender=None, id=None):
+                 sender=None, id=None, protocols=None):
         self.token = token
         self.url = url
         self.hs_token = hs_token
         self.sender = sender
         self.namespaces = self._check_namespaces(namespaces)
         self.id = id
+        if protocols:
+            self.protocols = set(protocols)
+        else:
+            self.protocols = set()
 
     def _check_namespaces(self, namespaces):
         # Sanity check that it is of the form:
@@ -219,6 +223,9 @@ class ApplicationService(object):
             or user_id == self.sender
         )
 
+    def is_interested_in_protocol(self, protocol):
+        return protocol in self.protocols
+
     def is_exclusive_alias(self, alias):
         return self._is_exclusive(ApplicationService.NS_ALIASES, alias)
 
diff --git a/synapse/config/appservice.py b/synapse/config/appservice.py
index eade803909..3184d2084c 100644
--- a/synapse/config/appservice.py
+++ b/synapse/config/appservice.py
@@ -122,6 +122,15 @@ def _load_appservice(hostname, as_info, config_filename):
                     raise ValueError(
                         "Missing/bad type 'exclusive' key in %s", regex_obj
                     )
+    # protocols check
+    protocols = as_info.get("protocols")
+    if protocols:
+        # Because strings are lists in python
+        if isinstance(protocols, str) or not isinstance(protocols, list):
+            raise KeyError("Optional 'protocols' must be a list if present.")
+        for p in protocols:
+            if not isinstance(p, str):
+                raise KeyError("Bad value for 'protocols' item")
     return ApplicationService(
         token=as_info["as_token"],
         url=as_info["url"],
@@ -129,4 +138,5 @@ def _load_appservice(hostname, as_info, config_filename):
         hs_token=as_info["hs_token"],
         sender=user_id,
         id=as_info["id"],
+        protocols=protocols,
     )
diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py
index 52e897d8d9..e0a6c9f19d 100644
--- a/synapse/handlers/appservice.py
+++ b/synapse/handlers/appservice.py
@@ -191,9 +191,11 @@ class ApplicationServicesHandler(object):
 
     @defer.inlineCallbacks
     def _get_services_for_3pn(self, protocol):
-        # TODO(paul): Filter by protocol
         services = yield self.store.get_app_services()
-        defer.returnValue(services)
+        interested_list = [
+            s for s in services if s.is_interested_in_protocol(protocol)
+        ]
+        defer.returnValue(interested_list)
 
     @defer.inlineCallbacks
     def _is_unknown_user(self, user_id):