From bd32a55c15c30bc64bf55f7a0effc7533bc50bff Mon Sep 17 00:00:00 2001 From: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com> Date: Wed, 2 Sep 2020 13:39:22 -0500 Subject: [PATCH] Fix issue with dates on inbound link previews --- js/models/messages.js | 1 - ts/textsecure/MessageReceiver.ts | 40 ++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/js/models/messages.js b/js/models/messages.js index 74a9b80cc7..d71e1e8a7d 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -778,7 +778,6 @@ isStickerPack: window.Signal.LinkPreviews.isStickerPack(preview.url), domain: window.Signal.LinkPreviews.getDomain(preview.url), image: preview.image ? this.getPropsForAttachment(preview.image) : null, - date: preview.date ? preview.date.toNumber() : null, })); }, getPropsForQuote() { diff --git a/ts/textsecure/MessageReceiver.ts b/ts/textsecure/MessageReceiver.ts index 2f12be4d6d..23d4b29324 100644 --- a/ts/textsecure/MessageReceiver.ts +++ b/ts/textsecure/MessageReceiver.ts @@ -1701,6 +1701,29 @@ class MessageReceiverInner extends EventTarget { digest: attachment.digest ? attachment.digest.toString('base64') : null, }; } + private isLinkPreviewDateValid(value: unknown): value is number { + return ( + typeof value === 'number' && + !Number.isNaN(value) && + Number.isFinite(value) && + value > 0 + ); + } + private cleanLinkPreviewDate(value: unknown): number | null { + if (this.isLinkPreviewDateValid(value)) { + return value; + } + if (!value) { + return null; + } + let result: unknown; + try { + result = (value as any).toNumber(); + } catch (err) { + return null; + } + return this.isLinkPreviewDateValid(result) ? result : null; + } async downloadAttachment( attachment: AttachmentPointerClass ): Promise { @@ -1856,18 +1879,11 @@ class MessageReceiverInner extends EventTarget { decrypted.attachments = (decrypted.attachments || []).map( this.cleanAttachment.bind(this) ); - decrypted.preview = (decrypted.preview || []).map(item => { - const { image } = item; - - if (!image) { - return item; - } - - return { - ...item, - image: this.cleanAttachment(image), - }; - }); + decrypted.preview = (decrypted.preview || []).map(item => ({ + ...item, + date: this.cleanLinkPreviewDate(item.date), + ...(item.image ? this.cleanAttachment(item.image) : {}), + })); decrypted.contact = (decrypted.contact || []).map(item => { const { avatar } = item;