Allow sender to specify whether msg should trigger APN fallback

// FREEBIE
This commit is contained in:
Moxie Marlinspike 2016-11-20 09:32:03 -08:00
parent 3c9963065d
commit 856e5eca4c
7 changed files with 21 additions and 16 deletions

View File

@ -217,7 +217,7 @@ public class MessageController {
messageBuilder.setRelay(source.getRelay().get());
}
pushSender.sendMessage(destinationAccount, destinationDevice, messageBuilder.build());
pushSender.sendMessage(destinationAccount, destinationDevice, messageBuilder.build(), incomingMessage.isSilent());
} catch (NotPushRegisteredException e) {
if (destinationDevice.isMaster()) throw new NoSuchUserException(e);
else logger.debug("Not registered", e);

View File

@ -45,6 +45,9 @@ public class IncomingMessage {
@JsonProperty
private long timestamp; // deprecated
@JsonProperty
private boolean silent = false;
public String getDestination() {
return destination;
@ -73,4 +76,8 @@ public class IncomingMessage {
public String getContent() {
return content;
}
public boolean isSilent() {
return silent;
}
}

View File

@ -68,7 +68,7 @@ public class PushSender implements Managed {
});
}
public void sendMessage(final Account account, final Device device, final Envelope message)
public void sendMessage(final Account account, final Device device, final Envelope message, final boolean silent)
throws NotPushRegisteredException
{
if (device.getGcmId() == null && device.getApnId() == null && !device.getFetchesMessages()) {
@ -79,11 +79,11 @@ public class PushSender implements Managed {
executor.execute(new Runnable() {
@Override
public void run() {
sendSynchronousMessage(account, device, message);
sendSynchronousMessage(account, device, message, silent);
}
});
} else {
sendSynchronousMessage(account, device, message);
sendSynchronousMessage(account, device, message, silent);
}
}
@ -99,9 +99,9 @@ public class PushSender implements Managed {
return webSocketSender;
}
private void sendSynchronousMessage(Account account, Device device, Envelope message) {
private void sendSynchronousMessage(Account account, Device device, Envelope message, boolean silent) {
if (device.getGcmId() != null) sendGcmMessage(account, device, message);
else if (device.getApnId() != null) sendApnMessage(account, device, message);
else if (device.getApnId() != null) sendApnMessage(account, device, message, silent);
else if (device.getFetchesMessages()) sendWebSocketMessage(account, device, message);
else throw new AssertionError();
}
@ -125,11 +125,11 @@ public class PushSender implements Managed {
}
}
private void sendApnMessage(Account account, Device device, Envelope outgoingMessage) {
private void sendApnMessage(Account account, Device device, Envelope outgoingMessage, boolean silent) {
DeliveryStatus deliveryStatus = webSocketSender.sendMessage(account, device, outgoingMessage, WebsocketSender.Type.APN);
if (!deliveryStatus.isDelivered() && outgoingMessage.getType() != Envelope.Type.RECEIPT) {
boolean fallback = !outgoingMessage.getSource().equals(account.getNumber());
boolean fallback = !silent && !outgoingMessage.getSource().equals(account.getNumber());
sendApnNotification(account, device, deliveryStatus.getMessageQueueDepth(), fallback);
}
}

View File

@ -68,7 +68,7 @@ public class ReceiptSender {
}
for (Device destinationDevice : destinationDevices) {
pushSender.sendMessage(destinationAccount, destinationDevice, message.build());
pushSender.sendMessage(destinationAccount, destinationDevice, message.build(), true);
}
}

View File

@ -112,7 +112,7 @@ public class FederatedControllerTest {
assertThat("Good Response", response.getStatus(), is(equalTo(204)));
verify(pushSender).sendMessage(any(Account.class), any(Device.class), any(MessageProtos.Envelope.class));
verify(pushSender).sendMessage(any(Account.class), any(Device.class), any(MessageProtos.Envelope.class), eq(false));
}
@Test

View File

@ -104,7 +104,7 @@ public class MessageControllerTest {
assertThat("Good Response", response.getStatus(), is(equalTo(200)));
verify(pushSender, times(1)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class));
verify(pushSender, times(1)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class), eq(false));
}
@Test
@ -157,7 +157,7 @@ public class MessageControllerTest {
assertThat("Good Response Code", response.getStatus(), is(equalTo(200)));
verify(pushSender, times(2)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class));
verify(pushSender, times(2)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class), eq(false));
}
@Test

View File

@ -18,8 +18,6 @@ import org.whispersystems.textsecuregcm.storage.AccountsManager;
import org.whispersystems.textsecuregcm.storage.Device;
import org.whispersystems.textsecuregcm.tests.util.AuthHelper;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.HashSet;
import java.util.Set;
@ -80,7 +78,7 @@ public class ReceiptControllerTest {
assertThat(response.getStatus() == 204);
verify(pushSender, times(1)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class));
verify(pushSender, times(1)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class), eq(true));
}
@Test
@ -95,7 +93,7 @@ public class ReceiptControllerTest {
assertThat(response.getStatus() == 204);
verify(pushSender, times(2)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class));
verify(pushSender, times(2)).sendMessage(any(Account.class), any(Device.class), any(Envelope.class), eq(true));
}