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

fork-5.53.8
Greyson Parrelli 2021-05-03 13:45:53 -04:00 zatwierdzone przez Cody Henthorne
rodzic 129effd0ec
commit add65cf592
2 zmienionych plików z 23 dodań i 12 usunięć

Wyświetl plik

@ -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 boolean sendPush = (isSecureText && !forceSms) || recipient.get().isUuidOnly();
final long thread = this.threadId; 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("");

Wyświetl plik

@ -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;