From 3018210db35a66321a19f89fba76dc50c70f8bcb 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 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SenderKeySharedStore.markSenderKeysSharedWith() stored the address using entry.toString() instead of entry.address(). Since SenderKeySharedEntry is a Java record, toString() returns the full record representation: SenderKeySharedEntry[address=, deviceId=1] instead of just the UUID. When signal-service-java later calls getSenderKeySharedWith() and compares the retrieved addresses against the current group member UUIDs, the comparison always fails — causing the distribution message to be re-sent to all recipients on every sendGroupMessage call. This results in a fresh unidentified TLS connection being opened for each group message (~6s delay per send), even for immediate consecutive sends to the same group. All send modes are affected: DBus daemon, JSON-RPC socket/http, and the CLI send command all share the same code path. The fix is a one-character change: entry.address() instead of entry.toString(). --- .../signal/manager/storage/senderKeys/SenderKeySharedStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java index 658540f7..0acf9ba5 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java @@ -204,7 +204,7 @@ public class SenderKeySharedStore { ).formatted(TABLE_SENDER_KEY_SHARED); try (final var statement = connection.prepareStatement(sql)) { for (final var entry : newEntries) { - statement.setString(1, entry.toString()); + statement.setString(1, entry.address()); statement.setInt(2, entry.deviceId()); statement.setBytes(3, UuidUtil.toByteArray(distributionId.asUuid())); statement.setLong(4, System.currentTimeMillis());