From 6aa699ad235a9976b8238215783174137b9fb4c7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 28 Apr 2021 15:53:30 +1000 Subject: [PATCH] fix deduplication for opengroups v1 & v2 --- app/sql.js | 19 +++++++++-- ts/data/data.ts | 34 ++++++++++++++++--- ts/models/conversation.ts | 1 - ts/opengroup/opengroupV2/OpenGroupAPIV2.ts | 1 - .../opengroupV2/OpenGroupServerPoller.ts | 3 -- ts/receiver/dataMessage.ts | 21 ++++++++---- 6 files changed, 60 insertions(+), 19 deletions(-) diff --git a/app/sql.js b/app/sql.js index 1049e43e6..6dc215f95 100644 --- a/app/sql.js +++ b/app/sql.js @@ -72,6 +72,7 @@ module.exports = { getUnreadByConversation, getUnreadCountByConversation, getMessageBySender, + getMessageBySenderAndServerId, getMessageIdsFromServerIds, getMessageById, getAllMessages, @@ -1982,7 +1983,7 @@ async function getAllMessageIds() { } // eslint-disable-next-line camelcase -async function getMessageBySender({ source, sourceDevice, sent_at }) { +async function getMessageBySender({ source, sourceDevice, sentAt }) { const rows = await db.all( `SELECT json FROM ${MESSAGES_TABLE} WHERE source = $source AND @@ -1991,7 +1992,21 @@ async function getMessageBySender({ source, sourceDevice, sent_at }) { { $source: source, $sourceDevice: sourceDevice, - $sent_at: sent_at, + $sent_at: sentAt, + } + ); + + return map(rows, row => jsonToObject(row.json)); +} + +async function getMessageBySenderAndServerId({ source, serverId }) { + const rows = await db.all( + `SELECT json FROM ${MESSAGES_TABLE} WHERE + source = $source AND + serverId = $serverId;`, + { + $source: source, + $serverId: serverId, } ); diff --git a/ts/data/data.ts b/ts/data/data.ts index d1fced994..c8fa878d2 100644 --- a/ts/data/data.ts +++ b/ts/data/data.ts @@ -117,6 +117,7 @@ const channelsToMake = { removeAllMessagesInConversation, getMessageBySender, + getMessageBySenderAndServerId, getMessageIdsFromServerIds, getMessageById, getAllMessages, @@ -720,14 +721,37 @@ export async function getAllMessageIds(): Promise> { return ids; } -export async function getMessageBySender( - // eslint-disable-next-line camelcase - { source, sourceDevice, sent_at }: { source: string; sourceDevice: number; sent_at: number } -): Promise { +export async function getMessageBySender({ + source, + sourceDevice, + sentAt, +}: { + source: string; + sourceDevice: number; + sentAt: number; +}): Promise { const messages = await channels.getMessageBySender({ source, sourceDevice, - sent_at, + sentAt, + }); + if (!messages || !messages.length) { + return null; + } + + return new MessageModel(messages[0]); +} + +export async function getMessageBySenderAndServerId({ + source, + serverId, +}: { + source: string; + serverId: number; +}): Promise { + const messages = await channels.getMessageBySenderAndServerId({ + source, + serverId, }); if (!messages || !messages.length) { return null; diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 360a53385..57f82a5d8 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -768,7 +768,6 @@ export class ConversationModel extends Backbone.Model { return null; } this.queueJob(async () => { - console.warn('sending groupinvi', messageModel); await this.sendMessageJob(messageModel, expireTimer); }); return null; diff --git a/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts b/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts index 13e136eb4..ca592d401 100644 --- a/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts +++ b/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts @@ -415,7 +415,6 @@ export const deleteSingleMessage = async ( }; const messageDeletedResult = await sendOpenGroupV2Request(request); const isOk = parseStatusCodeFromOnionRequest(messageDeletedResult) === 200; - console.warn('messageDeletedResult', messageDeletedResult); return isOk; }; diff --git a/ts/opengroup/opengroupV2/OpenGroupServerPoller.ts b/ts/opengroup/opengroupV2/OpenGroupServerPoller.ts index 73fb4d04d..a84a89c0f 100644 --- a/ts/opengroup/opengroupV2/OpenGroupServerPoller.ts +++ b/ts/opengroup/opengroupV2/OpenGroupServerPoller.ts @@ -177,8 +177,6 @@ const handleDeletions = async ( const allRowIds = (deleted || []).map(d => d.id); const maxDeletedId = Math.max(...allRowIds); try { - console.warn('We got deletion to do:', deleted, maxDeletedId); - const messageIds = await getMessageIdsFromServerIds(allIdsRemoved, conversationId); await Promise.all( @@ -253,7 +251,6 @@ const handleCompactPollResults = async ( // we want to do deletions even if we somehow lost the convo. if (res.deletions.length) { - console.warn('res.deletions', res.deletions); // new deletions await handleDeletions(res.deletions, convoId, convo); } diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index e09d117cd..b43d4932f 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -13,7 +13,7 @@ import { ConversationController } from '../session/conversations'; import { handleClosedGroupControlMessage } from './closedGroups'; import { MessageModel } from '../models/message'; import { MessageModelType } from '../models/messageType'; -import { getMessageBySender } from '../../ts/data/data'; +import { getMessageBySender, getMessageBySenderAndServerId } from '../../ts/data/data'; import { ConversationModel, ConversationTypeEnum } from '../models/conversation'; import { DeliveryReceiptMessage } from '../session/messages/outgoing/controlMessage/receipt/DeliveryReceiptMessage'; @@ -347,12 +347,19 @@ export async function isMessageDuplicate({ const { Errors } = window.Signal.Types; // serverId is only used for opengroupv2 try { - const result = await getMessageBySender({ - source, - sourceDevice, - sent_at: timestamp, - }); - + let result; + if (serverId) { + result = await getMessageBySenderAndServerId({ + source, + serverId, + }); + } else { + result = await getMessageBySender({ + source, + sourceDevice, + sentAt: timestamp, + }); + } if (!result) { return false; }