Merge pull request #3123 from matrix-org/dbkr/user_directory_defer_to_is

Option to defer user_directory search to an ID server
This commit is contained in:
David Baker 2018-04-27 17:18:13 +01:00 committed by GitHub
commit d7fad867fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 0 deletions

View File

@ -23,11 +23,15 @@ class UserDirectoryConfig(Config):
def read_config(self, config): def read_config(self, config):
self.user_directory_search_all_users = False self.user_directory_search_all_users = False
self.user_directory_defer_to_id_server = None
user_directory_config = config.get("user_directory", None) user_directory_config = config.get("user_directory", None)
if user_directory_config: if user_directory_config:
self.user_directory_search_all_users = ( self.user_directory_search_all_users = (
user_directory_config.get("search_all_users", False) user_directory_config.get("search_all_users", False)
) )
self.user_directory_defer_to_id_server = (
user_directory_config.get("defer_to_id_server", None)
)
def default_config(self, config_dir_path, server_name, **kwargs): def default_config(self, config_dir_path, server_name, **kwargs):
return """ return """
@ -41,4 +45,9 @@ class UserDirectoryConfig(Config):
# #
#user_directory: #user_directory:
# search_all_users: false # search_all_users: false
#
# If this is set, user search will be delegated to this ID server instead
# of synapse performing the search itself.
# This is an experimental API.
# defer_to_id_server: id.example.com
""" """

View File

@ -16,6 +16,7 @@
import logging import logging
from twisted.internet import defer from twisted.internet import defer
from signedjson.sign import sign_json
from synapse.api.errors import SynapseError from synapse.api.errors import SynapseError
from synapse.http.servlet import RestServlet, parse_json_object_from_request from synapse.http.servlet import RestServlet, parse_json_object_from_request
@ -36,6 +37,7 @@ class UserDirectorySearchRestServlet(RestServlet):
self.hs = hs self.hs = hs
self.auth = hs.get_auth() self.auth = hs.get_auth()
self.user_directory_handler = hs.get_user_directory_handler() self.user_directory_handler = hs.get_user_directory_handler()
self.http_client = hs.get_simple_http_client()
@defer.inlineCallbacks @defer.inlineCallbacks
def on_POST(self, request): def on_POST(self, request):
@ -60,6 +62,14 @@ class UserDirectorySearchRestServlet(RestServlet):
body = parse_json_object_from_request(request) body = parse_json_object_from_request(request)
if self.hs.config.user_directory_defer_to_id_server:
signed_body = sign_json(body, self.hs.hostname, self.hs.config.signing_key[0])
url = "http://%s/_matrix/identity/api/v1/user_directory/search" % (
self.hs.config.user_directory_defer_to_id_server,
)
resp = yield self.http_client.post_json_get_json(url, signed_body)
defer.returnValue((200, resp))
limit = body.get("limit", 10) limit = body.get("limit", 10)
limit = min(limit, 50) limit = min(limit, 50)