Add support for isRecipientUpdate flag

This commit is contained in:
Greyson Parrelli 2019-04-11 15:55:58 -04:00
parent 1a46e215d0
commit 1d55a87ade
5 changed files with 156 additions and 54 deletions

View File

@ -221,7 +221,7 @@ public class SignalServiceMessageSender {
SendMessageResult result = sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, content, false);
if ((result.getSuccess() != null && result.getSuccess().isNeedsSync()) || (unidentifiedAccess.isPresent() && isMultiDevice.get())) {
byte[] syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.of(recipient), timestamp, Collections.singletonList(result));
byte[] syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.of(recipient), timestamp, Collections.singletonList(result), false);
sendMessage(localAddress, Optional.<UnidentifiedAccess>absent(), timestamp, syncMessage, false);
}
@ -245,6 +245,7 @@ public class SignalServiceMessageSender {
*/
public List<SendMessageResult> sendMessage(List<SignalServiceAddress> recipients,
List<Optional<UnidentifiedAccessPair>> unidentifiedAccess,
boolean isRecipientUpdate,
SignalServiceDataMessage message)
throws IOException, UntrustedIdentityException
{
@ -261,7 +262,7 @@ public class SignalServiceMessageSender {
}
if (needsSyncInResults || (isMultiDevice.get())) {
byte[] syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.<SignalServiceAddress>absent(), timestamp, results);
byte[] syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.<SignalServiceAddress>absent(), timestamp, results, isRecipientUpdate);
sendMessage(localAddress, Optional.<UnidentifiedAccess>absent(), timestamp, syncMessage, false);
}
@ -574,11 +575,13 @@ public class SignalServiceMessageSender {
return createMultiDeviceSentTranscriptContent(createMessageContent(transcript.getMessage()),
Optional.of(address),
transcript.getTimestamp(),
Collections.singletonList(result));
Collections.singletonList(result),
false);
}
private byte[] createMultiDeviceSentTranscriptContent(byte[] content, Optional<SignalServiceAddress> recipient,
long timestamp, List<SendMessageResult> sendMessageResults)
long timestamp, List<SendMessageResult> sendMessageResults,
boolean isRecipientUpdate)
{
try {
Content.Builder container = Content.newBuilder();
@ -605,6 +608,8 @@ public class SignalServiceMessageSender {
sentMessage.setExpirationStartTimestamp(System.currentTimeMillis());
}
sentMessage.setIsRecipientUpdate(isRecipientUpdate);
return container.setSyncMessage(syncMessage.setSent(sentMessage)).build().toByteArray();
} catch (InvalidProtocolBufferException e) {
throw new AssertionError(e);

View File

@ -314,7 +314,8 @@ public class SignalServiceCipher {
sentContent.getTimestamp(),
createSignalServiceMessage(metadata, sentContent.getMessage()),
sentContent.getExpirationStartTimestamp(),
unidentifiedStatuses));
unidentifiedStatuses,
sentContent.getIsRecipientUpdate()));
}
if (content.hasRequest()) {

View File

@ -12,6 +12,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class SentTranscriptMessage {
@ -20,15 +21,18 @@ public class SentTranscriptMessage {
private final long expirationStartTimestamp;
private final SignalServiceDataMessage message;
private final Map<String, Boolean> unidentifiedStatus;
private final boolean isRecipientUpdate;
public SentTranscriptMessage(String destination, long timestamp, SignalServiceDataMessage message,
long expirationStartTimestamp, Map<String, Boolean> unidentifiedStatus)
long expirationStartTimestamp, Map<String, Boolean> unidentifiedStatus,
boolean isRecipientUpdate)
{
this.destination = Optional.of(destination);
this.timestamp = timestamp;
this.message = message;
this.expirationStartTimestamp = expirationStartTimestamp;
this.unidentifiedStatus = new HashMap<>(unidentifiedStatus);
this.isRecipientUpdate = isRecipientUpdate;
}
public SentTranscriptMessage(long timestamp, SignalServiceDataMessage message) {
@ -37,6 +41,7 @@ public class SentTranscriptMessage {
this.message = message;
this.expirationStartTimestamp = 0;
this.unidentifiedStatus = Collections.emptyMap();
this.isRecipientUpdate = false;
}
public Optional<String> getDestination() {
@ -61,4 +66,12 @@ public class SentTranscriptMessage {
}
return false;
}
public Set<String> getRecipients() {
return unidentifiedStatus.keySet();
}
public boolean isRecipientUpdate() {
return isRecipientUpdate;
}
}

View File

@ -23204,6 +23204,16 @@ public final class SignalServiceProtos {
*/
org.whispersystems.signalservice.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder getUnidentifiedStatusOrBuilder(
int index);
// optional bool isRecipientUpdate = 6 [default = false];
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
boolean hasIsRecipientUpdate();
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
boolean getIsRecipientUpdate();
}
/**
* Protobuf type {@code signalservice.SyncMessage.Sent}
@ -23292,6 +23302,11 @@ public final class SignalServiceProtos {
unidentifiedStatus_.add(input.readMessage(org.whispersystems.signalservice.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.PARSER, extensionRegistry));
break;
}
case 48: {
bitField0_ |= 0x00000010;
isRecipientUpdate_ = input.readBool();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
@ -24020,12 +24035,29 @@ public final class SignalServiceProtos {
return unidentifiedStatus_.get(index);
}
// optional bool isRecipientUpdate = 6 [default = false];
public static final int ISRECIPIENTUPDATE_FIELD_NUMBER = 6;
private boolean isRecipientUpdate_;
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
public boolean hasIsRecipientUpdate() {
return ((bitField0_ & 0x00000010) == 0x00000010);
}
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
public boolean getIsRecipientUpdate() {
return isRecipientUpdate_;
}
private void initFields() {
destination_ = "";
timestamp_ = 0L;
message_ = org.whispersystems.signalservice.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance();
expirationStartTimestamp_ = 0L;
unidentifiedStatus_ = java.util.Collections.emptyList();
isRecipientUpdate_ = false;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@ -24054,6 +24086,9 @@ public final class SignalServiceProtos {
for (int i = 0; i < unidentifiedStatus_.size(); i++) {
output.writeMessage(5, unidentifiedStatus_.get(i));
}
if (((bitField0_ & 0x00000010) == 0x00000010)) {
output.writeBool(6, isRecipientUpdate_);
}
getUnknownFields().writeTo(output);
}
@ -24083,6 +24118,10 @@ public final class SignalServiceProtos {
size += com.google.protobuf.CodedOutputStream
.computeMessageSize(5, unidentifiedStatus_.get(i));
}
if (((bitField0_ & 0x00000010) == 0x00000010)) {
size += com.google.protobuf.CodedOutputStream
.computeBoolSize(6, isRecipientUpdate_);
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@ -24219,6 +24258,8 @@ public final class SignalServiceProtos {
} else {
unidentifiedStatusBuilder_.clear();
}
isRecipientUpdate_ = false;
bitField0_ = (bitField0_ & ~0x00000020);
return this;
}
@ -24276,6 +24317,10 @@ public final class SignalServiceProtos {
} else {
result.unidentifiedStatus_ = unidentifiedStatusBuilder_.build();
}
if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
to_bitField0_ |= 0x00000010;
}
result.isRecipientUpdate_ = isRecipientUpdate_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@ -24332,6 +24377,9 @@ public final class SignalServiceProtos {
}
}
}
if (other.hasIsRecipientUpdate()) {
setIsRecipientUpdate(other.getIsRecipientUpdate());
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@ -24856,6 +24904,39 @@ public final class SignalServiceProtos {
return unidentifiedStatusBuilder_;
}
// optional bool isRecipientUpdate = 6 [default = false];
private boolean isRecipientUpdate_ ;
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
public boolean hasIsRecipientUpdate() {
return ((bitField0_ & 0x00000020) == 0x00000020);
}
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
public boolean getIsRecipientUpdate() {
return isRecipientUpdate_;
}
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
public Builder setIsRecipientUpdate(boolean value) {
bitField0_ |= 0x00000020;
isRecipientUpdate_ = value;
onChanged();
return this;
}
/**
* <code>optional bool isRecipientUpdate = 6 [default = false];</code>
*/
public Builder clearIsRecipientUpdate() {
bitField0_ = (bitField0_ & ~0x00000020);
isRecipientUpdate_ = false;
onChanged();
return this;
}
// @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Sent)
}
@ -37854,7 +37935,7 @@ public final class SignalServiceProtos {
"\001(\014\022,\n\005state\030\003 \001(\0162\035.signalservice.Verif" +
"ied.State\022\023\n\013nullMessage\030\004 \001(\014\"2\n\005State\022",
"\013\n\007DEFAULT\020\000\022\014\n\010VERIFIED\020\001\022\016\n\nUNVERIFIED" +
"\020\002\"\304\013\n\013SyncMessage\022-\n\004sent\030\001 \001(\0132\037.signa" +
"\020\002\"\346\013\n\013SyncMessage\022-\n\004sent\030\001 \001(\0132\037.signa" +
"lservice.SyncMessage.Sent\0225\n\010contacts\030\002 " +
"\001(\0132#.signalservice.SyncMessage.Contacts" +
"\0221\n\006groups\030\003 \001(\0132!.signalservice.SyncMes" +
@ -37867,56 +37948,57 @@ public final class SignalServiceProtos {
"ervice.SyncMessage.Configuration\022\017\n\007padd" +
"ing\030\010 \001(\014\022M\n\024stickerPackOperation\030\n \003(\0132" +
"/.signalservice.SyncMessage.StickerPackO" +
"peration\032\236\002\n\004Sent\022\023\n\013destination\030\001 \001(\t\022\021" +
"peration\032\300\002\n\004Sent\022\023\n\013destination\030\001 \001(\t\022\021" +
"\n\ttimestamp\030\002 \001(\004\022+\n\007message\030\003 \001(\0132\032.sig" +
"nalservice.DataMessage\022 \n\030expirationStar" +
"tTimestamp\030\004 \001(\004\022V\n\022unidentifiedStatus\030\005" +
" \003(\0132:.signalservice.SyncMessage.Sent.Un" +
"identifiedDeliveryStatus\032G\n\032Unidentified",
"DeliveryStatus\022\023\n\013destination\030\001 \001(\t\022\024\n\014u" +
"nidentified\030\002 \001(\010\032S\n\010Contacts\022.\n\004blob\030\001 " +
"\001(\0132 .signalservice.AttachmentPointer\022\027\n" +
"\010complete\030\002 \001(\010:\005false\0328\n\006Groups\022.\n\004blob" +
"\030\001 \001(\0132 .signalservice.AttachmentPointer" +
"\032,\n\007Blocked\022\017\n\007numbers\030\001 \003(\t\022\020\n\010groupIds" +
"\030\002 \003(\014\032\217\001\n\007Request\0225\n\004type\030\001 \001(\0162\'.signa" +
"lservice.SyncMessage.Request.Type\"M\n\004Typ" +
"e\022\013\n\007UNKNOWN\020\000\022\014\n\010CONTACTS\020\001\022\n\n\006GROUPS\020\002" +
"\022\013\n\007BLOCKED\020\003\022\021\n\rCONFIGURATION\020\004\032)\n\004Read",
"\022\016\n\006sender\030\001 \001(\t\022\021\n\ttimestamp\030\002 \001(\004\032}\n\rC" +
"onfiguration\022\024\n\014readReceipts\030\001 \001(\010\022&\n\036un" +
"identifiedDeliveryIndicators\030\002 \001(\010\022\030\n\020ty" +
"pingIndicators\030\003 \001(\010\022\024\n\014linkPreviews\030\004 \001" +
"(\010\032\234\001\n\024StickerPackOperation\022\016\n\006packId\030\001 " +
"\001(\014\022\017\n\007packKey\030\002 \001(\014\022B\n\004type\030\003 \001(\01624.sig" +
"nalservice.SyncMessage.StickerPackOperat" +
"ion.Type\"\037\n\004Type\022\013\n\007INSTALL\020\000\022\n\n\006REMOVE\020" +
"\001\"\337\001\n\021AttachmentPointer\022\n\n\002id\030\001 \001(\006\022\023\n\013c" +
"ontentType\030\002 \001(\t\022\013\n\003key\030\003 \001(\014\022\014\n\004size\030\004 ",
"\001(\r\022\021\n\tthumbnail\030\005 \001(\014\022\016\n\006digest\030\006 \001(\014\022\020" +
"\n\010fileName\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r\022\r\n\005width" +
"\030\t \001(\r\022\016\n\006height\030\n \001(\r\022\017\n\007caption\030\013 \001(\t\"" +
"\032\n\005Flags\022\021\n\rVOICE_MESSAGE\020\001\"\345\001\n\014GroupCon" +
"text\022\n\n\002id\030\001 \001(\014\022.\n\004type\030\002 \001(\0162 .signals" +
"ervice.GroupContext.Type\022\014\n\004name\030\003 \001(\t\022\017" +
"\n\007members\030\004 \003(\t\0220\n\006avatar\030\005 \001(\0132 .signal" +
"service.AttachmentPointer\"H\n\004Type\022\013\n\007UNK" +
"NOWN\020\000\022\n\n\006UPDATE\020\001\022\013\n\007DELIVER\020\002\022\010\n\004QUIT\020" +
"\003\022\020\n\014REQUEST_INFO\020\004\"\207\002\n\016ContactDetails\022\016",
"\n\006number\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\0224\n\006avatar\030\003" +
" \001(\0132$.signalservice.ContactDetails.Avat" +
"ar\022\r\n\005color\030\004 \001(\t\022)\n\010verified\030\005 \001(\0132\027.si" +
"gnalservice.Verified\022\022\n\nprofileKey\030\006 \001(\014" +
"\022\017\n\007blocked\030\007 \001(\010\022\023\n\013expireTimer\030\010 \001(\r\032-" +
"\n\006Avatar\022\023\n\013contentType\030\001 \001(\t\022\016\n\006length\030" +
"\002 \001(\r\"\347\001\n\014GroupDetails\022\n\n\002id\030\001 \001(\014\022\014\n\004na" +
"me\030\002 \001(\t\022\017\n\007members\030\003 \003(\t\0222\n\006avatar\030\004 \001(" +
"\0132\".signalservice.GroupDetails.Avatar\022\024\n" +
"\006active\030\005 \001(\010:\004true\022\023\n\013expireTimer\030\006 \001(\r",
"\022\r\n\005color\030\007 \001(\t\022\017\n\007blocked\030\010 \001(\010\032-\n\006Avat" +
"ar\022\023\n\013contentType\030\001 \001(\t\022\016\n\006length\030\002 \001(\rB" +
"E\n.org.whispersystems.signalservice.inte" +
"rnal.pushB\023SignalServiceProtos"
"identifiedDeliveryStatus\022 \n\021isRecipientU",
"pdate\030\006 \001(\010:\005false\032G\n\032UnidentifiedDelive" +
"ryStatus\022\023\n\013destination\030\001 \001(\t\022\024\n\014unident" +
"ified\030\002 \001(\010\032S\n\010Contacts\022.\n\004blob\030\001 \001(\0132 ." +
"signalservice.AttachmentPointer\022\027\n\010compl" +
"ete\030\002 \001(\010:\005false\0328\n\006Groups\022.\n\004blob\030\001 \001(\013" +
"2 .signalservice.AttachmentPointer\032,\n\007Bl" +
"ocked\022\017\n\007numbers\030\001 \003(\t\022\020\n\010groupIds\030\002 \003(\014" +
"\032\217\001\n\007Request\0225\n\004type\030\001 \001(\0162\'.signalservi" +
"ce.SyncMessage.Request.Type\"M\n\004Type\022\013\n\007U" +
"NKNOWN\020\000\022\014\n\010CONTACTS\020\001\022\n\n\006GROUPS\020\002\022\013\n\007BL",
"OCKED\020\003\022\021\n\rCONFIGURATION\020\004\032)\n\004Read\022\016\n\006se" +
"nder\030\001 \001(\t\022\021\n\ttimestamp\030\002 \001(\004\032}\n\rConfigu" +
"ration\022\024\n\014readReceipts\030\001 \001(\010\022&\n\036unidenti" +
"fiedDeliveryIndicators\030\002 \001(\010\022\030\n\020typingIn" +
"dicators\030\003 \001(\010\022\024\n\014linkPreviews\030\004 \001(\010\032\234\001\n" +
"\024StickerPackOperation\022\016\n\006packId\030\001 \001(\014\022\017\n" +
"\007packKey\030\002 \001(\014\022B\n\004type\030\003 \001(\01624.signalser" +
"vice.SyncMessage.StickerPackOperation.Ty" +
"pe\"\037\n\004Type\022\013\n\007INSTALL\020\000\022\n\n\006REMOVE\020\001\"\337\001\n\021" +
"AttachmentPointer\022\n\n\002id\030\001 \001(\006\022\023\n\013content",
"Type\030\002 \001(\t\022\013\n\003key\030\003 \001(\014\022\014\n\004size\030\004 \001(\r\022\021\n" +
"\tthumbnail\030\005 \001(\014\022\016\n\006digest\030\006 \001(\014\022\020\n\010file" +
"Name\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r\022\r\n\005width\030\t \001(\r" +
"\022\016\n\006height\030\n \001(\r\022\017\n\007caption\030\013 \001(\t\"\032\n\005Fla" +
"gs\022\021\n\rVOICE_MESSAGE\020\001\"\345\001\n\014GroupContext\022\n" +
"\n\002id\030\001 \001(\014\022.\n\004type\030\002 \001(\0162 .signalservice" +
".GroupContext.Type\022\014\n\004name\030\003 \001(\t\022\017\n\007memb" +
"ers\030\004 \003(\t\0220\n\006avatar\030\005 \001(\0132 .signalservic" +
"e.AttachmentPointer\"H\n\004Type\022\013\n\007UNKNOWN\020\000" +
"\022\n\n\006UPDATE\020\001\022\013\n\007DELIVER\020\002\022\010\n\004QUIT\020\003\022\020\n\014R",
"EQUEST_INFO\020\004\"\207\002\n\016ContactDetails\022\016\n\006numb" +
"er\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\0224\n\006avatar\030\003 \001(\0132$" +
".signalservice.ContactDetails.Avatar\022\r\n\005" +
"color\030\004 \001(\t\022)\n\010verified\030\005 \001(\0132\027.signalse" +
"rvice.Verified\022\022\n\nprofileKey\030\006 \001(\014\022\017\n\007bl" +
"ocked\030\007 \001(\010\022\023\n\013expireTimer\030\010 \001(\r\032-\n\006Avat" +
"ar\022\023\n\013contentType\030\001 \001(\t\022\016\n\006length\030\002 \001(\r\"" +
"\347\001\n\014GroupDetails\022\n\n\002id\030\001 \001(\014\022\014\n\004name\030\002 \001" +
"(\t\022\017\n\007members\030\003 \003(\t\0222\n\006avatar\030\004 \001(\0132\".si" +
"gnalservice.GroupDetails.Avatar\022\024\n\006activ",
"e\030\005 \001(\010:\004true\022\023\n\013expireTimer\030\006 \001(\r\022\r\n\005co" +
"lor\030\007 \001(\t\022\017\n\007blocked\030\010 \001(\010\032-\n\006Avatar\022\023\n\013" +
"contentType\030\001 \001(\t\022\016\n\006length\030\002 \001(\rBE\n.org" +
".whispersystems.signalservice.internal.p" +
"ushB\023SignalServiceProtos"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@ -38072,7 +38154,7 @@ public final class SignalServiceProtos {
internal_static_signalservice_SyncMessage_Sent_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_signalservice_SyncMessage_Sent_descriptor,
new java.lang.String[] { "Destination", "Timestamp", "Message", "ExpirationStartTimestamp", "UnidentifiedStatus", });
new java.lang.String[] { "Destination", "Timestamp", "Message", "ExpirationStartTimestamp", "UnidentifiedStatus", "IsRecipientUpdate", });
internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor =
internal_static_signalservice_SyncMessage_Sent_descriptor.getNestedTypes().get(0);
internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_fieldAccessorTable = new

View File

@ -236,6 +236,7 @@ message SyncMessage {
optional DataMessage message = 3;
optional uint64 expirationStartTimestamp = 4;
repeated UnidentifiedDeliveryStatus unidentifiedStatus = 5;
optional bool isRecipientUpdate = 6 [default = false];
}
message Contacts {