瀏覽代碼

link_wait: return 400 if signald's websocket disconnects while finishing link

Sumner Evans 3 年之前
父節點
當前提交
df9a556b12
共有 2 個文件被更改,包括 18 次插入1 次删除
  1. 9 0
      mausignald/errors.py
  2. 9 1
      mautrix_signal/web/provisioning_api.py

+ 9 - 0
mausignald/errors.py

@@ -63,6 +63,14 @@ class RequestValidationFailure(ResponseError):
         super().__init__(data, message_override=result_str)
 
 
+class InternalError(ResponseError):
+    def __init__(self, data: Dict[str, Any]) -> None:
+        exceptions = data.get("exceptions", [])
+        self.exceptions = exceptions
+        message = data.get("message")
+        super().__init__(data, error_type=", ".join(exceptions), message_override=message)
+
+
 response_error_types = {
     "invalid_request": RequestValidationFailure,
     "TimeoutException": TimeoutException,
@@ -71,6 +79,7 @@ response_error_types = {
     "UnknownIdentityKey": UnknownIdentityKey,
     "CaptchaRequired": CaptchaRequired,
     "AuthorizationFailedException": AuthorizationFailedException,
+    "InternalError": InternalError,
     # TODO add rest from https://gitlab.com/signald/signald/-/tree/main/src/main/java/io/finn/signald/exceptions
 }
 

+ 9 - 1
mautrix_signal/web/provisioning_api.py

@@ -21,7 +21,7 @@ import json
 from aiohttp import web
 
 from mausignald.types import Address, Account
-from mausignald.errors import TimeoutException
+from mausignald.errors import InternalError, TimeoutException
 from mautrix.types import UserID
 from mautrix.util.logging import TraceLogger
 
@@ -178,6 +178,14 @@ class ProvisioningAPI:
         except TimeoutException:
             raise web.HTTPBadRequest(text='{"error": "Signal linking timed out"}',
                                      headers=self._headers)
+        except InternalError as ie:
+            if "java.io.IOException" in ie.exceptions:
+                raise web.HTTPBadRequest(
+                    text='{"error": "Signald websocket disconnected before linking finished"}',
+                    headers=self._headers,
+                )
+            raise web.HTTPInternalServerError(text='{"error": "Fatal error in Signal linking"}',
+                                              headers=self._headers)
         except Exception:
             raise web.HTTPInternalServerError(text='{"error": "Fatal error in Signal linking"}',
                                               headers=self._headers)