]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service-java
authorAsamK <asamk@gmx.de>
Wed, 16 Mar 2022 20:04:14 +0000 (21:04 +0100)
committerAsamK <asamk@gmx.de>
Wed, 16 Mar 2022 20:08:41 +0000 (21:08 +0100)
15 files changed:
graalvm-config-dir/reflect-config.json
lib/build.gradle.kts
lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java
lib/src/main/java/org/asamk/signal/manager/api/SendMessageResult.java
lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java
lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java
lib/src/main/java/org/asamk/signal/manager/util/ProfileUtils.java
man/signal-cli.1.adoc
src/main/java/org/asamk/signal/json/JsonSendMessageResult.java
src/main/java/org/asamk/signal/util/SendMessageResultUtils.java

index 1857e1b367921543246a6231f0269cff0a55f2a8..f7c1a95b43c17284c50091c057bf530e7424e3d7 100644 (file)
     {"name":"nullMessage_"}, 
     {"name":"receiptMessage_"}, 
     {"name":"senderKeyDistributionMessage_"}, 
+    {"name":"storyMessage_"}, 
     {"name":"syncMessage_"}, 
     {"name":"typingMessage_"}
   ]
     {"name":"receipt_"}
   ]
 },
-{
-  "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Preview",
-  "fields":[
-    {"name":"bitField0_"}, 
-    {"name":"date_"}, 
-    {"name":"description_"}, 
-    {"name":"image_"}, 
-    {"name":"title_"}, 
-    {"name":"url_"}
-  ]
-},
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Quote",
   "fields":[
     {"name":"attachments_"}, 
-    {"name":"authorE164_"}, 
     {"name":"authorUuid_"}, 
     {"name":"bitField0_"}, 
     {"name":"bodyRanges_"}, 
     {"name":"padding_"}
   ]
 },
+{
+  "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Preview",
+  "fields":[
+    {"name":"bitField0_"}, 
+    {"name":"date_"}, 
+    {"name":"description_"}, 
+    {"name":"image_"}, 
+    {"name":"title_"}, 
+    {"name":"url_"}
+  ]
+},
 {
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ReceiptMessage",
   "fields":[
   "fields":[
     {"name":"bitField0_"}, 
     {"name":"groupId_"}, 
-    {"name":"threadE164_"}, 
     {"name":"threadUuid_"}, 
     {"name":"type_"}
   ]
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Read",
   "fields":[
     {"name":"bitField0_"}, 
-    {"name":"senderE164_"}, 
     {"name":"senderUuid_"}, 
     {"name":"timestamp_"}
   ]
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent",
   "fields":[
     {"name":"bitField0_"}, 
-    {"name":"destinationE164_"}, 
     {"name":"destinationUuid_"}, 
     {"name":"expirationStartTimestamp_"}, 
     {"name":"isRecipientUpdate_"}, 
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$UnidentifiedDeliveryStatus",
   "fields":[
     {"name":"bitField0_"}, 
-    {"name":"destinationE164_"}, 
     {"name":"destinationUuid_"}, 
     {"name":"unidentified_"}
   ]
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$ViewOnceOpen",
   "fields":[
     {"name":"bitField0_"}, 
-    {"name":"senderE164_"}, 
     {"name":"senderUuid_"}, 
     {"name":"timestamp_"}
   ]
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Viewed",
   "fields":[
     {"name":"bitField0_"}, 
-    {"name":"senderE164_"}, 
     {"name":"senderUuid_"}, 
     {"name":"timestamp_"}
   ]
   "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Verified",
   "fields":[
     {"name":"bitField0_"}, 
-    {"name":"destinationE164_"}, 
     {"name":"destinationUuid_"}, 
     {"name":"identityKey_"}, 
     {"name":"nullMessage_"}, 
   "name":"org.whispersystems.signalservice.internal.util.JsonUtil$IdentityKeySerializer",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.whispersystems.signalservice.internal.util.JsonUtil$ServiceIdDeserializer",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.whispersystems.signalservice.internal.util.JsonUtil$UuidDeserializer",
   "methods":[{"name":"<init>","parameterTypes":[] }]
index 3590f960d6d06eac115bc51abf4a4d3123ce7a5b..81a804ff056f31207c6dd84097c1b251d3335403 100644 (file)
@@ -14,7 +14,7 @@ repositories {
 }
 
 dependencies {
-    implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_43")
+    implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_44")
     implementation("com.fasterxml.jackson.core", "jackson-databind", "2.13.1")
     implementation("com.google.protobuf", "protobuf-javalite", "3.11.4")
     implementation("org.bouncycastle", "bcprov-jdk15on", "1.70")
index 73e7fe1903601063a3b2cfc13c09b85f358a4e7d..2361c733274fefc70861f8d9c9a19b88966e6c4c 100644 (file)
@@ -13,6 +13,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
+import org.whispersystems.signalservice.api.messages.SignalServicePreview;
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
 import org.whispersystems.signalservice.api.messages.calls.AnswerMessage;
@@ -242,7 +243,7 @@ public record MessageEnvelope(
                     RecipientResolver recipientResolver,
                     RecipientAddressResolver addressResolver
             ) {
-                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getAci())),
+                return new Mention(addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(mention.getServiceId())),
                         mention.getStart(),
                         mention.getLength());
             }
@@ -481,7 +482,7 @@ public record MessageEnvelope(
         public record Preview(String title, String description, long date, String url, Optional<Attachment> image) {
 
             static Preview from(
-                    SignalServiceDataMessage.Preview preview, final AttachmentFileProvider fileProvider
+                    SignalServicePreview preview, final AttachmentFileProvider fileProvider
             ) {
                 return new Preview(preview.getTitle(),
                         preview.getDescription(),
index c54e9f2795886bbb7d053695825eaa7fbcec37cb..1d38e9d9d5b004415a67744138b9919668db8532 100644 (file)
@@ -11,29 +11,30 @@ public record SendMessageResult(
         boolean isNetworkFailure,
         boolean isUnregisteredFailure,
         boolean isIdentityFailure,
+        boolean isRateLimitFailure,
         ProofRequiredException proofRequiredFailure
 ) {
 
     public static SendMessageResult success(RecipientAddress address) {
-        return new SendMessageResult(address, true, false, false, false, null);
+        return new SendMessageResult(address, true, false, false, false, false, null);
     }
 
     public static SendMessageResult networkFailure(RecipientAddress address) {
-        return new SendMessageResult(address, false, true, false, false, null);
+        return new SendMessageResult(address, false, true, false, false, false, null);
     }
 
     public static SendMessageResult unregisteredFailure(RecipientAddress address) {
-        return new SendMessageResult(address, false, false, true, false, null);
+        return new SendMessageResult(address, false, false, true, false, false, null);
     }
 
     public static SendMessageResult identityFailure(RecipientAddress address, IdentityKey identityKey) {
-        return new SendMessageResult(address, false, false, false, true, null);
+        return new SendMessageResult(address, false, false, false, true, false, null);
     }
 
     public static SendMessageResult proofRequiredFailure(
             RecipientAddress address, ProofRequiredException proofRequiredException
     ) {
-        return new SendMessageResult(address, false, true, false, false, proofRequiredException);
+        return new SendMessageResult(address, false, true, false, false, false, proofRequiredException);
     }
 
     public static SendMessageResult from(
@@ -47,10 +48,9 @@ public record SendMessageResult(
                 sendMessageResult.isNetworkFailure(),
                 sendMessageResult.isUnregisteredFailure(),
                 sendMessageResult.getIdentityFailure() != null,
+                sendMessageResult.getRateLimitFailure() != null,
                 sendMessageResult.getProofRequiredFailure() == null
                         ? null
                         : new ProofRequiredException(sendMessageResult.getProofRequiredFailure()));
     }
-
-    public record IdentityFailure(IdentityKey identityKey) {}
 }
index dd85671b21a5434a0771d8b6a202479f281c8559..3a54431882380bdc88d180e8437956ab8489ed2a 100644 (file)
@@ -30,7 +30,7 @@ public class ServiceConfig {
     public static final AccountAttributes.Capabilities capabilities;
 
     static {
-        capabilities = new AccountAttributes.Capabilities(false, true, false, true, true, true, true);
+        capabilities = new AccountAttributes.Capabilities(false, true, false, true, true, true, true, false);
 
         try {
             TrustStore contactTrustStore = new IasTrustStore();
index 5e668c15e13ce76ef56adc3472cc089fc3d2abf3..140b5971a42fe413f91bfcb4a00886a0bdebcfc8 100644 (file)
@@ -41,8 +41,8 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStre
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
-import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.DistributionId;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.exceptions.ConflictException;
 
 import java.io.File;
@@ -391,8 +391,8 @@ public class GroupHelper {
 
     private void storeProfileKeysFromMembers(final DecryptedGroup group) {
         for (var member : group.getMembersList()) {
-            final var aci = ACI.fromByteString(member.getUuid());
-            final var recipientId = account.getRecipientStore().resolveRecipient(aci);
+            final var serviceId = ServiceId.fromByteString(member.getUuid());
+            final var recipientId = account.getRecipientStore().resolveRecipient(serviceId);
             try {
                 account.getProfileStore()
                         .storeProfileKey(recipientId, new ProfileKey(member.getProfileKey().toByteArray()));
index 38acd37b35cce55ae6671a7eea926e78e06aba53..278fb107d6a1dc9c2d2c7d2a5943e5229579cb81 100644 (file)
@@ -12,6 +12,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.libsignal.InvalidKeyException;
 import org.whispersystems.signalservice.api.push.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.internal.contacts.crypto.Quote;
 import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedQuoteException;
@@ -75,7 +76,7 @@ public class RecipientHelper {
 
     public RecipientId resolveRecipient(final RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException {
         if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) {
-            return account.getRecipientStore().resolveRecipient(ACI.from(uuidRecipient.uuid()));
+            return account.getRecipientStore().resolveRecipient(ServiceId.from(uuidRecipient.uuid()));
         } else {
             final var number = ((RecipientIdentifier.Number) recipient).number();
             return account.getRecipientStore().resolveRecipient(number, () -> {
index 712d5a31669b65f6c660f25656969e7bf8af1405..1fb7c35cbf2f0d7b963c3fc03fc799256e27ab5f 100644 (file)
@@ -190,9 +190,10 @@ public class SendHelper {
             SignalServiceTypingMessage message, RecipientId recipientId
     ) {
         final var result = handleSendMessage(recipientId,
-                (messageSender, address, unidentifiedAccess) -> messageSender.sendTyping(address,
-                        unidentifiedAccess,
-                        message));
+                (messageSender, address, unidentifiedAccess) -> messageSender.sendTyping(List.of(address),
+                        List.of(unidentifiedAccess),
+                        message,
+                        null).get(0));
         handleSendMessageResult(result);
         return result;
     }
index eb6d5f29f2d695f93c0b2781e84b55504a146ae8..218032f88aa721a8c10287d764dd64b1957f7877 100644 (file)
@@ -10,8 +10,8 @@ import org.signal.storageservice.protos.groups.Member;
 import org.signal.storageservice.protos.groups.local.DecryptedGroup;
 import org.signal.storageservice.protos.groups.local.EnabledState;
 import org.signal.zkgroup.groups.GroupMasterKey;
-import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.push.DistributionId;
+import org.whispersystems.signalservice.api.push.ServiceId;
 
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -112,7 +112,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getMembersList()
                 .stream()
-                .map(m -> ACI.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -124,7 +124,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getPendingMembersList()
                 .stream()
-                .map(m -> ACI.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -136,7 +136,7 @@ public final class GroupInfoV2 extends GroupInfo {
         }
         return group.getRequestingMembersList()
                 .stream()
-                .map(m -> ACI.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
@@ -149,7 +149,7 @@ public final class GroupInfoV2 extends GroupInfo {
         return group.getMembersList()
                 .stream()
                 .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
-                .map(m -> ACI.fromByteString(m.getUuid()))
+                .map(m -> ServiceId.fromByteString(m.getUuid()))
                 .map(recipientResolver::resolveRecipient)
                 .collect(Collectors.toSet());
     }
index 3bfdadc0e513da6438650a62ff412a20bdb01699..69e2537d638028405941072e981cdd3fbe86c794 100644 (file)
@@ -1,6 +1,6 @@
 package org.asamk.signal.manager.storage.recipients;
 
-import org.whispersystems.signalservice.api.push.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import java.util.Optional;
@@ -8,7 +8,7 @@ import java.util.UUID;
 
 public record RecipientAddress(Optional<UUID> uuid, Optional<String> number) {
 
-    public static final UUID UNKNOWN_UUID = ACI.UNKNOWN.uuid();
+    public static final UUID UNKNOWN_UUID = ServiceId.UNKNOWN.uuid();
 
     /**
      * Construct a RecipientAddress.
@@ -62,7 +62,7 @@ public record RecipientAddress(Optional<UUID> uuid, Optional<String> number) {
     }
 
     public SignalServiceAddress toSignalServiceAddress() {
-        return new SignalServiceAddress(ACI.from(uuid.orElse(UNKNOWN_UUID)),
+        return new SignalServiceAddress(ServiceId.from(uuid.orElse(UNKNOWN_UUID)),
                 org.whispersystems.libsignal.util.guava.Optional.fromNullable(number.orElse(null)));
     }
 }
index 7c754d55618b8b41b243dfd4ceeea628833c80f5..9d7e0c5013ab7b74ca3d44dbb16ebd6f36f87a8a 100644 (file)
@@ -2,7 +2,7 @@ package org.asamk.signal.manager.util;
 
 import org.whispersystems.libsignal.util.guava.Optional;
 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
-import org.whispersystems.signalservice.api.push.ACI;
+import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import java.io.DataInputStream;
@@ -23,9 +23,9 @@ public class MessageCacheUtils {
             }
             var type = in.readInt();
             var source = in.readUTF();
-            ACI sourceAci = null;
+            ServiceId sourceServiceId = null;
             if (version >= 3) {
-                sourceAci = ACI.parseOrNull(in.readUTF());
+                sourceServiceId = ServiceId.parseOrNull(in.readUTF());
             }
             var sourceDevice = in.readInt();
             if (version == 1) {
@@ -58,9 +58,9 @@ public class MessageCacheUtils {
             if (version >= 4) {
                 serverDeliveredTimestamp = in.readLong();
             }
-            Optional<SignalServiceAddress> addressOptional = sourceAci == null
+            Optional<SignalServiceAddress> addressOptional = sourceServiceId == null
                     ? Optional.absent()
-                    : Optional.of(new SignalServiceAddress(sourceAci, source));
+                    : Optional.of(new SignalServiceAddress(sourceServiceId, source));
             return new SignalServiceEnvelope(type,
                     addressOptional,
                     sourceDevice,
index df7ca9c833176d502b7361d770b83dc6d30acbfb..c62c1d4cd4b14fe2e80bd17eaeb30bdc2680ea6b 100644 (file)
@@ -35,7 +35,7 @@ public class ProfileUtils {
                     getUnidentifiedAccessMode(encryptedProfile, profileCipher),
                     getCapabilities(encryptedProfile));
         } catch (InvalidCiphertextException e) {
-            logger.debug("Failed to decrypt profile for {}", encryptedProfile.getAci(), e);
+            logger.debug("Failed to decrypt profile for {}", encryptedProfile.getServiceId(), e);
             return null;
         }
     }
index 4754d4e5b2b6f8301f570f3685469a2d1a745668..1a30b2e06a869c29381ade46da635118e80028ce 100644 (file)
@@ -93,6 +93,7 @@ The verification should be done over voice, not SMS.
 *--captcha*::
 The captcha token, required if registration failed with a captcha required error.
 To get the token, go to https://signalcaptchas.org/registration/generate.html
+For the staging environment, use: https://signalcaptchas.org/staging/registration/generate.html
 Check the developer tools for a redirect starting with signalcaptcha:// Everything after signalcaptcha:// is the captcha token.
 
 === verify
index 9b80a3aa9d79f180535885c6d80a2800fd07ff4f..f81f54c60544dec70ec38fa16895a633e3419901 100644 (file)
@@ -24,7 +24,11 @@ public record JsonSendMessageResult(
                         ? Type.SUCCESS
                         : result.isNetworkFailure()
                                 ? Type.NETWORK_FAILURE
-                                : result.isUnregisteredFailure() ? Type.UNREGISTERED_FAILURE : Type.IDENTITY_FAILURE,
+                                : result.isRateLimitFailure()
+                                        ? Type.RATE_LIMIT_FAILURE
+                                        : result.isUnregisteredFailure()
+                                                ? Type.UNREGISTERED_FAILURE
+                                                : Type.IDENTITY_FAILURE,
                 result.proofRequiredFailure() != null ? result.proofRequiredFailure().getToken() : null,
                 result.proofRequiredFailure() != null ? result.proofRequiredFailure().getRetryAfterSeconds() : null);
     }
@@ -34,5 +38,6 @@ public record JsonSendMessageResult(
         NETWORK_FAILURE,
         UNREGISTERED_FAILURE,
         IDENTITY_FAILURE,
+        RATE_LIMIT_FAILURE,
     }
 }
index 74f49534f164747008564d95a1a3ebe4a1971bb4..a7739c23fbfe944620e5a4741ce94adc90a5ea98 100644 (file)
@@ -100,6 +100,8 @@ public class SendMessageResultUtils {
                     failure.getRetryAfterSeconds());
         } else if (result.isNetworkFailure()) {
             return String.format("Network failure for \"%s\"", identifier);
+        } else if (result.isRateLimitFailure()) {
+            return String.format("Rate limit failure for \"%s\"", identifier);
         } else if (result.isUnregisteredFailure()) {
             return String.format("Unregistered user \"%s\"", identifier);
         } else if (result.isIdentityFailure()) {