summary refs log tree commit diff
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2015-02-03 13:29:27 +0000
committerKegan Dougal <kegan@matrix.org>2015-02-03 13:29:27 +0000
commitf2c039bfb958ed349bce42098e296995786374cc (patch)
treeb8285361668534493f69ea6253fe88c2ff99f600
parentAdd namespace constants. Add restrict_to option to limit namespace checks. (diff)
downloadsynapse-f2c039bfb958ed349bce42098e296995786374cc.tar.xz
Implement restricted namespace checks. Begin fleshing out the main hook for notifying application services.
-rw-r--r--synapse/handlers/appservice.py19
-rw-r--r--synapse/storage/appservice.py21
2 files changed, 35 insertions, 5 deletions
diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py
index bf68b33398..dac63e2245 100644
--- a/synapse/handlers/appservice.py
+++ b/synapse/handlers/appservice.py
@@ -17,6 +17,7 @@ from twisted.internet import defer
 
 from ._base import BaseHandler
 from synapse.api.errors import Codes, StoreError, SynapseError
+from synapse.storage.appservice import ApplicationService
 
 import logging
 
@@ -88,8 +89,26 @@ class ApplicationServicesHandler(BaseHandler):
 
         # Do we know this user exists? If not, poke the user query API for
         # all services which match that user regex.
+        unknown_user = False  # TODO check
+        if unknown_user:
+            user_query_services = self.get_services_for_event(
+                event=event,
+                restrict_to=ApplicationService.NS_USERS
+            )
+            for user_service in user_query_services:
+                pass  # TODO poke User Query API
 
         # Do we know this room alias exists? If not, poke the room alias query
         # API for all services which match that room alias regex.
+        unknown_room_alias = False  # TODO check
+        if unknown_room_alias:
+            alias_query_services = self.get_services_for_event(
+                event=event,
+                restrict_to=ApplicationService.NS_ALIASES
+            )
+            for alias_service in alias_query_services:
+                pass  # TODO poke Room Alias Query API
 
         # Fork off pushes to these services - XXX First cut, best effort
+        for service in services:
+            pass  # TODO push event to service
diff --git a/synapse/storage/appservice.py b/synapse/storage/appservice.py
index 277741fced..cdf26ee434 100644
--- a/synapse/storage/appservice.py
+++ b/synapse/storage/appservice.py
@@ -33,6 +33,9 @@ class ApplicationService(object):
     NS_USERS = "users"
     NS_ALIASES = "aliases"
     NS_ROOMS = "rooms"
+    # The ordering here is important as it is used to map database values (which
+    # are stored as ints representing the position in this list) to namespace
+    # values.
     NS_LIST = [NS_USERS, NS_ALIASES, NS_ROOMS]
 
     def __init__(self, token, url=None, namespaces=None):
@@ -103,13 +106,21 @@ class ApplicationService(object):
         """
         if aliases_for_event is None:
             aliases_for_event = []
-        if restrict_to not in ApplicationService.NS_LIST:
-            # this is a programming error, so raise a general exception
+        if restrict_to and restrict_to not in ApplicationService.NS_LIST:
+            # this is a programming error, so fail early and raise a general
+            # exception
             raise Exception("Unexpected restrict_to value: %s". restrict_to)
 
-        return (self._matches_user(event)
-                or self._matches_aliases(event, aliases_for_event)
-                or self._matches_room_id(event))
+        if not restrict_to:
+            return (self._matches_user(event)
+                    or self._matches_aliases(event, aliases_for_event)
+                    or self._matches_room_id(event))
+        elif restrict_to == ApplicationService.NS_ALIASES:
+            return self._matches_aliases(event, aliases_for_event)
+        elif restrict_to == ApplicationService.NS_ROOMS:
+            return self._matches_room_id(event)
+        elif restrict_to == ApplicationService.NS_USERS:
+            return self._matches_user(event)
 
     def __str__(self):
         return "ApplicationService: %s" % (self.__dict__,)