From 84fd605ad3b7a077278b1090b9a332d0b83e7398 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Wed, 23 Aug 2017 13:36:49 -0700 Subject: [PATCH] MessageReceiver cache: Don't convert to string for save Because IndexedDB supports ArrayBuffer natively. FREEBIE --- js/libtextsecure.js | 22 +++++++++++++--------- libtextsecure/message_receiver.js | 22 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/js/libtextsecure.js b/js/libtextsecure.js index f2505a5a9..bb2cf65fb 100644 --- a/js/libtextsecure.js +++ b/js/libtextsecure.js @@ -38418,12 +38418,21 @@ MessageReceiver.prototype.extend({ }, queueCached: function(item) { try { - var envelopePlaintext = this.stringToArrayBuffer(item.envelope); + var envelopePlaintext = item.envelope; + + // Up until 0.42.6 we stored envelope and decrypted as strings in IndexedDB, + // so we need to be ready for them. + if (typeof envelopePlaintext === 'string') { + envelopePlaintext = this.stringToArrayBuffer(envelopePlaintext); + } var envelope = textsecure.protobuf.Envelope.decode(envelopePlaintext); var decrypted = item.decrypted; if (decrypted) { - var payloadPlaintext = this.stringToArrayBuffer(decrypted); + var payloadPlaintext = decrypted; + if (typeof payloadPlaintext === 'string') { + payloadPlaintext = this.stringToArrayBuffer(payloadPlaintext); + } this.queueDecryptedEnvelope(envelope, payloadPlaintext); } else { this.queueEnvelope(envelope); @@ -38436,9 +38445,6 @@ MessageReceiver.prototype.extend({ getEnvelopeId: function(envelope) { return envelope.source + '.' + envelope.sourceDevice + ' ' + envelope.timestamp.toNumber(); }, - arrayBufferToString: function(arrayBuffer) { - return new dcodeIO.ByteBuffer.wrap(arrayBuffer).toString('binary'); - }, stringToArrayBuffer: function(string) { return new dcodeIO.ByteBuffer.wrap(string, 'binary').toArrayBuffer(); }, @@ -38469,10 +38475,9 @@ MessageReceiver.prototype.extend({ addToCache: function(envelope, plaintext) { var id = this.getEnvelopeId(envelope); console.log('addToCache', id); - var string = this.arrayBufferToString(plaintext); var data = { id: id, - envelope: string, + envelope: plaintext, timestamp: Date.now(), attempts: 1 }; @@ -38481,9 +38486,8 @@ MessageReceiver.prototype.extend({ updateCache: function(envelope, plaintext) { var id = this.getEnvelopeId(envelope); console.log('updateCache', id); - var string = this.arrayBufferToString(plaintext); var data = { - decrypted: string + decrypted: plaintext }; return textsecure.storage.unprocessed.update(id, data); }, diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index ad3c66040..e70eea0e8 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -167,12 +167,21 @@ MessageReceiver.prototype.extend({ }, queueCached: function(item) { try { - var envelopePlaintext = this.stringToArrayBuffer(item.envelope); + var envelopePlaintext = item.envelope; + + // Up until 0.42.6 we stored envelope and decrypted as strings in IndexedDB, + // so we need to be ready for them. + if (typeof envelopePlaintext === 'string') { + envelopePlaintext = this.stringToArrayBuffer(envelopePlaintext); + } var envelope = textsecure.protobuf.Envelope.decode(envelopePlaintext); var decrypted = item.decrypted; if (decrypted) { - var payloadPlaintext = this.stringToArrayBuffer(decrypted); + var payloadPlaintext = decrypted; + if (typeof payloadPlaintext === 'string') { + payloadPlaintext = this.stringToArrayBuffer(payloadPlaintext); + } this.queueDecryptedEnvelope(envelope, payloadPlaintext); } else { this.queueEnvelope(envelope); @@ -185,9 +194,6 @@ MessageReceiver.prototype.extend({ getEnvelopeId: function(envelope) { return envelope.source + '.' + envelope.sourceDevice + ' ' + envelope.timestamp.toNumber(); }, - arrayBufferToString: function(arrayBuffer) { - return new dcodeIO.ByteBuffer.wrap(arrayBuffer).toString('binary'); - }, stringToArrayBuffer: function(string) { return new dcodeIO.ByteBuffer.wrap(string, 'binary').toArrayBuffer(); }, @@ -218,10 +224,9 @@ MessageReceiver.prototype.extend({ addToCache: function(envelope, plaintext) { var id = this.getEnvelopeId(envelope); console.log('addToCache', id); - var string = this.arrayBufferToString(plaintext); var data = { id: id, - envelope: string, + envelope: plaintext, timestamp: Date.now(), attempts: 1 }; @@ -230,9 +235,8 @@ MessageReceiver.prototype.extend({ updateCache: function(envelope, plaintext) { var id = this.getEnvelopeId(envelope); console.log('updateCache', id); - var string = this.arrayBufferToString(plaintext); var data = { - decrypted: string + decrypted: plaintext }; return textsecure.storage.unprocessed.update(id, data); },