]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service-java
authorAsamK <asamk@gmx.de>
Sun, 8 Sep 2024 08:13:59 +0000 (10:13 +0200)
committerAsamK <asamk@gmx.de>
Sun, 8 Sep 2024 08:18:17 +0000 (10:18 +0200)
CHANGELOG.md
graalvm-config-dir/reflect-config.json
graalvm-config-dir/resource-config.json
lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java
lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/prekeys/SignedPreKeyStore.java
settings.gradle.kts
src/main/java/org/asamk/signal/BaseConfig.java

index 7b534de6795d32efe59f4dc92ba9069d4f903665..bcceabd7abbf9555f0f8d0685201a0fd014a121f 100644 (file)
@@ -2,7 +2,7 @@
 
 ## [Unreleased]
 
-Requires libsignal-client version 0.52.5
+Requires libsignal-client version 0.56.0
 
 ### Fixed
 
index 0a65c68be0c0488255e328a35cba08f9a7ef0d91..d38c8ed2b6f794cb0e4bfff708de8daf381022d7 100644 (file)
   "allDeclaredFields":true,
   "allDeclaredMethods":true,
   "allDeclaredConstructors":true,
-  "methods":[{"name":"getAnnouncementGroup","parameterTypes":[] }, {"name":"getChangeNumber","parameterTypes":[] }, {"name":"getDeleteSync","parameterTypes":[] }, {"name":"getGiftBadges","parameterTypes":[] }, {"name":"getPaymentActivation","parameterTypes":[] }, {"name":"getPni","parameterTypes":[] }, {"name":"getSenderKey","parameterTypes":[] }, {"name":"getStorage","parameterTypes":[] }, {"name":"getStories","parameterTypes":[] }]
+  "methods":[{"name":"getAnnouncementGroup","parameterTypes":[] }, {"name":"getChangeNumber","parameterTypes":[] }, {"name":"getDeleteSync","parameterTypes":[] }, {"name":"getGiftBadges","parameterTypes":[] }, {"name":"getPaymentActivation","parameterTypes":[] }, {"name":"getPni","parameterTypes":[] }, {"name":"getSenderKey","parameterTypes":[] }, {"name":"getStorage","parameterTypes":[] }, {"name":"getStories","parameterTypes":[] }, {"name":"getVersionedExpirationTimer","parameterTypes":[] }]
 },
 {
   "name":"org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest",
index 2c5463f7cfe1d32c68c6d5481c95d95a0f734b07..eb97bf2f86468657dd224454cec92b82d4dc54ea 100644 (file)
     "pattern":"\\Qlibsignal_jni.dylib\\E"
   }, {
     "pattern":"\\Qlibsignal_jni.so\\E"
+  }, {
+    "pattern":"\\Qlibsignal_jni_amd64.so\\E"
   }, {
     "pattern":"\\Qorg/asamk/signal/manager/config/ias.store\\E"
   }, {
index 62aedaf6e599712bbcb1c2d18380a5ac0b29b121..2de70a531dc200caba461e5493b2568b311c9ae0 100644 (file)
@@ -28,7 +28,8 @@ public class ServiceConfig {
 
     public static AccountAttributes.Capabilities getCapabilities(boolean isPrimaryDevice) {
         final var deleteSync = !isPrimaryDevice;
-        return new AccountAttributes.Capabilities(true, deleteSync);
+        final var versionedExpirationTimer = !isPrimaryDevice;
+        return new AccountAttributes.Capabilities(true, deleteSync, versionedExpirationTimer);
     }
 
     public static ServiceEnvironmentConfig getServiceEnvironmentConfig(
index 0ec45cb9c4695d4223582ea31d64e95217f30fc1..5163c8fc27813e3415cdc34a81f17b6a0fcc1a86 100644 (file)
@@ -220,20 +220,30 @@ public class AccountHelper {
         final var messageSender = dependencies.getMessageSender();
         for (final var deviceId : deviceIds) {
             // Signed Prekey
-            final var signedPreKeyRecord = KeyUtils.generateSignedPreKeyRecord(KeyUtils.getRandomInt(PREKEY_MAXIMUM_ID),
-                    pniIdentity.getPrivateKey());
-            final var signedPreKeyEntity = new SignedPreKeyEntity(signedPreKeyRecord.getId(),
-                    signedPreKeyRecord.getKeyPair().getPublicKey(),
-                    signedPreKeyRecord.getSignature());
-            devicePniSignedPreKeys.put(deviceId, signedPreKeyEntity);
+            final SignedPreKeyRecord signedPreKeyRecord;
+            try {
+                signedPreKeyRecord = KeyUtils.generateSignedPreKeyRecord(KeyUtils.getRandomInt(PREKEY_MAXIMUM_ID),
+                        pniIdentity.getPrivateKey());
+                final var signedPreKeyEntity = new SignedPreKeyEntity(signedPreKeyRecord.getId(),
+                        signedPreKeyRecord.getKeyPair().getPublicKey(),
+                        signedPreKeyRecord.getSignature());
+                devicePniSignedPreKeys.put(deviceId, signedPreKeyEntity);
+            } catch (InvalidKeyException e) {
+                throw new AssertionError("unexpected invalid key", e);
+            }
 
             // Last-resort kyber prekey
-            final var lastResortKyberPreKeyRecord = KeyUtils.generateKyberPreKeyRecord(KeyUtils.getRandomInt(
-                    PREKEY_MAXIMUM_ID), pniIdentity.getPrivateKey());
-            final var kyberPreKeyEntity = new KyberPreKeyEntity(lastResortKyberPreKeyRecord.getId(),
-                    lastResortKyberPreKeyRecord.getKeyPair().getPublicKey(),
-                    lastResortKyberPreKeyRecord.getSignature());
-            devicePniLastResortKyberPreKeys.put(deviceId, kyberPreKeyEntity);
+            final KyberPreKeyRecord lastResortKyberPreKeyRecord;
+            try {
+                lastResortKyberPreKeyRecord = KeyUtils.generateKyberPreKeyRecord(KeyUtils.getRandomInt(PREKEY_MAXIMUM_ID),
+                        pniIdentity.getPrivateKey());
+                final var kyberPreKeyEntity = new KyberPreKeyEntity(lastResortKyberPreKeyRecord.getId(),
+                        lastResortKyberPreKeyRecord.getKeyPair().getPublicKey(),
+                        lastResortKyberPreKeyRecord.getSignature());
+                devicePniLastResortKyberPreKeys.put(deviceId, kyberPreKeyEntity);
+            } catch (InvalidKeyException e) {
+                throw new AssertionError("unexpected invalid key", e);
+            }
 
             // Registration Id
             var pniRegistrationId = -1;
index 9af1f01fdce5d75a74a7546d022ef3735151ca3c..efb4862356a9554220534420ba737ddb1ca71f53 100644 (file)
@@ -9,7 +9,6 @@ import org.asamk.signal.manager.storage.groups.GroupInfoV1;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.storage.stickers.StickerPack;
-import org.asamk.signal.manager.util.AttachmentUtils;
 import org.asamk.signal.manager.util.IOUtils;
 import org.asamk.signal.manager.util.MimeUtils;
 import org.jetbrains.annotations.NotNull;
@@ -18,12 +17,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.messages.SendMessageResult;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
-import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ConfigurationMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.ContactsMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceContact;
+import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactAvatar;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactsInputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactsOutputStream;
 import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroup;
@@ -170,7 +169,14 @@ public class SyncHelper {
                     final var contact = contactPair.second();
                     final var address = account.getRecipientAddressResolver().resolveRecipientAddress(recipientId);
 
-                    out.write(getDeviceContact(address, recipientId, contact));
+                    final var deviceContact = getDeviceContact(address, recipientId, contact);
+                    out.write(deviceContact);
+                    deviceContact.getAvatar().ifPresent(a -> {
+                        try {
+                            a.getInputStream().close();
+                        } catch (IOException ignored) {
+                        }
+                    });
                 }
 
                 if (account.getProfileKey() != null) {
@@ -178,7 +184,14 @@ public class SyncHelper {
                     final var address = account.getSelfRecipientAddress();
                     final var recipientId = account.getSelfRecipientId();
                     final var contact = account.getContactStore().getContact(recipientId);
-                    out.write(getDeviceContact(address, recipientId, contact));
+                    final var deviceContact = getDeviceContact(address, recipientId, contact);
+                    out.write(deviceContact);
+                    deviceContact.getAvatar().ifPresent(a -> {
+                        try {
+                            a.getInputStream().close();
+                        } catch (IOException ignored) {
+                        }
+                    });
                 }
             }
 
@@ -234,6 +247,7 @@ public class SyncHelper {
                 Optional.ofNullable(profileKey),
                 Optional.ofNullable(contact == null ? null : contact.messageExpirationTime()),
                 Optional.empty(),
+                Optional.empty(),
                 contact != null && contact.isArchived());
     }
 
@@ -391,7 +405,7 @@ public class SyncHelper {
             account.getContactStore().storeContact(recipientId, builder.build());
 
             if (c.getAvatar().isPresent()) {
-                downloadContactAvatar(c.getAvatar().get(), address);
+                storeContactAvatar(c.getAvatar().get(), address);
             }
         }
     }
@@ -425,21 +439,22 @@ public class SyncHelper {
         return context.getSendHelper().sendSyncMessage(message);
     }
 
-    private Optional<SignalServiceAttachmentStream> createContactAvatarAttachment(RecipientAddress address) throws IOException {
+    private Optional<DeviceContactAvatar> createContactAvatarAttachment(RecipientAddress address) throws IOException {
         final var streamDetails = context.getAvatarStore().retrieveContactAvatar(address);
         if (streamDetails == null) {
             return Optional.empty();
         }
 
-        final var uploadSpec = context.getDependencies().getMessageSender().getResumableUploadSpec().toProto();
-        return Optional.of(AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty(), uploadSpec));
+        return Optional.of(new DeviceContactAvatar(streamDetails.getStream(),
+                streamDetails.getLength(),
+                streamDetails.getContentType()));
     }
 
-    private void downloadContactAvatar(SignalServiceAttachment avatar, RecipientAddress address) {
+    private void storeContactAvatar(DeviceContactAvatar avatar, RecipientAddress address) {
         try {
             context.getAvatarStore()
                     .storeContactAvatar(address,
-                            outputStream -> context.getAttachmentHelper().retrieveAttachment(avatar, outputStream));
+                            outputStream -> IOUtils.copyStream(avatar.getInputStream(), outputStream));
         } catch (IOException e) {
             logger.warn("Failed to download avatar for contact {}, ignoring: {}", address, e.getMessage());
         }
index 0de10b136d37a7ca50f4fee015f62c040c0fe727..d62e939d14f8d576c532b62a07ee7def63c54d3c 100644 (file)
@@ -93,9 +93,13 @@ public class SignedPreKeyStore implements org.signal.libsignal.protocol.state.Si
             try (final var statement = connection.prepareStatement(sql)) {
                 statement.setInt(1, accountIdType);
                 statement.setInt(2, signedPreKeyId);
-                final var keyPair = record.getKeyPair();
-                statement.setBytes(3, keyPair.getPublicKey().serialize());
-                statement.setBytes(4, keyPair.getPrivateKey().serialize());
+                try {
+                    final var keyPair = record.getKeyPair();
+                    statement.setBytes(3, keyPair.getPublicKey().serialize());
+                    statement.setBytes(4, keyPair.getPrivateKey().serialize());
+                } catch (InvalidKeyException e) {
+                    throw new AssertionError("unexpected invalid key", e);
+                }
                 statement.setBytes(5, record.getSignature());
                 statement.setLong(6, record.getTimestamp());
                 statement.executeUpdate();
@@ -193,9 +197,13 @@ public class SignedPreKeyStore implements org.signal.libsignal.protocol.state.Si
                 for (final var record : signedPreKeys) {
                     statement.setInt(1, accountIdType);
                     statement.setInt(2, record.getId());
-                    final var keyPair = record.getKeyPair();
-                    statement.setBytes(3, keyPair.getPublicKey().serialize());
-                    statement.setBytes(4, keyPair.getPrivateKey().serialize());
+                    try {
+                        final var keyPair = record.getKeyPair();
+                        statement.setBytes(3, keyPair.getPublicKey().serialize());
+                        statement.setBytes(4, keyPair.getPrivateKey().serialize());
+                    } catch (InvalidKeyException e) {
+                        throw new AssertionError("unexpected invalid key", e);
+                    }
                     statement.setBytes(5, record.getSignature());
                     statement.setLong(6, record.getTimestamp());
                     statement.executeUpdate();
index e03e3059af9883b27260b33a4551b9a613a474f3..95d5a87d4df388362fc013918932c355234d51ab 100644 (file)
@@ -15,7 +15,7 @@ dependencyResolutionManagement {
             library("slf4j.jul", "org.slf4j", "jul-to-slf4j").versionRef("slf4j")
             library("logback", "ch.qos.logback", "logback-classic").version("1.5.6")
 
-            library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_106")
+            library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_107")
             library("sqlite", "org.xerial", "sqlite-jdbc").version("3.46.0.0")
             library("hikari", "com.zaxxer", "HikariCP").version("5.1.0")
             library("junit.jupiter", "org.junit.jupiter", "junit-jupiter").version("5.10.2")
index 6fd1b21e1c77e91f6c07f35c0196ab49a92723df..ef4c4d7e5bc0f8b1ab71b01b0aef423a5858434a 100644 (file)
@@ -8,7 +8,7 @@ public class BaseConfig {
     public static final String PROJECT_VERSION = BaseConfig.class.getPackage().getImplementationVersion();
 
     static final String USER_AGENT_SIGNAL_ANDROID = Optional.ofNullable(System.getenv("SIGNAL_CLI_USER_AGENT"))
-            .orElse("Signal-Android/7.14.1");
+            .orElse("Signal-Android/7.16.2");
     static final String USER_AGENT_SIGNAL_CLI = PROJECT_NAME == null
             ? "signal-cli"
             : PROJECT_NAME + "/" + PROJECT_VERSION;