]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java
Request message resend if incoming message can't be decrypted
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / helper / SendHelper.java
index 7b37f205822df663368c86093b109051bed41bcd..c0953f1fa27be3deb94f0a95fb3a13cb32bb4670 100644 (file)
@@ -13,6 +13,7 @@ import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.whispersystems.libsignal.protocol.DecryptionErrorMessage;
 import org.whispersystems.libsignal.util.guava.Optional;
 import org.whispersystems.signalservice.api.SignalServiceMessageSender;
 import org.whispersystems.signalservice.api.crypto.ContentHint;
@@ -156,6 +157,25 @@ public class SendHelper {
         }
     }
 
+    public void sendRetryReceipt(
+            DecryptionErrorMessage errorMessage, RecipientId recipientId, Optional<GroupId> groupId
+    ) throws IOException, UntrustedIdentityException {
+        var messageSender = dependencies.getMessageSender();
+        final var address = addressResolver.resolveSignalServiceAddress(recipientId);
+        logger.debug("Sending retry receipt for {} to {}, device: {}",
+                errorMessage.getTimestamp(),
+                recipientId,
+                errorMessage.getDeviceId());
+        try {
+            messageSender.sendRetryReceipt(address,
+                    unidentifiedAccessHelper.getAccessFor(recipientId),
+                    groupId.transform(GroupId::serialize),
+                    errorMessage);
+        } catch (org.whispersystems.signalservice.api.crypto.UntrustedIdentityException e) {
+            throw new UntrustedIdentityException(address);
+        }
+    }
+
     public SendMessageResult sendNullMessage(RecipientId recipientId) throws IOException {
         var messageSender = dependencies.getMessageSender();