From: AsamK Date: Wed, 16 Mar 2022 20:04:14 +0000 (+0100) Subject: Update libsignal-service-java X-Git-Tag: v0.10.4.2~3 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/942999b7b4beebf4519eed9b216587519b47e6c6?hp=3c2fa65e05ee6e57e88edb947385e0858f205949 Update libsignal-service-java --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 1857e1b3..f7c1a95b 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -2484,6 +2484,7 @@ {"name":"nullMessage_"}, {"name":"receiptMessage_"}, {"name":"senderKeyDistributionMessage_"}, + {"name":"storyMessage_"}, {"name":"syncMessage_"}, {"name":"typingMessage_"} ] @@ -2626,22 +2627,10 @@ {"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_"}, @@ -2763,6 +2752,17 @@ {"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":[ @@ -2846,7 +2846,6 @@ "fields":[ {"name":"bitField0_"}, {"name":"groupId_"}, - {"name":"threadE164_"}, {"name":"threadUuid_"}, {"name":"type_"} ] @@ -2863,7 +2862,6 @@ "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Read", "fields":[ {"name":"bitField0_"}, - {"name":"senderE164_"}, {"name":"senderUuid_"}, {"name":"timestamp_"} ] @@ -2879,7 +2877,6 @@ "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent", "fields":[ {"name":"bitField0_"}, - {"name":"destinationE164_"}, {"name":"destinationUuid_"}, {"name":"expirationStartTimestamp_"}, {"name":"isRecipientUpdate_"}, @@ -2892,7 +2889,6 @@ "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$UnidentifiedDeliveryStatus", "fields":[ {"name":"bitField0_"}, - {"name":"destinationE164_"}, {"name":"destinationUuid_"}, {"name":"unidentified_"} ] @@ -2910,7 +2906,6 @@ "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$ViewOnceOpen", "fields":[ {"name":"bitField0_"}, - {"name":"senderE164_"}, {"name":"senderUuid_"}, {"name":"timestamp_"} ] @@ -2919,7 +2914,6 @@ "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Viewed", "fields":[ {"name":"bitField0_"}, - {"name":"senderE164_"}, {"name":"senderUuid_"}, {"name":"timestamp_"} ] @@ -2937,7 +2931,6 @@ "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Verified", "fields":[ {"name":"bitField0_"}, - {"name":"destinationE164_"}, {"name":"destinationUuid_"}, {"name":"identityKey_"}, {"name":"nullMessage_"}, @@ -3104,6 +3097,10 @@ "name":"org.whispersystems.signalservice.internal.util.JsonUtil$IdentityKeySerializer", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.util.JsonUtil$ServiceIdDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.util.JsonUtil$UuidDeserializer", "methods":[{"name":"","parameterTypes":[] }] diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 3590f960..81a804ff 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_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") 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 73e7fe19..2361c733 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 @@ -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 image) { static Preview from( - SignalServiceDataMessage.Preview preview, final AttachmentFileProvider fileProvider + SignalServicePreview preview, final AttachmentFileProvider fileProvider ) { return new Preview(preview.getTitle(), preview.getDescription(), diff --git a/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResult.java b/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResult.java index c54e9f27..1d38e9d9 100644 --- a/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResult.java +++ b/lib/src/main/java/org/asamk/signal/manager/api/SendMessageResult.java @@ -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) {} } 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 dd85671b..3a544318 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 @@ -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(); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java index 5e668c15..140b5971 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java @@ -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())); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java index 38acd37b..278fb107 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java @@ -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, () -> { 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 712d5a31..1fb7c35c 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 @@ -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; } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java index eb6d5f29..218032f8 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java @@ -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()); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java index 3bfdadc0..69e2537d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java @@ -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, Optional 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, Optional 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))); } } 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 7c754d55..9d7e0c50 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 @@ -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 addressOptional = sourceAci == null + Optional addressOptional = sourceServiceId == null ? Optional.absent() - : Optional.of(new SignalServiceAddress(sourceAci, source)); + : Optional.of(new SignalServiceAddress(sourceServiceId, source)); return new SignalServiceEnvelope(type, addressOptional, sourceDevice, 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 df7ca9c8..c62c1d4c 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 @@ -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; } } diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 4754d4e5..1a30b2e0 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -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 diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index 9b80a3aa..f81f54c6 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -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, } } diff --git a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java index 74f49534..a7739c23 100644 --- a/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java +++ b/src/main/java/org/asamk/signal/util/SendMessageResultUtils.java @@ -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()) {