mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2025-02-26 06:11:10 -05:00
Return timeout error to user for identity server calls (#6073)
This commit is contained in:
parent
0660f8e367
commit
885a4726b7
1
changelog.d/6073.feature
Normal file
1
changelog.d/6073.feature
Normal file
@ -0,0 +1 @@
|
|||||||
|
Return a clearer error message when a timeout occurs when attempting to contact an identity server.
|
@ -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):
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user