Add extra guard against inserting unnecessary error messages.

This commit is contained in:
Greyson Parrelli
2023-05-08 13:36:35 -04:00
committed by Cody Henthorne
parent ec6d5031cf
commit ee3f2d62cf
4 changed files with 24 additions and 14 deletions

View File

@@ -106,7 +106,6 @@ import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.TombstoneAttachment;
import org.thoughtcrime.securesms.audio.AudioRecorder;
import org.thoughtcrime.securesms.audio.BluetoothVoiceNoteUtil;
import org.thoughtcrime.securesms.audio.BluetoothVoiceNoteUtilKt;
import org.thoughtcrime.securesms.badges.gifts.thanks.GiftThanksSheet;
import org.thoughtcrime.securesms.components.AnimatingToggle;
import org.thoughtcrime.securesms.components.ComposeText;
@@ -4073,7 +4072,7 @@ public class ConversationParentFragment extends Fragment
SimpleTask.run(() -> {
//noinspection CodeBlock2Expr
return SignalDatabase.messages().checkMessageExists(reactionDelegate.getMessageRecord());
return SignalDatabase.messages().messageExists(reactionDelegate.getMessageRecord());
}, messageExists -> {
if (!messageExists) {
reactionDelegate.hide();

View File

@@ -269,12 +269,13 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
private const val INDEX_THREAD_DATE = "message_thread_date_index"
private const val INDEX_THREAD_STORY_SCHEDULED_DATE_LATEST_REVISION_ID = "message_thread_story_parent_story_scheduled_date_latest_revision_id_index"
private const val INDEX_DATE_SENT_FROM_TO_THREAD = "message_date_sent_from_to_thread_index"
@JvmField
val CREATE_INDEXS = arrayOf(
"CREATE INDEX IF NOT EXISTS message_read_and_notified_and_thread_id_index ON $TABLE_NAME ($READ, $NOTIFIED, $THREAD_ID)",
"CREATE INDEX IF NOT EXISTS message_type_index ON $TABLE_NAME ($TYPE)",
"CREATE INDEX IF NOT EXISTS message_date_sent_from_to_thread_index ON $TABLE_NAME ($DATE_SENT, $FROM_RECIPIENT_ID, $TO_RECIPIENT_ID, $THREAD_ID)",
"CREATE INDEX IF NOT EXISTS $INDEX_DATE_SENT_FROM_TO_THREAD ON $TABLE_NAME ($DATE_SENT, $FROM_RECIPIENT_ID, $TO_RECIPIENT_ID, $THREAD_ID)",
"CREATE INDEX IF NOT EXISTS message_date_server_index ON $TABLE_NAME ($DATE_SERVER)",
"CREATE INDEX IF NOT EXISTS $INDEX_THREAD_DATE ON $TABLE_NAME ($THREAD_ID, $DATE_RECEIVED);",
"CREATE INDEX IF NOT EXISTS message_reactions_unread_index ON $TABLE_NAME ($REACTIONS_UNREAD);",
@@ -4181,13 +4182,20 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
.readToSingleInt()
}
fun checkMessageExists(messageRecord: MessageRecord): Boolean {
fun messageExists(messageRecord: MessageRecord): Boolean {
return readableDatabase
.exists(TABLE_NAME)
.where("$ID = ?", messageRecord.id)
.run()
}
fun messageExists(sentTimestamp: Long, author: RecipientId): Boolean {
return readableDatabase
.exists("$TABLE_NAME INDEXED BY $INDEX_DATE_SENT_FROM_TO_THREAD")
.where("$DATE_SENT = ? AND $FROM_RECIPIENT_ID = ?", sentTimestamp, author)
.run()
}
fun getReportSpamMessageServerData(threadId: Long, timestamp: Long, limit: Int): List<ReportSpamData> {
return getReportSpamMessageServerGuids(threadId, timestamp)
.sortedBy { it.dateReceived }

View File

@@ -18,6 +18,8 @@ import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.util.FeatureFlags;
import java.util.concurrent.TimeUnit;
/**
* Manages the time-based creation of error messages for retries that are pending for messages we couldn't decrypt.
@@ -26,6 +28,8 @@ public final class PendingRetryReceiptManager extends TimedEventManager<PendingR
private static final String TAG = Log.tag(PendingRetryReceiptManager.class);
private static final long RETRY_RECEIPT_LIFESPAN = TimeUnit.HOURS.toMillis(1);
private final PendingRetryReceiptCache pendingCache;
private final MessageTable messageDatabase;
@@ -55,11 +59,15 @@ public final class PendingRetryReceiptManager extends TimedEventManager<PendingR
@WorkerThread
@Override
protected void executeEvent(@NonNull PendingRetryReceiptModel event) {
if (SignalDatabase.threads().containsId(event.getThreadId()) && SignalDatabase.recipients().containsId(event.getAuthor())) {
Log.w(TAG, "It's been " + (System.currentTimeMillis() - event.getReceivedTimestamp()) + " ms since this retry receipt was received. Showing an error.");
messageDatabase.insertBadDecryptMessage(event.getAuthor(), event.getAuthorDevice(), event.getSentTimestamp(), event.getReceivedTimestamp(), event.getThreadId());
if (SignalDatabase.messages().messageExists(event.getSentTimestamp(), event.getAuthor())) {
Log.w(TAG, "[" + event.getSentTimestamp() + "] We have since received the target message! No longer need to insert an error.");
} else if (!SignalDatabase.threads().containsId(event.getThreadId())) {
Log.w(TAG, "[" + event.getSentTimestamp() + "] Would normally show an error, but the thread has since been deleted! ThreadId: " + event.getThreadId());
} else if (!SignalDatabase.recipients().containsId(event.getAuthor())) {
Log.w(TAG, "[" + event.getSentTimestamp() + "] Would normally show an error, but the recipient has since been deleted! RecipientId: " + event.getAuthor());
} else {
Log.w(TAG, "Would normally show an error, but the thread or recipient has since been deleted! ThreadId: " + event.getThreadId() + ", RecipientId: " + event.getAuthor());
Log.w(TAG, "[" + event.getSentTimestamp() + "] It's been " + (System.currentTimeMillis() - event.getReceivedTimestamp()) + " ms since this retry receipt was received. Showing an error.");
messageDatabase.insertBadDecryptMessage(event.getAuthor(), event.getAuthorDevice(), event.getSentTimestamp() - 1, event.getReceivedTimestamp(), event.getThreadId());
}
pendingCache.delete(event);
@@ -68,7 +76,7 @@ public final class PendingRetryReceiptManager extends TimedEventManager<PendingR
@WorkerThread
@Override
protected long getDelayForEvent(@NonNull PendingRetryReceiptModel event) {
long expiresAt = event.getReceivedTimestamp() + FeatureFlags.retryReceiptLifespan();
long expiresAt = event.getReceivedTimestamp() + RETRY_RECEIPT_LIFESPAN;
long timeLeft = expiresAt - System.currentTimeMillis();
return Math.max(0, timeLeft);

View File

@@ -428,11 +428,6 @@ public final class FeatureFlags {
return getBoolean(RETRY_RECEIPTS, true);
}
/** How long to wait before considering a retry to be a failure. */
public static long retryReceiptLifespan() {
return getLong(RETRY_RECEIPT_LIFESPAN, TimeUnit.HOURS.toMillis(1));
}
/** How old a message is allowed to be while still resending in response to a retry receipt . */
public static long retryRespondMaxAge() {
return getLong(RETRY_RESPOND_MAX_AGE, TimeUnit.DAYS.toMillis(14));