Przeglądaj źródła

errors: add AttachmentTooLargeError for attachments over 100MB

Note that is MB, not MiB.
Requires https://gitlab.com/signald/signald/-/commit/9dd4b1bdde9fb77f872a48ae225b3894e54e7ea6

This also makes AttachmentTooLargeError errors report UNSUPPORTED
checkpoint status instead of PERM_FAILURE.
Sumner Evans 3 lat temu
rodzic
commit
ecaa4542f1
2 zmienionych plików z 14 dodań i 7 usunięć
  1. 7 0
      mausignald/errors.py
  2. 7 7
      mautrix_signal/portal.py

+ 7 - 0
mausignald/errors.py

@@ -77,6 +77,12 @@ class InternalError(ResponseError):
         super().__init__(data, error_type=", ".join(exceptions), message_override=message)
 
 
+class AttachmentTooLargeError(ResponseError):
+    def __init__(self, data: dict[str, Any]) -> None:
+        self.filename = data.get("filename", "")
+        super().__init__(data, message_override="File is over the 100MB limit.")
+
+
 response_error_types = {
     "invalid_request": RequestValidationFailure,
     "TimeoutException": TimeoutException,
@@ -86,6 +92,7 @@ response_error_types = {
     "CaptchaRequired": CaptchaRequired,
     "AuthorizationFailedException": AuthorizationFailedException,
     "InternalError": InternalError,
+    "AttachmentTooLargeError": AttachmentTooLargeError,
     # TODO add rest from https://gitlab.com/signald/signald/-/tree/main/src/main/java/io/finn/signald/exceptions
 }
 

+ 7 - 7
mautrix_signal/portal.py

@@ -26,7 +26,7 @@ import os.path
 import pathlib
 import time
 
-from mausignald.errors import NotConnected, RPCError
+from mausignald.errors import AttachmentTooLargeError, NotConnected, RPCError
 from mausignald.types import (
     AccessControlMode,
     Address,
@@ -303,13 +303,13 @@ class Portal(DBPortal, BasePortal):
             await self._handle_matrix_message(sender, message, event_id)
         except Exception as e:
             self.log.exception(f"Failed to handle Matrix message {event_id}")
+            status = (
+                MessageSendCheckpointStatus.UNSUPPORTED
+                if isinstance(e, AttachmentTooLargeError)
+                else MessageSendCheckpointStatus.PERM_FAILURE
+            )
             sender.send_remote_checkpoint(
-                MessageSendCheckpointStatus.PERM_FAILURE,
-                event_id,
-                self.mxid,
-                EventType.ROOM_MESSAGE,
-                message.msgtype,
-                error=e,
+                status, event_id, self.mxid, EventType.ROOM_MESSAGE, message.msgtype, error=e
             )
             await sender.handle_auth_failure(e)
             await self._send_message(