Add urgency flag to message sends.

This commit is contained in:
Cody Henthorne
2022-08-01 13:06:51 -04:00
committed by Greyson Parrelli
parent c7cd261641
commit dc04c8ed98
38 changed files with 256 additions and 139 deletions

View File

@@ -225,7 +225,8 @@ public class SignalServiceMessageReceiver {
entity.getServerTimestamp(),
messageResult.getServerDeliveredTimestamp(),
entity.getServerUuid(),
entity.getDestinationUuid());
entity.getDestinationUuid(),
entity.isUrgent());
} else {
envelope = new SignalServiceEnvelope(entity.getType(),
entity.getTimestamp(),
@@ -234,7 +235,8 @@ public class SignalServiceMessageReceiver {
entity.getServerTimestamp(),
messageResult.getServerDeliveredTimestamp(),
entity.getServerUuid(),
entity.getDestinationUuid());
entity.getDestinationUuid(),
entity.isUrgent());
}
callback.onMessage(envelope);

View File

@@ -203,7 +203,7 @@ public class SignalServiceMessageSender {
Content content = createReceiptContent(message);
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.IMPLICIT, Optional.empty());
return sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), message.getWhen(), envelopeContent, false, null);
return sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), message.getWhen(), envelopeContent, false, null, false);
}
/**
@@ -219,7 +219,7 @@ public class SignalServiceMessageSender {
PlaintextContent content = new PlaintextContent(errorMessage);
EnvelopeContent envelopeContent = EnvelopeContent.plaintext(content, groupId);
sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null);
sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null, false);
}
/**
@@ -234,7 +234,7 @@ public class SignalServiceMessageSender {
Content content = createTypingContent(message);
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.IMPLICIT, Optional.empty());
sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), message.getTimestamp(), envelopeContent, true, null, cancelationSignal);
sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), message.getTimestamp(), envelopeContent, true, null, cancelationSignal, false);
}
/**
@@ -247,7 +247,7 @@ public class SignalServiceMessageSender {
throws IOException, UntrustedIdentityException, InvalidKeyException, NoSessionException, InvalidRegistrationIdException
{
Content content = createTypingContent(message);
sendGroupMessage(distributionId, recipients, unidentifiedAccess, message.getTimestamp(), content, ContentHint.IMPLICIT, message.getGroupId(), true, SenderKeyGroupEvents.EMPTY);
sendGroupMessage(distributionId, recipients, unidentifiedAccess, message.getTimestamp(), content, ContentHint.IMPLICIT, message.getGroupId(), true, SenderKeyGroupEvents.EMPTY, false);
}
public List<SendMessageResult> sendStory(List<SignalServiceAddress> recipients,
@@ -260,7 +260,7 @@ public class SignalServiceMessageSender {
{
Content content = createStoryContent(message);
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.RESENDABLE, Optional.empty());
List<SendMessageResult> sendMessageResults = sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, null, null);
List<SendMessageResult> sendMessageResults = sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, null, null, false);
if (store.isMultiDevice()) {
SignalServiceSyncMessage syncMessage = createSelfSendSyncMessageForStory(message, timestamp, isRecipientUpdate, manifest);
@@ -284,7 +284,7 @@ public class SignalServiceMessageSender {
throws IOException, UntrustedIdentityException, InvalidKeyException, NoSessionException, InvalidRegistrationIdException
{
Content content = createStoryContent(message);
List<SendMessageResult> sendMessageResults = sendGroupMessage(distributionId, recipients, unidentifiedAccess, timestamp, content, ContentHint.RESENDABLE, groupId, false, SenderKeyGroupEvents.EMPTY);
List<SendMessageResult> sendMessageResults = sendGroupMessage(distributionId, recipients, unidentifiedAccess, timestamp, content, ContentHint.RESENDABLE, groupId, false, SenderKeyGroupEvents.EMPTY, false);
if (store.isMultiDevice()) {
SignalServiceSyncMessage syncMessage = createSelfSendSyncMessageForStory(message, timestamp, isRecipientUpdate, manifest);
@@ -310,7 +310,7 @@ public class SignalServiceMessageSender {
Content content = createCallContent(message);
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.DEFAULT, Optional.empty());
sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null);
sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null, message.isUrgent());
}
public List<SendMessageResult> sendCallMessage(List<SignalServiceAddress> recipients,
@@ -321,7 +321,7 @@ public class SignalServiceMessageSender {
Content content = createCallContent(message);
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.DEFAULT, Optional.empty());
return sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null, null);
return sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null, null, message.isUrgent());
}
public List<SendMessageResult> sendCallMessage(DistributionId distributionId,
@@ -331,7 +331,7 @@ public class SignalServiceMessageSender {
throws IOException, UntrustedIdentityException, InvalidKeyException, NoSessionException, InvalidRegistrationIdException
{
Content content = createCallContent(message);
return sendGroupMessage(distributionId, recipients, unidentifiedAccess, message.getTimestamp().get(), content, ContentHint.IMPLICIT, message.getGroupId(), false, SenderKeyGroupEvents.EMPTY);
return sendGroupMessage(distributionId, recipients, unidentifiedAccess, message.getTimestamp().get(), content, ContentHint.IMPLICIT, message.getGroupId(), false, SenderKeyGroupEvents.EMPTY, message.isUrgent());
}
/**
@@ -360,7 +360,8 @@ public class SignalServiceMessageSender {
Optional<UnidentifiedAccessPair> unidentifiedAccess,
ContentHint contentHint,
SignalServiceDataMessage message,
IndividualSendEvents sendEvents)
IndividualSendEvents sendEvents,
boolean urgent)
throws UntrustedIdentityException, IOException
{
Log.d(TAG, "[" + message.getTimestamp() + "] Sending a data message.");
@@ -371,7 +372,7 @@ public class SignalServiceMessageSender {
sendEvents.onMessageEncrypted();
long timestamp = message.getTimestamp();
SendMessageResult result = sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, null);
SendMessageResult result = sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, null, urgent);
sendEvents.onMessageSent();
@@ -379,7 +380,7 @@ public class SignalServiceMessageSender {
Content syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.of(recipient), timestamp, Collections.singletonList(result), false, Collections.emptySet());
EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty());
sendMessage(localAddress, Optional.empty(), timestamp, syncMessageContent, false, null);
sendMessage(localAddress, Optional.empty(), timestamp, syncMessageContent, false, null, false);
}
sendEvents.onSyncMessageSent();
@@ -403,7 +404,8 @@ public class SignalServiceMessageSender {
List<SignalServiceAddress> recipients,
List<Optional<UnidentifiedAccessPair>> unidentifiedAccess,
SenderKeyDistributionMessage message,
Optional<byte[]> groupId)
Optional<byte[]> groupId,
boolean urgent)
throws IOException
{
ByteString distributionBytes = ByteString.copyFrom(message.serialize());
@@ -412,7 +414,7 @@ public class SignalServiceMessageSender {
long timestamp = System.currentTimeMillis();
Log.d(TAG, "[" + timestamp + "] Sending SKDM to " + recipients.size() + " recipients for DistributionId " + distributionId);
return sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, null, null);
return sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, null, null, urgent);
}
/**
@@ -430,13 +432,14 @@ public class SignalServiceMessageSender {
long timestamp,
Content content,
ContentHint contentHint,
Optional<byte[]> groupId)
Optional<byte[]> groupId,
boolean urgent)
throws UntrustedIdentityException, IOException
{
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, contentHint, groupId);
Optional<UnidentifiedAccess> access = unidentifiedAccess.isPresent() ? unidentifiedAccess.get().getTargetUnidentifiedAccess() : Optional.empty();
return sendMessage(address, access, timestamp, envelopeContent, false, null);
return sendMessage(address, access, timestamp, envelopeContent, false, null, urgent);
}
/**
@@ -448,14 +451,15 @@ public class SignalServiceMessageSender {
boolean isRecipientUpdate,
ContentHint contentHint,
SignalServiceDataMessage message,
SenderKeyGroupEvents sendEvents)
SenderKeyGroupEvents sendEvents,
boolean urgent)
throws IOException, UntrustedIdentityException, NoSessionException, InvalidKeyException, InvalidRegistrationIdException
{
Log.d(TAG, "[" + message.getTimestamp() + "] Sending a group data message to " + recipients.size() + " recipients using DistributionId " + distributionId);
Content content = createMessageContent(message);
Optional<byte[]> groupId = message.getGroupId();
List<SendMessageResult> results = sendGroupMessage(distributionId, recipients, unidentifiedAccess, message.getTimestamp(), content, contentHint, groupId, false, sendEvents);
List<SendMessageResult> results = sendGroupMessage(distributionId, recipients, unidentifiedAccess, message.getTimestamp(), content, contentHint, groupId, false, sendEvents, urgent);
sendEvents.onMessageSent();
@@ -463,7 +467,7 @@ public class SignalServiceMessageSender {
Content syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.empty(), message.getTimestamp(), results, isRecipientUpdate, Collections.emptySet());
EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty());
sendMessage(localAddress, Optional.empty(), message.getTimestamp(), syncMessageContent, false, null);
sendMessage(localAddress, Optional.empty(), message.getTimestamp(), syncMessageContent, false, null, false);
}
sendEvents.onSyncMessageSent();
@@ -484,7 +488,8 @@ public class SignalServiceMessageSender {
SignalServiceDataMessage message,
LegacyGroupEvents sendEvents,
PartialSendCompleteListener partialListener,
CancelationSignal cancelationSignal)
CancelationSignal cancelationSignal,
boolean urgent)
throws IOException, UntrustedIdentityException
{
Log.d(TAG, "[" + message.getTimestamp() + "] Sending a data message to " + recipients.size() + " recipients.");
@@ -492,7 +497,7 @@ public class SignalServiceMessageSender {
Content content = createMessageContent(message);
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, contentHint, message.getGroupId());
long timestamp = message.getTimestamp();
List<SendMessageResult> results = sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, partialListener, cancelationSignal);
List<SendMessageResult> results = sendMessage(recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, envelopeContent, false, partialListener, cancelationSignal, urgent);
boolean needsSyncInResults = false;
sendEvents.onMessageSent();
@@ -513,7 +518,7 @@ public class SignalServiceMessageSender {
Content syncMessage = createMultiDeviceSentTranscriptContent(content, recipient, timestamp, results, isRecipientUpdate, Collections.emptySet());
EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty());
sendMessage(localAddress, Optional.empty(), timestamp, syncMessageContent, false, null);
sendMessage(localAddress, Optional.empty(), timestamp, syncMessageContent, false, null, false);
}
sendEvents.onSyncMessageSent();
@@ -531,14 +536,15 @@ public class SignalServiceMessageSender {
throws IOException, UntrustedIdentityException
{
Content content;
boolean urgent = false;
if (message.getContacts().isPresent()) {
content = createMultiDeviceContactsContent(message.getContacts().get().getContactsStream().asStream(),
message.getContacts().get().isComplete());
content = createMultiDeviceContactsContent(message.getContacts().get().getContactsStream().asStream(), message.getContacts().get().isComplete());
} else if (message.getGroups().isPresent()) {
content = createMultiDeviceGroupsContent(message.getGroups().get().asStream());
} else if (message.getRead().isPresent()) {
content = createMultiDeviceReadContent(message.getRead().get());
urgent = true;
} else if (message.getViewed().isPresent()) {
content = createMultiDeviceViewedContent(message.getViewed().get());
} else if (message.getViewOnceOpen().isPresent()) {
@@ -563,6 +569,7 @@ public class SignalServiceMessageSender {
return sendVerifiedSyncMessage(message.getVerified().get());
} else if (message.getRequest().isPresent()) {
content = createRequestContent(message.getRequest().get().getRequest());
urgent = message.getRequest().get().isUrgent();
} else if (message.getPniIdentity().isPresent()) {
content = createPniIdentityContent(message.getPniIdentity().get());
} else {
@@ -574,7 +581,7 @@ public class SignalServiceMessageSender {
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.IMPLICIT, Optional.empty());
return sendMessage(localAddress, Optional.empty(), timestamp, envelopeContent, false, null);
return sendMessage(localAddress, Optional.empty(), timestamp, envelopeContent, false, null, urgent);
}
public void setSoTimeoutMillis(long soTimeoutMillis) {
@@ -711,13 +718,13 @@ public class SignalServiceMessageSender {
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.IMPLICIT, Optional.empty());
SendMessageResult result = sendMessage(message.getDestination(), Optional.empty(), message.getTimestamp(), envelopeContent, false, null);
SendMessageResult result = sendMessage(message.getDestination(), Optional.empty(), message.getTimestamp(), envelopeContent, false, null, false);
if (result.getSuccess().isNeedsSync()) {
Content syncMessage = createMultiDeviceVerifiedContent(message, nullMessage.toByteArray());
EnvelopeContent syncMessageContent = EnvelopeContent.encrypted(syncMessage, ContentHint.IMPLICIT, Optional.empty());
sendMessage(localAddress, Optional.empty(), message.getTimestamp(), syncMessageContent, false, null);
sendMessage(localAddress, Optional.empty(), message.getTimestamp(), syncMessageContent, false, null, false);
}
return result;
@@ -741,7 +748,7 @@ public class SignalServiceMessageSender {
EnvelopeContent envelopeContent = EnvelopeContent.encrypted(content, ContentHint.IMPLICIT, Optional.empty());
return sendMessage(address, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null);
return sendMessage(address, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), envelopeContent, false, null, false);
}
private Content createTypingContent(SignalServiceTypingMessage message) {
@@ -1616,7 +1623,8 @@ public class SignalServiceMessageSender {
EnvelopeContent content,
boolean online,
PartialSendCompleteListener partialListener,
CancelationSignal cancelationSignal)
CancelationSignal cancelationSignal,
boolean urgent)
throws IOException
{
Log.d(TAG, "[" + timestamp + "] Sending to " + recipients.size() + " recipients.");
@@ -1631,7 +1639,7 @@ public class SignalServiceMessageSender {
SignalServiceAddress recipient = recipientIterator.next();
Optional<UnidentifiedAccess> access = unidentifiedAccessIterator.next();
futureResults.add(executor.submit(() -> {
SendMessageResult result = sendMessage(recipient, access, timestamp, content, online, cancelationSignal);
SendMessageResult result = sendMessage(recipient, access, timestamp, content, online, cancelationSignal, urgent);
if (partialListener != null) {
partialListener.onPartialSendComplete(result);
}
@@ -1698,7 +1706,8 @@ public class SignalServiceMessageSender {
long timestamp,
EnvelopeContent content,
boolean online,
CancelationSignal cancelationSignal)
CancelationSignal cancelationSignal,
boolean urgent)
throws UntrustedIdentityException, IOException
{
enforceMaxContentSize(content);
@@ -1711,7 +1720,7 @@ public class SignalServiceMessageSender {
}
try {
OutgoingPushMessageList messages = getEncryptedMessages(socket, recipient, unidentifiedAccess, timestamp, content, online);
OutgoingPushMessageList messages = getEncryptedMessages(socket, recipient, unidentifiedAccess, timestamp, content, online, urgent);
if (content.getContent().isPresent() && content.getContent().get().getSyncMessage() != null && content.getContent().get().getSyncMessage().hasSent()) {
Log.d(TAG, "[sendMessage][" + timestamp + "] Sending a sent sync message to devices: " + messages.getDevices());
@@ -1796,7 +1805,8 @@ public class SignalServiceMessageSender {
ContentHint contentHint,
Optional<byte[]> groupId,
boolean online,
SenderKeyGroupEvents sendEvents)
SenderKeyGroupEvents sendEvents,
boolean urgent)
throws IOException, UntrustedIdentityException, NoSessionException, InvalidKeyException, InvalidRegistrationIdException
{
if (recipients.isEmpty()) {
@@ -1833,7 +1843,7 @@ public class SignalServiceMessageSender {
})
.collect(Collectors.toList());
List<SendMessageResult> results = sendSenderKeyDistributionMessage(distributionId, needsSenderKey, access, message, groupId);
List<SendMessageResult> results = sendSenderKeyDistributionMessage(distributionId, needsSenderKey, access, message, groupId, urgent);
List<SignalServiceAddress> successes = results.stream()
.filter(SendMessageResult::isSuccess)
@@ -1895,7 +1905,7 @@ public class SignalServiceMessageSender {
try {
try {
SendGroupMessageResponse response = new MessagingService.SendResponseProcessor<>(messagingService.sendToGroup(ciphertext, joinedUnidentifiedAccess, timestamp, online).blockingGet()).getResultOrThrow();
SendGroupMessageResponse response = new MessagingService.SendResponseProcessor<>(messagingService.sendToGroup(ciphertext, joinedUnidentifiedAccess, timestamp, online, urgent).blockingGet()).getResultOrThrow();
return transformGroupResponseToMessageResults(targetInfo.devices, response, content);
} catch (InvalidUnidentifiedAccessHeaderException | NotFoundException | GroupMismatchedDevicesException | GroupStaleDevicesException e) {
// Non-technical failures shouldn't be retried with socket
@@ -1906,7 +1916,7 @@ public class SignalServiceMessageSender {
Log.w(TAG, "[sendGroupMessage][" + timestamp + "] Pipe failed, falling back... (" + e.getClass().getSimpleName() + ": " + e.getMessage() + ")");
}
SendGroupMessageResponse response = socket.sendGroupMessage(ciphertext, joinedUnidentifiedAccess, timestamp, online);
SendGroupMessageResponse response = socket.sendGroupMessage(ciphertext, joinedUnidentifiedAccess, timestamp, online, urgent);
return transformGroupResponseToMessageResults(targetInfo.devices, response, content);
} catch (GroupMismatchedDevicesException e) {
Log.w(TAG, "[sendGroupMessage][" + timestamp + "] Handling mismatched devices. (" + e.getMessage() + ")");
@@ -2070,7 +2080,8 @@ public class SignalServiceMessageSender {
Optional<UnidentifiedAccess> unidentifiedAccess,
long timestamp,
EnvelopeContent plaintext,
boolean online)
boolean online,
boolean urgent)
throws IOException, InvalidKeyException, UntrustedIdentityException
{
List<OutgoingPushMessage> messages = new LinkedList<>();
@@ -2091,7 +2102,7 @@ public class SignalServiceMessageSender {
}
}
return new OutgoingPushMessageList(recipient.getIdentifier(), timestamp, messages, online);
return new OutgoingPushMessageList(recipient.getIdentifier(), timestamp, messages, online, urgent);
}
private OutgoingPushMessage getEncryptedMessage(PushServiceSocket socket,

View File

@@ -65,14 +65,16 @@ public class SignalServiceEnvelope {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
String uuid,
String destinationUuid)
String destinationUuid,
boolean urgent)
{
Envelope.Builder builder = Envelope.newBuilder()
.setType(Envelope.Type.valueOf(type))
.setSourceDevice(senderDevice)
.setTimestamp(timestamp)
.setServerTimestamp(serverReceivedTimestamp)
.setDestinationUuid(destinationUuid);
.setDestinationUuid(destinationUuid)
.setUrgent(urgent);
if (sender.isPresent()) {
builder.setSourceUuid(sender.get().getServiceId().toString());
@@ -100,13 +102,15 @@ public class SignalServiceEnvelope {
long serverReceivedTimestamp,
long serverDeliveredTimestamp,
String uuid,
String destinationUuid)
String destinationUuid,
boolean urgent)
{
Envelope.Builder builder = Envelope.newBuilder()
.setType(Envelope.Type.valueOf(type))
.setTimestamp(timestamp)
.setServerTimestamp(serverReceivedTimestamp)
.setDestinationUuid(destinationUuid);
.setDestinationUuid(destinationUuid)
.setUrgent(urgent);
if (uuid != null) {
builder.setServerGuid(uuid);
@@ -273,6 +277,9 @@ public class SignalServiceEnvelope {
return envelope.getDestinationUuid();
}
public boolean isUrgent() {
return envelope.getUrgent();
}
private SignalServiceEnvelopeProto.Builder serializeToProto() {
SignalServiceEnvelopeProto.Builder builder = SignalServiceEnvelopeProto.newBuilder()
@@ -280,7 +287,8 @@ public class SignalServiceEnvelope {
.setDeviceId(getSourceDevice())
.setTimestamp(getTimestamp())
.setServerReceivedTimestamp(getServerReceivedTimestamp())
.setServerDeliveredTimestamp(getServerDeliveredTimestamp());
.setServerDeliveredTimestamp(getServerDeliveredTimestamp())
.setUrgent(isUrgent());
if (getSourceUuid().isPresent()) {
builder.setSourceUuid(getSourceUuid().get());
@@ -330,6 +338,7 @@ public class SignalServiceEnvelope {
proto.getServerReceivedTimestamp(),
proto.getServerDeliveredTimestamp(),
proto.getServerGuid(),
proto.getDestinationUuid());
proto.getDestinationUuid(),
proto.getUrgent());
}
}

View File

@@ -198,4 +198,10 @@ public class SignalServiceCallMessage {
public Optional<Long> getTimestamp() {
return timestamp;
}
public boolean isUrgent() {
return offerMessage.isPresent() ||
hangupMessage.isPresent() ||
opaqueMessage.map(m -> m.getUrgency() == OpaqueMessage.Urgency.HANDLE_IMMEDIATELY).orElse(false);
}
}

View File

@@ -47,4 +47,8 @@ public class RequestMessage {
public boolean isPniIdentityRequest() {
return request.getType() == Request.Type.PNI_IDENTITY;
}
public boolean isUrgent() {
return isContactsRequest() || isKeysRequest() || isPniIdentityRequest();
}
}

View File

@@ -72,13 +72,13 @@ public class MessagingService {
.onErrorReturn(ServiceResponse::forUnknownError);
}
public Single<ServiceResponse<SendGroupMessageResponse>> sendToGroup(byte[] body, byte[] joinedUnidentifiedAccess, long timestamp, boolean online) {
public Single<ServiceResponse<SendGroupMessageResponse>> sendToGroup(byte[] body, byte[] joinedUnidentifiedAccess, long timestamp, boolean online, boolean urgent) {
List<String> headers = new LinkedList<String>() {{
add("content-type:application/vnd.signal-messenger.mrm");
add("Unidentified-Access-Key:" + Base64.encodeBytes(joinedUnidentifiedAccess));
}};
String path = String.format(Locale.US, "/v1/messages/multi_recipient?ts=%s&online=%s", timestamp, online);
String path = String.format(Locale.US, "/v1/messages/multi_recipient?ts=%s&online=%s&urgent=%s", timestamp, online, urgent);
WebSocketRequestMessage requestMessage = WebSocketRequestMessage.newBuilder()
.setId(new SecureRandom().nextLong())

View File

@@ -26,15 +26,20 @@ public class OutgoingPushMessageList {
@JsonProperty
private boolean online;
@JsonProperty
private boolean urgent;
public OutgoingPushMessageList(String destination,
long timestamp,
List<OutgoingPushMessage> messages,
boolean online)
boolean online,
boolean urgent)
{
this.timestamp = timestamp;
this.destination = destination;
this.messages = messages;
this.online = online;
this.urgent = urgent;
}
public String getDestination() {
@@ -53,6 +58,10 @@ public class OutgoingPushMessageList {
return online;
}
public boolean isUrgent() {
return urgent;
}
@JsonIgnore
public List<Integer> getDevices() {
return messages.stream().map(OutgoingPushMessage::getDestinationDeviceId).collect(Collectors.toList());

View File

@@ -212,7 +212,7 @@ public class PushServiceSocket {
private static final String DIRECTORY_AUTH_PATH = "/v1/directory/auth";
private static final String MESSAGE_PATH = "/v1/messages/%s";
private static final String GROUP_MESSAGE_PATH = "/v1/messages/multi_recipient?ts=%s&online=%s";
private static final String GROUP_MESSAGE_PATH = "/v1/messages/multi_recipient?ts=%s&online=%s&urgent=%s";
private static final String SENDER_ACK_MESSAGE_PATH = "/v1/messages/%s/%d";
private static final String UUID_ACK_MESSAGE_PATH = "/v1/messages/uuid/%s";
private static final String ATTACHMENT_V2_PATH = "/v2/attachments/form/upload";
@@ -463,12 +463,12 @@ public class PushServiceSocket {
return JsonUtil.fromJson(responseText, SenderCertificate.class).getCertificate();
}
public SendGroupMessageResponse sendGroupMessage(byte[] body, byte[] joinedUnidentifiedAccess, long timestamp, boolean online)
public SendGroupMessageResponse sendGroupMessage(byte[] body, byte[] joinedUnidentifiedAccess, long timestamp, boolean online, boolean urgent)
throws IOException
{
ServiceConnectionHolder connectionHolder = (ServiceConnectionHolder) getRandom(serviceClients, random);
String path = String.format(Locale.US, GROUP_MESSAGE_PATH, timestamp, online);
String path = String.format(Locale.US, GROUP_MESSAGE_PATH, timestamp, online, urgent);
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(String.format("%s%s", connectionHolder.getUrl(), path));

View File

@@ -37,6 +37,9 @@ public class SignalServiceEnvelopeEntity {
@JsonProperty
private String guid;
@JsonProperty
private Boolean urgent;
public SignalServiceEnvelopeEntity() {}
public int getType() {
@@ -86,4 +89,8 @@ public class SignalServiceEnvelopeEntity {
public String getDestinationUuid() {
return destinationUuid;
}
public boolean isUrgent() {
return urgent == null || urgent;
}
}

View File

@@ -33,6 +33,7 @@ message SignalServiceEnvelopeProto {
optional int64 serverDeliveredTimestamp = 9;
optional string serverGuid = 10;
optional string destinationUuid = 11;
optional bool urgent = 12 [default = true];
}
message MetadataProto {

View File

@@ -33,7 +33,8 @@ message Envelope {
optional bytes content = 8; // Contains an encrypted Content
optional string serverGuid = 9;
optional uint64 serverTimestamp = 10;
// NEXT ID: 14
optional bool urgent = 14 [default = true];
// NEXT ID: 15
}
message Content {