From 32150b1aaa32888c5179d664a9a497a13d3f4bfa Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 30 Aug 2021 13:39:27 +0200 Subject: [PATCH] Move all message decryption to IncomingMessageHandler --- .../org/asamk/signal/manager/Manager.java | 47 +++++++-------- .../helper/IncomingMessageHandler.java | 59 +++++++++++++++---- 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 9e38853b..87b89913 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -58,7 +58,6 @@ import org.asamk.signal.manager.storage.stickers.StickerPackId; import org.asamk.signal.manager.util.KeyUtils; import org.asamk.signal.manager.util.StickerUtils; import org.asamk.signal.manager.util.Utils; -import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.libsignal.IdentityKey; @@ -818,37 +817,33 @@ public class Manager implements Closeable { ) { var envelope = cachedMessage.loadEnvelope(); if (envelope == null) { + cachedMessage.delete(); return null; } - SignalServiceContent content = null; - List actions = null; - if (!envelope.isReceipt()) { - try { - content = dependencies.getCipher().decrypt(envelope); - } catch (ProtocolUntrustedIdentityException e) { - if (System.currentTimeMillis() - envelope.getServerDeliveredTimestamp() > 1000L * 60 * 60 * 24 * 30) { - // Envelope is more than a month old, cleaning up. - cachedMessage.delete(); - return null; - } - if (!envelope.hasSourceUuid()) { - final var identifier = e.getSender(); - final var recipientId = account.getRecipientStore().resolveRecipient(identifier); - try { - account.getMessageCache().replaceSender(cachedMessage, recipientId); - } catch (IOException ioException) { - logger.warn("Failed to move cached message to recipient folder: {}", ioException.getMessage()); - } - } - return null; - } catch (Exception er) { - // All other errors are not recoverable, so delete the cached message + + final var result = incomingMessageHandler.handleRetryEnvelope(envelope, ignoreAttachments, handler); + final var actions = result.first(); + final var exception = result.second(); + + if (exception instanceof UntrustedIdentityException) { + if (System.currentTimeMillis() - envelope.getServerDeliveredTimestamp() > 1000L * 60 * 60 * 24 * 30) { + // Envelope is more than a month old, cleaning up. cachedMessage.delete(); return null; } - actions = incomingMessageHandler.handleMessage(envelope, content, ignoreAttachments); + if (!envelope.hasSourceUuid()) { + final var identifier = ((UntrustedIdentityException) exception).getSender(); + final var recipientId = account.getRecipientStore().resolveRecipient(identifier); + try { + account.getMessageCache().replaceSender(cachedMessage, recipientId); + } catch (IOException ioException) { + logger.warn("Failed to move cached message to recipient folder: {}", ioException.getMessage()); + } + } + return null; } - handler.handleMessage(envelope, content, null); + + // If successful and for all other errors that are not recoverable, delete the cached message cachedMessage.delete(); return actions; } diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java b/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java index f28b3638..57b71ee1 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java @@ -79,6 +79,28 @@ public final class IncomingMessageHandler { this.jobExecutor = jobExecutor; } + public Pair, Exception> handleRetryEnvelope( + final SignalServiceEnvelope envelope, + final boolean ignoreAttachments, + final Manager.ReceiveMessageHandler handler + ) { + SignalServiceContent content = null; + if (!envelope.isReceipt()) { + try { + content = dependencies.getCipher().decrypt(envelope); + } catch (ProtocolUntrustedIdentityException e) { + final var recipientId = account.getRecipientStore().resolveRecipient(e.getSender()); + final var exception = new UntrustedIdentityException(addressResolver.resolveSignalServiceAddress( + recipientId), e.getSenderDevice()); + return new Pair<>(List.of(), exception); + } catch (Exception e) { + return new Pair<>(List.of(), e); + } + } + final var actions = checkAndHandleMessage(envelope, content, ignoreAttachments, handler, null); + return new Pair<>(actions, null); + } + public Pair, Exception> handleEnvelope( final SignalServiceEnvelope envelope, final boolean ignoreAttachments, @@ -108,35 +130,48 @@ public final class IncomingMessageHandler { } catch (Exception e) { exception = e; } - - if (!envelope.hasSourceUuid() && content != null) { - // Store uuid if we don't have it already - // address/uuid is validated by unidentified sender certificate - account.getRecipientStore().resolveRecipientTrusted(content.getSender()); - } } + actions.addAll(checkAndHandleMessage(envelope, content, ignoreAttachments, handler, exception)); + return new Pair<>(actions, exception); + } + + private List checkAndHandleMessage( + final SignalServiceEnvelope envelope, + final SignalServiceContent content, + final boolean ignoreAttachments, + final Manager.ReceiveMessageHandler handler, + final Exception exception + ) { + if (!envelope.hasSourceUuid() && content != null) { + // Store uuid if we don't have it already + // address/uuid is validated by unidentified sender certificate + account.getRecipientStore().resolveRecipientTrusted(content.getSender()); + } if (isMessageBlocked(envelope, content)) { logger.info("Ignoring a message from blocked user/group: {}", envelope.getTimestamp()); + return List.of(); } else if (isNotAllowedToSendToGroup(envelope, content)) { logger.info("Ignoring a group message from an unauthorized sender (no member or admin): {} {}", (envelope.hasSourceUuid() ? envelope.getSourceAddress() : content.getSender()).getIdentifier(), envelope.getTimestamp()); + return List.of(); } else { - actions.addAll(handleMessage(envelope, content, ignoreAttachments)); + List actions; + if (content != null) { + actions = handleMessage(envelope, content, ignoreAttachments); + } else { + actions = List.of(); + } handler.handleMessage(envelope, content, exception); + return actions; } - return new Pair<>(actions, exception); } public List handleMessage( SignalServiceEnvelope envelope, SignalServiceContent content, boolean ignoreAttachments ) { var actions = new ArrayList(); - if (content == null) { - return actions; - } - final RecipientId sender; if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) { sender = recipientResolver.resolveRecipient(envelope.getSourceAddress()); -- 2.50.1