From: AsamK Date: Sat, 14 May 2022 13:08:19 +0000 (+0200) Subject: Update libsignal-service-java X-Git-Tag: v0.10.6~20 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/a80e18169a9cc68c59c5d7bc6dcdc7b747dfcf37 Update libsignal-service-java --- diff --git a/graalvm-config-dir/jni-config.json b/graalvm-config-dir/jni-config.json index a852dc92..27abd5be 100644 --- a/graalvm-config-dir/jni-config.json +++ b/graalvm-config-dir/jni-config.json @@ -81,6 +81,7 @@ { "name":"org.signal.libsignal.protocol.IdentityKey", "methods":[ + {"name":"","parameterTypes":["long"] }, {"name":"","parameterTypes":["byte[]"] }, {"name":"serialize","parameterTypes":[] } ] @@ -102,7 +103,10 @@ }, { "name":"org.signal.libsignal.protocol.SignalProtocolAddress", - "methods":[{"name":"","parameterTypes":["java.lang.String","int"] }] + "methods":[ + {"name":"","parameterTypes":["long"] }, + {"name":"","parameterTypes":["java.lang.String","int"] } + ] }, { "name":"org.signal.libsignal.protocol.UntrustedIdentityException", @@ -159,7 +163,10 @@ { "name":"org.signal.libsignal.protocol.state.SessionRecord", "fields":[{"name":"unsafeHandle"}], - "methods":[{"name":"","parameterTypes":["byte[]"] }] + "methods":[ + {"name":"","parameterTypes":["long"] }, + {"name":"","parameterTypes":["byte[]"] } + ] }, { "name":"org.signal.libsignal.protocol.state.SessionStore" @@ -171,6 +178,10 @@ { "name":"org.signal.libsignal.protocol.state.SignedPreKeyStore" }, +{ + "name":"org.signal.libsignal.zkgroup.InvalidInputException", + "methods":[{"name":"","parameterTypes":["java.lang.String"] }] +}, { "name":"org.sqlite.Collation" }, diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 9f7f9526..b2e12b5e 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -2560,6 +2560,7 @@ {"name":"delete_"}, {"name":"expireTimer_"}, {"name":"flags_"}, + {"name":"giftBadge_"}, {"name":"groupCallUpdate_"}, {"name":"groupV2_"}, {"name":"group_"}, @@ -2953,6 +2954,8 @@ {"name":"expirationStartTimestamp_"}, {"name":"isRecipientUpdate_"}, {"name":"message_"}, + {"name":"storyMessageRecipients_"}, + {"name":"storyMessage_"}, {"name":"timestamp_"}, {"name":"unidentifiedStatus_"} ] @@ -3042,6 +3045,7 @@ "fields":[ {"name":"address_"}, {"name":"bitField0_"}, + {"name":"destinationUuid_"}, {"name":"groupId_"}, {"name":"needsReceipt_"}, {"name":"senderDevice_"}, diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index c0434285..e1590dc2 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -14,7 +14,7 @@ repositories { } dependencies { - implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_47") + implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_48") implementation("com.fasterxml.jackson.core", "jackson-databind", "2.13.2.2") implementation("com.google.protobuf", "protobuf-javalite", "3.11.4") implementation("org.bouncycastle", "bcprov-jdk15on", "1.70") diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index addc3bb7..c7f1d22f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -540,7 +540,8 @@ class ManagerImpl implements Manager { .resolveSignalServiceAddress(context.getRecipientHelper().resolveRecipient(quote.author())), quote.message(), List.of(), - resolveMentions(quote.mentions()))); + resolveMentions(quote.mentions()), + SignalServiceDataMessage.Quote.Type.NORMAL)); } if (message.sticker().isPresent()) { final var sticker = message.sticker().get(); 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 7c6cd58c..67a33613 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 @@ -517,7 +517,7 @@ public record MessageEnvelope( long expirationStartTimestamp, Optional destination, Set recipients, - Data message + Optional message ) { static Sent from( @@ -534,7 +534,8 @@ public record MessageEnvelope( .stream() .map(d -> addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(d))) .collect(Collectors.toSet()), - Data.from(sentMessage.getMessage(), recipientResolver, addressResolver, fileProvider)); + sentMessage.getDataMessage() + .map(message -> Data.from(message, recipientResolver, addressResolver, fileProvider))); } } diff --git a/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java b/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java index de248755..422d0db7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java +++ b/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java @@ -31,7 +31,7 @@ public class ServiceConfig { public static final AccountAttributes.Capabilities capabilities; static { - capabilities = new AccountAttributes.Capabilities(false, true, false, true, true, true, true, false); + capabilities = new AccountAttributes.Capabilities(false, true, false, true, true, true, true, false, false); try { TrustStore contactTrustStore = new IasTrustStore(); @@ -50,7 +50,8 @@ public class ServiceConfig { try { try { org.signal.libsignal.internal.Native.UuidCiphertext_CheckValidContents(new byte[0]); - } catch (IllegalArgumentException ignored) { + } catch (Exception e) { + logger.trace("Expected exception when checking libsignal-client: {}", e.getMessage()); } return true; } catch (UnsatisfiedLinkError e) { diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java index d56ce98f..06a0b89a 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java @@ -529,7 +529,8 @@ class GroupV2Helper { final var today = currentTimeDays(); if (groupApiCredentials == null || !groupApiCredentials.containsKey(today)) { // Returns credentials for the next 7 days - groupApiCredentials = dependencies.getGroupsV2Api().getCredentials(today); + final var isAci = true; // TODO enable group handling with PNI + groupApiCredentials = dependencies.getGroupsV2Api().getCredentials(today, isAci); // TODO cache credentials on disk until they expire } var authCredentialResponse = groupApiCredentials.get(today); 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 3da0c729..c4b1524c 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 @@ -122,7 +122,8 @@ public final class IncomingMessageHandler { actions.add(new RetrieveProfileAction(recipientId)); exception = new UntrustedIdentityException(account.getRecipientStore() .resolveRecipientAddress(recipientId), e.getSenderDevice()); - } catch (ProtocolInvalidKeyIdException | ProtocolInvalidKeyException | ProtocolNoSessionException | ProtocolInvalidMessageException e) { + } catch (ProtocolInvalidKeyIdException | ProtocolInvalidKeyException | ProtocolNoSessionException | + ProtocolInvalidMessageException e) { logger.debug("Failed to decrypt incoming message", e); final var sender = account.getRecipientStore().resolveRecipient(e.getSender()); if (context.getContactHelper().isContactBlocked(sender)) { @@ -319,11 +320,13 @@ public final class IncomingMessageHandler { if (syncMessage.getSent().isPresent()) { var message = syncMessage.getSent().get(); final var destination = message.getDestination().orElse(null); - actions.addAll(handleSignalServiceDataMessage(message.getMessage(), - true, - sender, - destination == null ? null : context.getRecipientHelper().resolveRecipient(destination), - ignoreAttachments)); + if (message.getDataMessage().isPresent()) { + actions.addAll(handleSignalServiceDataMessage(message.getDataMessage().get(), + true, + sender, + destination == null ? null : context.getRecipientHelper().resolveRecipient(destination), + ignoreAttachments)); + } } if (syncMessage.getRequest().isPresent() && account.isMasterDevice()) { var rm = syncMessage.getRequest().get(); 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 46f34a4d..652c4694 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 @@ -616,10 +616,12 @@ public class SendHelper { var address = account.getSelfAddress(); var transcript = new SentTranscriptMessage(Optional.of(address), message.getTimestamp(), - message, + Optional.of(message), message.getExpiresInSeconds(), Map.of(address, true), - false); + false, + Optional.empty(), + Set.of()); var syncMessage = SignalServiceSyncMessage.forSentTranscript(transcript); return sendSyncMessage(syncMessage); diff --git a/lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java index a1f19274..347e3d81 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java @@ -3,6 +3,7 @@ package org.asamk.signal.manager.util; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.util.UuidUtil; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -18,7 +19,7 @@ public class MessageCacheUtils { try (var f = new FileInputStream(file)) { var in = new DataInputStream(f); var version = in.readInt(); - if (version > 4) { + if (version > 5) { return null; } var type = in.readInt(); @@ -32,6 +33,10 @@ public class MessageCacheUtils { // read legacy relay field in.readUTF(); } + String destinationUuid = null; + if (version >= 5) { + destinationUuid = in.readUTF(); + } var timestamp = in.readLong(); byte[] content = null; var contentLen = in.readInt(); @@ -69,18 +74,20 @@ public class MessageCacheUtils { content, serverReceivedTimestamp, serverDeliveredTimestamp, - uuid); + uuid, + destinationUuid == null ? UuidUtil.UNKNOWN_UUID.toString() : destinationUuid); } } public static void storeEnvelope(SignalServiceEnvelope envelope, File file) throws IOException { try (var f = new FileOutputStream(file)) { try (var out = new DataOutputStream(f)) { - out.writeInt(4); // version + out.writeInt(5); // version out.writeInt(envelope.getType()); out.writeUTF(envelope.getSourceE164().isPresent() ? envelope.getSourceE164().get() : ""); out.writeUTF(envelope.getSourceUuid().isPresent() ? envelope.getSourceUuid().get() : ""); out.writeInt(envelope.getSourceDevice()); + out.writeUTF(envelope.getDestinationUuid() == null ? "" : envelope.getDestinationUuid()); out.writeLong(envelope.getTimestamp()); if (envelope.hasContent()) { out.writeInt(envelope.getContent().length); diff --git a/src/main/java/org/asamk/signal/ReceiveMessageHandler.java b/src/main/java/org/asamk/signal/ReceiveMessageHandler.java index 3351d666..04a7be03 100644 --- a/src/main/java/org/asamk/signal/ReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/ReceiveMessageHandler.java @@ -298,8 +298,10 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { .println("Expiration started at: {}", DateUtils.formatTimestamp(sentTranscriptMessage.expirationStartTimestamp())); } - var message = sentTranscriptMessage.message(); - printDataMessage(writer.indentedWriter(), message); + if (sentTranscriptMessage.message().isPresent()) { + var message = sentTranscriptMessage.message().get(); + printDataMessage(writer.indentedWriter(), message); + } } if (syncMessage.blocked().isPresent()) { writer.println("Received sync message with block list"); diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index ed27ad6d..d64abd0b 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -786,7 +786,7 @@ public class DbusManagerImpl implements Manager { ? Optional.empty() : Optional.of(new RecipientAddress(null, syncReceived.getDestination())), Set.of(), - new MessageEnvelope.Data(syncReceived.getTimestamp(), + Optional.of(new MessageEnvelope.Data(syncReceived.getTimestamp(), syncReceived.getGroupId().length > 0 ? Optional.of(new MessageEnvelope.Data.GroupContext(GroupId.unknownVersion( syncReceived.getGroupId()), false, 0)) @@ -806,7 +806,7 @@ public class DbusManagerImpl implements Manager { Optional.empty(), List.of(), List.of(), - List.of()))), + List.of())))), Optional.empty(), List.of(), List.of(), diff --git a/src/main/java/org/asamk/signal/dbus/DbusReceiveMessageHandler.java b/src/main/java/org/asamk/signal/dbus/DbusReceiveMessageHandler.java index 375fb0b1..dcea2bf1 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusReceiveMessageHandler.java +++ b/src/main/java/org/asamk/signal/dbus/DbusReceiveMessageHandler.java @@ -79,27 +79,29 @@ public class DbusReceiveMessageHandler implements Manager.ReceiveMessageHandler if (syncMessage.sent().isPresent()) { var transcript = syncMessage.sent().get(); - if (transcript.destination().isPresent() || transcript.message().groupContext().isPresent()) { - var message = transcript.message(); - var groupId = message.groupContext() - .map(MessageEnvelope.Data.GroupContext::groupId) - .map(GroupId::serialize) - .orElseGet(() -> new byte[0]); - - conn.sendMessage(new Signal.SyncMessageReceived(objectPath, - transcript.message().timestamp(), - senderString, - transcript.destination().map(RecipientAddress::getLegacyIdentifier).orElse(""), - groupId, - message.body().orElse(""), - getAttachments(message))); - conn.sendMessage(new Signal.SyncMessageReceivedV2(objectPath, - transcript.message().timestamp(), - senderString, - transcript.destination().map(RecipientAddress::getLegacyIdentifier).orElse(""), - groupId, - message.body().orElse(""), - getMessageExtras(message))); + if (transcript.message().isPresent()) { + final var dataMessage = transcript.message().get(); + if (transcript.destination().isPresent() || dataMessage.groupContext().isPresent()) { + var groupId = dataMessage.groupContext() + .map(MessageEnvelope.Data.GroupContext::groupId) + .map(GroupId::serialize) + .orElseGet(() -> new byte[0]); + + conn.sendMessage(new Signal.SyncMessageReceived(objectPath, + dataMessage.timestamp(), + senderString, + transcript.destination().map(RecipientAddress::getLegacyIdentifier).orElse(""), + groupId, + dataMessage.body().orElse(""), + getAttachments(dataMessage))); + conn.sendMessage(new Signal.SyncMessageReceivedV2(objectPath, + dataMessage.timestamp(), + senderString, + transcript.destination().map(RecipientAddress::getLegacyIdentifier).orElse(""), + groupId, + dataMessage.body().orElse(""), + getMessageExtras(dataMessage))); + } } } } diff --git a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java index 0accddc1..fc84b088 100644 --- a/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java +++ b/src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java @@ -19,10 +19,13 @@ record JsonSyncDataMessage( return new JsonSyncDataMessage(address.getLegacyIdentifier(), address.number().orElse(null), address.uuid().map(UUID::toString).orElse(null), - JsonDataMessage.from(transcriptMessage.message())); + transcriptMessage.message().map(JsonDataMessage::from).orElse(null)); } else { - return new JsonSyncDataMessage(null, null, null, JsonDataMessage.from(transcriptMessage.message())); + return new JsonSyncDataMessage(null, + null, + null, + transcriptMessage.message().map(JsonDataMessage::from).orElse(null)); } } }