From 09850afce526e232e7eab7a222d1189c90cb8c4c Mon Sep 17 00:00:00 2001 From: Stefan Meinecke Date: Tue, 14 Apr 2026 18:44:02 +0200 Subject: [PATCH] Fix sender key re-distribution on every group message in daemon mode sendGroupMessageInternalWithSenderKey() calls sender.send() which handles distribution and delivery, but never calls markSenderKeySharedWith() on success. SenderKeySharedStore therefore has no record that the distribution was sent, causing it to re-distribute to all recipients on every subsequent sendGroupMessage call. This results in a fresh unidentified TLS connection being opened for each group message (~6s delay per send), even for back-to-back sends to the same group. All send modes are affected: DBus daemon, JSON-RPC socket/http, and CLI send command all share the same code path. The fix mirrors the existing pattern in resendMessage() (line 307): after a successful send, record each successful recipient's address+device in the sender key shared store. --- .../org/asamk/signal/manager/helper/SendHelper.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java index d4f54945..cf6eb6be 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java @@ -705,6 +705,17 @@ public class SendHelper { successCount, addresses.size()); + final var successfulAddresses = results.stream() + .filter(SendMessageResult::isSuccess) + .flatMap(r -> r.getSuccess() + .getDevices() + .stream() + .map(device -> new SignalProtocolAddress(r.getAddress().getIdentifier(), device))) + .toList(); + if (!successfulAddresses.isEmpty()) { + account.getSenderKeyStore().markSenderKeySharedWith(distributionId, successfulAddresses); + } + return results; } catch (org.whispersystems.signalservice.api.crypto.UntrustedIdentityException e) { return null;