From 856e5eca4cad68b1f649d76f169812b2e249843a Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sun, 20 Nov 2016 09:32:03 -0800 Subject: [PATCH] Allow sender to specify whether msg should trigger APN fallback // FREEBIE --- .../controllers/MessageController.java | 2 +- .../textsecuregcm/entities/IncomingMessage.java | 7 +++++++ .../textsecuregcm/push/PushSender.java | 14 +++++++------- .../textsecuregcm/push/ReceiptSender.java | 2 +- .../tests/controllers/FederatedControllerTest.java | 2 +- .../tests/controllers/MessageControllerTest.java | 4 ++-- .../tests/controllers/ReceiptControllerTest.java | 6 ++---- 7 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java b/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java index de3455768..1c2301d19 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java +++ b/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java @@ -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); diff --git a/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java b/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java index ff48511a1..1eb617d54 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java +++ b/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java @@ -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; + } } diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java b/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java index 94c5be7be..a5cafca0f 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java +++ b/src/main/java/org/whispersystems/textsecuregcm/push/PushSender.java @@ -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); } } diff --git a/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java b/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java index 55de18d3f..0a2519e89 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java +++ b/src/main/java/org/whispersystems/textsecuregcm/push/ReceiptSender.java @@ -68,7 +68,7 @@ public class ReceiptSender { } for (Device destinationDevice : destinationDevices) { - pushSender.sendMessage(destinationAccount, destinationDevice, message.build()); + pushSender.sendMessage(destinationAccount, destinationDevice, message.build(), true); } } diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/FederatedControllerTest.java b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/FederatedControllerTest.java index 4f54e44ae..4b8a807bf 100644 --- a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/FederatedControllerTest.java +++ b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/FederatedControllerTest.java @@ -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 diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java index 3e79f8276..48087ebe7 100644 --- a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java +++ b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java @@ -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 diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ReceiptControllerTest.java b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ReceiptControllerTest.java index 23660594c..9f9989ec8 100644 --- a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ReceiptControllerTest.java +++ b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ReceiptControllerTest.java @@ -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)); }