diff --git a/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 5fb8365..7355564 100644 --- a/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -66,6 +66,7 @@ import java.util.Set; import java.util.UUID; import static org.whispersystems.signalservice.internal.push.ProvisioningProtos.ProvisionMessage; +import static org.whispersystems.signalservice.internal.push.ProvisioningProtos.ProvisioningVersion; /** * The main interface for creating, registering, and @@ -397,8 +398,15 @@ public class SignalServiceAccountManager { ProvisionMessage.Builder message = ProvisionMessage.newBuilder() .setIdentityKeyPublic(ByteString.copyFrom(identityKeyPair.getPublicKey().serialize())) .setIdentityKeyPrivate(ByteString.copyFrom(identityKeyPair.getPrivateKey().serialize())) - .setNumber(userE164) - .setProvisioningCode(code); + .setProvisioningCode(code) + .setProvisioningVersion(ProvisioningVersion.CURRENT_VALUE); + if (userE164 != null) { + message.setNumber(userE164); + } + + if (userUuid != null) { + message.setUuid(userUuid.toString()); + } if (profileKey.isPresent()) { message.setProfileKey(ByteString.copyFrom(profileKey.get())); diff --git a/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 194224b..75aebac 100644 --- a/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/java/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -53,6 +53,7 @@ import org.whispersystems.signalservice.internal.push.AttachmentUploadAttributes import org.whispersystems.signalservice.internal.push.MismatchedDevices; import org.whispersystems.signalservice.internal.push.OutgoingPushMessage; import org.whispersystems.signalservice.internal.push.OutgoingPushMessageList; +import org.whispersystems.signalservice.internal.push.ProvisioningProtos; import org.whispersystems.signalservice.internal.push.PushAttachmentData; import org.whispersystems.signalservice.internal.push.PushServiceSocket; import org.whispersystems.signalservice.internal.push.SendMessageResponse; @@ -743,6 +744,8 @@ public class SignalServiceMessageSender { configurationMessage.setLinkPreviews(configuration.getLinkPreviews().get()); } + configurationMessage.setProvisioningVersion(ProvisioningProtos.ProvisioningVersion.CURRENT_VALUE); + return container.setSyncMessage(syncMessage.setConfiguration(configurationMessage)).build().toByteArray(); } diff --git a/java/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java b/java/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java index e4a24a4..d7cc397 100644 --- a/java/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java +++ b/java/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java @@ -6,6 +6,7 @@ package org.whispersystems.signalservice.api.crypto; +import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; import org.signal.libsignal.metadata.InvalidMetadataMessageException; @@ -55,6 +56,8 @@ import org.whispersystems.signalservice.api.messages.calls.HangupMessage; import org.whispersystems.signalservice.api.messages.calls.IceUpdateMessage; import org.whispersystems.signalservice.api.messages.calls.OfferMessage; import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage; +import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage; +import org.whispersystems.signalservice.api.messages.multidevice.ConfigurationMessage; import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage; import org.whispersystems.signalservice.api.messages.multidevice.RequestMessage; import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage; @@ -450,6 +453,52 @@ public class SignalServiceCipher { return SignalServiceSyncMessage.forStickerPackOperations(operations); } + if (content.hasBlocked()) { + List numbers = content.getBlocked().getNumbersList(); + List uuids = content.getBlocked().getUuidsList(); + List addresses = new ArrayList<>(numbers.size() + uuids.size()); + List groupIds = new ArrayList<>(content.getBlocked().getGroupIdsList().size()); + + for (String e164 : numbers) { + Optional address = SignalServiceAddress.fromRaw(null, e164); + if (address.isPresent()) { + addresses.add(address.get()); + } + } + + for (String uuid : uuids) { + Optional address = SignalServiceAddress.fromRaw(uuid, null); + if (address.isPresent()) { + addresses.add(address.get()); + } + } + + for (ByteString groupId : content.getBlocked().getGroupIdsList()) { + groupIds.add(groupId.toByteArray()); + } + + return SignalServiceSyncMessage.forBlocked(new BlockedListMessage(addresses, groupIds)); + } + + if (content.hasConfiguration()) { + Boolean readReceipts = content.getConfiguration().hasReadReceipts() ? content.getConfiguration().getReadReceipts() : null; + Boolean unidentifiedDeliveryIndicators = content.getConfiguration().hasUnidentifiedDeliveryIndicators() ? content.getConfiguration().getUnidentifiedDeliveryIndicators() : null; + Boolean typingIndicators = content.getConfiguration().hasTypingIndicators() ? content.getConfiguration().getTypingIndicators() : null; + Boolean linkPreviews = content.getConfiguration().hasLinkPreviews() ? content.getConfiguration().getLinkPreviews() : null; + + return SignalServiceSyncMessage.forConfiguration(new ConfigurationMessage(Optional.fromNullable(readReceipts), + Optional.fromNullable(unidentifiedDeliveryIndicators), + Optional.fromNullable(typingIndicators), + Optional.fromNullable(linkPreviews))); + } + + if (content.hasFetchLatest() && content.getFetchLatest().hasType()) { + switch (content.getFetchLatest().getType()) { + case LOCAL_PROFILE: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.LOCAL_PROFILE); + case STORAGE_MANIFEST: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.STORAGE_MANIFEST); + } + } + return SignalServiceSyncMessage.empty(); } diff --git a/java/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java b/java/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java index 379deb0..1a6eb5d 100644 --- a/java/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java +++ b/java/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java @@ -24,6 +24,7 @@ public class SignalServiceSyncMessage { private final Optional verified; private final Optional configuration; private final Optional> stickerPackOperations; + private final Optional fetchType; private SignalServiceSyncMessage(Optional sent, Optional contacts, @@ -34,7 +35,8 @@ public class SignalServiceSyncMessage { Optional viewOnceOpen, Optional verified, Optional configuration, - Optional> stickerPackOperations) + Optional> stickerPackOperations, + Optional fetchType) { this.sent = sent; this.contacts = contacts; @@ -46,6 +48,7 @@ public class SignalServiceSyncMessage { this.verified = verified; this.configuration = configuration; this.stickerPackOperations = stickerPackOperations; + this.fetchType = fetchType; } public static SignalServiceSyncMessage forSentTranscript(SentTranscriptMessage sent) { @@ -58,7 +61,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forContacts(ContactsMessage contacts) { @@ -71,7 +75,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forGroups(SignalServiceAttachment groups) { @@ -84,7 +89,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forRequest(RequestMessage request) { @@ -97,7 +103,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forRead(List reads) { @@ -110,7 +117,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forViewOnceOpen(ViewOnceOpenMessage timerRead) { @@ -123,7 +131,8 @@ public class SignalServiceSyncMessage { Optional.of(timerRead), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forRead(ReadMessage read) { @@ -139,7 +148,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forVerified(VerifiedMessage verifiedMessage) { @@ -152,7 +162,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.of(verifiedMessage), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forBlocked(BlockedListMessage blocked) { @@ -165,7 +176,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forConfiguration(ConfigurationMessage configuration) { @@ -178,7 +190,8 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.of(configuration), - Optional.>absent()); + Optional.>absent(), + Optional.absent()); } public static SignalServiceSyncMessage forStickerPackOperations(List stickerPackOperations) { @@ -191,10 +204,11 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.of(stickerPackOperations)); + Optional.of(stickerPackOperations), + Optional.absent()); } - public static SignalServiceSyncMessage empty() { + public static SignalServiceSyncMessage forFetchLatest(FetchType fetchType) { return new SignalServiceSyncMessage(Optional.absent(), Optional.absent(), Optional.absent(), @@ -204,7 +218,22 @@ public class SignalServiceSyncMessage { Optional.absent(), Optional.absent(), Optional.absent(), - Optional.>absent()); + Optional.>absent(), + Optional.of(fetchType)); + } + + public static SignalServiceSyncMessage empty() { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent()); } public Optional getSent() { @@ -247,4 +276,12 @@ public class SignalServiceSyncMessage { return stickerPackOperations; } + public Optional getFetchType() { + return fetchType; + } + + public enum FetchType { + LOCAL_PROFILE, + STORAGE_MANIFEST + } } diff --git a/protobuf/Provisioning.proto b/protobuf/Provisioning.proto index 47fadbc..1f1e452 100644 --- a/protobuf/Provisioning.proto +++ b/protobuf/Provisioning.proto @@ -16,11 +16,21 @@ message ProvisionEnvelope { } message ProvisionMessage { - optional bytes identityKeyPublic = 1; - optional bytes identityKeyPrivate = 2; - optional string number = 3; - optional string provisioningCode = 4; - optional string userAgent = 5; - optional bytes profileKey = 6; - optional bool readReceipts = 7; + optional bytes identityKeyPublic = 1; + optional bytes identityKeyPrivate = 2; + optional string number = 3; + optional string uuid = 8; + optional string provisioningCode = 4; + optional string userAgent = 5; + optional bytes profileKey = 6; + optional bool readReceipts = 7; + optional uint32 provisioningVersion = 9; +} + +enum ProvisioningVersion { + option allow_alias = true; + + INITIAL = 0; + TABLET_SUPPORT = 1; + CURRENT = 1; } diff --git a/protobuf/SignalService.proto b/protobuf/SignalService.proto index 74b15fc..9e34b9b 100644 --- a/protobuf/SignalService.proto +++ b/protobuf/SignalService.proto @@ -291,10 +291,11 @@ message SyncMessage { } message Configuration { - optional bool readReceipts = 1; - optional bool unidentifiedDeliveryIndicators = 2; - optional bool typingIndicators = 3; - optional bool linkPreviews = 4; + optional bool readReceipts = 1; + optional bool unidentifiedDeliveryIndicators = 2; + optional bool typingIndicators = 3; + optional bool linkPreviews = 4; + optional uint32 provisioningVersion = 5; } message StickerPackOperation { @@ -314,6 +315,18 @@ message SyncMessage { optional uint64 timestamp = 2; } + + message FetchLatest { + enum Type { + UNKNOWN = 0; + LOCAL_PROFILE = 1; + STORAGE_MANIFEST = 2; + } + + optional Type type = 1; + } + + optional Sent sent = 1; optional Contacts contacts = 2; optional Groups groups = 3; @@ -325,6 +338,7 @@ message SyncMessage { optional bytes padding = 8; repeated StickerPackOperation stickerPackOperation = 10; optional ViewOnceOpen viewOnceOpen = 11; + optional FetchLatest fetchLatest = 12; } message AttachmentPointer {