Ver código fonte

Merge pull request #217 from mautrix/attachment-too-large

errors: add AttachmentTooLargeError for attachments over 100MB
Sumner Evans 3 anos atrás
pai
commit
b799063015
2 arquivos alterados com 16 adições e 7 exclusões
  1. 7 0
      mausignald/errors.py
  2. 9 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
 }
 

+ 9 - 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,
@@ -287,6 +287,8 @@ class Portal(DBPortal, BasePortal):
         return str(path)
 
     async def _download_matrix_media(self, message: MediaMessageEventContent) -> str:
+        if message.info.size > 100 * 10**6:
+            raise AttachmentTooLargeError({"filename": message.body})
         if message.file:
             data = await self.main_intent.download_media(message.file.url)
             data = decrypt_attachment(
@@ -303,13 +305,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(