From 08008629b366eb80d073aa39c2a7ca6dff7bcc59 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 27 Aug 2021 10:57:52 -0400 Subject: [PATCH] Fix some issues around SignalServiceAddress creation. --- .../jobs/MultiDeviceBlockedUpdateJob.java | 2 +- .../securesms/mms/MessageGroupContext.java | 3 +- .../securesms/recipients/RecipientUtil.java | 2 +- .../api/SignalServiceMessageReceiver.java | 2 +- .../api/messages/SignalServiceContent.java | 85 +++---------------- .../DeviceContactsInputStream.java | 4 +- .../multidevice/DeviceGroupsInputStream.java | 82 ------------------ .../api/push/SignalServiceAddress.java | 2 +- .../api/storage/SignalAccountRecord.java | 2 +- .../push/SignalServiceEnvelopeEntity.java | 2 +- 10 files changed, 19 insertions(+), 167 deletions(-) delete mode 100644 libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceGroupsInputStream.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java index 428082fe8a..18e26b826b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java @@ -82,7 +82,7 @@ public class MultiDeviceBlockedUpdateJob extends BaseJob { while ((recipient = reader.getNext()) != null) { if (recipient.isPushGroup()) { blockedGroups.add(recipient.requireGroupId().getDecodedId()); - } else if (recipient.isMaybeRegistered()) { + } else if (recipient.isMaybeRegistered() && (recipient.hasUuid() || recipient.hasE164())) { blockedIndividuals.add(RecipientUtil.toSignalServiceAddress(context, recipient)); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java index 3757f3c7a7..ac9e5fc69f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java @@ -132,8 +132,7 @@ public final class MessageGroupContext { return Stream.of(groupContext.getMembersList()) .map(GroupContext.Member::getE164) .withoutNulls() - .map(e164 -> new SignalServiceAddress(null, e164)) - .map(RecipientId::from) + .map(RecipientId::fromExternalPush) .filterNot(selfId::equals) .toList(); } 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 cc448bd268..ee088c607d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientUtil.java @@ -82,7 +82,7 @@ public class RecipientUtil { return Stream.of(recipients) .map(Recipient::resolve) - .map(r -> new SignalServiceAddress(r.getUuid().orNull(), r.getE164().orNull())) + .map(r -> new SignalServiceAddress(r.requireUuid(), r.getE164().orNull())) .toList(); } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java index 10c8862964..3f33231ca3 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageReceiver.java @@ -202,7 +202,7 @@ public class SignalServiceMessageReceiver { SignalServiceEnvelope envelope; if (entity.hasSource() && entity.getSourceDevice() > 0) { - SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrNull(entity.getSourceUuid()), entity.getSourceE164()); + SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrThrow(entity.getSourceUuid()), entity.getSourceE164()); envelope = new SignalServiceEnvelope(entity.getType(), Optional.of(address), entity.getSourceDevice(), diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java index 9054c3e272..37511b2793 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java @@ -505,12 +505,11 @@ public final class SignalServiceContent { SignalServiceProtos.DataMessage content) throws UnsupportedDataMessageException, InvalidMessageStructureException { - SignalServiceGroup groupInfoV1 = createGroupV1Info(content); SignalServiceGroupV2 groupInfoV2 = createGroupV2Info(content); Optional groupContext; try { - groupContext = SignalServiceGroupContext.createOptional(groupInfoV1, groupInfoV2); + groupContext = SignalServiceGroupContext.createOptional(null, groupInfoV2); } catch (InvalidMessageException e) { throw new InvalidMessageStructureException(e); } @@ -559,7 +558,8 @@ public final class SignalServiceContent { } return new SignalServiceDataMessage(metadata.getTimestamp(), - groupInfoV1, groupInfoV2, + null, + groupInfoV2, attachments, content.hasBody() ? content.getBody() : null, endSession, @@ -588,7 +588,7 @@ public final class SignalServiceContent { SignalServiceProtos.SyncMessage.Sent sentContent = content.getSent(); SignalServiceDataMessage dataMessage = createSignalServiceMessage(metadata, sentContent.getMessage()); Optional address = SignalServiceAddress.isValidAddress(sentContent.getDestinationUuid(), sentContent.getDestinationE164()) - ? Optional.of(new SignalServiceAddress(UuidUtil.parseOrNull(sentContent.getDestinationUuid()), sentContent.getDestinationE164())) + ? Optional.of(new SignalServiceAddress(UuidUtil.parseOrThrow(sentContent.getDestinationUuid()), sentContent.getDestinationE164())) : Optional.absent(); if (!address.isPresent() && !dataMessage.getGroupContext().isPresent()) { @@ -597,7 +597,7 @@ public final class SignalServiceContent { for (SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus status : sentContent.getUnidentifiedStatusList()) { if (SignalServiceAddress.isValidAddress(status.getDestinationUuid(), status.getDestinationE164())) { - SignalServiceAddress recipient = new SignalServiceAddress(UuidUtil.parseOrNull(status.getDestinationUuid()), status.getDestinationE164()); + SignalServiceAddress recipient = new SignalServiceAddress(UuidUtil.parseOrThrow(status.getDestinationUuid()), status.getDestinationE164()); unidentifiedStatuses.put(recipient, status.getUnidentified()); } else { Log.w(TAG, "Encountered an invalid UnidentifiedDeliveryStatus in a SentTranscript! Ignoring."); @@ -621,7 +621,7 @@ public final class SignalServiceContent { for (SignalServiceProtos.SyncMessage.Read read : content.getReadList()) { if (SignalServiceAddress.isValidAddress(read.getSenderUuid(), read.getSenderE164())) { - SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrNull(read.getSenderUuid()), read.getSenderE164()); + SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrThrow(read.getSenderUuid()), read.getSenderE164()); readMessages.add(new ReadMessage(address, read.getTimestamp())); } else { Log.w(TAG, "Encountered an invalid ReadMessage! Ignoring."); @@ -636,7 +636,7 @@ public final class SignalServiceContent { for (SignalServiceProtos.SyncMessage.Viewed viewed : content.getViewedList()) { if (SignalServiceAddress.isValidAddress(viewed.getSenderUuid(), viewed.getSenderE164())) { - SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrNull(viewed.getSenderUuid()), viewed.getSenderE164()); + SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrThrow(viewed.getSenderUuid()), viewed.getSenderE164()); viewedMessages.add(new ViewedMessage(address, viewed.getTimestamp())); } else { Log.w(TAG, "Encountered an invalid ReadMessage! Ignoring."); @@ -648,7 +648,7 @@ public final class SignalServiceContent { if (content.hasViewOnceOpen()) { if (SignalServiceAddress.isValidAddress(content.getViewOnceOpen().getSenderUuid(), content.getViewOnceOpen().getSenderE164())) { - SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrNull(content.getViewOnceOpen().getSenderUuid()), content.getViewOnceOpen().getSenderE164()); + SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrThrow(content.getViewOnceOpen().getSenderUuid()), content.getViewOnceOpen().getSenderE164()); ViewOnceOpenMessage timerRead = new ViewOnceOpenMessage(address, content.getViewOnceOpen().getTimestamp()); return SignalServiceSyncMessage.forViewOnceOpen(timerRead); } else { @@ -660,7 +660,7 @@ public final class SignalServiceContent { if (SignalServiceAddress.isValidAddress(content.getVerified().getDestinationUuid(), content.getVerified().getDestinationE164())) { try { SignalServiceProtos.Verified verified = content.getVerified(); - SignalServiceAddress destination = new SignalServiceAddress(UuidUtil.parseOrNull(verified.getDestinationUuid()), verified.getDestinationE164()); + SignalServiceAddress destination = new SignalServiceAddress(UuidUtil.parseOrThrow(verified.getDestinationUuid()), verified.getDestinationE164()); IdentityKey identityKey = new IdentityKey(verified.getIdentityKey().toByteArray(), 0); VerifiedMessage.VerifiedState verifiedState; @@ -898,7 +898,7 @@ public final class SignalServiceContent { } if (SignalServiceAddress.isValidAddress(content.getQuote().getAuthorUuid(), content.getQuote().getAuthorE164())) { - SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrNull(content.getQuote().getAuthorUuid()), content.getQuote().getAuthorE164()); + SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrThrow(content.getQuote().getAuthorUuid()), content.getQuote().getAuthorE164()); return new SignalServiceDataMessage.Quote(content.getQuote().getId(), address, @@ -1162,71 +1162,6 @@ public final class SignalServiceContent { } - private static SignalServiceGroup createGroupV1Info(SignalServiceProtos.DataMessage content) throws InvalidMessageStructureException { - if (!content.hasGroup()) return null; - - SignalServiceGroup.Type type; - - switch (content.getGroup().getType()) { - case DELIVER: type = SignalServiceGroup.Type.DELIVER; break; - case UPDATE: type = SignalServiceGroup.Type.UPDATE; break; - case QUIT: type = SignalServiceGroup.Type.QUIT; break; - case REQUEST_INFO: type = SignalServiceGroup.Type.REQUEST_INFO; break; - default: type = SignalServiceGroup.Type.UNKNOWN; break; - } - - if (content.getGroup().getType() != DELIVER) { - String name = null; - List members = null; - SignalServiceAttachmentPointer avatar = null; - - if (content.getGroup().hasName()) { - name = content.getGroup().getName(); - } - - if (content.getGroup().getMembersCount() > 0) { - members = new ArrayList<>(content.getGroup().getMembersCount()); - - for (SignalServiceProtos.GroupContext.Member member : content.getGroup().getMembersList()) { - if (SignalServiceAddress.isValidAddress(null, member.getE164())) { - members.add(new SignalServiceAddress(null, member.getE164())); - } else { - throw new InvalidMessageStructureException("GroupContext.Member had no address!"); - } - } - } else if (content.getGroup().getMembersE164Count() > 0) { - members = new ArrayList<>(content.getGroup().getMembersE164Count()); - - for (String member : content.getGroup().getMembersE164List()) { - members.add(new SignalServiceAddress(null, member)); - } - } - - if (content.getGroup().hasAvatar()) { - SignalServiceProtos.AttachmentPointer pointer = content.getGroup().getAvatar(); - - avatar = new SignalServiceAttachmentPointer(pointer.getCdnNumber(), - SignalServiceAttachmentRemoteId.from(pointer), - pointer.getContentType(), - pointer.getKey().toByteArray(), - Optional.of(pointer.getSize()), - Optional.absent(), 0, 0, - Optional.fromNullable(pointer.hasDigest() ? pointer.getDigest().toByteArray() : null), - Optional.absent(), - false, - false, - false, - Optional.absent(), - Optional.absent(), - pointer.hasUploadTimestamp() ? pointer.getUploadTimestamp() : 0); - } - - return new SignalServiceGroup(type, content.getGroup().getId().toByteArray(), name, members, avatar); - } - - return new SignalServiceGroup(content.getGroup().getId().toByteArray()); - } - private static SignalServiceGroupV2 createGroupV2Info(SignalServiceProtos.DataMessage content) throws InvalidMessageStructureException { if (!content.hasGroupV2()) return null; diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java index 57cf637576..55b95db3ba 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceContactsInputStream.java @@ -41,7 +41,7 @@ public class DeviceContactsInputStream extends ChunkedInputStream { throw new IOException("Missing contact address!"); } - SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrNull(details.getUuid()), details.getNumber()); + SignalServiceAddress address = new SignalServiceAddress(UuidUtil.parseOrThrow(details.getUuid()), details.getNumber()); Optional name = Optional.fromNullable(details.getName()); Optional avatar = Optional.absent(); Optional color = details.hasColor() ? Optional.of(details.getColor()) : Optional.absent(); @@ -66,7 +66,7 @@ public class DeviceContactsInputStream extends ChunkedInputStream { throw new InvalidMessageException("Missing Verified address!"); } IdentityKey identityKey = new IdentityKey(details.getVerified().getIdentityKey().toByteArray(), 0); - SignalServiceAddress destination = new SignalServiceAddress(UuidUtil.parseOrNull(details.getVerified().getDestinationUuid()), + SignalServiceAddress destination = new SignalServiceAddress(UuidUtil.parseOrThrow(details.getVerified().getDestinationUuid()), details.getVerified().getDestinationE164()); VerifiedMessage.VerifiedState state; diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceGroupsInputStream.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceGroupsInputStream.java deleted file mode 100644 index de228f2d18..0000000000 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/DeviceGroupsInputStream.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2014-2018 Open Whisper Systems - * - * Licensed according to the LICENSE file in this repository. - */ - -package org.whispersystems.signalservice.api.messages.multidevice; - -import org.whispersystems.libsignal.util.guava.Optional; -import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import org.whispersystems.signalservice.api.util.UuidUtil; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupDetails; -import org.whispersystems.signalservice.internal.util.Util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -public class DeviceGroupsInputStream extends ChunkedInputStream{ - - public DeviceGroupsInputStream(InputStream in) { - super(in); - } - - public DeviceGroup read() throws IOException { - long detailsLength = readRawVarint32(); - byte[] detailsSerialized = new byte[(int)detailsLength]; - Util.readFully(in, detailsSerialized); - - GroupDetails details = GroupDetails.parseFrom(detailsSerialized); - - if (!details.hasId()) { - throw new IOException("ID missing on group record!"); - } - - byte[] id = details.getId().toByteArray(); - Optional name = Optional.fromNullable(details.getName()); - List members = details.getMembersList(); - Optional avatar = Optional.absent(); - boolean active = details.getActive(); - Optional expirationTimer = Optional.absent(); - Optional color = Optional.fromNullable(details.getColor()); - boolean blocked = details.getBlocked(); - Optional inboxPosition = Optional.absent(); - boolean archived = false; - - if (details.hasAvatar()) { - long avatarLength = details.getAvatar().getLength(); - InputStream avatarStream = new ChunkedInputStream.LimitedInputStream(in, avatarLength); - String avatarContentType = details.getAvatar().getContentType(); - - avatar = Optional.of(new SignalServiceAttachmentStream(avatarStream, avatarContentType, avatarLength, Optional.absent(), false, false, false, null, null)); - } - - if (details.hasExpireTimer() && details.getExpireTimer() > 0) { - expirationTimer = Optional.of(details.getExpireTimer()); - } - - List addressMembers = new ArrayList<>(members.size()); - for (GroupDetails.Member member : members) { - if (SignalServiceAddress.isValidAddress(null, member.getE164())) { - addressMembers.add(new SignalServiceAddress(null, member.getE164())); - } else { - throw new IOException("Missing group member address!"); - } - } - - if (details.hasInboxPosition()) { - inboxPosition = Optional.of(details.getInboxPosition()); - } - - if (details.hasArchived()) { - archived = details.getArchived(); - } - - return new DeviceGroup(id, name, addressMembers, avatar, active, expirationTimer, color, blocked, inboxPosition, archived); - } - -} diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/SignalServiceAddress.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/SignalServiceAddress.java index 79ebde4fae..09ddd1d571 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/SignalServiceAddress.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/SignalServiceAddress.java @@ -69,7 +69,7 @@ public class SignalServiceAddress { public static Optional fromRaw(String rawUuid, String e164) { if (isValidAddress(rawUuid, e164)) { - return Optional.of(new SignalServiceAddress(UuidUtil.parseOrNull(rawUuid), e164)); + return Optional.of(new SignalServiceAddress(UuidUtil.parseOrThrow(rawUuid), e164)); } else { return Optional.absent(); } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalAccountRecord.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalAccountRecord.java index 340bf53a37..1b3337aa3e 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalAccountRecord.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/storage/SignalAccountRecord.java @@ -271,7 +271,7 @@ public final class SignalAccountRecord implements SignalRecord { static PinnedConversation fromRemote(AccountRecord.PinnedConversation remote) { if (remote.hasContact()) { - return forContact(new SignalServiceAddress(UuidUtil.parseOrNull(remote.getContact().getUuid()), remote.getContact().getE164())); + return forContact(new SignalServiceAddress(UuidUtil.parseOrThrow(remote.getContact().getUuid()), remote.getContact().getE164())); } else if (!remote.getLegacyGroupId().isEmpty()) { return forGroupV1(remote.getLegacyGroupId().toByteArray()); } else if (!remote.getGroupMasterKey().isEmpty()) { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/SignalServiceEnvelopeEntity.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/SignalServiceEnvelopeEntity.java index bfe4b0a5f4..b4b48e1e14 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/SignalServiceEnvelopeEntity.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/SignalServiceEnvelopeEntity.java @@ -57,7 +57,7 @@ public class SignalServiceEnvelopeEntity { } public boolean hasSource() { - return source != null || sourceUuid != null; + return sourceUuid != null; } public int getSourceDevice() {