Treat unregistered user during send as general failure.

This commit is contained in:
Cody Henthorne 2024-04-04 16:50:25 -04:00 committed by Greyson Parrelli
parent 2ce6ea9a2a
commit ea081e981f
12 changed files with 9 additions and 54 deletions

View file

@ -35,12 +35,6 @@ public class AlertView extends AppCompatImageView {
setVisibility(View.GONE); setVisibility(View.GONE);
} }
public void setPendingApproval() {
setVisibility(View.VISIBLE);
setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_colorOnSurfaceVariant));
setContentDescription(getContext().getString(R.string.conversation_item_sent__pending_approval_description));
}
public void setFailed() { public void setFailed() {
setVisibility(View.VISIBLE); setVisibility(View.VISIBLE);
setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_colorError)); setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_colorError));

View file

@ -315,8 +315,6 @@ public class ConversationItemFooter extends ConstraintLayout {
} }
dateView.setText(errorMsg); dateView.setText(errorMsg);
} else if (messageRecord.isPendingInsecureSmsFallback()) {
dateView.setText(R.string.ConversationItem_click_to_approve_unencrypted);
} else if (messageRecord.isRateLimited()) { } else if (messageRecord.isRateLimited()) {
dateView.setText(R.string.ConversationItem_send_paused); dateView.setText(R.string.ConversationItem_send_paused);
} else if (MessageRecordUtil.isScheduled(messageRecord)) { } else if (MessageRecordUtil.isScheduled(messageRecord)) {
@ -410,7 +408,7 @@ public class ConversationItemFooter extends ConstraintLayout {
previousMessageId = newMessageId; previousMessageId = newMessageId;
if (messageRecord.isFailed() || messageRecord.isPendingInsecureSmsFallback() || MessageRecordUtil.isScheduled(messageRecord)) { if (messageRecord.isFailed() || MessageRecordUtil.isScheduled(messageRecord)) {
deliveryStatusView.setNone(); deliveryStatusView.setNone();
return; return;
} }

View file

@ -1573,8 +1573,6 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
if (!messageRecord.isMediaPending() && messageRecord.isFailed()) { if (!messageRecord.isMediaPending() && messageRecord.isFailed()) {
alertView.setFailed(); alertView.setFailed();
} else if (messageRecord.isPendingInsecureSmsFallback()) {
alertView.setPendingApproval();
} else if (messageRecord.isRateLimited()) { } else if (messageRecord.isRateLimited()) {
alertView.setRateLimited(); alertView.setRateLimited();
} else { } else {
@ -1826,7 +1824,6 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
return batchSelected.isEmpty() && return batchSelected.isEmpty() &&
((messageRecord.isFailed() && !messageRecord.isMmsNotification()) || ((messageRecord.isFailed() && !messageRecord.isMmsNotification()) ||
(messageRecord.isRateLimited() && SignalStore.rateLimit().needsRecaptcha()) || (messageRecord.isRateLimited() && SignalStore.rateLimit().needsRecaptcha()) ||
messageRecord.isPendingInsecureSmsFallback() ||
messageRecord.isBundleKeyExchange()); messageRecord.isBundleKeyExchange());
} }
@ -1990,7 +1987,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo
private boolean isFooterVisible(@NonNull MessageRecord current, @NonNull Optional<MessageRecord> next, boolean isGroupThread) { private boolean isFooterVisible(@NonNull MessageRecord current, @NonNull Optional<MessageRecord> next, boolean isGroupThread) {
boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(next.get().getTimestamp(), current.getTimestamp()); boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(next.get().getTimestamp(), current.getTimestamp());
return forceFooter(messageRecord) || current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() || current.isPendingInsecureSmsFallback() || return forceFooter(messageRecord) || current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() ||
current.isFailed() || current.isRateLimited() || differentTimestamps || isEndOfMessageCluster(current, next, isGroupThread); current.isFailed() || current.isRateLimited() || differentTimestamps || isEndOfMessageCluster(current, next, isGroupThread);
} }

View file

@ -578,7 +578,6 @@ open class V2ConversationItemTextOnlyViewHolder<Model : MappingModel<Model>>(
when { when {
record.isFailed -> alert.setFailed() record.isFailed -> alert.setFailed()
record.isPendingInsecureSmsFallback -> alert.setPendingApproval()
record.isRateLimited -> alert.setRateLimited() record.isRateLimited -> alert.setRateLimited()
else -> alert.setNone() else -> alert.setNone()
} }
@ -645,8 +644,6 @@ open class V2ConversationItemTextOnlyViewHolder<Model : MappingModel<Model>>(
binding.footerDate.setOnClickListener { binding.footerDate.setOnClickListener {
conversationContext.clickListener.onMessageWithErrorClicked(record) conversationContext.clickListener.onMessageWithErrorClicked(record)
} }
} else if (record.isPendingInsecureSmsFallback) {
binding.footerDate.setText(R.string.ConversationItem_click_to_approve_unencrypted)
} else if (record.isRateLimited) { } else if (record.isRateLimited) {
binding.footerDate.setText(R.string.ConversationItem_send_paused) binding.footerDate.setText(R.string.ConversationItem_send_paused)
} else if (record.isScheduled()) { } else if (record.isScheduled()) {
@ -694,7 +691,7 @@ open class V2ConversationItemTextOnlyViewHolder<Model : MappingModel<Model>>(
messageId = newMessageId messageId = newMessageId
if (!record.isOutgoing || record.isFailed || record.isPendingInsecureSmsFallback || record.isScheduled()) { if (!record.isOutgoing || record.isFailed || record.isScheduled()) {
deliveryStatus.setNone() deliveryStatus.setNone()
return return
} }

View file

@ -508,9 +508,6 @@ public final class ConversationListItem extends ConstraintLayout implements Bind
} else if (thread.isFailed()) { } else if (thread.isFailed()) {
deliveryStatusIndicator.setNone(); deliveryStatusIndicator.setNone();
alertView.setFailed(); alertView.setFailed();
} else if (thread.isPendingInsecureSmsFallback()) {
deliveryStatusIndicator.setNone();
alertView.setPendingApproval();
} else { } else {
alertView.setNone(); alertView.setNone();

View file

@ -1915,12 +1915,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
} }
} }
fun markAsPendingInsecureSmsFallback(messageId: Long) {
val threadId = getThreadIdForMessage(messageId)
updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_PENDING_INSECURE_SMS_FALLBACK, Optional.of(threadId))
ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(MessageId(messageId))
}
fun markAsSending(messageId: Long) { fun markAsSending(messageId: Long) {
val threadId = getThreadIdForMessage(messageId) val threadId = getThreadIdForMessage(messageId)
updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_SENDING_TYPE, Optional.of(threadId)) updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_SENDING_TYPE, Optional.of(threadId))

View file

@ -75,6 +75,7 @@ public abstract class DisplayRecord {
return return
MessageTypes.isFailedMessageType(type) || MessageTypes.isFailedMessageType(type) ||
MessageTypes.isPendingSecureSmsFallbackType(type) || MessageTypes.isPendingSecureSmsFallbackType(type) ||
MessageTypes.isPendingInsecureSmsFallbackType(type) ||
deliveryStatus >= MessageTable.Status.STATUS_FAILED; deliveryStatus >= MessageTable.Status.STATUS_FAILED;
} }
@ -224,10 +225,6 @@ public abstract class DisplayRecord {
return hasReadReceipt; return hasReadReceipt;
} }
public boolean isPendingInsecureSmsFallback() {
return MessageTypes.isPendingInsecureSmsFallbackType(type);
}
public boolean isPaymentNotification() { public boolean isPaymentNotification() {
return MessageTypes.isPaymentsNotification(type); return MessageTypes.isPaymentsNotification(type);
} }

View file

@ -20,6 +20,7 @@ final class StatusUtil {
static boolean isFailed(long type, long deliveryStatus) { static boolean isFailed(long type, long deliveryStatus) {
return MessageTypes.isFailedMessageType(type) || return MessageTypes.isFailedMessageType(type) ||
MessageTypes.isPendingSecureSmsFallbackType(type) || MessageTypes.isPendingSecureSmsFallbackType(type) ||
MessageTypes.isPendingInsecureSmsFallbackType(type) ||
deliveryStatus >= MessageTable.Status.STATUS_FAILED; deliveryStatus >= MessageTable.Status.STATUS_FAILED;
} }

View file

@ -180,10 +180,6 @@ public final class ThreadRecord {
return hasReadReceipt; return hasReadReceipt;
} }
public boolean isPendingInsecureSmsFallback() {
return MessageTypes.isPendingInsecureSmsFallbackType(type);
}
public boolean isDelivered() { public boolean isDelivered() {
return StatusUtil.isDelivered(deliveryStatus, hasDeliveryReceipt); return StatusUtil.isDelivered(deliveryStatus, hasDeliveryReceipt);
} }

View file

@ -30,7 +30,6 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.service.ExpiringMessageManager; import org.thoughtcrime.securesms.service.ExpiringMessageManager;
import org.thoughtcrime.securesms.transport.InsecureFallbackApprovalException;
import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.thoughtcrime.securesms.util.SignalLocalMetrics;
@ -205,9 +204,9 @@ public class IndividualSendJob extends PushSendJob {
log(TAG, String.valueOf(message.getSentTimeMillis()), "Sent message: " + messageId); log(TAG, String.valueOf(message.getSentTimeMillis()), "Sent message: " + messageId);
} catch (InsecureFallbackApprovalException ifae) { } catch (UnregisteredUserException uue) {
warn(TAG, "Failure", ifae); warn(TAG, "Failure", uue);
database.markAsPendingInsecureSmsFallback(messageId); database.markAsSentFailed(messageId);
notifyMediaMessageDeliveryFailed(context, messageId); notifyMediaMessageDeliveryFailed(context, messageId);
ApplicationDependencies.getJobManager().add(new DirectoryRefreshJob(false)); ApplicationDependencies.getJobManager().add(new DirectoryRefreshJob(false));
} catch (UntrustedIdentityException uie) { } catch (UntrustedIdentityException uie) {
@ -237,7 +236,7 @@ public class IndividualSendJob extends PushSendJob {
} }
private boolean deliver(OutgoingMessage message, MessageRecord originalEditedMessage) private boolean deliver(OutgoingMessage message, MessageRecord originalEditedMessage)
throws IOException, InsecureFallbackApprovalException, UntrustedIdentityException, UndeliverableMessageException throws IOException, UnregisteredUserException, UntrustedIdentityException, UndeliverableMessageException
{ {
if (message.getThreadRecipient() == null) { if (message.getThreadRecipient() == null) {
throw new UndeliverableMessageException("No destination address."); throw new UndeliverableMessageException("No destination address.");
@ -335,9 +334,6 @@ public class IndividualSendJob extends PushSendJob {
return result.getSuccess().isUnidentified(); return result.getSuccess().isUnidentified();
} }
} catch (UnregisteredUserException e) {
warn(TAG, String.valueOf(message.getSentTimeMillis()), e);
throw new InsecureFallbackApprovalException(e);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
warn(TAG, String.valueOf(message.getSentTimeMillis()), e); warn(TAG, String.valueOf(message.getSentTimeMillis()), e);
throw new UndeliverableMessageException(e); throw new UndeliverableMessageException(e);

View file

@ -1,11 +0,0 @@
package org.thoughtcrime.securesms.transport;
public class InsecureFallbackApprovalException extends Exception {
public InsecureFallbackApprovalException(String detailMessage) {
super(detailMessage);
}
public InsecureFallbackApprovalException(Throwable e) {
super(e);
}
}

View file

@ -307,7 +307,6 @@
<string name="ConversationItem_error_network_not_delivered">Send failed</string> <string name="ConversationItem_error_network_not_delivered">Send failed</string>
<string name="ConversationItem_group_action_left">%1$s has left the group.</string> <string name="ConversationItem_group_action_left">%1$s has left the group.</string>
<string name="ConversationItem_send_paused">Send paused</string> <string name="ConversationItem_send_paused">Send paused</string>
<string name="ConversationItem_click_to_approve_unencrypted">Send failed, tap for unsecured fallback</string>
<string name="ConversationItem_click_to_approve_unencrypted_sms_dialog_title">Fallback to unencrypted SMS?</string> <string name="ConversationItem_click_to_approve_unencrypted_sms_dialog_title">Fallback to unencrypted SMS?</string>
<string name="ConversationItem_click_to_approve_unencrypted_mms_dialog_title">Fallback to unencrypted MMS?</string> <string name="ConversationItem_click_to_approve_unencrypted_mms_dialog_title">Fallback to unencrypted MMS?</string>
<string name="ConversationItem_click_to_approve_unencrypted_dialog_message">This message will <b>not</b> be encrypted because the recipient is no longer a Signal user.\n\nSend unsecured message?</string> <string name="ConversationItem_click_to_approve_unencrypted_dialog_message">This message will <b>not</b> be encrypted because the recipient is no longer a Signal user.\n\nSend unsecured message?</string>