Store the server timestamp for a message.

This commit is contained in:
Greyson Parrelli
2020-04-13 19:02:50 -04:00
parent 00b6a222bd
commit f12a9b9ac7
23 changed files with 315 additions and 214 deletions

View File

@@ -176,14 +176,14 @@ public class SignalServiceCipher {
SessionCipher sessionCipher = new SessionCipher(signalProtocolStore, sourceAddress);
paddedMessage = sessionCipher.decrypt(new PreKeySignalMessage(ciphertext));
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), false);
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerTimestamp(), false);
sessionVersion = sessionCipher.getSessionVersion();
} else if (envelope.isSignalMessage()) {
SignalProtocolAddress sourceAddress = getPreferredProtocolAddress(signalProtocolStore, envelope.getSourceAddress(), envelope.getSourceDevice());
SessionCipher sessionCipher = new SessionCipher(signalProtocolStore, sourceAddress);
paddedMessage = sessionCipher.decrypt(new SignalMessage(ciphertext));
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), false);
metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerTimestamp(), false);
sessionVersion = sessionCipher.getSessionVersion();
} else if (envelope.isUnidentifiedSender()) {
SealedSessionCipher sealedSessionCipher = new SealedSessionCipher(signalProtocolStore, localAddress.getUuid().orNull(), localAddress.getNumber().orNull(), 1);
@@ -192,7 +192,7 @@ public class SignalServiceCipher {
SignalProtocolAddress protocolAddress = getPreferredProtocolAddress(signalProtocolStore, resultAddress, result.getDeviceId());
paddedMessage = result.getPaddedMessage();
metadata = new SignalServiceMetadata(resultAddress, result.getDeviceId(), envelope.getTimestamp(), true);
metadata = new SignalServiceMetadata(resultAddress, result.getDeviceId(), envelope.getTimestamp(), envelope.getServerTimestamp(), true);
sessionVersion = sealedSessionCipher.getSessionVersion(protocolAddress);
} else {
throw new InvalidMetadataMessageException("Unknown type: " + envelope.getType());

View File

@@ -58,6 +58,7 @@ public final class SignalServiceContent {
private final SignalServiceAddress sender;
private final int senderDevice;
private final long timestamp;
private final long serverTimestamp;
private final boolean needsReceipt;
private final SignalServiceContentProto serializedState;
@@ -67,10 +68,11 @@ public final class SignalServiceContent {
private final Optional<SignalServiceReceiptMessage> readMessage;
private final Optional<SignalServiceTypingMessage> typingMessage;
private SignalServiceContent(SignalServiceDataMessage message, SignalServiceAddress sender, int senderDevice, long timestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
private SignalServiceContent(SignalServiceDataMessage message, SignalServiceAddress sender, int senderDevice, long timestamp, long serverTimestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.serverTimestamp = serverTimestamp;
this.needsReceipt = needsReceipt;
this.serializedState = serializedState;
@@ -81,10 +83,11 @@ public final class SignalServiceContent {
this.typingMessage = Optional.absent();
}
private SignalServiceContent(SignalServiceSyncMessage synchronizeMessage, SignalServiceAddress sender, int senderDevice, long timestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
private SignalServiceContent(SignalServiceSyncMessage synchronizeMessage, SignalServiceAddress sender, int senderDevice, long timestamp, long serverTimestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.serverTimestamp = serverTimestamp;
this.needsReceipt = needsReceipt;
this.serializedState = serializedState;
@@ -95,10 +98,11 @@ public final class SignalServiceContent {
this.typingMessage = Optional.absent();
}
private SignalServiceContent(SignalServiceCallMessage callMessage, SignalServiceAddress sender, int senderDevice, long timestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
private SignalServiceContent(SignalServiceCallMessage callMessage, SignalServiceAddress sender, int senderDevice, long timestamp, long serverTimestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.serverTimestamp = serverTimestamp;
this.needsReceipt = needsReceipt;
this.serializedState = serializedState;
@@ -109,10 +113,11 @@ public final class SignalServiceContent {
this.typingMessage = Optional.absent();
}
private SignalServiceContent(SignalServiceReceiptMessage receiptMessage, SignalServiceAddress sender, int senderDevice, long timestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
private SignalServiceContent(SignalServiceReceiptMessage receiptMessage, SignalServiceAddress sender, int senderDevice, long timestamp, long serverTimestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.serverTimestamp = serverTimestamp;
this.needsReceipt = needsReceipt;
this.serializedState = serializedState;
@@ -123,10 +128,11 @@ public final class SignalServiceContent {
this.typingMessage = Optional.absent();
}
private SignalServiceContent(SignalServiceTypingMessage typingMessage, SignalServiceAddress sender, int senderDevice, long timestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
private SignalServiceContent(SignalServiceTypingMessage typingMessage, SignalServiceAddress sender, int senderDevice, long timestamp, long serverTimestamp, boolean needsReceipt, SignalServiceContentProto serializedState) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.serverTimestamp = serverTimestamp;
this.needsReceipt = needsReceipt;
this.serializedState = serializedState;
@@ -169,6 +175,10 @@ public final class SignalServiceContent {
return timestamp;
}
public long getServerTimestamp() {
return serverTimestamp;
}
public boolean isNeedsReceipt() {
return needsReceipt;
}
@@ -206,6 +216,7 @@ public final class SignalServiceContent {
metadata.getSender(),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
metadata.isNeedsReceipt(),
serviceContentProto);
} else if (serviceContentProto.getDataCase() == SignalServiceContentProto.DataCase.CONTENT) {
@@ -216,6 +227,7 @@ public final class SignalServiceContent {
metadata.getSender(),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
metadata.isNeedsReceipt(),
serviceContentProto);
} else if (message.hasSyncMessage() && localAddress.matches(metadata.getSender())) {
@@ -223,6 +235,7 @@ public final class SignalServiceContent {
metadata.getSender(),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
metadata.isNeedsReceipt(),
serviceContentProto);
} else if (message.hasCallMessage()) {
@@ -230,6 +243,7 @@ public final class SignalServiceContent {
metadata.getSender(),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
metadata.isNeedsReceipt(),
serviceContentProto);
} else if (message.hasReceiptMessage()) {
@@ -237,6 +251,7 @@ public final class SignalServiceContent {
metadata.getSender(),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
metadata.isNeedsReceipt(),
serviceContentProto);
} else if (message.hasTypingMessage()) {
@@ -244,6 +259,7 @@ public final class SignalServiceContent {
metadata.getSender(),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
false,
serviceContentProto);
}

View File

@@ -6,13 +6,15 @@ public final class SignalServiceMetadata {
private final SignalServiceAddress sender;
private final int senderDevice;
private final long timestamp;
private final long serverTimestamp;
private final boolean needsReceipt;
public SignalServiceMetadata(SignalServiceAddress sender, int senderDevice, long timestamp, boolean needsReceipt) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.needsReceipt = needsReceipt;
public SignalServiceMetadata(SignalServiceAddress sender, int senderDevice, long timestamp, long serverTimestamp, boolean needsReceipt) {
this.sender = sender;
this.senderDevice = senderDevice;
this.timestamp = timestamp;
this.serverTimestamp = serverTimestamp;
this.needsReceipt = needsReceipt;
}
public SignalServiceAddress getSender() {
@@ -27,6 +29,10 @@ public final class SignalServiceMetadata {
return timestamp;
}
public long getServerTimestamp() {
return serverTimestamp;
}
public boolean isNeedsReceipt() {
return needsReceipt;
}

View File

@@ -14,13 +14,15 @@ public final class SignalServiceMetadataProtobufSerializer {
.setSenderDevice(metadata.getSenderDevice())
.setNeedsReceipt(metadata.isNeedsReceipt())
.setTimestamp(metadata.getTimestamp())
.setServerTimestamp(metadata.getServerTimestamp())
.build();
}
public static SignalServiceMetadata fromProtobuf(MetadataProto metadata) {
return new SignalServiceMetadata(SignalServiceAddressProtobufSerializer.fromProtobuf(metadata.getAddress()),
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getNeedsReceipt());
metadata.getSenderDevice(),
metadata.getTimestamp(),
metadata.getServerTimestamp(),
metadata.getNeedsReceipt());
}
}

View File

@@ -22,10 +22,11 @@ message SignalServiceContentProto {
}
message MetadataProto {
optional AddressProto address = 1;
optional int32 senderDevice = 2;
optional int64 timestamp = 3;
optional bool needsReceipt = 4;
optional AddressProto address = 1;
optional int32 senderDevice = 2;
optional int64 timestamp = 3;
optional int64 serverTimestamp = 5;
optional bool needsReceipt = 4;
}
message AddressProto {