Support additional sync behavior for linked devices.

This commit is contained in:
Greyson Parrelli 2019-11-08 15:05:30 -05:00
parent d07175fb76
commit a88d6a6533
6 changed files with 148 additions and 27 deletions

View File

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

View File

@ -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();
}

View File

@ -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<String> numbers = content.getBlocked().getNumbersList();
List<String> uuids = content.getBlocked().getUuidsList();
List<SignalServiceAddress> addresses = new ArrayList<>(numbers.size() + uuids.size());
List<byte[]> groupIds = new ArrayList<>(content.getBlocked().getGroupIdsList().size());
for (String e164 : numbers) {
Optional<SignalServiceAddress> address = SignalServiceAddress.fromRaw(null, e164);
if (address.isPresent()) {
addresses.add(address.get());
}
}
for (String uuid : uuids) {
Optional<SignalServiceAddress> 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();
}

View File

@ -24,6 +24,7 @@ public class SignalServiceSyncMessage {
private final Optional<VerifiedMessage> verified;
private final Optional<ConfigurationMessage> configuration;
private final Optional<List<StickerPackOperationMessage>> stickerPackOperations;
private final Optional<FetchType> fetchType;
private SignalServiceSyncMessage(Optional<SentTranscriptMessage> sent,
Optional<ContactsMessage> contacts,
@ -34,7 +35,8 @@ public class SignalServiceSyncMessage {
Optional<ViewOnceOpenMessage> viewOnceOpen,
Optional<VerifiedMessage> verified,
Optional<ConfigurationMessage> configuration,
Optional<List<StickerPackOperationMessage>> stickerPackOperations)
Optional<List<StickerPackOperationMessage>> stickerPackOperations,
Optional<FetchType> 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.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forContacts(ContactsMessage contacts) {
@ -71,7 +75,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forGroups(SignalServiceAttachment groups) {
@ -84,7 +89,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forRequest(RequestMessage request) {
@ -97,7 +103,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forRead(List<ReadMessage> reads) {
@ -110,7 +117,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forViewOnceOpen(ViewOnceOpenMessage timerRead) {
@ -123,7 +131,8 @@ public class SignalServiceSyncMessage {
Optional.of(timerRead),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forRead(ReadMessage read) {
@ -139,7 +148,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forVerified(VerifiedMessage verifiedMessage) {
@ -152,7 +162,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.of(verifiedMessage),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forBlocked(BlockedListMessage blocked) {
@ -165,7 +176,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forConfiguration(ConfigurationMessage configuration) {
@ -178,7 +190,8 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.of(configuration),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage forStickerPackOperations(List<StickerPackOperationMessage> stickerPackOperations) {
@ -191,10 +204,11 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.of(stickerPackOperations));
Optional.of(stickerPackOperations),
Optional.<FetchType>absent());
}
public static SignalServiceSyncMessage empty() {
public static SignalServiceSyncMessage forFetchLatest(FetchType fetchType) {
return new SignalServiceSyncMessage(Optional.<SentTranscriptMessage>absent(),
Optional.<ContactsMessage>absent(),
Optional.<SignalServiceAttachment>absent(),
@ -204,7 +218,22 @@ public class SignalServiceSyncMessage {
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent());
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.of(fetchType));
}
public static SignalServiceSyncMessage empty() {
return new SignalServiceSyncMessage(Optional.<SentTranscriptMessage>absent(),
Optional.<ContactsMessage>absent(),
Optional.<SignalServiceAttachment>absent(),
Optional.<BlockedListMessage>absent(),
Optional.<RequestMessage>absent(),
Optional.<List<ReadMessage>>absent(),
Optional.<ViewOnceOpenMessage>absent(),
Optional.<VerifiedMessage>absent(),
Optional.<ConfigurationMessage>absent(),
Optional.<List<StickerPackOperationMessage>>absent(),
Optional.<FetchType>absent());
}
public Optional<SentTranscriptMessage> getSent() {
@ -247,4 +276,12 @@ public class SignalServiceSyncMessage {
return stickerPackOperations;
}
public Optional<FetchType> getFetchType() {
return fetchType;
}
public enum FetchType {
LOCAL_PROFILE,
STORAGE_MANIFEST
}
}

View File

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

View File

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