Return timeout error to user for identity server calls (#6073)

This commit is contained in:
Andrew Morgan 2019-09-23 15:37:23 +02:00 committed by Richard van der Hoff
parent 0660f8e367
commit 885a4726b7
3 changed files with 38 additions and 11 deletions

1
changelog.d/6073.feature Normal file
View File

@ -0,0 +1 @@
Return a clearer error message when a timeout occurs when attempting to contact an identity server.

View File

@ -22,6 +22,7 @@ import logging
from canonicaljson import json from canonicaljson import json
from twisted.internet import defer from twisted.internet import defer
from twisted.internet.error import TimeoutError
from synapse.api.errors import ( from synapse.api.errors import (
CodeMessageException, CodeMessageException,
@ -108,7 +109,10 @@ class IdentityHandler(BaseHandler):
url = id_server + "/_matrix/identity/api/v1/3pid/getValidated3pid" url = id_server + "/_matrix/identity/api/v1/3pid/getValidated3pid"
data = yield self.http_client.get_json(url, query_params) try:
data = yield self.http_client.get_json(url, query_params)
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
return data if "medium" in data else None return data if "medium" in data else None
@defer.inlineCallbacks @defer.inlineCallbacks
@ -171,6 +175,8 @@ class IdentityHandler(BaseHandler):
if e.code != 404 or not use_v2: if e.code != 404 or not use_v2:
logger.error("3PID bind failed with Matrix error: %r", e) logger.error("3PID bind failed with Matrix error: %r", e)
raise e.to_synapse_error() raise e.to_synapse_error()
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
except CodeMessageException as e: except CodeMessageException as e:
data = json.loads(e.msg) # XXX WAT? data = json.loads(e.msg) # XXX WAT?
return data return data
@ -261,7 +267,9 @@ class IdentityHandler(BaseHandler):
logger.warn("Received %d response while unbinding threepid", e.code) logger.warn("Received %d response while unbinding threepid", e.code)
else: else:
logger.error("Failed to unbind threepid on identity server: %s", e) logger.error("Failed to unbind threepid on identity server: %s", e)
raise SynapseError(502, "Failed to contact identity server") raise SynapseError(500, "Failed to contact identity server")
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
yield self.store.remove_user_bound_threepid( yield self.store.remove_user_bound_threepid(
user_id=mxid, user_id=mxid,
@ -394,6 +402,8 @@ class IdentityHandler(BaseHandler):
except HttpResponseException as e: except HttpResponseException as e:
logger.info("Proxied requestToken failed: %r", e) logger.info("Proxied requestToken failed: %r", e)
raise e.to_synapse_error() raise e.to_synapse_error()
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
@defer.inlineCallbacks @defer.inlineCallbacks
def requestMsisdnToken( def requestMsisdnToken(
@ -446,6 +456,8 @@ class IdentityHandler(BaseHandler):
except HttpResponseException as e: except HttpResponseException as e:
logger.info("Proxied requestToken failed: %r", e) logger.info("Proxied requestToken failed: %r", e)
raise e.to_synapse_error() raise e.to_synapse_error()
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
def create_id_access_token_header(id_access_token): def create_id_access_token_header(id_access_token):

View File

@ -25,6 +25,7 @@ from signedjson.sign import verify_signed_json
from unpaddedbase64 import decode_base64 from unpaddedbase64 import decode_base64
from twisted.internet import defer from twisted.internet import defer
from twisted.internet.error import TimeoutError
from synapse import types from synapse import types
from synapse.api.constants import EventTypes, Membership from synapse.api.constants import EventTypes, Membership
@ -756,7 +757,8 @@ class RoomMemberHandler(object):
raise AuthError(401, "No signatures on 3pid binding") raise AuthError(401, "No signatures on 3pid binding")
yield self._verify_any_signature(data, id_server) yield self._verify_any_signature(data, id_server)
return data["mxid"] return data["mxid"]
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
except IOError as e: except IOError as e:
logger.warning("Error from v1 identity server lookup: %s" % (e,)) logger.warning("Error from v1 identity server lookup: %s" % (e,))
@ -777,10 +779,13 @@ class RoomMemberHandler(object):
Deferred[str|None]: the matrix ID of the 3pid, or None if it is not recognised. Deferred[str|None]: the matrix ID of the 3pid, or None if it is not recognised.
""" """
# Check what hashing details are supported by this identity server # Check what hashing details are supported by this identity server
hash_details = yield self.simple_http_client.get_json( try:
"%s%s/_matrix/identity/v2/hash_details" % (id_server_scheme, id_server), hash_details = yield self.simple_http_client.get_json(
{"access_token": id_access_token}, "%s%s/_matrix/identity/v2/hash_details" % (id_server_scheme, id_server),
) {"access_token": id_access_token},
)
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
if not isinstance(hash_details, dict): if not isinstance(hash_details, dict):
logger.warning( logger.warning(
@ -851,6 +856,8 @@ class RoomMemberHandler(object):
}, },
headers=headers, headers=headers,
) )
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
except Exception as e: except Exception as e:
logger.warning("Error when performing a v2 3pid lookup: %s", e) logger.warning("Error when performing a v2 3pid lookup: %s", e)
raise SynapseError( raise SynapseError(
@ -873,10 +880,13 @@ class RoomMemberHandler(object):
if server_hostname not in data["signatures"]: if server_hostname not in data["signatures"]:
raise AuthError(401, "No signature from server %s" % (server_hostname,)) raise AuthError(401, "No signature from server %s" % (server_hostname,))
for key_name, signature in data["signatures"][server_hostname].items(): for key_name, signature in data["signatures"][server_hostname].items():
key_data = yield self.simple_http_client.get_json( try:
"%s%s/_matrix/identity/api/v1/pubkey/%s" key_data = yield self.simple_http_client.get_json(
% (id_server_scheme, server_hostname, key_name) "%s%s/_matrix/identity/api/v1/pubkey/%s"
) % (id_server_scheme, server_hostname, key_name)
)
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
if "public_key" not in key_data: if "public_key" not in key_data:
raise AuthError( raise AuthError(
401, "No public key named %s from %s" % (key_name, server_hostname) 401, "No public key named %s from %s" % (key_name, server_hostname)
@ -1051,6 +1061,8 @@ class RoomMemberHandler(object):
invite_config, invite_config,
{"Authorization": create_id_access_token_header(id_access_token)}, {"Authorization": create_id_access_token_header(id_access_token)},
) )
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
except HttpResponseException as e: except HttpResponseException as e:
if e.code != 404: if e.code != 404:
logger.info("Failed to POST %s with JSON: %s", url, e) logger.info("Failed to POST %s with JSON: %s", url, e)
@ -1067,6 +1079,8 @@ class RoomMemberHandler(object):
data = yield self.simple_http_client.post_json_get_json( data = yield self.simple_http_client.post_json_get_json(
url, invite_config url, invite_config
) )
except TimeoutError:
raise SynapseError(500, "Timed out contacting identity server")
except HttpResponseException as e: except HttpResponseException as e:
logger.warning( logger.warning(
"Error trying to call /store-invite on %s%s: %s", "Error trying to call /store-invite on %s%s: %s",