From 1e2590af493dedf62be565268c198a78aba5f1f0 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 15 Jan 2021 12:15:07 -0500 Subject: [PATCH] Lock the threadId during message send. Fixes #10659 --- .../conversation/ConversationActivity.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 5f8e267d44..cdfe6a2a73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -236,7 +236,6 @@ import org.thoughtcrime.securesms.registration.RegistrationNavigationActivity; import org.thoughtcrime.securesms.service.KeyCachingService; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.sms.OutgoingEncryptedMessage; -import org.thoughtcrime.securesms.sms.OutgoingEndSessionMessage; import org.thoughtcrime.securesms.sms.OutgoingTextMessage; import org.thoughtcrime.securesms.stickers.StickerKeyboardProvider; import org.thoughtcrime.securesms.stickers.StickerLocator; @@ -1086,6 +1085,8 @@ public class ConversationActivity extends PassphraseRequiredActivity return; } + final long thread = this.threadId; + ExpirationDialog.show(this, recipient.get().getExpireMessages(), expirationTime -> SimpleTask.run( @@ -1101,7 +1102,7 @@ public class ConversationActivity extends PassphraseRequiredActivity } else { DatabaseFactory.getRecipientDatabase(ConversationActivity.this).setExpireMessages(recipient.getId(), expirationTime); OutgoingExpirationUpdateMessage outgoingMessage = new OutgoingExpirationUpdateMessage(getRecipient(), System.currentTimeMillis(), expirationTime * 1000L); - MessageSender.send(ConversationActivity.this, outgoingMessage, threadId, false, null); + MessageSender.send(ConversationActivity.this, outgoingMessage, thread, false, null); } return GroupChangeResult.SUCCESS; }, @@ -2644,13 +2645,14 @@ public class ConversationActivity extends PassphraseRequiredActivity } private void sendMediaMessage(@NonNull MediaSendActivityResult result) { + long thread = this.threadId; long expiresIn = recipient.get().getExpireMessages() * 1000L; QuoteModel quote = result.isViewOnce() ? null : inputPanel.getQuote().orNull(); List mentions = new ArrayList<>(result.getMentions()); OutgoingMediaMessage message = new OutgoingMediaMessage(recipient.get(), new SlideDeck(), result.getBody(), System.currentTimeMillis(), -1, expiresIn, result.isViewOnce(), distributionType, quote, Collections.emptyList(), Collections.emptyList(), mentions); OutgoingMediaMessage secureMessage = new OutgoingSecureMediaMessage(message); - ApplicationDependencies.getTypingStatusSender().onTypingStopped(threadId); + ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread); inputPanel.clearQuote(); attachmentManager.clear(glideRequests, false); @@ -2659,7 +2661,7 @@ public class ConversationActivity extends PassphraseRequiredActivity long id = fragment.stageOutgoingMessage(message); SimpleTask.run(() -> { - long resultId = MessageSender.sendPushWithPreUploadedMedia(this, secureMessage, result.getPreUploadResults(), threadId, () -> fragment.releaseOutgoingMessage(id)); + long resultId = MessageSender.sendPushWithPreUploadedMedia(this, secureMessage, result.getPreUploadResults(), thread, () -> fragment.releaseOutgoingMessage(id)); int deleted = DatabaseFactory.getAttachmentDatabase(this).deleteAbandonedPreuploadedAttachments(); Log.i(TAG, "Deleted " + deleted + " abandoned attachments."); @@ -2704,6 +2706,8 @@ public class ConversationActivity extends PassphraseRequiredActivity return new SettableFuture<>(null); } + final long thread = this.threadId; + if (isSecureText && !forceSms) { MessageUtil.SplitResult splitMessage = MessageUtil.getSplitMessage(this, body, sendButton.getSelectedTransport().calculateCharacters(body).maxPrimaryMessageSize); body = splitMessage.getBody(); @@ -2722,7 +2726,7 @@ public class ConversationActivity extends PassphraseRequiredActivity if (isSecureText && !forceSms) { outgoingMessage = new OutgoingSecureMediaMessage(outgoingMessageCandidate); - ApplicationDependencies.getTypingStatusSender().onTypingStopped(threadId); + ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread); } else { outgoingMessage = outgoingMessageCandidate; } @@ -2741,7 +2745,7 @@ public class ConversationActivity extends PassphraseRequiredActivity final long id = fragment.stageOutgoingMessage(outgoingMessage); SimpleTask.run(() -> { - return MessageSender.send(context, outgoingMessage, threadId, forceSms, () -> fragment.releaseOutgoingMessage(id)); + return MessageSender.send(context, outgoingMessage, thread, forceSms, () -> fragment.releaseOutgoingMessage(id)); }, result -> { sendComplete(result); future.set(null); @@ -2761,6 +2765,7 @@ public class ConversationActivity extends PassphraseRequiredActivity return; } + final long thread = this.threadId; final Context context = getApplicationContext(); final String messageBody = getMessage(); @@ -2768,7 +2773,7 @@ public class ConversationActivity extends PassphraseRequiredActivity if (isSecureText && !forceSms) { message = new OutgoingEncryptedMessage(recipient.get(), messageBody, expiresIn); - ApplicationDependencies.getTypingStatusSender().onTypingStopped(threadId); + ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread); } else { message = new OutgoingTextMessage(recipient.get(), messageBody, expiresIn, subscriptionId); } @@ -2784,7 +2789,7 @@ public class ConversationActivity extends PassphraseRequiredActivity new AsyncTask() { @Override protected Long doInBackground(OutgoingTextMessage... messages) { - return MessageSender.send(context, messages[0], threadId, forceSms, () -> fragment.releaseOutgoingMessage(id)); + return MessageSender.send(context, messages[0], thread, forceSms, () -> fragment.releaseOutgoingMessage(id)); } @Override