From 3f7b73cf5efee46f3c962fdfb1dbc34a909321de Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 9 Oct 2025 13:32:06 -0300 Subject: [PATCH] Require ACI for ReadMessage sender field. --- .../securesms/jobs/MultiDeviceReadUpdateJob.java | 9 +++++++-- .../signalservice/api/SignalServiceMessageSender.java | 2 +- .../api/messages/multidevice/ReadMessage.java | 8 ++++---- .../whispersystems/signalservice/api/push/ServiceId.kt | 3 +-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java index 86079a928b..7ba4cd7c89 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java @@ -20,11 +20,11 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.util.JsonUtils; -import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; +import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; @@ -116,7 +116,12 @@ public class MultiDeviceReadUpdateJob extends BaseJob { for (SerializableSyncMessageId messageId : messageIds) { Recipient recipient = Recipient.resolved(RecipientId.from(messageId.recipientId)); if (!recipient.isGroup() && !recipient.isDistributionList() && recipient.isMaybeRegistered() && (recipient.getHasServiceId() || recipient.getHasE164())) { - readMessages.add(new ReadMessage(RecipientUtil.getOrFetchServiceId(context, recipient), messageId.timestamp)); + ServiceId senderAci = RecipientUtil.getOrFetchServiceId(context, recipient); + if (senderAci instanceof ServiceId.ACI) { + readMessages.add(new ReadMessage((ServiceId.ACI) senderAci, messageId.timestamp)); + } else { + Log.w(TAG, "Failed to add ReadMessage for sender without an ACI! { recipientId: " + messageId.recipientId + ", timestamp: " + messageId.timestamp + " }"); + } } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 272d51658b..e5cdc15c08 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -1459,7 +1459,7 @@ public class SignalServiceMessageSender { readMessages.stream() .map(readMessage -> new SyncMessage.Read.Builder() .timestamp(readMessage.getTimestamp()) - .senderAci(readMessage.getSender().toString()) + .senderAci(readMessage.getSenderAci().toString()) .build()) .collect(Collectors.toList()) ); diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/ReadMessage.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/ReadMessage.java index bacba361ee..ae9089e5c9 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/ReadMessage.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/ReadMessage.java @@ -10,10 +10,10 @@ import org.whispersystems.signalservice.api.push.ServiceId; public class ReadMessage { - private final ServiceId sender; - private final long timestamp; + private final ServiceId.ACI sender; + private final long timestamp; - public ReadMessage(ServiceId sender, long timestamp) { + public ReadMessage(ServiceId.ACI sender, long timestamp) { this.sender = sender; this.timestamp = timestamp; } @@ -22,7 +22,7 @@ public class ReadMessage { return timestamp; } - public ServiceId getSender() { + public ServiceId.ACI getSenderAci() { return sender; } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/ServiceId.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/ServiceId.kt index d5b594b284..aa6f098a6f 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/ServiceId.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/push/ServiceId.kt @@ -5,8 +5,7 @@ import okio.ByteString.Companion.toByteString import org.signal.libsignal.protocol.ServiceId.InvalidServiceIdException import org.signal.libsignal.protocol.SignalProtocolAddress import org.signal.libsignal.protocol.logging.Log -import org.whispersystems.signalservice.api.push.ServiceId.ACI -import org.whispersystems.signalservice.api.push.ServiceId.PNI +import org.whispersystems.signalservice.api.push.ServiceId.Companion.parseOrThrow import org.whispersystems.signalservice.api.util.UuidUtil import org.whispersystems.signalservice.api.util.toByteArray import java.util.UUID