From cc3f98b20acdf71a285adcaebe8a0e84221231a9 Mon Sep 17 00:00:00 2001 From: Beaudan Date: Fri, 1 Feb 2019 10:34:27 +1100 Subject: [PATCH] Move the incoming hash filtering logic into sql.js to prevent data races --- app/sql.js | 8 ++++++-- js/modules/data.js | 2 +- libtextsecure/http-resources.js | 11 ++++------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/sql.js b/app/sql.js index b64c4feac..95aa17e82 100644 --- a/app/sql.js +++ b/app/sql.js @@ -1534,18 +1534,22 @@ async function saveMessage(data, { forceSave } = {}) { return toCreate.id; } -async function saveSeenMessageHashes(arrayOfHashes) { +async function saveSeenMessageHashes(incomingHashes) { let promise; + const hashList = incomingHashes.map(h => h.hash); + const dupHashes = await getSeenMessagesByHashList(hashList); + const newHashes = incomingHashes.filter(h => !dupHashes.includes(h.hash)); db.serialize(() => { promise = Promise.all([ db.run('BEGIN TRANSACTION;'), - ...map(arrayOfHashes, hashData => saveSeenMessageHash(hashData)), + ...map(newHashes, hashData => saveSeenMessageHash(hashData)), db.run('COMMIT TRANSACTION;'), ]); }); await promise; + return newHashes; } async function saveSeenMessageHash(data) { diff --git a/js/modules/data.js b/js/modules/data.js index e850c723d..622750aff 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -788,7 +788,7 @@ async function cleanSeenMessages() { } async function saveSeenMessageHashes(data) { - await channels.saveSeenMessageHashes(_cleanData(data)); + return channels.saveSeenMessageHashes(_cleanData(data)); } async function saveSeenMessageHash(data) { diff --git a/libtextsecure/http-resources.js b/libtextsecure/http-resources.js index bded6ef25..a506a31fe 100644 --- a/libtextsecure/http-resources.js +++ b/libtextsecure/http-resources.js @@ -45,16 +45,13 @@ const filterIncomingMessages = async function filterIncomingMessages( messages ) { - const incomingHashes = messages.map(m => m.hash); - const dupHashes = await window.Signal.Data.getSeenMessagesByHashList( - incomingHashes - ); - const newMessages = messages.filter(m => !dupHashes.includes(m.hash)); - const newHashes = newMessages.map(m => ({ + const incomingHashes = messages.map(m => ({ expiresAt: m.expiration, hash: m.hash, })); - await window.Signal.Data.saveSeenMessageHashes(newHashes); + let newHashes = await window.Signal.Data.saveSeenMessageHashes(incomingHashes); + newHashes = newHashes.map(h => h.hash); + const newMessages = messages.filter(m => newHashes.includes(m.hash)); return newMessages; };