Use CodeMessageException subclass instead
Parse json errors from get_json client methods and throw special errors.pull/2147/head
							parent
							
								
									a46982cee9
								
							
						
					
					
						commit
						1a9255c12e
					
				|  | @ -66,6 +66,17 @@ class CodeMessageException(RuntimeError): | |||
|         return cs_error(self.msg) | ||||
| 
 | ||||
| 
 | ||||
| class MatrixCodeMessageException(CodeMessageException): | ||||
|     """An error from a general matrix endpoint, eg. from a proxied Matrix API call. | ||||
| 
 | ||||
|     Attributes: | ||||
|         errcode (str): Matrix error code e.g 'M_FORBIDDEN' | ||||
|     """ | ||||
|     def __init__(self, code, msg, errcode=Codes.UNKNOWN): | ||||
|         super(MatrixCodeMessageException, self).__init__(code, msg) | ||||
|         self.errcode = errcode | ||||
| 
 | ||||
| 
 | ||||
| class SynapseError(CodeMessageException): | ||||
|     """A base exception type for matrix errors which have an errcode and error | ||||
|     message (as well as an HTTP status code). | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ | |||
| from twisted.internet import defer | ||||
| 
 | ||||
| from synapse.api.errors import ( | ||||
|     CodeMessageException | ||||
|     MatrixCodeMessageException, CodeMessageException | ||||
| ) | ||||
| from ._base import BaseHandler | ||||
| from synapse.util.async import run_on_reactor | ||||
|  | @ -35,7 +35,7 @@ class IdentityHandler(BaseHandler): | |||
|     def __init__(self, hs): | ||||
|         super(IdentityHandler, self).__init__(hs) | ||||
| 
 | ||||
|         self.proxy_client = hs.get_matrix_proxy_client() | ||||
|         self.http_client = hs.get_simple_http_client() | ||||
| 
 | ||||
|         self.trusted_id_servers = set(hs.config.trusted_third_party_id_servers) | ||||
|         self.trust_any_id_server_just_for_testing_do_not_use = ( | ||||
|  | @ -83,13 +83,16 @@ class IdentityHandler(BaseHandler): | |||
| 
 | ||||
|         data = {} | ||||
|         try: | ||||
|             data = yield self.proxy_client.get_json( | ||||
|                 "https://%s%s" % ( | ||||
|             data = yield self.http_client.get_json( | ||||
|                 "http://%s%s" % ( | ||||
|                     id_server, | ||||
|                     "/_matrix/identity/api/v1/3pid/getValidated3pid" | ||||
|                 ), | ||||
|                 {'sid': creds['sid'], 'client_secret': client_secret} | ||||
|             ) | ||||
|         except MatrixCodeMessageException as e: | ||||
|             logger.info("getValidated3pid failed with Matrix error: %r", e) | ||||
|             raise SynapseError(e.code, e.msg, e.errcode) | ||||
|         except CodeMessageException as e: | ||||
|             data = json.loads(e.msg) | ||||
| 
 | ||||
|  | @ -118,8 +121,8 @@ class IdentityHandler(BaseHandler): | |||
|             raise SynapseError(400, "No client_secret in creds") | ||||
| 
 | ||||
|         try: | ||||
|             data = yield self.proxy_client.post_urlencoded_get_json( | ||||
|                 "https://%s%s" % ( | ||||
|             data = yield self.http_client.post_urlencoded_get_json( | ||||
|                 "http://%s%s" % ( | ||||
|                     id_server, "/_matrix/identity/api/v1/3pid/bind" | ||||
|                 ), | ||||
|                 { | ||||
|  | @ -151,14 +154,17 @@ class IdentityHandler(BaseHandler): | |||
|         params.update(kwargs) | ||||
| 
 | ||||
|         try: | ||||
|             data = yield self.proxy_client.post_json_get_json( | ||||
|                 "https://%s%s" % ( | ||||
|             data = yield self.http_client.post_json_get_json( | ||||
|                 "http://%s%s" % ( | ||||
|                     id_server, | ||||
|                     "/_matrix/identity/api/v1/validate/email/requestToken" | ||||
|                 ), | ||||
|                 params | ||||
|             ) | ||||
|             defer.returnValue(data) | ||||
|         except MatrixCodeMessageException as e: | ||||
|             logger.info("Proxied requestToken failed with Matrix error: %r", e) | ||||
|             raise SynapseError(e.code, e.msg, e.errcode) | ||||
|         except CodeMessageException as e: | ||||
|             logger.info("Proxied requestToken failed: %r", e) | ||||
|             raise e | ||||
|  | @ -185,14 +191,17 @@ class IdentityHandler(BaseHandler): | |||
|         params.update(kwargs) | ||||
| 
 | ||||
|         try: | ||||
|             data = yield self.proxy_client.post_json_get_json( | ||||
|                 "https://%s%s" % ( | ||||
|             data = yield self.http_client.post_json_get_json( | ||||
|                 "http://%s%s" % ( | ||||
|                     id_server, | ||||
|                     "/_matrix/identity/api/v1/validate/msisdn/requestToken" | ||||
|                 ), | ||||
|                 params | ||||
|             ) | ||||
|             defer.returnValue(data) | ||||
|         except MatrixCodeMessageException as e: | ||||
|             logger.info("Proxied requestToken failed with Matrix error: %r", e) | ||||
|             raise SynapseError(e.code, e.msg, e.errcode) | ||||
|         except CodeMessageException as e: | ||||
|             logger.info("Proxied requestToken failed: %r", e) | ||||
|             raise e | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ from OpenSSL import SSL | |||
| from OpenSSL.SSL import VERIFY_NONE | ||||
| 
 | ||||
| from synapse.api.errors import ( | ||||
|     CodeMessageException, SynapseError, Codes, | ||||
|     CodeMessageException, MatrixCodeMessageException, SynapseError, Codes, | ||||
| ) | ||||
| from synapse.util.logcontext import preserve_context_over_fn | ||||
| import synapse.metrics | ||||
|  | @ -145,8 +145,10 @@ class SimpleHttpClient(object): | |||
| 
 | ||||
|         body = yield preserve_context_over_fn(readBody, response) | ||||
| 
 | ||||
|         if response.code / 100 >= 4: | ||||
|             raise CodeMessageException(response.code, body) | ||||
|         if 200 <= response.code < 300: | ||||
|             defer.returnValue(json.loads(body)) | ||||
|         else: | ||||
|             raise self._exceptionFromFailedRequest(response, body) | ||||
| 
 | ||||
|         defer.returnValue(json.loads(body)) | ||||
| 
 | ||||
|  | @ -168,7 +170,11 @@ class SimpleHttpClient(object): | |||
|             error message. | ||||
|         """ | ||||
|         body = yield self.get_raw(uri, args) | ||||
|         defer.returnValue(json.loads(body)) | ||||
| 
 | ||||
|         if 200 <= response.code < 300: | ||||
|             defer.returnValue(json.loads(body)) | ||||
|         else: | ||||
|             raise self._exceptionFromFailedRequest(response, body) | ||||
| 
 | ||||
|     @defer.inlineCallbacks | ||||
|     def put_json(self, uri, json_body, args={}): | ||||
|  | @ -249,6 +255,16 @@ class SimpleHttpClient(object): | |||
|         else: | ||||
|             raise CodeMessageException(response.code, body) | ||||
| 
 | ||||
|     def _exceptionFromFailedRequest(self, response, body): | ||||
|         try: | ||||
|             jsonBody = json.loads(body) | ||||
|             errcode = jsonBody['errcode'] | ||||
|             error = jsonBody['error'] | ||||
|             return MatrixCodeMessageException(response.code, error, errcode) | ||||
|         except e: | ||||
|             print e | ||||
|             return CodeMessageException(response.code, body) | ||||
| 
 | ||||
|     # XXX: FIXME: This is horribly copy-pasted from matrixfederationclient. | ||||
|     # The two should be factored out. | ||||
| 
 | ||||
|  | @ -309,46 +325,6 @@ class SimpleHttpClient(object): | |||
|         defer.returnValue((length, headers, response.request.absoluteURI, response.code)) | ||||
| 
 | ||||
| 
 | ||||
| class MatrixProxyClient(object): | ||||
|     """ | ||||
|     An HTTP client that proxies other Matrix endpoints, ie. if the remote endpoint | ||||
|     returns Matrix-style error response, this will raise the appropriate SynapseError | ||||
|     """ | ||||
|     def __init__(self, hs): | ||||
|         self.simpleHttpClient = SimpleHttpClient(hs) | ||||
| 
 | ||||
|     @defer.inlineCallbacks | ||||
|     def post_json_get_json(self, uri, post_json): | ||||
|         try: | ||||
|             result = yield self.simpleHttpClient.post_json_get_json(uri, post_json) | ||||
|             defer.returnValue(result) | ||||
|         except CodeMessageException as cme: | ||||
|             ex = self._tryGetMatrixError(cme) | ||||
|             if ex is not None: | ||||
|                 raise ex | ||||
|             raise cme | ||||
| 
 | ||||
|     @defer.inlineCallbacks | ||||
|     def get_json(self, uri, args={}): | ||||
|         try: | ||||
|             result = yield self.simpleHttpClient.get_json(uri, args) | ||||
|             defer.returnValue(result) | ||||
|         except CodeMessageException as cme: | ||||
|             ex = self._tryGetMatrixError(cme) | ||||
|             if ex is not None: | ||||
|                 raise ex | ||||
|             raise cme | ||||
| 
 | ||||
|     def _tryGetMatrixError(self, codeMessageException): | ||||
|         try: | ||||
|             errbody = json.loads(codeMessageException.msg) | ||||
|             errcode = errbody['errcode'] | ||||
|             errtext = errbody['error'] | ||||
|             return SynapseError(codeMessageException.code, errtext, errcode) | ||||
|         except: | ||||
|             return None | ||||
| 
 | ||||
| 
 | ||||
| # XXX: FIXME: This is horribly copy-pasted from matrixfederationclient. | ||||
| # The two should be factored out. | ||||
| 
 | ||||
|  |  | |||
|  | @ -49,9 +49,7 @@ from synapse.handlers.events import EventHandler, EventStreamHandler | |||
| from synapse.handlers.initial_sync import InitialSyncHandler | ||||
| from synapse.handlers.receipts import ReceiptsHandler | ||||
| from synapse.handlers.read_marker import ReadMarkerHandler | ||||
| from synapse.http.client import ( | ||||
|     SimpleHttpClient, InsecureInterceptableContextFactory, MatrixProxyClient | ||||
| ) | ||||
| from synapse.http.client import SimpleHttpClient, InsecureInterceptableContextFactory | ||||
| from synapse.http.matrixfederationclient import MatrixFederationHttpClient | ||||
| from synapse.notifier import Notifier | ||||
| from synapse.push.pusherpool import PusherPool | ||||
|  | @ -130,7 +128,6 @@ class HomeServer(object): | |||
|         'filtering', | ||||
|         'http_client_context_factory', | ||||
|         'simple_http_client', | ||||
|         'matrix_proxy_client', | ||||
|         'media_repository', | ||||
|         'federation_transport_client', | ||||
|         'federation_sender', | ||||
|  | @ -193,9 +190,6 @@ class HomeServer(object): | |||
|     def build_simple_http_client(self): | ||||
|         return SimpleHttpClient(self) | ||||
| 
 | ||||
|     def build_matrix_proxy_client(self): | ||||
|         return MatrixProxyClient(self) | ||||
| 
 | ||||
|     def build_v1auth(self): | ||||
|         orf = Auth(self) | ||||
|         # Matrix spec makes no reference to what HTTP status code is returned, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 David Baker
						David Baker