From 4a3d9d90a6eb14335620d08b36e7b6742798ecba Mon Sep 17 00:00:00 2001 From: AsamK Date: Wed, 13 May 2026 18:25:35 +0200 Subject: [PATCH] Update libsignal-service --- gradle/libs.versions.toml | 2 +- .../org/asamk/signal/manager/Manager.java | 2 +- .../signal/manager/api/MessageEnvelope.java | 4 +- .../helper/IncomingMessageHandler.java | 18 +++----- .../signal/manager/helper/ReceiveHelper.java | 13 +++--- .../signal/manager/internal/ManagerImpl.java | 44 +++++++++---------- .../asamk/signal/commands/SendCommand.java | 3 +- .../asamk/signal/dbus/DbusManagerImpl.java | 3 +- .../org/asamk/signal/dbus/DbusSignalImpl.java | 3 +- .../signal/http/SseInitialFlushTest.java | 3 +- .../jsonrpc/SubscribeCallEventsTest.java | 3 +- 11 files changed, 42 insertions(+), 56 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e952c6eb..4f788d43 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ slf4j = "2.0.17" junit = "6.0.3" micronaut-json-schema = "2.0.0-M8" micronaut-core = "4.9.3" -signal-service = "2.15.3_unofficial_145" +signal-service = "2.15.3_unofficial_146" [libraries] bouncycastle = "org.bouncycastle:bcprov-jdk18on:1.84" 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 fda3a323..dac629e7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -259,7 +259,7 @@ public interface Manager extends Closeable { RecipientIdentifier.Single recipient ) throws IOException; - SendMessageResults sendEndSessionMessage(Set recipients) throws IOException; + void sendEndSessionMessage(Set recipients) throws IOException; SendMessageResults sendMessageRequestResponse( MessageEnvelope.Sync.MessageRequestResponse.Type type, diff --git a/lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java b/lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java index c8de254b..975e1639 100644 --- a/lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java +++ b/lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java @@ -157,7 +157,7 @@ public record MessageEnvelope( dataMessage.getExpiresInSeconds(), dataMessage.isExpirationUpdate(), dataMessage.isViewOnce(), - dataMessage.isEndSession(), + false, dataMessage.isProfileKeyUpdate(), dataMessage.getProfileKey().isPresent(), dataMessage.getReaction().map(r -> Reaction.from(r, recipientResolver, addressResolver)), @@ -1028,7 +1028,7 @@ public record MessageEnvelope( final AttachmentFileProvider fileProvider, Exception exception ) { - final var serviceId = envelope.getSourceServiceId().map(ServiceId::parseOrNull).orElse(null); + final var serviceId = envelope.getSourceServiceId(); final var source = !envelope.isUnidentifiedSender() && serviceId != null ? recipientResolver.resolveRecipient(serviceId) : envelope.isUnidentifiedSender() && content != null 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 92014fa3..4714b568 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 @@ -142,10 +142,11 @@ public final class IncomingMessageHandler { final var actions = new ArrayList(); SignalServiceContent content = null; Exception exception = null; - envelope.getSourceServiceId().map(ServiceId::parseOrNull) - // Store uuid if we don't have it already - // uuid in envelope is sent by server - .ifPresent(serviceId -> account.getRecipientResolver().resolveRecipient(serviceId)); + if (envelope.getSourceServiceId() != null) { + // Store uuid if we don't have it already + // uuid in envelope is sent by server + account.getRecipientResolver().resolveRecipient(envelope.getSourceServiceId()); + } if (!envelope.isReceipt()) { final var destination = getDestination(envelope).serviceId(); try { @@ -874,11 +875,6 @@ public final class IncomingMessageHandler { final var selfAddress = isSync ? source : destination; final var conversationPartnerAddress = isSync ? destination : source; - if (conversationPartnerAddress != null && message.isEndSession()) { - account.getAccountData(selfAddress.serviceId()) - .getSessionStore() - .deleteAllSessions(conversationPartnerAddress.serviceId()); - } if (message.isExpirationUpdate() || message.getBody().isPresent()) { if (message.getGroupContext().isPresent()) { final var groupContext = message.getGroupContext().get(); @@ -1047,7 +1043,7 @@ public final class IncomingMessageHandler { } private SignalServiceAddress getSenderAddress(SignalServiceEnvelope envelope, SignalServiceContent content) { - final var serviceId = envelope.getSourceServiceId().map(ServiceId::parseOrNull).orElse(null); + final var serviceId = envelope.getSourceServiceId(); if (!envelope.isUnidentifiedSender() && serviceId != null) { return new SignalServiceAddress(serviceId); } else if (content != null) { @@ -1058,7 +1054,7 @@ public final class IncomingMessageHandler { } private DeviceAddress getSender(SignalServiceEnvelope envelope, SignalServiceContent content) { - final var serviceId = envelope.getSourceServiceId().map(ServiceId::parseOrNull).orElse(null); + final var serviceId = envelope.getSourceServiceId(); if (!envelope.isUnidentifiedSender() && serviceId != null) { return new DeviceAddress(account.getRecipientResolver().resolveRecipient(serviceId), serviceId, diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java index 73291d9e..31f1c04d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java @@ -9,7 +9,6 @@ import org.asamk.signal.manager.jobs.CleanOldPreKeysJob; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.messageCache.CachedMessage; import org.asamk.signal.manager.storage.recipients.RecipientAddress; -import org.signal.core.models.ServiceId; import org.signal.core.models.ServiceId.ACI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -150,10 +149,10 @@ public class ReceiveHelper { for (final var it : batch) { SignalServiceEnvelope envelope1 = new SignalServiceEnvelope(it.getEnvelope(), it.getServerDeliveredTimestamp()); - final var recipientId = envelope1.getSourceServiceId() - .map(ServiceId::parseOrNull) - .map(s -> account.getRecipientResolver().resolveRecipient(s)) - .orElse(null); + final var sourceServiceId = envelope1.getSourceServiceId(); + final var recipientId = sourceServiceId == null + ? null + : account.getRecipientResolver().resolveRecipient(sourceServiceId); logger.trace("Storing new message from {}", recipientId); // store message on disk, before acknowledging receipt to the server cachedMessage[0] = account.getMessageCache().cacheMessage(envelope1, recipientId); @@ -238,7 +237,7 @@ public class ReceiveHelper { if (exception instanceof UntrustedIdentityException) { logger.debug("Keeping message with untrusted identity in message cache"); final var address = ((UntrustedIdentityException) exception).getSender(); - if (envelope.getSourceServiceId().isEmpty() && address.aci().isPresent()) { + if (envelope.getSourceServiceId() == null && address.aci().isPresent()) { final var recipientId = account.getRecipientResolver() .resolveRecipient(ACI.parseOrThrow(address.aci().get())); try { @@ -292,7 +291,7 @@ public class ReceiveHelper { cachedMessage.delete(); return null; } - if (envelope.getSourceServiceId().isEmpty()) { + if (envelope.getSourceServiceId() == null) { final var identifier = ((UntrustedIdentityException) exception).getSender(); final var recipientId = account.getRecipientResolver() .resolveRecipient(new RecipientAddress(identifier)); diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index c2aba751..394fa894 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -1091,30 +1091,26 @@ public class ManagerImpl implements Manager { } @Override - public SendMessageResults sendEndSessionMessage(Set recipients) throws IOException { - var messageBuilder = SignalServiceDataMessage.newBuilder().asEndSessionMessage(); - - try { - return sendMessage(messageBuilder, - recipients.stream().map(RecipientIdentifier.class::cast).collect(Collectors.toSet()), - false); - } catch (GroupNotFoundException | NotAGroupMemberException | GroupSendingNotAllowedException e) { - throw new AssertionError(e); - } finally { - for (var recipient : recipients) { - final RecipientId recipientId; - try { - recipientId = context.getRecipientHelper().resolveRecipient(recipient); - } catch (UnregisteredRecipientException e) { - continue; - } - final var serviceId = context.getAccount() - .getRecipientAddressResolver() - .resolveRecipientAddress(recipientId) - .serviceId(); - if (serviceId.isPresent()) { - account.getAccountData(ServiceIdType.ACI).getSessionStore().deleteAllSessions(serviceId.get()); - } + public void sendEndSessionMessage(Set recipients) throws IOException { + for (var recipient : recipients) { + final RecipientId recipientId; + try { + recipientId = context.getRecipientHelper().resolveRecipient(recipient); + } catch (UnregisteredRecipientException e) { + continue; + } + final var recipientAddress = context.getAccount() + .getRecipientAddressResolver() + .resolveRecipientAddress(recipientId); + final var aciSessionStore = account.getAccountData(ServiceIdType.ACI).getSessionStore(); + final var pniSessionStore = account.getAccountData(ServiceIdType.PNI).getSessionStore(); + if (recipientAddress.aci().isPresent()) { + aciSessionStore.archiveSessions(recipientAddress.aci().get()); + pniSessionStore.archiveSessions(recipientAddress.aci().get()); + } + if (recipientAddress.pni().isPresent()) { + aciSessionStore.archiveSessions(recipientAddress.pni().get()); + pniSessionStore.archiveSessions(recipientAddress.pni().get()); } } } diff --git a/src/main/java/org/asamk/signal/commands/SendCommand.java b/src/main/java/org/asamk/signal/commands/SendCommand.java index aa4bb957..c6ef5077 100644 --- a/src/main/java/org/asamk/signal/commands/SendCommand.java +++ b/src/main/java/org/asamk/signal/commands/SendCommand.java @@ -144,8 +144,7 @@ public class SendCommand implements JsonRpcLocalCommand { } try { - final var results = m.sendEndSessionMessage(singleRecipients); - outputResult(outputWriter, results); + m.sendEndSessionMessage(singleRecipients); return; } catch (IOException e) { throw new UnexpectedErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass() diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index faf099e4..45b937ae 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -543,9 +543,8 @@ public class DbusManagerImpl implements Manager { } @Override - public SendMessageResults sendEndSessionMessage(final Set recipients) throws IOException { + public void sendEndSessionMessage(final Set recipients) throws IOException { signal.sendEndSessionMessage(recipients.stream().map(RecipientIdentifier.Single::getIdentifier).toList()); - return new SendMessageResults(0, Map.of()); } @Override diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 20069b9a..a9983caa 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -430,8 +430,7 @@ public class DbusSignalImpl implements Signal, AutoCloseable { @Override public void sendEndSessionMessage(final List recipients) { try { - final var results = m.sendEndSessionMessage(getSingleRecipientIdentifiers(recipients, m.getSelfNumber())); - checkSendMessageResults(results); + m.sendEndSessionMessage(getSingleRecipientIdentifiers(recipients, m.getSelfNumber())); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } diff --git a/src/test/java/org/asamk/signal/http/SseInitialFlushTest.java b/src/test/java/org/asamk/signal/http/SseInitialFlushTest.java index 77e59dbd..4796ae5d 100644 --- a/src/test/java/org/asamk/signal/http/SseInitialFlushTest.java +++ b/src/test/java/org/asamk/signal/http/SseInitialFlushTest.java @@ -326,8 +326,7 @@ class SseInitialFlushTest { } @Override - public SendMessageResults sendEndSessionMessage(Set recipients) { - return null; + public void sendEndSessionMessage(Set recipients) { } @Override diff --git a/src/test/java/org/asamk/signal/jsonrpc/SubscribeCallEventsTest.java b/src/test/java/org/asamk/signal/jsonrpc/SubscribeCallEventsTest.java index 37c00829..bfc56ed3 100644 --- a/src/test/java/org/asamk/signal/jsonrpc/SubscribeCallEventsTest.java +++ b/src/test/java/org/asamk/signal/jsonrpc/SubscribeCallEventsTest.java @@ -328,8 +328,7 @@ class SubscribeCallEventsTest { } @Override - public SendMessageResults sendEndSessionMessage(Set r) { - return null; + public void sendEndSessionMessage(Set r) { } @Override