summary refs log tree commit diff
path: root/synapse/api
diff options
context:
space:
mode:
Diffstat (limited to 'synapse/api')
-rw-r--r--synapse/api/auth.py29
-rw-r--r--synapse/api/urls.py1
2 files changed, 30 insertions, 0 deletions
diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index 7105ee21dc..4f116184c9 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -299,6 +299,35 @@ class Auth(object):
         # Can optionally look elsewhere in the request (e.g. headers)
         try:
             access_token = request.args["access_token"][0]
+
+            # Check for application service tokens with a user_id override
+            try:
+                if "user_id" not in request.args:
+                    # This has to be done like this rather than relying on it
+                    # natively throwing because tests use a Mock for the request
+                    # object which doesn't throw :/
+                    raise KeyError
+
+                masquerade_user_id = request.args["user_id"][0]
+                app_service = yield self.store.get_app_service_by_token(
+                    access_token
+                )
+                if not app_service:
+                    raise AuthError(
+                        403, "Invalid application service access token"
+                    )
+                if not app_service.is_interested_in_user(masquerade_user_id):
+                    raise AuthError(
+                        403,
+                        "Application service cannot masquerade as this user."
+                    )
+                defer.returnValue(
+                    (UserID.from_string(masquerade_user_id), ClientInfo("", ""))
+                )
+                return
+            except KeyError:
+                pass  # normal users won't have this query parameter set
+
             user_info = yield self.get_user_by_token(access_token)
             user = user_info["user"]
             device_id = user_info["device_id"]
diff --git a/synapse/api/urls.py b/synapse/api/urls.py
index 693c0efda6..9485719332 100644
--- a/synapse/api/urls.py
+++ b/synapse/api/urls.py
@@ -22,3 +22,4 @@ WEB_CLIENT_PREFIX = "/_matrix/client"
 CONTENT_REPO_PREFIX = "/_matrix/content"
 SERVER_KEY_PREFIX = "/_matrix/key/v1"
 MEDIA_PREFIX = "/_matrix/media/v1"
+APP_SERVICE_PREFIX = "/_matrix/appservice/v1"