From 609ebf024b4fc8c8214e582641dc7c9f880e689f Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 12 Jun 2021 16:22:21 +0200 Subject: [PATCH] Update libsignal-service-java --- CHANGELOG.md | 2 +- graalvm-config-dir/reflect-config.json | 3 ++ lib/build.gradle.kts | 2 +- .../org/asamk/signal/manager/Manager.java | 16 +++++++--- .../signal/manager/config/ServiceConfig.java | 2 +- .../storage/protocol/SignalProtocolStore.java | 31 +++++++++++++++++++ .../manager/storage/recipients/Profile.java | 3 +- .../storage/sessions/SessionStore.java | 26 ++++++++++++++++ .../signal/manager/util/ProfileUtils.java | 3 ++ 9 files changed, 79 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dae42af..a4667d60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## [Unreleased] -**Attention**: Now requires native libsignal-client version 0.5.1 +**Attention**: Now requires native libsignal-client version 0.8.1 ### Added - Added new parameters to `updateGroup` for group v2 features: diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 2660230d..0f10babc 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -1787,8 +1787,10 @@ {"name":"bitField0_", "allowUnsafeAccess":true}, {"name":"callMessage_", "allowUnsafeAccess":true}, {"name":"dataMessage_", "allowUnsafeAccess":true}, + {"name":"decryptionErrorMessage_", "allowUnsafeAccess":true}, {"name":"nullMessage_", "allowUnsafeAccess":true}, {"name":"receiptMessage_", "allowUnsafeAccess":true}, + {"name":"senderKeyDistributionMessage_", "allowUnsafeAccess":true}, {"name":"syncMessage_", "allowUnsafeAccess":true}, {"name":"typingMessage_", "allowUnsafeAccess":true} ] @@ -2139,6 +2141,7 @@ "fields":[ {"name":"address_", "allowUnsafeAccess":true}, {"name":"bitField0_", "allowUnsafeAccess":true}, + {"name":"groupId_", "allowUnsafeAccess":true}, {"name":"needsReceipt_", "allowUnsafeAccess":true}, {"name":"senderDevice_", "allowUnsafeAccess":true}, {"name":"serverDeliveredTimestamp_", "allowUnsafeAccess":true}, diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 0b385f82..1fa399d0 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -14,7 +14,7 @@ repositories { } dependencies { - api("com.github.turasa:signal-service-java:2.15.3_unofficial_23") + api("com.github.turasa:signal-service-java:2.15.3_unofficial_24") implementation("com.google.protobuf:protobuf-javalite:3.10.0") implementation("org.bouncycastle:bcprov-jdk15on:1.68") implementation("org.slf4j:slf4j-api:1.7.30") 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 55b57828..994d1e61 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -87,6 +87,7 @@ import org.whispersystems.signalservice.api.SignalServiceMessagePipe; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.SignalSessionLock; +import org.whispersystems.signalservice.api.crypto.ContentHint; import org.whispersystems.signalservice.api.crypto.SignalServiceCipher; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations; @@ -1534,7 +1535,7 @@ public class Manager implements Closeable { private void sendSyncMessage(SignalServiceSyncMessage message) throws IOException, UntrustedIdentityException { var messageSender = createMessageSender(); - messageSender.sendMessage(message, unidentifiedAccessHelper.getAccessForSync()); + messageSender.sendSyncMessage(message, unidentifiedAccessHelper.getAccessForSync()); } private Set getSignalServiceAddresses(Collection numbers) throws InvalidNumberException { @@ -1614,9 +1615,10 @@ public class Manager implements Closeable { final var addresses = recipientIdList.stream() .map(this::resolveSignalServiceAddress) .collect(Collectors.toList()); - var result = messageSender.sendMessage(addresses, + var result = messageSender.sendDataMessage(addresses, unidentifiedAccessHelper.getAccessFor(recipientIdList), isRecipientUpdate, + ContentHint.DEFAULT, message); for (var r : result) { @@ -1691,7 +1693,7 @@ public class Manager implements Closeable { try { var startTime = System.currentTimeMillis(); - messageSender.sendMessage(syncMessage, unidentifiedAccess); + messageSender.sendSyncMessage(syncMessage, unidentifiedAccess); return SendMessageResult.success(recipient, unidentifiedAccess.isPresent(), false, @@ -1709,11 +1711,15 @@ public class Manager implements Closeable { final var address = resolveSignalServiceAddress(recipientId); try { try { - return messageSender.sendMessage(address, unidentifiedAccessHelper.getAccessFor(recipientId), message); + return messageSender.sendDataMessage(address, + unidentifiedAccessHelper.getAccessFor(recipientId), + ContentHint.DEFAULT, + message); } catch (UnregisteredUserException e) { final var newRecipientId = refreshRegisteredUser(recipientId); - return messageSender.sendMessage(resolveSignalServiceAddress(newRecipientId), + return messageSender.sendDataMessage(resolveSignalServiceAddress(newRecipientId), unidentifiedAccessHelper.getAccessFor(newRecipientId), + ContentHint.DEFAULT, message); } } catch (UntrustedIdentityException e) { 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 c3314f75..9e0a4375 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 @@ -34,7 +34,7 @@ public class ServiceConfig { } catch (Throwable ignored) { zkGroupAvailable = false; } - capabilities = new AccountAttributes.Capabilities(false, zkGroupAvailable, false, zkGroupAvailable); + capabilities = new AccountAttributes.Capabilities(false, zkGroupAvailable, false, zkGroupAvailable, false); try { TrustStore contactTrustStore = new IasTrustStore(); diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java index e308bb66..5e504ec6 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java @@ -3,6 +3,7 @@ package org.asamk.signal.manager.storage.protocol; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKeyPair; import org.whispersystems.libsignal.InvalidKeyIdException; +import org.whispersystems.libsignal.NoSessionException; import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.groups.state.SenderKeyRecord; import org.whispersystems.libsignal.state.IdentityKeyStore; @@ -13,8 +14,11 @@ import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyStore; import org.whispersystems.signalservice.api.SignalServiceProtocolStore; import org.whispersystems.signalservice.api.SignalServiceSessionStore; +import org.whispersystems.signalservice.api.push.DistributionId; +import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.UUID; public class SignalProtocolStore implements SignalServiceProtocolStore { @@ -86,6 +90,11 @@ public class SignalProtocolStore implements SignalServiceProtocolStore { return sessionStore.loadSession(address); } + @Override + public List loadExistingSessions(final List addresses) throws NoSessionException { + return sessionStore.loadExistingSessions(addresses); + } + @Override public List getSubDeviceSessions(String name) { return sessionStore.getSubDeviceSessions(name); @@ -145,10 +154,32 @@ public class SignalProtocolStore implements SignalServiceProtocolStore { public void storeSenderKey( final SignalProtocolAddress sender, final UUID distributionId, final SenderKeyRecord record ) { + // TODO } @Override public SenderKeyRecord loadSenderKey(final SignalProtocolAddress sender, final UUID distributionId) { + // TODO + return null; + } + + @Override + public Set getSenderKeySharedWith(final DistributionId distributionId) { + // TODO return null; } + + @Override + public void markSenderKeySharedWith( + final DistributionId distributionId, final Collection addresses + ) { + // TODO + } + + @Override + public void clearSenderKeySharedWith( + final DistributionId distributionId, final Collection addresses + ) { + // TODO + } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java index dcdc8964..87828953 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/Profile.java @@ -133,7 +133,8 @@ public class Profile { public enum Capability { gv2, storage, - gv1Migration; + gv1Migration, + senderKey; static Capability valueOfOrNull(String value) { try { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java index 3e5555f4..ef0a055b 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java @@ -6,6 +6,7 @@ import org.asamk.signal.manager.util.IOUtils; import org.asamk.signal.manager.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.libsignal.NoSessionException; import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.protocol.CiphertextMessage; import org.whispersystems.libsignal.state.SessionRecord; @@ -21,6 +22,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -55,6 +57,30 @@ public class SessionStore implements SignalServiceSessionStore { } } + @Override + public List loadExistingSessions(final List addresses) throws NoSessionException { + final var keys = addresses.stream().map(this::getKey).collect(Collectors.toList()); + + synchronized (cachedSessions) { + final var sessions = keys.stream() + .map(this::loadSessionLocked) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (sessions.size() != addresses.size()) { + String message = "Mismatch! Asked for " + + addresses.size() + + " sessions, but only found " + + sessions.size() + + "!"; + logger.warn(message); + throw new NoSessionException(message); + } + + return sessions; + } + } + @Override public List getSubDeviceSessions(String name) { final var recipientId = resolveRecipient(name); diff --git a/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java index 814bd7fa..213f516c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java @@ -62,6 +62,9 @@ public class ProfileUtils { if (encryptedProfile.getCapabilities().isStorage()) { capabilities.add(Profile.Capability.storage); } + if (encryptedProfile.getCapabilities().isSenderKey()) { + capabilities.add(Profile.Capability.senderKey); + } return capabilities; } -- 2.50.1