Explorar o código

Update max text message size checks (#903)

The current implementation was buggy, since it checked for
"string.length" which returns the UTF-16 unit count. Instead, use the
UTF-8 byte length.

Furthermore, read the max message body size from the client info object
(with fallback to the default 3500 bytes).
Danilo Bargen %!s(int64=6) %!d(string=hai) anos
pai
achega
7862d2c07b

+ 0 - 1
public/i18n/cs.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "Soubory větší než {maxmb} MiB nelze odeslat",
         "FILE_TOO_LARGE_WEB": "Aktuálně nelze prostřednictvím Threema Web odeslat soubory větší než 15 MiB",
         "FILE_TOO_LARGE_GENERIC": "Soubor je moc velký na odeslání",
-        "TEXT_TOO_LONG": "Tato zpráva je příliš dlouhá a nemůže být odeslána (Max. délka je {max} znaků).",
         "NOTIFICATION_PERMISSION_DENIED": "Chcete-li přijímat upozornění v prohlížeči, musíte ručně udělit povolení oznámení pro Threema Web.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Další informace.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Váš prohlížeč nepodporuje oznámení z aplikace.",

+ 0 - 1
public/i18n/de.json

@@ -260,7 +260,6 @@
         "FILE_TOO_LARGE": "Dateien grösser als {maxmb} MiB können nicht versendet werden",
         "FILE_TOO_LARGE_WEB": "Aktuell können keine Dateien grösser als 15 MiB über Threema Web versendet werden",
         "FILE_TOO_LARGE_GENERIC": "Datei kann nicht gesendet werden, weil sie zu gross ist",
-        "TEXT_TOO_LONG": "Diese Nachricht ist zu lang und kann nicht gesendet werden (Maximale Länge {max} Zeichen).",
         "NOTIFICATION_PERMISSION_DENIED": "Sie müssen die Benachrichtigungsberechtigung für Threema Web manuell erteilen, um Desktopbenachrichtigungen erhalten zu können.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Mehr erfahren.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Ihr Browser unterstützt keine Desktopbenachrichtigungen.",

+ 0 - 1
public/i18n/en.json

@@ -261,7 +261,6 @@
         "FILE_TOO_LARGE": "Files larger than {maxmb} MiB cannot be sent",
         "FILE_TOO_LARGE_WEB": "Currently files larger than 15 MiB cannot be sent through Threema Web",
         "FILE_TOO_LARGE_GENERIC": "File is too large to be sent",
-        "TEXT_TOO_LONG": "This message is too long and cannot be sent (Max length {max} characters).",
         "NOTIFICATION_PERMISSION_DENIED": "You have to grant the notification permission for Threema Web manually in order to receive desktop notifications.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Learn more.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Your browser does not support desktop notifications.",

+ 0 - 1
public/i18n/es.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "No se pueden enviar archivos de más de {maxmb} MiB",
         "FILE_TOO_LARGE_WEB": "Actualmente no se pueden enviar archivos de más de 15 MiB a través de Threema Web",
         "FILE_TOO_LARGE_GENERIC": "El archivo es demasiado grande para ser enviado",
-        "TEXT_TOO_LONG": "Este mensaje es demasiado largo y no se puede enviar (Longitud máxima: {max} caracteres)",
         "NOTIFICATION_PERMISSION_DENIED": "Debe otorgar manualmente el permiso de notificaciones a Threema Web para poder recibir notificaciones de escritorio",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Saber más.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Su navegador no soporta notificaciones de escritorio.",

+ 0 - 1
public/i18n/fr.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "Les fichiers plus grands que {maxmb} MiB ne peuvent pas être envoyés",
         "FILE_TOO_LARGE_WEB": "Actuellement les fichiers plus grands que 15 MiB ne peuvent pas être envoyés avec Threema Web",
         "FILE_TOO_LARGE_GENERIC": "Le fichier est trop lourd pour être envoyé.",
-        "TEXT_TOO_LONG": "Le fichier est trop long et ne peut pas être envoyé (Longueur max {max} caractères).",
         "NOTIFICATION_PERMISSION_DENIED": "Vous devez autoriser les notifications pour Threema Web manuellement pour pouvoir recevoir les notifications sur votre ordinateur.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "En savoir davantage.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Votre ordinateur ne supporte pas les notifications.",

+ 0 - 1
public/i18n/nl.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "Bestanden groter dan {maxmb} MiB kunnen niet worden verstuurd",
         "FILE_TOO_LARGE_WEB": "Momenteel kunnen bestanden groter dan 15 MiB niet worden verstuurd met Threema Web",
         "FILE_TOO_LARGE_GENERIC": "Het bestand is te groot om te versturen",
-        "TEXT_TOO_LONG": "Dit bericht is te lang en kan niet verstuurd worden (Max lengte {max} karakters).",
         "NOTIFICATION_PERMISSION_DENIED": "Je moet handmatig Threema Web toegang geven om desktop notificaties te ontvangen.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Kom meer te weten",
         "NOTIFICATION_API_NOT_AVAILABLE": "Je browser ondersteunt geen desktop notificaties.",

+ 0 - 1
public/i18n/pt.json

@@ -248,7 +248,6 @@
         "FILE_TOO_LARGE": "Arquivos maiores que {maxmb} MiB não podem ser enviados",
         "FILE_TOO_LARGE_WEB": "Actualmente, arquivos maiores que 15 MiB não podem ser enviados através do site da Threema Web.",
         "FILE_TOO_LARGE_GENERIC": "O arquivo é muito grande para ser enviado",
-        "TEXT_TOO_LONG": "Esta mensagem é muito longa e não pode ser enviada (Max length {max} caracteres).",
         "NOTIFICATION_PERMISSION_DENIED": "Você precisa conceder a permissão de notificação para o Threema Web manualmente para receber notificações da área de trabalho.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Saber mais.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Seu navegador não suporta notificações na área de trabalho.",

+ 0 - 1
public/i18n/sk.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "Súbory väčšie ako {maxmb} MiB nemôžu byť poslané",
         "FILE_TOO_LARGE_WEB": "V súčastnosti nemôžu byť poslané, cez Threema Web, súbory väčšie ako 15 MiB",
         "FILE_TOO_LARGE_GENERIC": "Súbor je príliš veľký na odoslanie ",
-        "TEXT_TOO_LONG": "Táto správa je veľmi dlhá a nemôže byť poslaná (Maximálna dĺžka je {max} znakov).",
         "NOTIFICATION_PERMISSION_DENIED": "Pokiaľ chcete prijímať upozornenia v prehliadači, musíte manuálne udeliť povolenia oznámení pre Threema Web.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Ďalšie informácie.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Váš prehliadač nepodporuje oznámenia z aplikácii.",

+ 0 - 1
public/i18n/uk.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "Файли розміром більше {maxmb} Мб неможливо надіслати",
         "FILE_TOO_LARGE_WEB": "В даний час файли розміром більше 15 Мб неможливо надіслати через Threema Web",
         "FILE_TOO_LARGE_GENERIC": "Файл завеликий для надсилання",
-        "TEXT_TOO_LONG": "Це повідомлення є занадто довгим і не може бути надіслане (Максимальна довжина {max} символів).",
         "NOTIFICATION_PERMISSION_DENIED": "Ви повинні надати дозвіл на сповіщення для Threema Web вручну, щоб отримувати повідомлення на робочому столі.",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "Докладніше.",
         "NOTIFICATION_API_NOT_AVAILABLE": "Ваш браузер не підтримує сповіщення на робочому столі.",

+ 0 - 1
public/i18n/zh.json

@@ -259,7 +259,6 @@
         "FILE_TOO_LARGE": "无法发送大于{maxmb} M的文件",
         "FILE_TOO_LARGE_WEB": "这个文件大于15M,无法通过Threema Web发送",
         "FILE_TOO_LARGE_GENERIC": "文件太大无法发送",
-        "TEXT_TOO_LONG": "此消息太长且无法发送(最大长度为{max}个字符)。",
         "NOTIFICATION_PERMISSION_DENIED": "您必须手动授予Threema Web通知权限才能接收通知。",
         "NOTIFICATION_PERMISSION_DENIED_LEARN_MORE": "了解更多",
         "NOTIFICATION_API_NOT_AVAILABLE": "您的浏览器不支持通知",

+ 3 - 1
src/directives/compose_area.ts

@@ -199,7 +199,9 @@ export default [
                                 .catch(reject);
                         };
 
-                        if (text.length > scope.maxTextLength) {
+                        // Check for max length
+                        const byteLength = (new TextEncoder().encode(text)).length;
+                        if (byteLength > scope.maxTextLength) {
                             const pieces: string[] = stringService.byteChunk(text, scope.maxTextLength, 50);
                             const confirm = $mdDialog.confirm()
                                 .title($translate.instant('messenger.MESSAGE_TOO_LONG_SPLIT_SUBJECT'))

+ 7 - 8
src/services/webclient.ts

@@ -100,7 +100,6 @@ export class WebClientService {
     private static SEQUENCE_NUMBER_MAX = (2 ** 32) - 1;
     private static CHUNK_CACHE_SIZE_MAX = 2 * 1024 * 1024;
     private static AVATAR_LOW_MAX_SIZE = 48;
-    private static MAX_TEXT_LENGTH = 3500;
     private static MAX_FILE_SIZE_WEBRTC_TASK_V0 = 15 * 1024 * 1024;
     private static CONNECTION_ID_NONCE = stringToUtf8a('connectionidconnectionid');
 
@@ -1796,12 +1795,11 @@ export class WebClientService {
                     throw this.$translate.instant('error.ERROR_OCCURRED');
                 }
 
-                // Ignore text messages that are too long.
-                if (msgLength > WebClientService.MAX_TEXT_LENGTH) {
-                    throw this.$translate.instant('error.TEXT_TOO_LONG', {
-                        max: WebClientService.MAX_TEXT_LENGTH,
-                    });
-                }
+                // Note: Not validating message length again here, since that
+                // would require us to re-encode the text a second time (since
+                // the compose area already checks the length). If we still end
+                // up with messages that are too large for some unexpected
+                // reason, we'd get an error message from the app.
 
                 break;
             case 'file':
@@ -3380,6 +3378,7 @@ export class WebClientService {
             capabilities: {
                 maxGroupSize: getOrDefault<number>(data.capabilities.maxGroupSize, 50),
                 maxFileSize: getOrDefault<number>(data.capabilities.maxFileSize, 50 * 1024 * 1024),
+                maxMessageBodySize: getOrDefault<number>(data.capabilities.maxMessageBodySize, 3500),
                 distributionLists: getOrDefault<boolean>(data.capabilities.distributionLists, true),
                 imageFormat: data.capabilities.imageFormat,
                 mdm: data.capabilities.mdm,
@@ -3478,7 +3477,7 @@ export class WebClientService {
      * Return the max text length
      */
     public getMaxTextLength(): number {
-        return WebClientService.MAX_TEXT_LENGTH;
+        return this.clientInfo.capabilities.maxMessageBodySize;
     }
 
     /**

+ 1 - 0
src/threema.d.ts

@@ -745,6 +745,7 @@ declare namespace threema {
     interface AppCapabilities {
         maxGroupSize: number;
         maxFileSize: number;
+        maxMessageBodySize: number;
         distributionLists: boolean;
         imageFormat: ImageFormat;
         mdm?: MdmRestrictions;