From ef6a5b65994c253f2b9c29687babf2684a2dc19a Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 19 Aug 2020 15:49:16 -0400 Subject: [PATCH] Fix bug causing call requests to not be handled properly. --- .../securesms/recipients/RecipientUtil.java | 23 ++++++++++++++++++- .../securesms/service/WebRtcCallService.java | 6 +---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java index 4ea624643e..f2189929d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java @@ -17,7 +17,6 @@ import org.thoughtcrime.securesms.groups.GroupChangeBusyException; import org.thoughtcrime.securesms.groups.GroupChangeException; import org.thoughtcrime.securesms.groups.GroupChangeFailedException; import org.thoughtcrime.securesms.groups.GroupManager; -import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.jobs.MultiDeviceBlockedUpdateJob; import org.thoughtcrime.securesms.jobs.MultiDeviceMessageRequestResponseJob; import org.thoughtcrime.securesms.jobs.RotateProfileKeyJob; @@ -201,6 +200,20 @@ public class RecipientUtil { return isMessageRequestAccepted(context, threadId, threadRecipient); } + /** + * Like {@link #isMessageRequestAccepted(Context, long)} but with fewer checks around messages so it + * is more likely to return false. + */ + @WorkerThread + public static boolean isCallRequestAccepted(@NonNull Context context, @Nullable Recipient threadRecipient) { + if (threadRecipient == null) { + return true; + } + + long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(threadRecipient); + return isCallRequestAccepted(context, threadId, threadRecipient); + } + /** * @return True if a conversation existed before we enabled message requests, otherwise false. */ @@ -244,6 +257,14 @@ public class RecipientUtil { isPreMessageRequestThread(context, threadId); } + @WorkerThread + private static boolean isCallRequestAccepted(@NonNull Context context, long threadId, @NonNull Recipient threadRecipient) { + return threadRecipient.isProfileSharing() || + threadRecipient.isSystemContact() || + hasSentMessageInThread(context, threadId) || + isPreMessageRequestThread(context, threadId); + } + @WorkerThread private static boolean hasSentMessageInThread(@NonNull Context context, long threadId) { return DatabaseFactory.getMmsSmsDatabase(context).getOutgoingSecureConversationCount(threadId) != 0; diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java index 6450471eef..81015ce36f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java @@ -17,8 +17,6 @@ import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.protobuf.ByteString; - import org.greenrobot.eventbus.EventBus; import org.signal.ringrtc.CallException; import org.signal.ringrtc.CallId; @@ -44,7 +42,6 @@ import org.thoughtcrime.securesms.ringrtc.CameraEventListener; import org.thoughtcrime.securesms.ringrtc.CameraState; import org.thoughtcrime.securesms.ringrtc.IceCandidateParcel; import org.thoughtcrime.securesms.ringrtc.RemotePeer; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.FutureTaskListener; import org.thoughtcrime.securesms.util.ListenableFutureTask; import org.thoughtcrime.securesms.util.ServiceUtil; @@ -76,7 +73,6 @@ import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserExce import java.io.IOException; import java.util.ArrayList; -import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; @@ -410,7 +406,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer, return; } - if (remotePeer.getRecipient() == null || !RecipientUtil.isMessageRequestAccepted(getApplicationContext(), remotePeer.getRecipient())) { + if (remotePeer.getRecipient() == null || !RecipientUtil.isCallRequestAccepted(getApplicationContext(), remotePeer.getRecipient())) { Log.i(TAG, "handleReceivedOffer(): Caller is untrusted."); intent.putExtra(EXTRA_BROADCAST, true); intent.putExtra(EXTRA_HANGUP_TYPE, HangupMessage.Type.NEED_PERMISSION.getCode());