From 9ffacfe90e54a86da289d3e6fb3c3df738f57abb Mon Sep 17 00:00:00 2001 From: AsamK Date: Wed, 19 Oct 2022 19:09:23 +0200 Subject: [PATCH] Add --ignore-stories flag to prevent receiving story messages --- .../asamk/signal/manager/SignalDependencies.java | 14 ++++++++++++-- .../asamk/signal/manager/api/ReceiveConfig.java | 2 +- .../asamk/signal/manager/helper/AccountHelper.java | 1 - .../asamk/signal/manager/helper/ReceiveHelper.java | 11 ++++++----- man/signal-cli.1.adoc | 8 ++++++++ .../org/asamk/signal/commands/DaemonCommand.java | 13 +++++++++---- .../signal/commands/JsonRpcDispatcherCommand.java | 10 +++++++--- .../org/asamk/signal/commands/ReceiveCommand.java | 12 ++++++++---- 8 files changed, 51 insertions(+), 20 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java b/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java index 6450f1f8..3b3b375a 100644 --- a/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java +++ b/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java @@ -40,6 +40,8 @@ public class SignalDependencies { private final ExecutorService executor; private final SignalSessionLock sessionLock; + private boolean allowStories = true; + private SignalServiceAccountManager accountManager; private GroupsV2Api groupsV2Api; private GroupsV2Operations groupsV2Operations; @@ -72,6 +74,14 @@ public class SignalDependencies { public void resetAfterAddressChange() { this.messageSender = null; this.cipher = null; + getSignalWebSocket().forceNewWebSockets(); + } + + /** + * This method needs to be called before the first websocket is created + */ + public void setAllowStories(final boolean allowStories) { + this.allowStories = allowStories; } public ServiceEnvironmentConfig getServiceEnvironmentConfig() { @@ -135,7 +145,7 @@ public class SignalDependencies { Optional.of(credentialsProvider), userAgent, healthMonitor, - true); + allowStories); } @Override @@ -145,7 +155,7 @@ public class SignalDependencies { Optional.empty(), userAgent, healthMonitor, - true); + allowStories); } }; signalWebSocket = new SignalWebSocket(webSocketFactory); diff --git a/lib/src/main/java/org/asamk/signal/manager/api/ReceiveConfig.java b/lib/src/main/java/org/asamk/signal/manager/api/ReceiveConfig.java index bf5f1d99..e9108d12 100644 --- a/lib/src/main/java/org/asamk/signal/manager/api/ReceiveConfig.java +++ b/lib/src/main/java/org/asamk/signal/manager/api/ReceiveConfig.java @@ -1,3 +1,3 @@ package org.asamk.signal.manager.api; -public record ReceiveConfig(boolean ignoreAttachments, boolean sendReadReceipts) {} +public record ReceiveConfig(boolean ignoreAttachments, boolean ignoreStories, boolean sendReadReceipts) {} diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index 7ae9aa45..36cd76a3 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -110,7 +110,6 @@ public class AccountHelper { // TODO check and update remote storage context.getUnidentifiedAccessHelper().rotateSenderCertificates(); dependencies.resetAfterAddressChange(); - dependencies.getSignalWebSocket().forceNewWebSockets(); context.getAccountFileUpdater().updateAccountIdentifiers(account.getNumber(), account.getAci()); } diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java index 09ca1a40..5dca96ea 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java @@ -9,6 +9,7 @@ import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.messageCache.CachedMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.SignalWebSocket; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState; import org.whispersystems.signalservice.api.websocket.WebSocketUnavailableException; @@ -35,7 +36,7 @@ public class ReceiveHelper { private final SignalDependencies dependencies; private final Context context; - private ReceiveConfig receiveConfig = new ReceiveConfig(false, false); + private ReceiveConfig receiveConfig = new ReceiveConfig(false, false, false); private boolean needsToRetryFailedMessages = false; private boolean hasCaughtUpWithOldMessages = false; private boolean isWaitingForMessage = false; @@ -51,6 +52,7 @@ public class ReceiveHelper { public void setReceiveConfig(final ReceiveConfig receiveConfig) { this.receiveConfig = receiveConfig; + dependencies.setAllowStories(!receiveConfig.ignoreStories()); } public void setNeedsToRetryFailedMessages(final boolean needsToRetryFailedMessages) { @@ -104,25 +106,24 @@ public class ReceiveHelper { signalWebSocket.connect(); try { - receiveMessagesInternal(timeout, returnOnTimeout, handler, queuedActions); + receiveMessagesInternal(signalWebSocket, timeout, returnOnTimeout, handler, queuedActions); } finally { hasCaughtUpWithOldMessages = false; handleQueuedActions(queuedActions.keySet()); queuedActions.clear(); - dependencies.getSignalWebSocket().disconnect(); + signalWebSocket.disconnect(); webSocketStateDisposable.dispose(); shouldStop = false; } } private void receiveMessagesInternal( + final SignalWebSocket signalWebSocket, Duration timeout, boolean returnOnTimeout, Manager.ReceiveMessageHandler handler, final Map queuedActions ) throws IOException { - final var signalWebSocket = dependencies.getSignalWebSocket(); - var backOffCounter = 0; isWaitingForMessage = false; diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index f1e9e79a..9b6ec2db 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -359,9 +359,14 @@ In json mode this is outputted as one json object per line. *-t* TIMEOUT, *--timeout* TIMEOUT:: Number of seconds to wait for new messages (negative values disable timeout). Default is 5 seconds. + *--ignore-attachments*:: Don’t download attachments of received messages. +*--ignore-stories*:: +Don’t receive story messages from the server. + + *--send-read-receipts*:: Send read receipts for all incoming data messages (in addition to the default delivery receipts) @@ -639,6 +644,9 @@ See signal-cli-jsonrpc (5) for info on the JSON-RPC interface. *--ignore-attachments*:: Don’t download attachments of received messages. +*--ignore-stories*:: +Don’t receive story messages from the server. + *--send-read-receipts*:: Send read receipts for all incoming data messages (in addition to the default delivery receipts) diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index cec7cd03..01d0326f 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -79,6 +79,9 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { subparser.addArgument("--ignore-attachments") .help("Don’t download attachments of received messages.") .action(Arguments.storeTrue()); + subparser.addArgument("--ignore-stories") + .help("Don’t receive story messages from the server.") + .action(Arguments.storeTrue()); subparser.addArgument("--send-read-receipts") .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") .action(Arguments.storeTrue()); @@ -97,9 +100,10 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { final var noReceiveStdOut = Boolean.TRUE.equals(ns.getBoolean("no-receive-stdout")); final var receiveMode = ns.get("receive-mode"); final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); - final boolean sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); + final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); + final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); - m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, sendReadReceipts)); + m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts)); addDefaultReceiveHandler(m, noReceiveStdOut ? null : outputWriter, receiveMode != ReceiveMode.ON_START); final Channel inheritedChannel; @@ -160,9 +164,10 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand { final var noReceiveStdOut = Boolean.TRUE.equals(ns.getBoolean("no-receive-stdout")); final var receiveMode = ns.get("receive-mode"); final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); - final boolean sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); + final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); + final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); - final var receiveConfig = new ReceiveConfig(ignoreAttachments, sendReadReceipts); + final var receiveConfig = new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts); c.getManagers().forEach(m -> { m.setReceiveConfig(receiveConfig); addDefaultReceiveHandler(m, noReceiveStdOut ? null : outputWriter, receiveMode != ReceiveMode.ON_START); diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index ef33a6e8..34961bd3 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -34,6 +34,9 @@ public class JsonRpcDispatcherCommand implements LocalCommand { subparser.addArgument("--ignore-attachments") .help("Don’t download attachments of received messages.") .action(Arguments.storeTrue()); + subparser.addArgument("--ignore-stories") + .help("Don’t receive story messages from the server.") + .action(Arguments.storeTrue()); subparser.addArgument("--send-read-receipts") .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") .action(Arguments.storeTrue()); @@ -48,9 +51,10 @@ public class JsonRpcDispatcherCommand implements LocalCommand { public void handleCommand( final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { - final boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); - final boolean sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); - m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, sendReadReceipts)); + final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); + final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); + final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); + m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts)); final var jsonOutputWriter = (JsonWriter) outputWriter; final Supplier lineSupplier = IOUtils.getLineSupplier(new InputStreamReader(System.in, diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index 68292557..4d5bdff0 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -40,6 +40,9 @@ public class ReceiveCommand implements LocalCommand { subparser.addArgument("--ignore-attachments") .help("Don’t download attachments of received messages.") .action(Arguments.storeTrue()); + subparser.addArgument("--ignore-stories") + .help("Don’t receive story messages from the server.") + .action(Arguments.storeTrue()); subparser.addArgument("--send-read-receipts") .help("Send read receipts for all incoming data messages (in addition to the default delivery receipts)") .action(Arguments.storeTrue()); @@ -54,10 +57,11 @@ public class ReceiveCommand implements LocalCommand { public void handleCommand( final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { - double timeout = ns.getDouble("timeout"); - boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); - boolean sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); - m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, sendReadReceipts)); + final var timeout = ns.getDouble("timeout"); + final var ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); + final var ignoreStories = Boolean.TRUE.equals(ns.getBoolean("ignore-stories")); + final var sendReadReceipts = Boolean.TRUE.equals(ns.getBoolean("send-read-receipts")); + m.setReceiveConfig(new ReceiveConfig(ignoreAttachments, ignoreStories, sendReadReceipts)); try { final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m, (JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter); -- 2.50.1