Move all message decryption to IncomingMessageHandler

This commit is contained in:
AsamK 2021-08-30 13:39:27 +02:00
parent 5743cf4455
commit 32150b1aaa
2 changed files with 68 additions and 38 deletions

View file

@ -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.KeyUtils;
import org.asamk.signal.manager.util.StickerUtils; import org.asamk.signal.manager.util.StickerUtils;
import org.asamk.signal.manager.util.Utils; import org.asamk.signal.manager.util.Utils;
import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKey;
@ -818,21 +817,22 @@ public class Manager implements Closeable {
) { ) {
var envelope = cachedMessage.loadEnvelope(); var envelope = cachedMessage.loadEnvelope();
if (envelope == null) { if (envelope == null) {
cachedMessage.delete();
return null; return null;
} }
SignalServiceContent content = null;
List<HandleAction> actions = null; final var result = incomingMessageHandler.handleRetryEnvelope(envelope, ignoreAttachments, handler);
if (!envelope.isReceipt()) { final var actions = result.first();
try { final var exception = result.second();
content = dependencies.getCipher().decrypt(envelope);
} catch (ProtocolUntrustedIdentityException e) { if (exception instanceof UntrustedIdentityException) {
if (System.currentTimeMillis() - envelope.getServerDeliveredTimestamp() > 1000L * 60 * 60 * 24 * 30) { if (System.currentTimeMillis() - envelope.getServerDeliveredTimestamp() > 1000L * 60 * 60 * 24 * 30) {
// Envelope is more than a month old, cleaning up. // Envelope is more than a month old, cleaning up.
cachedMessage.delete(); cachedMessage.delete();
return null; return null;
} }
if (!envelope.hasSourceUuid()) { if (!envelope.hasSourceUuid()) {
final var identifier = e.getSender(); final var identifier = ((UntrustedIdentityException) exception).getSender();
final var recipientId = account.getRecipientStore().resolveRecipient(identifier); final var recipientId = account.getRecipientStore().resolveRecipient(identifier);
try { try {
account.getMessageCache().replaceSender(cachedMessage, recipientId); account.getMessageCache().replaceSender(cachedMessage, recipientId);
@ -841,14 +841,9 @@ public class Manager implements Closeable {
} }
} }
return null; return null;
} catch (Exception er) {
// All other errors are not recoverable, so delete the cached message
cachedMessage.delete();
return null;
} }
actions = incomingMessageHandler.handleMessage(envelope, content, ignoreAttachments);
} // If successful and for all other errors that are not recoverable, delete the cached message
handler.handleMessage(envelope, content, null);
cachedMessage.delete(); cachedMessage.delete();
return actions; return actions;
} }

View file

@ -79,6 +79,28 @@ public final class IncomingMessageHandler {
this.jobExecutor = jobExecutor; this.jobExecutor = jobExecutor;
} }
public Pair<List<HandleAction>, 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<List<HandleAction>, Exception> handleEnvelope( public Pair<List<HandleAction>, Exception> handleEnvelope(
final SignalServiceEnvelope envelope, final SignalServiceEnvelope envelope,
final boolean ignoreAttachments, final boolean ignoreAttachments,
@ -108,35 +130,48 @@ public final class IncomingMessageHandler {
} catch (Exception e) { } catch (Exception e) {
exception = e; exception = e;
} }
}
actions.addAll(checkAndHandleMessage(envelope, content, ignoreAttachments, handler, exception));
return new Pair<>(actions, exception);
}
private List<HandleAction> checkAndHandleMessage(
final SignalServiceEnvelope envelope,
final SignalServiceContent content,
final boolean ignoreAttachments,
final Manager.ReceiveMessageHandler handler,
final Exception exception
) {
if (!envelope.hasSourceUuid() && content != null) { if (!envelope.hasSourceUuid() && content != null) {
// Store uuid if we don't have it already // Store uuid if we don't have it already
// address/uuid is validated by unidentified sender certificate // address/uuid is validated by unidentified sender certificate
account.getRecipientStore().resolveRecipientTrusted(content.getSender()); account.getRecipientStore().resolveRecipientTrusted(content.getSender());
} }
}
if (isMessageBlocked(envelope, content)) { if (isMessageBlocked(envelope, content)) {
logger.info("Ignoring a message from blocked user/group: {}", envelope.getTimestamp()); logger.info("Ignoring a message from blocked user/group: {}", envelope.getTimestamp());
return List.of();
} else if (isNotAllowedToSendToGroup(envelope, content)) { } else if (isNotAllowedToSendToGroup(envelope, content)) {
logger.info("Ignoring a group message from an unauthorized sender (no member or admin): {} {}", logger.info("Ignoring a group message from an unauthorized sender (no member or admin): {} {}",
(envelope.hasSourceUuid() ? envelope.getSourceAddress() : content.getSender()).getIdentifier(), (envelope.hasSourceUuid() ? envelope.getSourceAddress() : content.getSender()).getIdentifier(),
envelope.getTimestamp()); envelope.getTimestamp());
return List.of();
} else { } else {
actions.addAll(handleMessage(envelope, content, ignoreAttachments)); List<HandleAction> actions;
handler.handleMessage(envelope, content, exception); 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<HandleAction> handleMessage( public List<HandleAction> handleMessage(
SignalServiceEnvelope envelope, SignalServiceContent content, boolean ignoreAttachments SignalServiceEnvelope envelope, SignalServiceContent content, boolean ignoreAttachments
) { ) {
var actions = new ArrayList<HandleAction>(); var actions = new ArrayList<HandleAction>();
if (content == null) {
return actions;
}
final RecipientId sender; final RecipientId sender;
if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) { if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) {
sender = recipientResolver.resolveRecipient(envelope.getSourceAddress()); sender = recipientResolver.resolveRecipient(envelope.getSourceAddress());