Browse Source

Provide error message instead of aesm URL

when encrypted media cannot be decrypted because it can't be downloaded.
JC Brand 2 years ago
parent
commit
eb9fd74c77
2 changed files with 13 additions and 6 deletions
  1. 4 0
      src/headless/utils/core.js
  2. 9 6
      src/plugins/omemo/utils.js

+ 4 - 0
src/headless/utils/core.js

@@ -18,6 +18,10 @@ import { setUserJID, } from '@converse/headless/utils/init.js';
 import { settings_api } from '@converse/headless/shared/settings/api.js';
 import { stx , toStanza } from './stanza.js';
 
+export function isError (obj) {
+    return Object.prototype.toString.call(obj) === "[object Error]";
+}
+
 export function isEmptyMessage (attrs) {
     if (attrs instanceof Model) {
         attrs = attrs.attributes;

+ 9 - 6
src/plugins/omemo/utils.js

@@ -12,6 +12,7 @@ import { __ } from 'i18n';
 import { _converse, converse, api } from '@converse/headless/core';
 import { html } from 'lit';
 import { initStorage } from '@converse/headless/utils/storage.js';
+import { isError } from '@converse/headless/utils/core.js';
 import { isAudioURL, isImageURL, isVideoURL, getURI } from '@converse/headless/utils/url.js';
 import { until } from 'lit/directives/until.js';
 import {
@@ -170,8 +171,8 @@ async function getAndDecryptFile (uri) {
     const http_url = uri.toString().replace(/^aesgcm/, protocol);
     const cipher = await downloadFile(http_url);
     if (cipher === null) {
-        log.error(`Could not decrypt file ${uri.toString()} since it could not be downloaded`);
-        return null;
+        log.error(`Could not decrypt a received encrypted file ${uri.toString()} since it could not be downloaded`);
+        return new Error(__('Error: could not decrypt a received encrypted file, because it could not be downloaded'));
     }
     const iv = hash.slice(0, 24);
     const key = hash.slice(24);
@@ -183,7 +184,7 @@ async function getAndDecryptFile (uri) {
         log.error(e);
         return null;
     }
-    const [filename, extension] = uri.filename()?.split('.');
+    const [filename, extension] = uri.filename().split('.');
     const mimetype = MIMETYPES_MAP[extension];
     try {
         const file = new File([content], filename, { 'type': mimetype });
@@ -196,10 +197,11 @@ async function getAndDecryptFile (uri) {
 }
 
 function getTemplateForObjectURL (uri, obj_url, richtext) {
-    const file_url = uri.toString();
-    if (obj_url === null) {
-        return file_url;
+    if (isError(obj_url)) {
+        return html`<p class="error">${obj_url.message}</p>`;
     }
+
+    const file_url = uri.toString();
     if (isImageURL(file_url)) {
         return tpl_image({
             'src': obj_url,
@@ -236,6 +238,7 @@ function addEncryptedFiles(text, offset, richtext) {
         const uri = getURI(text.slice(o.start, o.end));
         const promise = getAndDecryptFile(uri)
             .then(obj_url => getTemplateForObjectURL(uri, obj_url, richtext));
+
         const template = html`${until(promise, '')}`;
         richtext.addTemplateResult(o.start + offset, o.end + offset, template);
     });