Prevent crash when opening conversation with unregistered UUID-only recipient.

This commit is contained in:
Greyson Parrelli
2021-05-03 13:45:53 -04:00
committed by Cody Henthorne
parent 129effd0ec
commit add65cf592
2 changed files with 23 additions and 12 deletions

View File

@@ -1518,7 +1518,9 @@ public class ConversationActivity extends PassphraseRequiredActivity
sendButton.resetAvailableTransports(isMediaMessage); sendButton.resetAvailableTransports(isMediaMessage);
if (!isSecureText && !isPushGroupConversation()) sendButton.disableTransport(Type.TEXTSECURE); if (!isSecureText && !isPushGroupConversation() && !recipient.get().isUuidOnly()) {
sendButton.disableTransport(Type.TEXTSECURE);
}
if (recipient.get().isPushGroup() || (!recipient.get().isMmsGroup() && !recipient.get().hasSmsAddress())) { if (recipient.get().isPushGroup() || (!recipient.get().isMmsGroup() && !recipient.get().hasSmsAddress())) {
sendButton.disableTransport(Type.SMS); sendButton.disableTransport(Type.SMS);
@@ -1527,8 +1529,11 @@ public class ConversationActivity extends PassphraseRequiredActivity
if (!recipient.get().isPushGroup() && recipient.get().isForceSmsSelection()) { if (!recipient.get().isPushGroup() && recipient.get().isForceSmsSelection()) {
sendButton.setDefaultTransport(Type.SMS); sendButton.setDefaultTransport(Type.SMS);
} else { } else {
if (isSecureText || isPushGroupConversation()) sendButton.setDefaultTransport(Type.TEXTSECURE); if (isSecureText || isPushGroupConversation() || recipient.get().isUuidOnly()) {
else sendButton.setDefaultTransport(Type.SMS); sendButton.setDefaultTransport(Type.TEXTSECURE);
} else {
sendButton.setDefaultTransport(Type.SMS);
}
} }
calculateCharactersRemaining(); calculateCharactersRemaining();
@@ -2588,7 +2593,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
inputPanel.setVisibility(View.GONE); inputPanel.setVisibility(View.GONE);
makeDefaultSmsButton.setVisibility(View.GONE); makeDefaultSmsButton.setVisibility(View.GONE);
registerButton.setVisibility(View.VISIBLE); registerButton.setVisibility(View.VISIBLE);
} else if (!isSecureText && !isDefaultSms) { } else if (!isSecureText && !isDefaultSms && recipient.hasSmsAddress()) {
unblockButton.setVisibility(View.GONE); unblockButton.setVisibility(View.GONE);
inputPanel.setVisibility(View.GONE); inputPanel.setVisibility(View.GONE);
makeDefaultSmsButton.setVisibility(View.VISIBLE); makeDefaultSmsButton.setVisibility(View.VISIBLE);
@@ -2842,14 +2847,15 @@ public class ConversationActivity extends PassphraseRequiredActivity
final boolean initiating, final boolean initiating,
final boolean clearComposeBox) final boolean clearComposeBox)
{ {
if (!isDefaultSms && (!isSecureText || forceSms)) { if (!isDefaultSms && (!isSecureText || forceSms) && recipient.get().hasSmsAddress()) {
showDefaultSmsPrompt(); showDefaultSmsPrompt();
return new SettableFuture<>(null); return new SettableFuture<>(null);
} }
final long thread = this.threadId; final boolean sendPush = (isSecureText && !forceSms) || recipient.get().isUuidOnly();
final long thread = this.threadId;
if (isSecureText && !forceSms) { if (sendPush) {
MessageUtil.SplitResult splitMessage = MessageUtil.getSplitMessage(this, body, sendButton.getSelectedTransport().calculateCharacters(body).maxPrimaryMessageSize); MessageUtil.SplitResult splitMessage = MessageUtil.getSplitMessage(this, body, sendButton.getSelectedTransport().calculateCharacters(body).maxPrimaryMessageSize);
body = splitMessage.getBody(); body = splitMessage.getBody();
@@ -2865,7 +2871,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
final OutgoingMediaMessage outgoingMessage; final OutgoingMediaMessage outgoingMessage;
if (isSecureText && !forceSms) { if (sendPush) {
outgoingMessage = new OutgoingSecureMediaMessage(outgoingMessageCandidate); outgoingMessage = new OutgoingSecureMediaMessage(outgoingMessageCandidate);
ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread); ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread);
} else { } else {
@@ -2874,7 +2880,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
Permissions.with(this) Permissions.with(this)
.request(Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS) .request(Manifest.permission.SEND_SMS, Manifest.permission.READ_SMS)
.ifNecessary(!isSecureText || forceSms) .ifNecessary(!sendPush)
.withPermanentDenialDialog(getString(R.string.ConversationActivity_signal_needs_sms_permission_in_order_to_send_an_sms)) .withPermanentDenialDialog(getString(R.string.ConversationActivity_signal_needs_sms_permission_in_order_to_send_an_sms))
.onAllGranted(() -> { .onAllGranted(() -> {
if (clearComposeBox) { if (clearComposeBox) {
@@ -2901,7 +2907,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
private void sendTextMessage(final boolean forceSms, final long expiresIn, final int subscriptionId, final boolean initiating) private void sendTextMessage(final boolean forceSms, final long expiresIn, final int subscriptionId, final boolean initiating)
throws InvalidMessageException throws InvalidMessageException
{ {
if (!isDefaultSms && (!isSecureText || forceSms)) { if (!isDefaultSms && (!isSecureText || forceSms) && recipient.get().hasSmsAddress()) {
showDefaultSmsPrompt(); showDefaultSmsPrompt();
return; return;
} }
@@ -2909,10 +2915,11 @@ public class ConversationActivity extends PassphraseRequiredActivity
final long thread = this.threadId; final long thread = this.threadId;
final Context context = getApplicationContext(); final Context context = getApplicationContext();
final String messageBody = getMessage(); final String messageBody = getMessage();
final boolean sendPush = (isSecureText && !forceSms) || recipient.get().isUuidOnly();
OutgoingTextMessage message; OutgoingTextMessage message;
if (isSecureText && !forceSms) { if (sendPush) {
message = new OutgoingEncryptedMessage(recipient.get(), messageBody, expiresIn); message = new OutgoingEncryptedMessage(recipient.get(), messageBody, expiresIn);
ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread); ApplicationDependencies.getTypingStatusSender().onTypingStopped(thread);
} else { } else {
@@ -2921,7 +2928,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
Permissions.with(this) Permissions.with(this)
.request(Manifest.permission.SEND_SMS) .request(Manifest.permission.SEND_SMS)
.ifNecessary(forceSms || !isSecureText) .ifNecessary(!sendPush)
.withPermanentDenialDialog(getString(R.string.ConversationActivity_signal_needs_sms_permission_in_order_to_send_an_sms)) .withPermanentDenialDialog(getString(R.string.ConversationActivity_signal_needs_sms_permission_in_order_to_send_an_sms))
.onAllGranted(() -> { .onAllGranted(() -> {
silentlySetComposeText(""); silentlySetComposeText("");

View File

@@ -650,6 +650,10 @@ public class Recipient {
return getUuid().isPresent(); return getUuid().isPresent();
} }
public boolean isUuidOnly() {
return hasUuid() && !hasSmsAddress();
}
public @NonNull GroupId requireGroupId() { public @NonNull GroupId requireGroupId() {
GroupId resolved = resolving ? resolve().groupId : groupId; GroupId resolved = resolving ? resolve().groupId : groupId;