mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-27 06:29:54 +00:00
Add extra guard against inserting unnecessary error messages.
This commit is contained in:
committed by
Cody Henthorne
parent
ec6d5031cf
commit
ee3f2d62cf
@@ -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();
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user