From be2ed8989f873f96edfeac9f3e8b7f9a9be46f5b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 1 Jul 2022 11:06:37 -0400 Subject: [PATCH] Fix possible crash in ProfileKeySendJob if given an invalid threadId. --- .../securesms/database/ThreadDatabase.java | 1 - .../securesms/jobs/ProfileKeySendJob.java | 8 ++++++-- .../messagerequests/MessageRequestRepository.java | 2 +- .../securesms/messages/MessageContentProcessor.java | 12 ++++++++---- .../thoughtcrime/securesms/sms/MessageSender.java | 7 +++++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index f311f59c8..3493fdfb0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -1153,7 +1153,6 @@ public class ThreadDatabase extends Database { SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); try (Cursor cursor = db.query(TABLE_NAME, RECIPIENT_ID_PROJECTION, ID_WHERE, SqlUtil.buildArgs(threadId), null, null, null)) { - if (cursor != null && cursor.moveToFirst()) { return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID))); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java index 9caa67349..5d71def15 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ProfileKeySendJob.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.jobs; import android.content.Context; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import com.annimon.stream.Stream; @@ -45,13 +46,16 @@ public class ProfileKeySendJob extends BaseJob { * * @param queueLimits True if you only want one of these to be run per person after decryptions * are drained, otherwise false. + * + * @return The job that is created, or null if the threadId provided was invalid. */ @WorkerThread - public static ProfileKeySendJob create(@NonNull Context context, long threadId, boolean queueLimits) { + public static @Nullable ProfileKeySendJob create(long threadId, boolean queueLimits) { Recipient conversationRecipient = SignalDatabase.threads().getRecipientForThreadId(threadId); if (conversationRecipient == null) { - throw new AssertionError("We have a thread but no recipient!"); + Log.w(TAG, "Thread no longer valid! Aborting."); + return null; } if (conversationRecipient.isPushV2Group()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index d20ce3068..2acfd44f9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -144,7 +144,7 @@ final class MessageRequestRepository { RecipientDatabase recipientDatabase = SignalDatabase.recipients(); recipientDatabase.setProfileSharing(liveRecipient.getId(), true); - MessageSender.sendProfileKey(context, threadId); + MessageSender.sendProfileKey(threadId); List messageIds = SignalDatabase.threads().setEntireThreadRead(threadId); ApplicationDependencies.getMessageNotifier().updateNotification(context); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index 3000ec996..c05bfa80a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -325,10 +325,14 @@ public final class MessageContentProcessor { .enqueue(); } else if (!threadRecipient.isGroup()) { Log.i(TAG, "Message was to a 1:1. Ensuring this user has our profile key."); - ApplicationDependencies.getJobManager() - .startChain(new RefreshAttributesJob(false)) - .then(ProfileKeySendJob.create(context, SignalDatabase.threads().getOrCreateThreadIdFor(threadRecipient), true)) - .enqueue(); + ProfileKeySendJob profileSendJob = ProfileKeySendJob.create(SignalDatabase.threads().getOrCreateThreadIdFor(threadRecipient), true); + + if (profileSendJob != null) { + ApplicationDependencies.getJobManager() + .startChain(new RefreshAttributesJob(false)) + .then(profileSendJob) + .enqueue(); + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java index 9e0a858a1..d1b764bcb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java @@ -102,8 +102,11 @@ public class MessageSender { * Suitable for a 1:1 conversation or a GV1 group only. */ @WorkerThread - public static void sendProfileKey(final Context context, final long threadId) { - ApplicationDependencies.getJobManager().add(ProfileKeySendJob.create(context, threadId, false)); + public static void sendProfileKey(final long threadId) { + ProfileKeySendJob job = ProfileKeySendJob.create(threadId, false); + if (job != null) { + ApplicationDependencies.getJobManager().add(job); + } } public static long send(final Context context,