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()); messageBuilder.setRelay(source.getRelay().get());
} }
pushSender.sendMessage(destinationAccount, destinationDevice, messageBuilder.build()); pushSender.sendMessage(destinationAccount, destinationDevice, messageBuilder.build(), incomingMessage.isSilent());
} catch (NotPushRegisteredException e) { } catch (NotPushRegisteredException e) {
if (destinationDevice.isMaster()) throw new NoSuchUserException(e); if (destinationDevice.isMaster()) throw new NoSuchUserException(e);
else logger.debug("Not registered", e); else logger.debug("Not registered", e);

View File

@ -45,6 +45,9 @@ public class IncomingMessage {
@JsonProperty @JsonProperty
private long timestamp; // deprecated private long timestamp; // deprecated
@JsonProperty
private boolean silent = false;
public String getDestination() { public String getDestination() {
return destination; return destination;
@ -73,4 +76,8 @@ public class IncomingMessage {
public String getContent() { public String getContent() {
return content; 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 throws NotPushRegisteredException
{ {
if (device.getGcmId() == null && device.getApnId() == null && !device.getFetchesMessages()) { if (device.getGcmId() == null && device.getApnId() == null && !device.getFetchesMessages()) {
@ -79,11 +79,11 @@ public class PushSender implements Managed {
executor.execute(new Runnable() { executor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
sendSynchronousMessage(account, device, message); sendSynchronousMessage(account, device, message, silent);
} }
}); });
} else { } else {
sendSynchronousMessage(account, device, message); sendSynchronousMessage(account, device, message, silent);
} }
} }
@ -99,9 +99,9 @@ public class PushSender implements Managed {
return webSocketSender; 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); 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 if (device.getFetchesMessages()) sendWebSocketMessage(account, device, message);
else throw new AssertionError(); 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); DeliveryStatus deliveryStatus = webSocketSender.sendMessage(account, device, outgoingMessage, WebsocketSender.Type.APN);
if (!deliveryStatus.isDelivered() && outgoingMessage.getType() != Envelope.Type.RECEIPT) { 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); sendApnNotification(account, device, deliveryStatus.getMessageQueueDepth(), fallback);
} }
} }

View File

@ -68,7 +68,7 @@ public class ReceiptSender {
} }
for (Device destinationDevice : destinationDevices) { 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))); 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 @Test

View File

@ -104,7 +104,7 @@ public class MessageControllerTest {
assertThat("Good Response", response.getStatus(), is(equalTo(200))); 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 @Test
@ -157,7 +157,7 @@ public class MessageControllerTest {
assertThat("Good Response Code", response.getStatus(), is(equalTo(200))); 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 @Test

View File

@ -18,8 +18,6 @@ import org.whispersystems.textsecuregcm.storage.AccountsManager;
import org.whispersystems.textsecuregcm.storage.Device; import org.whispersystems.textsecuregcm.storage.Device;
import org.whispersystems.textsecuregcm.tests.util.AuthHelper; 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 javax.ws.rs.core.Response;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -80,7 +78,7 @@ public class ReceiptControllerTest {
assertThat(response.getStatus() == 204); 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 @Test
@ -95,7 +93,7 @@ public class ReceiptControllerTest {
assertThat(response.getStatus() == 204); 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));
} }