From 4f8da7819e080382ffea7754e4fa5f29177d102f Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 5 Jun 2023 19:30:18 +0200 Subject: [PATCH 01/16] Reformat code --- src/main/java/org/asamk/Signal.java | 2 +- .../asamk/signal/commands/TrustCommand.java | 10 ++--- .../asamk/signal/dbus/DbusManagerImpl.java | 3 +- .../org/asamk/signal/dbus/DbusSignalImpl.java | 40 +++++++++---------- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 2ca23dfb..0a508548 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -139,7 +139,7 @@ public interface Signal extends DBusInterface { DBusPath getDevice(long deviceId); public DBusPath getIdentity(String number); - + public List listIdentities(); List listDevices() throws Error.Failure; diff --git a/src/main/java/org/asamk/signal/commands/TrustCommand.java b/src/main/java/org/asamk/signal/commands/TrustCommand.java index 7d1dd632..9b9735d3 100644 --- a/src/main/java/org/asamk/signal/commands/TrustCommand.java +++ b/src/main/java/org/asamk/signal/commands/TrustCommand.java @@ -38,15 +38,15 @@ public class TrustCommand implements JsonRpcLocalCommand { var recipentString = ns.getString("recipient"); var recipient = CommandUtil.getSingleRecipientIdentifier(recipentString, m.getSelfNumber()); if (Boolean.TRUE.equals(ns.getBoolean("trust-all-known-keys"))) { - boolean res; try { - res = m.trustIdentityAllKeys(recipient); + final var res = m.trustIdentityAllKeys(recipient); + if (!res) { + throw new UserErrorException( + "Failed to set the trust for this number, make sure the number is correct."); + } } catch (UnregisteredRecipientException e) { throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered."); } - if (!res) { - throw new UserErrorException("Failed to set the trust for this number, make sure the number is correct."); - } } else { var safetyNumber = ns.getString("verified-safety-number"); if (safetyNumber == null) { diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 0e81e578..f87eded6 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -669,8 +669,7 @@ public class DbusManagerImpl implements Manager { @Override public boolean trustIdentityVerified( - final RecipientIdentifier.Single recipient, - final IdentityVerificationCode verificationCode + final RecipientIdentifier.Single recipient, final IdentityVerificationCode verificationCode ) { throw new UnsupportedOperationException(); } diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 6a44ff97..f6ea4eef 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -11,6 +11,7 @@ import org.asamk.signal.manager.api.GroupLinkState; import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupPermission; import org.asamk.signal.manager.api.GroupSendingNotAllowedException; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidNumberException; @@ -30,7 +31,6 @@ import org.asamk.signal.manager.api.UnregisteredRecipientException; import org.asamk.signal.manager.api.UpdateGroup; import org.asamk.signal.manager.api.UpdateProfile; import org.asamk.signal.manager.api.UserStatus; -import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.util.SendMessageResultUtils; import org.freedesktop.dbus.DBusPath; import org.freedesktop.dbus.connections.impl.DBusConnection; @@ -55,8 +55,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import java.util.UUID; +import java.util.stream.Collectors; import static org.asamk.signal.dbus.DbusUtils.makeValidObjectPathElement; @@ -1044,8 +1044,8 @@ public class DbusSignalImpl implements Signal { final var object = new DbusSignalIdentityImpl(i); exportObject(object); this.identities.add(new StructIdentity(new DBusPath(object.getObjectPath()), - emptyIfNull(i.recipient().getIdentifier()), - i.recipient().getLegacyIdentifier())); + emptyIfNull(i.recipient().getIdentifier()), + i.recipient().getLegacyIdentifier())); }); } @@ -1054,17 +1054,18 @@ public class DbusSignalImpl implements Signal { } private void unExportIdentities() { - this.identities.stream().map(StructIdentity::getObjectPath).map(DBusPath::getPath).forEach(connection::unExportObject); + this.identities.stream() + .map(StructIdentity::getObjectPath) + .map(DBusPath::getPath) + .forEach(connection::unExportObject); this.identities.clear(); } @Override public DBusPath getIdentity(String number) throws Error.Failure { - final var found = identities.stream() - .filter(identity -> identity.getName().equals(number)) - .findFirst(); - + final var found = identities.stream().filter(identity -> identity.getName().equals(number)).findFirst(); + if (found.isEmpty()) { throw new Error.Failure("Identity for " + number + " unkown"); } @@ -1082,16 +1083,16 @@ public class DbusSignalImpl implements Signal { private final org.asamk.signal.manager.api.Identity identity; public DbusSignalIdentityImpl(final org.asamk.signal.manager.api.Identity identity) { - this.identity=identity; + this.identity = identity; super.addPropertiesHandler(new DbusInterfacePropertiesHandler("org.asamk.Signal.Identity", List.of(new DbusProperty<>("Number", () -> identity.recipient().number().orElse("")), - new DbusProperty<>("Uuid", () -> identity.recipient().uuid().map(UUID::toString).orElse("")), + new DbusProperty<>("Uuid", + () -> identity.recipient().uuid().map(UUID::toString).orElse("")), new DbusProperty<>("Fingerprint", () -> identity.getFingerprint()), new DbusProperty<>("SafetyNumber", identity::safetyNumber), new DbusProperty<>("ScannableSafetyNumber", identity::scannableSafetyNumber), new DbusProperty<>("TrustLevel", identity::trustLevel), - new DbusProperty<>("AddedDate", identity::dateAddedTimestamp) - ))); + new DbusProperty<>("AddedDate", identity::dateAddedTimestamp)))); } @Override @@ -1100,22 +1101,21 @@ public class DbusSignalImpl implements Signal { } @Override - public void trust() throws Error.Failure { - var recipient=RecipientIdentifier.Single.fromAddress(identity.recipient()); + public void trust() throws Error.Failure { + var recipient = RecipientIdentifier.Single.fromAddress(identity.recipient()); try { m.trustIdentityAllKeys(recipient); } catch (UnregisteredRecipientException e) { throw new Error.Failure("The user " + e.getSender().getIdentifier() + " is not registered."); } - }; + } @Override public void trustVerified(String safetyNumber) throws Error.Failure { - var recipient = RecipientIdentifier.Single.fromAddress(identity.recipient()); - + var recipient = RecipientIdentifier.Single.fromAddress(identity.recipient()); + if (safetyNumber == null) { - throw new Error.Failure( - "You need to specify a fingerprint/safety number"); + throw new Error.Failure("You need to specify a fingerprint/safety number"); } final IdentityVerificationCode verificationCode; try { -- 2.51.0 From 3d5c440aa24227f7a9a387dd675c6f5844d9c293 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 11 Jun 2023 16:39:54 +0200 Subject: [PATCH 02/16] Improve uuid/number handling --- man/signal-cli-dbus.5.adoc | 10 ++++++---- src/main/java/org/asamk/Signal.java | 10 +++++----- .../org/asamk/signal/dbus/DbusSignalImpl.java | 16 ++++++++-------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/man/signal-cli-dbus.5.adoc b/man/signal-cli-dbus.5.adoc index 0f11ef9d..1f2caa18 100644 --- a/man/signal-cli-dbus.5.adoc +++ b/man/signal-cli-dbus.5.adoc @@ -422,12 +422,12 @@ listIdentities() -> identities:: * identities : Array of structs (objectPath, id, name) ** objectPath : DBusPath representing the identity object path ** uuid : Internal uuid of the identity -** number : Phone number of the identity (or uuid if not known) +** number : Phone number of the identity Lists all know identities getIdentity(Number) -> identityPath:: -* Number : Phone number +* Number : Phone number * identityPath : DBusPath object for the identity Gets the identity Dbus path for a given phone number @@ -575,13 +575,15 @@ To get all properties, use: trust() -> <>:: -Establish trust with the given identity. TrustLevel will become TRUSTED_UNVERFIED +Establish trust with the given identity. +TrustLevel will become TRUSTED_UNVERFIED Exceptions: Failure trustVerified(SafetyNumber) -> <>:: -Establish trust with the given identity using their safety number. TrustLevel will become TRUSTED_VERIFIED +Establish trust with the given identity using their safety number. +TrustLevel will become TRUSTED_VERIFIED Exceptions: Failure diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 0a508548..9bffd6af 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -564,12 +564,12 @@ public interface Signal extends DBusInterface { String uuid; @Position(2) - String name; + String number; - public StructIdentity(final DBusPath objectPath, final String uuid, final String name) { + public StructIdentity(final DBusPath objectPath, final String uuid, final String number) { this.objectPath = objectPath; this.uuid = uuid; - this.name = name; + this.number = number; } public DBusPath getObjectPath() { @@ -580,8 +580,8 @@ public interface Signal extends DBusInterface { return uuid; } - public String getName() { - return name; + public String getNumber() { + return number; } } diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index f6ea4eef..fef6821a 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -1044,8 +1044,8 @@ public class DbusSignalImpl implements Signal { final var object = new DbusSignalIdentityImpl(i); exportObject(object); this.identities.add(new StructIdentity(new DBusPath(object.getObjectPath()), - emptyIfNull(i.recipient().getIdentifier()), - i.recipient().getLegacyIdentifier())); + i.recipient().uuid().map(UUID::toString).orElse(""), + i.recipient().number().orElse(""))); }); } @@ -1063,11 +1063,12 @@ public class DbusSignalImpl implements Signal { @Override public DBusPath getIdentity(String number) throws Error.Failure { - - final var found = identities.stream().filter(identity -> identity.getName().equals(number)).findFirst(); + final var found = identities.stream() + .filter(identity -> identity.getNumber().equals(number) || identity.getUuid().equals(number)) + .findFirst(); if (found.isEmpty()) { - throw new Error.Failure("Identity for " + number + " unkown"); + throw new Error.Failure("Identity for " + number + " unknown"); } return found.get().getObjectPath(); } @@ -1088,7 +1089,7 @@ public class DbusSignalImpl implements Signal { List.of(new DbusProperty<>("Number", () -> identity.recipient().number().orElse("")), new DbusProperty<>("Uuid", () -> identity.recipient().uuid().map(UUID::toString).orElse("")), - new DbusProperty<>("Fingerprint", () -> identity.getFingerprint()), + new DbusProperty<>("Fingerprint", identity::getFingerprint), new DbusProperty<>("SafetyNumber", identity::safetyNumber), new DbusProperty<>("ScannableSafetyNumber", identity::scannableSafetyNumber), new DbusProperty<>("TrustLevel", identity::trustLevel), @@ -1181,8 +1182,7 @@ public class DbusSignalImpl implements Signal { public class DbusSignalConfigurationImpl extends DbusProperties implements Signal.Configuration { - public DbusSignalConfigurationImpl( - ) { + public DbusSignalConfigurationImpl() { super.addPropertiesHandler(new DbusInterfacePropertiesHandler("org.asamk.Signal.Configuration", List.of(new DbusProperty<>("ReadReceipts", this::getReadReceipts, this::setReadReceipts), new DbusProperty<>("UnidentifiedDeliveryIndicators", -- 2.51.0 From aad4b535249cd8f8c4588e931850b5b2ffb0b6ca Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 11 Jun 2023 17:16:38 +0200 Subject: [PATCH 03/16] Update dependencies --- graalvm-config-dir/reflect-config.json | 30 +++++++++++++++++++ .../signal/manager/helper/AccountHelper.java | 11 ++++--- .../signal/manager/helper/PreKeyHelper.java | 14 +++++++-- .../signal/manager/helper/ReceiveHelper.java | 6 +++- .../manager/helper/RecipientHelper.java | 2 +- .../storage/protocol/SignalProtocolStore.java | 16 ++++++++++ settings.gradle.kts | 4 +-- 7 files changed, 72 insertions(+), 11 deletions(-) diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 9da72883..f1d57669 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -492,6 +492,11 @@ "allDeclaredMethods":true, "allDeclaredClasses":true }, +{ + "name":"org.asamk.Signal$Identity", + "allDeclaredClasses":true, + "queryAllDeclaredMethods":true +}, { "name":"org.asamk.Signal$MessageReceived", "allDeclaredConstructors":true, @@ -526,6 +531,10 @@ "queryAllDeclaredConstructors":true, "methods":[{"name":"","parameterTypes":["org.freedesktop.dbus.DBusPath","byte[]","java.lang.String"] }] }, +{ + "name":"org.asamk.Signal$StructIdentity", + "allDeclaredFields":true +}, { "name":"org.asamk.Signal$SyncMessageReceived", "allDeclaredConstructors":true, @@ -2790,6 +2799,20 @@ "queryAllDeclaredConstructors":true, "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$ByteArrayDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$KEMPublicKeyDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.push.MismatchedDevices", "allDeclaredFields":true, @@ -2797,6 +2820,13 @@ "allDeclaredConstructors":true, "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.push.OneTimePreKeyCounts", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.push.OutgoingPushMessage", "allDeclaredFields":true, diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index edca4f97..16ab92bd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -28,6 +28,7 @@ import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedExcep import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; +import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity; import org.whispersystems.signalservice.internal.push.OutgoingPushMessage; import org.whispersystems.util.Base64UrlSafe; @@ -153,6 +154,7 @@ public class AccountHelper { // TODO create new PNI identity key final List deviceMessages = null; final Map devicePniSignedPreKeys = null; + final Map devicePniLastResortKyberPrekeys = null; final Map pniRegistrationIds = null; var sessionId = account.getSessionId(account.getNumber()); final var result = NumberVerificationUtils.verifyNumber(sessionId, @@ -174,6 +176,7 @@ public class AccountHelper { account.getPniIdentityKeyPair().getPublicKey(), deviceMessages, devicePniSignedPreKeys, + devicePniLastResortKyberPrekeys, pniRegistrationIds))); }); // TODO handle response @@ -193,10 +196,10 @@ public class AccountHelper { } } - final var candidates = Username.generateCandidates(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH); + final var candidates = Username.candidatesFrom(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH); final var candidateHashes = new ArrayList(); for (final var candidate : candidates) { - candidateHashes.add(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(candidate))); + candidateHashes.add(Base64UrlSafe.encodeBytesWithoutPadding(candidate.getHash())); } final var response = dependencies.getAccountManager().reserveUsername(candidateHashes); @@ -207,7 +210,7 @@ public class AccountHelper { } logger.debug("[reserveUsername] Successfully reserved username."); - final var username = candidates.get(hashIndex); + final var username = candidates.get(hashIndex).getUsername(); dependencies.getAccountManager().confirmUsername(username, response); account.setUsername(username); @@ -226,7 +229,7 @@ public class AccountHelper { final var whoAmIResponse = dependencies.getAccountManager().getWhoAmI(); final var serverUsernameHash = whoAmIResponse.getUsernameHash(); final var hasServerUsername = !isEmpty(serverUsernameHash); - final var localUsernameHash = Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(localUsername)); + final var localUsernameHash = Base64UrlSafe.encodeBytesWithoutPadding(new Username(localUsername).getHash()); if (!hasServerUsername) { logger.debug("No remote username is set."); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java index 24cd675c..06dc31b9 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java @@ -9,6 +9,7 @@ import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.account.PreKeyUpload; import org.whispersystems.signalservice.api.push.ServiceIdType; import java.io.IOException; @@ -34,9 +35,11 @@ public class PreKeyHelper { } public void refreshPreKeysIfNecessary(ServiceIdType serviceIdType) throws IOException { - if (dependencies.getAccountManager().getPreKeysCount(serviceIdType) < ServiceConfig.PREKEY_MINIMUM_COUNT) { + final var preKeyCounts = dependencies.getAccountManager().getPreKeyCounts(serviceIdType); + if (preKeyCounts.getEcCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { refreshPreKeys(serviceIdType); } + // TODO kyber pre keys } public void refreshPreKeys() throws IOException { @@ -68,8 +71,13 @@ public class PreKeyHelper { final var oneTimePreKeys = generatePreKeys(serviceIdType); final var signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair); - dependencies.getAccountManager() - .setPreKeys(serviceIdType, identityKeyPair.getPublicKey(), signedPreKeyRecord, oneTimePreKeys); + final var preKeyUpload = new PreKeyUpload(serviceIdType, + identityKeyPair.getPublicKey(), + signedPreKeyRecord, + oneTimePreKeys, + null, + null); + dependencies.getAccountManager().setPreKeys(preKeyUpload); } private List generatePreKeys(ServiceIdType serviceIdType) { diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java index b2262223..3d4ca38d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java @@ -152,8 +152,12 @@ public class ReceiveHelper { logger.trace("Storing new message from {}", recipientId); // store message on disk, before acknowledging receipt to the server cachedMessage[0] = account.getMessageCache().cacheMessage(envelope1, recipientId); + try { + signalWebSocket.sendAck(it); + } catch (IOException e) { + logger.warn("Failed to ack envelope to server after storing it: {}", e.getMessage()); + } } - return true; }); isWaitingForMessage = false; backOffCounter = 0; 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 384d1fa0..8f100612 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 @@ -180,7 +180,7 @@ public class RecipientHelper { private ACI getRegisteredUserByUsername(String username) throws IOException, BaseUsernameException { return dependencies.getAccountManager() - .getAciByUsernameHash(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username))); + .getAciByUsernameHash(Base64UrlSafe.encodeBytesWithoutPadding(new Username(username).getHash())); } public record RegisteredUser(Optional aci, Optional pni) { 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 223f39fc..b4e27afc 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 @@ -226,4 +226,20 @@ public class SignalProtocolStore implements SignalServiceAccountDataStore { public void markKyberPreKeyUsed(final int kyberPreKeyId) { // TODO } + + @Override + public List loadLastResortKyberPreKeys() { + // TODO + return List.of(); + } + + @Override + public void removeKyberPreKey(final int i) { + // TODO + } + + @Override + public void storeLastResortKyberPreKey(final int i, final KyberPreKeyRecord kyberPreKeyRecord) { + // TODO + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index edf8c13d..f21554e4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ dependencyResolutionManagement { versionCatalogs { create("libs") { library("bouncycastle", "org.bouncycastle", "bcprov-jdk15on").version("1.70") - library("jackson.databind", "com.fasterxml.jackson.core", "jackson-databind").version("2.15.1") + library("jackson.databind", "com.fasterxml.jackson.core", "jackson-databind").version("2.15.2") library("argparse4j", "net.sourceforge.argparse4j", "argparse4j").version("0.9.0") library("dbusjava", "com.github.hypfvieh", "dbus-java-transport-native-unixsocket").version("4.3.0") version("slf4j", "2.0.7") @@ -16,7 +16,7 @@ dependencyResolutionManagement { library("logback", "ch.qos.logback", "logback-classic").version("1.4.7") - library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_72") + library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_73") library("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.23.0") library("sqlite", "org.xerial", "sqlite-jdbc").version("3.42.0.0") library("hikari", "com.zaxxer", "HikariCP").version("5.0.1") -- 2.51.0 From da25b2a7637754c0bb708d51561b26deb69c1271 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 11 Jun 2023 17:17:04 +0200 Subject: [PATCH 04/16] Add missing return to app command handling --- src/main/java/org/asamk/signal/App.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/asamk/signal/App.java b/src/main/java/org/asamk/signal/App.java index fdd88e7c..9ac4b190 100644 --- a/src/main/java/org/asamk/signal/App.java +++ b/src/main/java/org/asamk/signal/App.java @@ -190,6 +190,7 @@ public class App { if (command instanceof LocalCommand localCommand) { handleLocalCommand(localCommand, account, signalAccountFiles, commandHandler); + return; } throw new UserErrorException("Command only works in multi-account mode"); -- 2.51.0 From 0c5993c0adde6b64206ba4f328a5b74e296791f3 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 11 Jun 2023 17:47:48 +0200 Subject: [PATCH 05/16] Add support for invalid pre key failure when sending message --- .../signal/manager/api/SendMessageResult.java | 27 ++++--------------- .../signal/json/JsonSendMessageResult.java | 5 +++- 2 files changed, 9 insertions(+), 23 deletions(-) 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 1507390b..4158b60e 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 @@ -2,7 +2,6 @@ package org.asamk.signal.manager.api; import org.asamk.signal.manager.helper.RecipientAddressResolver; import org.asamk.signal.manager.storage.recipients.RecipientResolver; -import org.signal.libsignal.protocol.IdentityKey; public record SendMessageResult( RecipientAddress address, @@ -11,29 +10,12 @@ public record SendMessageResult( boolean isUnregisteredFailure, boolean isIdentityFailure, boolean isRateLimitFailure, - ProofRequiredException proofRequiredFailure + ProofRequiredException proofRequiredFailure, + boolean isInvalidPreKeyFailure ) { - public static SendMessageResult success(RecipientAddress address) { - return new SendMessageResult(address, true, false, false, false, false, null); - } - - public static SendMessageResult networkFailure(RecipientAddress address) { - return new SendMessageResult(address, false, true, false, false, false, null); - } - public static SendMessageResult unregisteredFailure(RecipientAddress address) { - 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, false, null); - } - - public static SendMessageResult proofRequiredFailure( - RecipientAddress address, ProofRequiredException proofRequiredException - ) { - return new SendMessageResult(address, false, true, false, false, false, proofRequiredException); + return new SendMessageResult(address, false, false, true, false, false, null, false); } public static SendMessageResult from( @@ -50,6 +32,7 @@ public record SendMessageResult( sendMessageResult.getRateLimitFailure() != null || sendMessageResult.getProofRequiredFailure() != null, sendMessageResult.getProofRequiredFailure() == null ? null - : new ProofRequiredException(sendMessageResult.getProofRequiredFailure())); + : new ProofRequiredException(sendMessageResult.getProofRequiredFailure()), + sendMessageResult.isInvalidPreKeyFailure()); } } diff --git a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java index 13b953fc..f9ca8f86 100644 --- a/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java +++ b/src/main/java/org/asamk/signal/json/JsonSendMessageResult.java @@ -28,7 +28,9 @@ public record JsonSendMessageResult( ? Type.NETWORK_FAILURE : result.isUnregisteredFailure() ? Type.UNREGISTERED_FAILURE - : Type.IDENTITY_FAILURE, + : result.isInvalidPreKeyFailure() + ? Type.INVALID_PRE_KEY_FAILURE + : Type.IDENTITY_FAILURE, result.proofRequiredFailure() != null ? result.proofRequiredFailure().getToken() : null, result.proofRequiredFailure() != null ? result.proofRequiredFailure().getRetryAfterSeconds() : null); } @@ -39,5 +41,6 @@ public record JsonSendMessageResult( UNREGISTERED_FAILURE, IDENTITY_FAILURE, RATE_LIMIT_FAILURE, + INVALID_PRE_KEY_FAILURE, } } -- 2.51.0 From 8726c4ede0cee0e44d43631b5676e87eb6cb0175 Mon Sep 17 00:00:00 2001 From: Adimarantis Date: Sat, 17 Jun 2023 09:21:28 +0200 Subject: [PATCH 06/16] Update identities after trust (#1264) --- src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index fef6821a..a2fd25e0 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -1109,6 +1109,7 @@ public class DbusSignalImpl implements Signal { } catch (UnregisteredRecipientException e) { throw new Error.Failure("The user " + e.getSender().getIdentifier() + " is not registered."); } + updateIdentities(); } @Override @@ -1135,6 +1136,7 @@ public class DbusSignalImpl implements Signal { } catch (UnregisteredRecipientException e) { throw new Error.Failure("The user " + e.getSender().getIdentifier() + " is not registered."); } + updateIdentities(); } } -- 2.51.0 From b70a43aeb50902b403e866c45bfb148d648f4afa Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 15 Jun 2023 19:50:15 +0200 Subject: [PATCH 07/16] Update graalvm config --- graalvm-config-dir/jni-config.json | 101 +- graalvm-config-dir/reflect-config.json | 1669 +++-------------------- graalvm-config-dir/resource-config.json | 410 +++--- 3 files changed, 385 insertions(+), 1795 deletions(-) diff --git a/graalvm-config-dir/jni-config.json b/graalvm-config-dir/jni-config.json index 98c05c7c..f5051e5b 100644 --- a/graalvm-config-dir/jni-config.json +++ b/graalvm-config-dir/jni-config.json @@ -4,12 +4,7 @@ }, { "name":"com.sun.security.auth.module.UnixSystem", - "fields":[ - {"name":"gid"}, - {"name":"groups"}, - {"name":"uid"}, - {"name":"username"} - ] + "fields":[{"name":"gid"}, {"name":"groups"}, {"name":"uid"}, {"name":"username"}] }, { "name":"java.lang.Boolean", @@ -21,10 +16,7 @@ }, { "name":"java.lang.ClassLoader", - "methods":[ - {"name":"getPlatformClassLoader","parameterTypes":[] }, - {"name":"loadClass","parameterTypes":["java.lang.String"] } - ] + "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }, {"name":"loadClass","parameterTypes":["java.lang.String"] }] }, { "name":"java.lang.IllegalArgumentException", @@ -39,10 +31,7 @@ }, { "name":"java.lang.Throwable", - "methods":[ - {"name":"getMessage","parameterTypes":[] }, - {"name":"toString","parameterTypes":[] } - ] + "methods":[{"name":"getMessage","parameterTypes":[] }, {"name":"toString","parameterTypes":[] }] }, { "name":"java.lang.UnsatisfiedLinkError", @@ -50,38 +39,18 @@ }, { "name":"java.util.UUID", - "methods":[ - {"name":"","parameterTypes":["long","long"] }, - {"name":"getLeastSignificantBits","parameterTypes":[] }, - {"name":"getMostSignificantBits","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["long","long"] }, {"name":"getLeastSignificantBits","parameterTypes":[] }, {"name":"getMostSignificantBits","parameterTypes":[] }] }, { "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" }, { "name":"org.asamk.signal.manager.storage.protocol.SignalProtocolStore", - "methods":[ - {"name":"getIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, - {"name":"getIdentityKeyPair","parameterTypes":[] }, - {"name":"getLocalRegistrationId","parameterTypes":[] }, - {"name":"isTrustedIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey","org.signal.libsignal.protocol.state.IdentityKeyStore$Direction"] }, - {"name":"loadPreKey","parameterTypes":["int"] }, - {"name":"loadSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID"] }, - {"name":"loadSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, - {"name":"loadSignedPreKey","parameterTypes":["int"] }, - {"name":"removePreKey","parameterTypes":["int"] }, - {"name":"saveIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey"] }, - {"name":"storeSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID","org.signal.libsignal.protocol.groups.state.SenderKeyRecord"] }, - {"name":"storeSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.state.SessionRecord"] } - ] + "methods":[{"name":"getIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, {"name":"getIdentityKeyPair","parameterTypes":[] }, {"name":"getLocalRegistrationId","parameterTypes":[] }, {"name":"isTrustedIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey","org.signal.libsignal.protocol.state.IdentityKeyStore$Direction"] }, {"name":"loadPreKey","parameterTypes":["int"] }, {"name":"loadSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID"] }, {"name":"loadSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, {"name":"loadSignedPreKey","parameterTypes":["int"] }, {"name":"removePreKey","parameterTypes":["int"] }, {"name":"saveIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey"] }, {"name":"storeSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID","org.signal.libsignal.protocol.groups.state.SenderKeyRecord"] }, {"name":"storeSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.state.SessionRecord"] }] }, { "name":"org.asamk.signal.manager.storage.senderKeys.SenderKeyStore", - "methods":[ - {"name":"loadSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID"] }, - {"name":"storeSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID","org.signal.libsignal.protocol.groups.state.SenderKeyRecord"] } - ] + "methods":[{"name":"loadSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID"] }, {"name":"storeSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID","org.signal.libsignal.protocol.groups.state.SenderKeyRecord"] }] }, { "name":"org.graalvm.jniutils.JNIExceptionWrapperEntryPoints", @@ -93,11 +62,7 @@ }, { "name":"org.signal.libsignal.protocol.IdentityKey", - "methods":[ - {"name":"","parameterTypes":["long"] }, - {"name":"","parameterTypes":["byte[]"] }, - {"name":"serialize","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["long"] }, {"name":"","parameterTypes":["byte[]"] }, {"name":"serialize","parameterTypes":[] }] }, { "name":"org.signal.libsignal.protocol.IdentityKeyPair", @@ -120,10 +85,7 @@ }, { "name":"org.signal.libsignal.protocol.SignalProtocolAddress", - "methods":[ - {"name":"","parameterTypes":["long"] }, - {"name":"","parameterTypes":["java.lang.String","int"] } - ] + "methods":[{"name":"","parameterTypes":["long"] }, {"name":"","parameterTypes":["java.lang.String","int"] }] }, { "name":"org.signal.libsignal.protocol.UntrustedIdentityException", @@ -165,10 +127,7 @@ }, { "name":"org.signal.libsignal.protocol.state.IdentityKeyStore$Direction", - "fields":[ - {"name":"RECEIVING"}, - {"name":"SENDING"} - ] + "fields":[{"name":"RECEIVING"}, {"name":"SENDING"}] }, { "name":"org.signal.libsignal.protocol.state.KyberPreKeyStore" @@ -183,10 +142,7 @@ { "name":"org.signal.libsignal.protocol.state.SessionRecord", "fields":[{"name":"unsafeHandle"}], - "methods":[ - {"name":"","parameterTypes":["long"] }, - {"name":"","parameterTypes":["byte[]"] } - ] + "methods":[{"name":"","parameterTypes":["long"] }, {"name":"","parameterTypes":["byte[]"] }] }, { "name":"org.signal.libsignal.protocol.state.SessionStore" @@ -228,27 +184,16 @@ }, { "name":"org.sqlite.Function", - "fields":[ - {"name":"args"}, - {"name":"context"}, - {"name":"value"} - ], + "fields":[{"name":"args"}, {"name":"context"}, {"name":"value"}], "methods":[{"name":"xFunc","parameterTypes":[] }] }, { "name":"org.sqlite.Function$Aggregate", - "methods":[ - {"name":"clone","parameterTypes":[] }, - {"name":"xFinal","parameterTypes":[] }, - {"name":"xStep","parameterTypes":[] } - ] + "methods":[{"name":"clone","parameterTypes":[] }, {"name":"xFinal","parameterTypes":[] }, {"name":"xStep","parameterTypes":[] }] }, { "name":"org.sqlite.Function$Window", - "methods":[ - {"name":"xInverse","parameterTypes":[] }, - {"name":"xValue","parameterTypes":[] } - ] + "methods":[{"name":"xInverse","parameterTypes":[] }, {"name":"xValue","parameterTypes":[] }] }, { "name":"org.sqlite.ProgressHandler", @@ -256,12 +201,7 @@ }, { "name":"org.sqlite.core.DB", - "methods":[ - {"name":"onCommit","parameterTypes":["boolean"] }, - {"name":"onUpdate","parameterTypes":["int","java.lang.String","java.lang.String","long"] }, - {"name":"throwex","parameterTypes":[] }, - {"name":"throwex","parameterTypes":["int"] } - ] + "methods":[{"name":"onCommit","parameterTypes":["boolean"] }, {"name":"onUpdate","parameterTypes":["int","java.lang.String","java.lang.String","long"] }, {"name":"throwex","parameterTypes":[] }, {"name":"throwex","parameterTypes":["int"] }] }, { "name":"org.sqlite.core.DB$ProgressObserver", @@ -269,16 +209,7 @@ }, { "name":"org.sqlite.core.NativeDB", - "fields":[ - {"name":"busyHandler"}, - {"name":"commitListener"}, - {"name":"pointer"}, - {"name":"progressHandler"}, - {"name":"updateListener"} - ], - "methods":[ - {"name":"stringToUtf8ByteArray","parameterTypes":["java.lang.String"] }, - {"name":"throwex","parameterTypes":["java.lang.String"] } - ] + "fields":[{"name":"busyHandler"}, {"name":"commitListener"}, {"name":"pointer"}, {"name":"progressHandler"}, {"name":"updateListener"}], + "methods":[{"name":"stringToUtf8ByteArray","parameterTypes":["java.lang.String"] }, {"name":"throwex","parameterTypes":["java.lang.String"] }] } ] diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index f1d57669..f053cead 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -155,78 +155,7 @@ "name":"com.zaxxer.hikari.HikariConfig", "allDeclaredFields":true, "queryAllPublicMethods":true, - "methods":[ - {"name":"getCatalog","parameterTypes":[] }, - {"name":"getConnectionInitSql","parameterTypes":[] }, - {"name":"getConnectionTestQuery","parameterTypes":[] }, - {"name":"getConnectionTimeout","parameterTypes":[] }, - {"name":"getDataSource","parameterTypes":[] }, - {"name":"getDataSourceClassName","parameterTypes":[] }, - {"name":"getDataSourceJNDI","parameterTypes":[] }, - {"name":"getDataSourceProperties","parameterTypes":[] }, - {"name":"getDriverClassName","parameterTypes":[] }, - {"name":"getExceptionOverrideClassName","parameterTypes":[] }, - {"name":"getHealthCheckProperties","parameterTypes":[] }, - {"name":"getHealthCheckRegistry","parameterTypes":[] }, - {"name":"getIdleTimeout","parameterTypes":[] }, - {"name":"getInitializationFailTimeout","parameterTypes":[] }, - {"name":"getJdbcUrl","parameterTypes":[] }, - {"name":"getKeepaliveTime","parameterTypes":[] }, - {"name":"getLeakDetectionThreshold","parameterTypes":[] }, - {"name":"getMaxLifetime","parameterTypes":[] }, - {"name":"getMaximumPoolSize","parameterTypes":[] }, - {"name":"getMetricRegistry","parameterTypes":[] }, - {"name":"getMetricsTrackerFactory","parameterTypes":[] }, - {"name":"getMinimumIdle","parameterTypes":[] }, - {"name":"getPassword","parameterTypes":[] }, - {"name":"getPoolName","parameterTypes":[] }, - {"name":"getScheduledExecutor","parameterTypes":[] }, - {"name":"getSchema","parameterTypes":[] }, - {"name":"getThreadFactory","parameterTypes":[] }, - {"name":"getTransactionIsolation","parameterTypes":[] }, - {"name":"getUsername","parameterTypes":[] }, - {"name":"getValidationTimeout","parameterTypes":[] }, - {"name":"isAllowPoolSuspension","parameterTypes":[] }, - {"name":"isAutoCommit","parameterTypes":[] }, - {"name":"isIsolateInternalQueries","parameterTypes":[] }, - {"name":"isReadOnly","parameterTypes":[] }, - {"name":"isRegisterMbeans","parameterTypes":[] }, - {"name":"setAllowPoolSuspension","parameterTypes":["boolean"] }, - {"name":"setAutoCommit","parameterTypes":["boolean"] }, - {"name":"setCatalog","parameterTypes":["java.lang.String"] }, - {"name":"setConnectionInitSql","parameterTypes":["java.lang.String"] }, - {"name":"setConnectionTestQuery","parameterTypes":["java.lang.String"] }, - {"name":"setConnectionTimeout","parameterTypes":["long"] }, - {"name":"setDataSource","parameterTypes":["javax.sql.DataSource"] }, - {"name":"setDataSourceClassName","parameterTypes":["java.lang.String"] }, - {"name":"setDataSourceJNDI","parameterTypes":["java.lang.String"] }, - {"name":"setDataSourceProperties","parameterTypes":["java.util.Properties"] }, - {"name":"setDriverClassName","parameterTypes":["java.lang.String"] }, - {"name":"setExceptionOverrideClassName","parameterTypes":["java.lang.String"] }, - {"name":"setHealthCheckProperties","parameterTypes":["java.util.Properties"] }, - {"name":"setHealthCheckRegistry","parameterTypes":["java.lang.Object"] }, - {"name":"setIdleTimeout","parameterTypes":["long"] }, - {"name":"setInitializationFailTimeout","parameterTypes":["long"] }, - {"name":"setIsolateInternalQueries","parameterTypes":["boolean"] }, - {"name":"setJdbcUrl","parameterTypes":["java.lang.String"] }, - {"name":"setKeepaliveTime","parameterTypes":["long"] }, - {"name":"setLeakDetectionThreshold","parameterTypes":["long"] }, - {"name":"setMaxLifetime","parameterTypes":["long"] }, - {"name":"setMaximumPoolSize","parameterTypes":["int"] }, - {"name":"setMetricRegistry","parameterTypes":["java.lang.Object"] }, - {"name":"setMetricsTrackerFactory","parameterTypes":["com.zaxxer.hikari.metrics.MetricsTrackerFactory"] }, - {"name":"setMinimumIdle","parameterTypes":["int"] }, - {"name":"setPassword","parameterTypes":["java.lang.String"] }, - {"name":"setPoolName","parameterTypes":["java.lang.String"] }, - {"name":"setReadOnly","parameterTypes":["boolean"] }, - {"name":"setRegisterMbeans","parameterTypes":["boolean"] }, - {"name":"setScheduledExecutor","parameterTypes":["java.util.concurrent.ScheduledExecutorService"] }, - {"name":"setSchema","parameterTypes":["java.lang.String"] }, - {"name":"setThreadFactory","parameterTypes":["java.util.concurrent.ThreadFactory"] }, - {"name":"setTransactionIsolation","parameterTypes":["java.lang.String"] }, - {"name":"setUsername","parameterTypes":["java.lang.String"] }, - {"name":"setValidationTimeout","parameterTypes":["long"] } - ] + "methods":[{"name":"getCatalog","parameterTypes":[] }, {"name":"getConnectionInitSql","parameterTypes":[] }, {"name":"getConnectionTestQuery","parameterTypes":[] }, {"name":"getConnectionTimeout","parameterTypes":[] }, {"name":"getDataSource","parameterTypes":[] }, {"name":"getDataSourceClassName","parameterTypes":[] }, {"name":"getDataSourceJNDI","parameterTypes":[] }, {"name":"getDataSourceProperties","parameterTypes":[] }, {"name":"getDriverClassName","parameterTypes":[] }, {"name":"getExceptionOverrideClassName","parameterTypes":[] }, {"name":"getHealthCheckProperties","parameterTypes":[] }, {"name":"getHealthCheckRegistry","parameterTypes":[] }, {"name":"getIdleTimeout","parameterTypes":[] }, {"name":"getInitializationFailTimeout","parameterTypes":[] }, {"name":"getJdbcUrl","parameterTypes":[] }, {"name":"getKeepaliveTime","parameterTypes":[] }, {"name":"getLeakDetectionThreshold","parameterTypes":[] }, {"name":"getMaxLifetime","parameterTypes":[] }, {"name":"getMaximumPoolSize","parameterTypes":[] }, {"name":"getMetricRegistry","parameterTypes":[] }, {"name":"getMetricsTrackerFactory","parameterTypes":[] }, {"name":"getMinimumIdle","parameterTypes":[] }, {"name":"getPassword","parameterTypes":[] }, {"name":"getPoolName","parameterTypes":[] }, {"name":"getScheduledExecutor","parameterTypes":[] }, {"name":"getSchema","parameterTypes":[] }, {"name":"getThreadFactory","parameterTypes":[] }, {"name":"getTransactionIsolation","parameterTypes":[] }, {"name":"getUsername","parameterTypes":[] }, {"name":"getValidationTimeout","parameterTypes":[] }, {"name":"isAllowPoolSuspension","parameterTypes":[] }, {"name":"isAutoCommit","parameterTypes":[] }, {"name":"isIsolateInternalQueries","parameterTypes":[] }, {"name":"isReadOnly","parameterTypes":[] }, {"name":"isRegisterMbeans","parameterTypes":[] }, {"name":"setAllowPoolSuspension","parameterTypes":["boolean"] }, {"name":"setAutoCommit","parameterTypes":["boolean"] }, {"name":"setCatalog","parameterTypes":["java.lang.String"] }, {"name":"setConnectionInitSql","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTestQuery","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTimeout","parameterTypes":["long"] }, {"name":"setDataSource","parameterTypes":["javax.sql.DataSource"] }, {"name":"setDataSourceClassName","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceJNDI","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceProperties","parameterTypes":["java.util.Properties"] }, {"name":"setDriverClassName","parameterTypes":["java.lang.String"] }, {"name":"setExceptionOverrideClassName","parameterTypes":["java.lang.String"] }, {"name":"setHealthCheckProperties","parameterTypes":["java.util.Properties"] }, {"name":"setHealthCheckRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setIdleTimeout","parameterTypes":["long"] }, {"name":"setInitializationFailTimeout","parameterTypes":["long"] }, {"name":"setIsolateInternalQueries","parameterTypes":["boolean"] }, {"name":"setJdbcUrl","parameterTypes":["java.lang.String"] }, {"name":"setKeepaliveTime","parameterTypes":["long"] }, {"name":"setLeakDetectionThreshold","parameterTypes":["long"] }, {"name":"setMaxLifetime","parameterTypes":["long"] }, {"name":"setMaximumPoolSize","parameterTypes":["int"] }, {"name":"setMetricRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setMetricsTrackerFactory","parameterTypes":["com.zaxxer.hikari.metrics.MetricsTrackerFactory"] }, {"name":"setMinimumIdle","parameterTypes":["int"] }, {"name":"setPassword","parameterTypes":["java.lang.String"] }, {"name":"setPoolName","parameterTypes":["java.lang.String"] }, {"name":"setReadOnly","parameterTypes":["boolean"] }, {"name":"setRegisterMbeans","parameterTypes":["boolean"] }, {"name":"setScheduledExecutor","parameterTypes":["java.util.concurrent.ScheduledExecutorService"] }, {"name":"setSchema","parameterTypes":["java.lang.String"] }, {"name":"setThreadFactory","parameterTypes":["java.util.concurrent.ThreadFactory"] }, {"name":"setTransactionIsolation","parameterTypes":["java.lang.String"] }, {"name":"setUsername","parameterTypes":["java.lang.String"] }, {"name":"setValidationTimeout","parameterTypes":["long"] }] }, { "name":"int", @@ -314,10 +243,7 @@ { "name":"java.lang.Throwable", "queryAllPublicMethods":true, - "methods":[ - {"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }, - {"name":"getSuppressed","parameterTypes":[] } - ] + "methods":[{"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }, {"name":"getSuppressed","parameterTypes":[] }] }, { "name":"java.lang.constant.Constable", @@ -333,10 +259,7 @@ }, { "name":"java.lang.reflect.RecordComponent", - "methods":[ - {"name":"getName","parameterTypes":[] }, - {"name":"getType","parameterTypes":[] } - ] + "methods":[{"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] }, { "name":"java.net.NetPermission" @@ -441,6 +364,18 @@ "allDeclaredMethods":true, "allDeclaredConstructors":true }, +{ + "name":"java.util.concurrent.ForkJoinTask", + "fields":[{"name":"aux"}, {"name":"status"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicBoolean", + "fields":[{"name":"value"}] +}, +{ + "name":"java.util.concurrent.atomic.AtomicReference", + "fields":[{"name":"value"}] +}, { "name":"javax.security.auth.x500.X500Principal", "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] @@ -560,11 +495,7 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String"] }, - {"name":"deviceLinkUri","parameterTypes":[] }, - {"name":"deviceName","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"deviceLinkUri","parameterTypes":[] }, {"name":"deviceName","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.FinishLinkCommand$JsonFinishLink", @@ -578,12 +509,7 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"isRegistered","parameterTypes":[] }, - {"name":"number","parameterTypes":[] }, - {"name":"recipient","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"isRegistered","parameterTypes":[] }, {"name":"number","parameterTypes":[] }, {"name":"recipient","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.ListAccountsCommand$JsonAccount", @@ -603,14 +529,7 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"about","parameterTypes":[] }, - {"name":"aboutEmoji","parameterTypes":[] }, - {"name":"familyName","parameterTypes":[] }, - {"name":"givenName","parameterTypes":[] }, - {"name":"lastUpdateTimestamp","parameterTypes":[] }, - {"name":"mobileCoinAddress","parameterTypes":[] } - ] + "methods":[{"name":"about","parameterTypes":[] }, {"name":"aboutEmoji","parameterTypes":[] }, {"name":"familyName","parameterTypes":[] }, {"name":"givenName","parameterTypes":[] }, {"name":"lastUpdateTimestamp","parameterTypes":[] }, {"name":"mobileCoinAddress","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.ListDevicesCommand$JsonDevice", @@ -635,63 +554,35 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"addedTimestamp","parameterTypes":[] }, - {"name":"fingerprint","parameterTypes":[] }, - {"name":"number","parameterTypes":[] }, - {"name":"safetyNumber","parameterTypes":[] }, - {"name":"scannableSafetyNumber","parameterTypes":[] }, - {"name":"trustLevel","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"addedTimestamp","parameterTypes":[] }, {"name":"fingerprint","parameterTypes":[] }, {"name":"number","parameterTypes":[] }, {"name":"safetyNumber","parameterTypes":[] }, {"name":"scannableSafetyNumber","parameterTypes":[] }, {"name":"trustLevel","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.ListStickerPacksCommand$JsonStickerPack", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"author","parameterTypes":[] }, - {"name":"cover","parameterTypes":[] }, - {"name":"installed","parameterTypes":[] }, - {"name":"packId","parameterTypes":[] }, - {"name":"stickers","parameterTypes":[] }, - {"name":"title","parameterTypes":[] }, - {"name":"url","parameterTypes":[] } - ] + "methods":[{"name":"author","parameterTypes":[] }, {"name":"cover","parameterTypes":[] }, {"name":"installed","parameterTypes":[] }, {"name":"packId","parameterTypes":[] }, {"name":"stickers","parameterTypes":[] }, {"name":"title","parameterTypes":[] }, {"name":"url","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.ListStickerPacksCommand$JsonStickerPack$JsonSticker", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"contentType","parameterTypes":[] }, - {"name":"emoji","parameterTypes":[] }, - {"name":"id","parameterTypes":[] } - ] + "methods":[{"name":"contentType","parameterTypes":[] }, {"name":"emoji","parameterTypes":[] }, {"name":"id","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.ReceiveCommand$ReceiveParams", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.Double","java.lang.Integer"] }, - {"name":"maxMessages","parameterTypes":[] }, - {"name":"timeout","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.Double","java.lang.Integer"] }, {"name":"maxMessages","parameterTypes":[] }, {"name":"timeout","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.RegisterCommand$RegistrationParams", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.Boolean","java.lang.String"] }, - {"name":"captcha","parameterTypes":[] }, - {"name":"voice","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.String"] }, {"name":"captcha","parameterTypes":[] }, {"name":"voice","parameterTypes":[] }] }, { "name":"org.asamk.signal.commands.StartLinkCommand$JsonLink", @@ -712,27 +603,14 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String"] }, - {"name":"pin","parameterTypes":[] }, - {"name":"verificationCode","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"pin","parameterTypes":[] }, {"name":"verificationCode","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonAttachment", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"caption","parameterTypes":[] }, - {"name":"contentType","parameterTypes":[] }, - {"name":"filename","parameterTypes":[] }, - {"name":"height","parameterTypes":[] }, - {"name":"id","parameterTypes":[] }, - {"name":"size","parameterTypes":[] }, - {"name":"uploadTimestamp","parameterTypes":[] }, - {"name":"width","parameterTypes":[] } - ] + "methods":[{"name":"caption","parameterTypes":[] }, {"name":"contentType","parameterTypes":[] }, {"name":"filename","parameterTypes":[] }, {"name":"height","parameterTypes":[] }, {"name":"id","parameterTypes":[] }, {"name":"size","parameterTypes":[] }, {"name":"uploadTimestamp","parameterTypes":[] }, {"name":"width","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonAttachmentData", @@ -746,24 +624,14 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"answerMessage","parameterTypes":[] }, - {"name":"busyMessage","parameterTypes":[] }, - {"name":"hangupMessage","parameterTypes":[] }, - {"name":"iceUpdateMessages","parameterTypes":[] }, - {"name":"offerMessage","parameterTypes":[] } - ] + "methods":[{"name":"answerMessage","parameterTypes":[] }, {"name":"busyMessage","parameterTypes":[] }, {"name":"hangupMessage","parameterTypes":[] }, {"name":"iceUpdateMessages","parameterTypes":[] }, {"name":"offerMessage","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonCallMessage$Answer", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"id","parameterTypes":[] }, - {"name":"opaque","parameterTypes":[] }, - {"name":"sdp","parameterTypes":[] } - ] + "methods":[{"name":"id","parameterTypes":[] }, {"name":"opaque","parameterTypes":[] }, {"name":"sdp","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonCallMessage$Busy", @@ -777,35 +645,21 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"deviceId","parameterTypes":[] }, - {"name":"id","parameterTypes":[] }, - {"name":"isLegacy","parameterTypes":[] }, - {"name":"type","parameterTypes":[] } - ] + "methods":[{"name":"deviceId","parameterTypes":[] }, {"name":"id","parameterTypes":[] }, {"name":"isLegacy","parameterTypes":[] }, {"name":"type","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonCallMessage$IceUpdate", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"id","parameterTypes":[] }, - {"name":"opaque","parameterTypes":[] }, - {"name":"sdp","parameterTypes":[] } - ] + "methods":[{"name":"id","parameterTypes":[] }, {"name":"opaque","parameterTypes":[] }, {"name":"sdp","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonCallMessage$Offer", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"id","parameterTypes":[] }, - {"name":"opaque","parameterTypes":[] }, - {"name":"sdp","parameterTypes":[] }, - {"name":"type","parameterTypes":[] } - ] + "methods":[{"name":"id","parameterTypes":[] }, {"name":"opaque","parameterTypes":[] }, {"name":"sdp","parameterTypes":[] }, {"name":"type","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonContactAddress", @@ -842,174 +696,91 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"attachments","parameterTypes":[] }, - {"name":"contacts","parameterTypes":[] }, - {"name":"expiresInSeconds","parameterTypes":[] }, - {"name":"groupInfo","parameterTypes":[] }, - {"name":"mentions","parameterTypes":[] }, - {"name":"message","parameterTypes":[] }, - {"name":"payment","parameterTypes":[] }, - {"name":"previews","parameterTypes":[] }, - {"name":"quote","parameterTypes":[] }, - {"name":"reaction","parameterTypes":[] }, - {"name":"remoteDelete","parameterTypes":[] }, - {"name":"sticker","parameterTypes":[] }, - {"name":"storyContext","parameterTypes":[] }, - {"name":"textStyles","parameterTypes":[] }, - {"name":"timestamp","parameterTypes":[] }, - {"name":"viewOnce","parameterTypes":[] } - ] + "methods":[{"name":"attachments","parameterTypes":[] }, {"name":"contacts","parameterTypes":[] }, {"name":"expiresInSeconds","parameterTypes":[] }, {"name":"groupInfo","parameterTypes":[] }, {"name":"mentions","parameterTypes":[] }, {"name":"message","parameterTypes":[] }, {"name":"payment","parameterTypes":[] }, {"name":"previews","parameterTypes":[] }, {"name":"quote","parameterTypes":[] }, {"name":"reaction","parameterTypes":[] }, {"name":"remoteDelete","parameterTypes":[] }, {"name":"sticker","parameterTypes":[] }, {"name":"storyContext","parameterTypes":[] }, {"name":"textStyles","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }, {"name":"viewOnce","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonEditMessage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"dataMessage","parameterTypes":[] }, - {"name":"targetSentTimestamp","parameterTypes":[] } - ] + "methods":[{"name":"dataMessage","parameterTypes":[] }, {"name":"targetSentTimestamp","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonError", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"message","parameterTypes":[] }, - {"name":"type","parameterTypes":[] } - ] + "methods":[{"name":"message","parameterTypes":[] }, {"name":"type","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonGroupInfo", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"groupId","parameterTypes":[] }, - {"name":"type","parameterTypes":[] } - ] + "methods":[{"name":"groupId","parameterTypes":[] }, {"name":"type","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonMention", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"length","parameterTypes":[] }, - {"name":"name","parameterTypes":[] }, - {"name":"number","parameterTypes":[] }, - {"name":"start","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"length","parameterTypes":[] }, {"name":"name","parameterTypes":[] }, {"name":"number","parameterTypes":[] }, {"name":"start","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonMessageEnvelope", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"callMessage","parameterTypes":[] }, - {"name":"dataMessage","parameterTypes":[] }, - {"name":"editMessage","parameterTypes":[] }, - {"name":"receiptMessage","parameterTypes":[] }, - {"name":"source","parameterTypes":[] }, - {"name":"sourceDevice","parameterTypes":[] }, - {"name":"sourceName","parameterTypes":[] }, - {"name":"sourceNumber","parameterTypes":[] }, - {"name":"sourceUuid","parameterTypes":[] }, - {"name":"storyMessage","parameterTypes":[] }, - {"name":"syncMessage","parameterTypes":[] }, - {"name":"timestamp","parameterTypes":[] }, - {"name":"typingMessage","parameterTypes":[] } - ] + "methods":[{"name":"callMessage","parameterTypes":[] }, {"name":"dataMessage","parameterTypes":[] }, {"name":"editMessage","parameterTypes":[] }, {"name":"receiptMessage","parameterTypes":[] }, {"name":"source","parameterTypes":[] }, {"name":"sourceDevice","parameterTypes":[] }, {"name":"sourceName","parameterTypes":[] }, {"name":"sourceNumber","parameterTypes":[] }, {"name":"sourceUuid","parameterTypes":[] }, {"name":"storyMessage","parameterTypes":[] }, {"name":"syncMessage","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }, {"name":"typingMessage","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonPayment", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"note","parameterTypes":[] }, - {"name":"receipt","parameterTypes":[] } - ] + "methods":[{"name":"note","parameterTypes":[] }, {"name":"receipt","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonPreview", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"description","parameterTypes":[] }, - {"name":"image","parameterTypes":[] }, - {"name":"title","parameterTypes":[] }, - {"name":"url","parameterTypes":[] } - ] + "methods":[{"name":"description","parameterTypes":[] }, {"name":"image","parameterTypes":[] }, {"name":"title","parameterTypes":[] }, {"name":"url","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonQuote", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"attachments","parameterTypes":[] }, - {"name":"author","parameterTypes":[] }, - {"name":"authorNumber","parameterTypes":[] }, - {"name":"authorUuid","parameterTypes":[] }, - {"name":"id","parameterTypes":[] }, - {"name":"mentions","parameterTypes":[] }, - {"name":"text","parameterTypes":[] }, - {"name":"textStyles","parameterTypes":[] } - ] + "methods":[{"name":"attachments","parameterTypes":[] }, {"name":"author","parameterTypes":[] }, {"name":"authorNumber","parameterTypes":[] }, {"name":"authorUuid","parameterTypes":[] }, {"name":"id","parameterTypes":[] }, {"name":"mentions","parameterTypes":[] }, {"name":"text","parameterTypes":[] }, {"name":"textStyles","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonQuotedAttachment", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"contentType","parameterTypes":[] }, - {"name":"filename","parameterTypes":[] }, - {"name":"thumbnail","parameterTypes":[] } - ] + "methods":[{"name":"contentType","parameterTypes":[] }, {"name":"filename","parameterTypes":[] }, {"name":"thumbnail","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonReaction", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"emoji","parameterTypes":[] }, - {"name":"isRemove","parameterTypes":[] }, - {"name":"targetAuthor","parameterTypes":[] }, - {"name":"targetAuthorNumber","parameterTypes":[] }, - {"name":"targetAuthorUuid","parameterTypes":[] }, - {"name":"targetSentTimestamp","parameterTypes":[] } - ] + "methods":[{"name":"emoji","parameterTypes":[] }, {"name":"isRemove","parameterTypes":[] }, {"name":"targetAuthor","parameterTypes":[] }, {"name":"targetAuthorNumber","parameterTypes":[] }, {"name":"targetAuthorUuid","parameterTypes":[] }, {"name":"targetSentTimestamp","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonReceiptMessage", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"isDelivery","parameterTypes":[] }, - {"name":"isRead","parameterTypes":[] }, - {"name":"isViewed","parameterTypes":[] }, - {"name":"timestamps","parameterTypes":[] }, - {"name":"when","parameterTypes":[] } - ] + "methods":[{"name":"isDelivery","parameterTypes":[] }, {"name":"isRead","parameterTypes":[] }, {"name":"isViewed","parameterTypes":[] }, {"name":"timestamps","parameterTypes":[] }, {"name":"when","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonRecipientAddress", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"number","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"number","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonRemoteDelete", @@ -1023,13 +794,7 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"groupId","parameterTypes":[] }, - {"name":"recipientAddress","parameterTypes":[] }, - {"name":"retryAfterSeconds","parameterTypes":[] }, - {"name":"token","parameterTypes":[] }, - {"name":"type","parameterTypes":[] } - ] + "methods":[{"name":"groupId","parameterTypes":[] }, {"name":"recipientAddress","parameterTypes":[] }, {"name":"retryAfterSeconds","parameterTypes":[] }, {"name":"token","parameterTypes":[] }, {"name":"type","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonSendMessageResult$Type", @@ -1047,88 +812,49 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"packId","parameterTypes":[] }, - {"name":"stickerId","parameterTypes":[] } - ] + "methods":[{"name":"packId","parameterTypes":[] }, {"name":"stickerId","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonStoryContext", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"authorNumber","parameterTypes":[] }, - {"name":"authorUuid","parameterTypes":[] }, - {"name":"sentTimestamp","parameterTypes":[] } - ] + "methods":[{"name":"authorNumber","parameterTypes":[] }, {"name":"authorUuid","parameterTypes":[] }, {"name":"sentTimestamp","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonStoryMessage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"allowsReplies","parameterTypes":[] }, - {"name":"fileAttachment","parameterTypes":[] }, - {"name":"groupId","parameterTypes":[] }, - {"name":"textAttachment","parameterTypes":[] } - ] + "methods":[{"name":"allowsReplies","parameterTypes":[] }, {"name":"fileAttachment","parameterTypes":[] }, {"name":"groupId","parameterTypes":[] }, {"name":"textAttachment","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonStoryMessage$TextAttachment", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"backgroundColor","parameterTypes":[] }, - {"name":"backgroundGradient","parameterTypes":[] }, - {"name":"preview","parameterTypes":[] }, - {"name":"style","parameterTypes":[] }, - {"name":"text","parameterTypes":[] }, - {"name":"textBackgroundColor","parameterTypes":[] }, - {"name":"textForegroundColor","parameterTypes":[] } - ] + "methods":[{"name":"backgroundColor","parameterTypes":[] }, {"name":"backgroundGradient","parameterTypes":[] }, {"name":"preview","parameterTypes":[] }, {"name":"style","parameterTypes":[] }, {"name":"text","parameterTypes":[] }, {"name":"textBackgroundColor","parameterTypes":[] }, {"name":"textForegroundColor","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonStoryMessage$TextAttachment$Gradient", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"angle","parameterTypes":[] }, - {"name":"colors","parameterTypes":[] }, - {"name":"endColor","parameterTypes":[] }, - {"name":"positions","parameterTypes":[] }, - {"name":"startColor","parameterTypes":[] } - ] + "methods":[{"name":"angle","parameterTypes":[] }, {"name":"colors","parameterTypes":[] }, {"name":"endColor","parameterTypes":[] }, {"name":"positions","parameterTypes":[] }, {"name":"startColor","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonSyncDataMessage", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"dataMessage","parameterTypes":[] }, - {"name":"destination","parameterTypes":[] }, - {"name":"destinationNumber","parameterTypes":[] }, - {"name":"destinationUuid","parameterTypes":[] }, - {"name":"editMessage","parameterTypes":[] } - ] + "methods":[{"name":"dataMessage","parameterTypes":[] }, {"name":"destination","parameterTypes":[] }, {"name":"destinationNumber","parameterTypes":[] }, {"name":"destinationUuid","parameterTypes":[] }, {"name":"editMessage","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonSyncMessage", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"blockedGroupIds","parameterTypes":[] }, - {"name":"blockedNumbers","parameterTypes":[] }, - {"name":"readMessages","parameterTypes":[] }, - {"name":"sentMessage","parameterTypes":[] }, - {"name":"sentStoryMessage","parameterTypes":[] }, - {"name":"type","parameterTypes":[] } - ] + "methods":[{"name":"blockedGroupIds","parameterTypes":[] }, {"name":"blockedNumbers","parameterTypes":[] }, {"name":"readMessages","parameterTypes":[] }, {"name":"sentMessage","parameterTypes":[] }, {"name":"sentStoryMessage","parameterTypes":[] }, {"name":"type","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonSyncMessageType", @@ -1140,45 +866,28 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"sender","parameterTypes":[] }, - {"name":"senderNumber","parameterTypes":[] }, - {"name":"senderUuid","parameterTypes":[] }, - {"name":"timestamp","parameterTypes":[] } - ] + "methods":[{"name":"sender","parameterTypes":[] }, {"name":"senderNumber","parameterTypes":[] }, {"name":"senderUuid","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonSyncStoryMessage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"dataMessage","parameterTypes":[] }, - {"name":"destinationNumber","parameterTypes":[] }, - {"name":"destinationUuid","parameterTypes":[] } - ] + "methods":[{"name":"dataMessage","parameterTypes":[] }, {"name":"destinationNumber","parameterTypes":[] }, {"name":"destinationUuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonTextStyle", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"length","parameterTypes":[] }, - {"name":"start","parameterTypes":[] }, - {"name":"style","parameterTypes":[] } - ] + "methods":[{"name":"length","parameterTypes":[] }, {"name":"start","parameterTypes":[] }, {"name":"style","parameterTypes":[] }] }, { "name":"org.asamk.signal.json.JsonTypingMessage", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"action","parameterTypes":[] }, - {"name":"groupId","parameterTypes":[] }, - {"name":"timestamp","parameterTypes":[] } - ] + "methods":[{"name":"action","parameterTypes":[] }, {"name":"groupId","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }] }, { "name":"org.asamk.signal.jsonrpc.JsonRpcBatchMessage", @@ -1226,39 +935,21 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.util.List","java.lang.Integer"] }, - {"name":"accounts","parameterTypes":[] }, - {"name":"version","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.util.List","java.lang.Integer"] }, {"name":"accounts","parameterTypes":[] }, {"name":"version","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.accounts.AccountsStorage$Account", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"] }, - {"name":"environment","parameterTypes":[] }, - {"name":"number","parameterTypes":[] }, - {"name":"path","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String"] }, {"name":"environment","parameterTypes":[] }, {"name":"number","parameterTypes":[] }, {"name":"path","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.configuration.ConfigurationStore$Storage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","org.asamk.signal.manager.api.PhoneNumberSharingMode"] }, - {"name":"linkPreviews","parameterTypes":[] }, - {"name":"phoneNumberSharingMode","parameterTypes":[] }, - {"name":"phoneNumberUnlisted","parameterTypes":[] }, - {"name":"readReceipts","parameterTypes":[] }, - {"name":"typingIndicators","parameterTypes":[] }, - {"name":"unidentifiedDeliveryIndicators","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","java.lang.Boolean","org.asamk.signal.manager.api.PhoneNumberSharingMode"] }, {"name":"linkPreviews","parameterTypes":[] }, {"name":"phoneNumberSharingMode","parameterTypes":[] }, {"name":"phoneNumberUnlisted","parameterTypes":[] }, {"name":"readReceipts","parameterTypes":[] }, {"name":"typingIndicators","parameterTypes":[] }, {"name":"unidentifiedDeliveryIndicators","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.contacts.LegacyContactInfo", @@ -1293,38 +984,21 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.util.List"] }, - {"name":"groups","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.util.List"] }, {"name":"groups","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.groups.LegacyGroupStore$Storage$GroupV1", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","int","boolean","boolean","java.util.List"] }, - {"name":"archived","parameterTypes":[] }, - {"name":"blocked","parameterTypes":[] }, - {"name":"color","parameterTypes":[] }, - {"name":"expectedV2Id","parameterTypes":[] }, - {"name":"groupId","parameterTypes":[] }, - {"name":"members","parameterTypes":[] }, - {"name":"messageExpirationTime","parameterTypes":[] }, - {"name":"name","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","int","boolean","boolean","java.util.List"] }, {"name":"archived","parameterTypes":[] }, {"name":"blocked","parameterTypes":[] }, {"name":"color","parameterTypes":[] }, {"name":"expectedV2Id","parameterTypes":[] }, {"name":"groupId","parameterTypes":[] }, {"name":"members","parameterTypes":[] }, {"name":"messageExpirationTime","parameterTypes":[] }, {"name":"name","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.groups.LegacyGroupStore$Storage$GroupV1$JsonRecipientAddress", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String"] }, - {"name":"number","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"number","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.groups.LegacyGroupStore$Storage$GroupV1$MembersDeserializer", @@ -1335,26 +1009,14 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","boolean","boolean"] }, - {"name":"blocked","parameterTypes":[] }, - {"name":"distributionId","parameterTypes":[] }, - {"name":"groupId","parameterTypes":[] }, - {"name":"masterKey","parameterTypes":[] }, - {"name":"permissionDenied","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","boolean","boolean"] }, {"name":"blocked","parameterTypes":[] }, {"name":"distributionId","parameterTypes":[] }, {"name":"groupId","parameterTypes":[] }, {"name":"masterKey","parameterTypes":[] }, {"name":"permissionDenied","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.identities.LegacyIdentityKeyStore$IdentityStorage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","int","long"] }, - {"name":"addedTimestamp","parameterTypes":[] }, - {"name":"identityKey","parameterTypes":[] }, - {"name":"trustLevel","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","int","long"] }, {"name":"addedTimestamp","parameterTypes":[] }, {"name":"identityKey","parameterTypes":[] }, {"name":"trustLevel","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.profiles.LegacyProfileStore", @@ -1417,130 +1079,70 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.util.List","long"] }, - {"name":"lastId","parameterTypes":[] }, - {"name":"recipients","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.util.List","long"] }, {"name":"lastId","parameterTypes":[] }, {"name":"recipients","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["long","java.lang.String","java.lang.String","java.lang.String","java.lang.String","org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient$Contact","org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient$Profile"] }, - {"name":"contact","parameterTypes":[] }, - {"name":"expiringProfileKeyCredential","parameterTypes":[] }, - {"name":"id","parameterTypes":[] }, - {"name":"number","parameterTypes":[] }, - {"name":"profile","parameterTypes":[] }, - {"name":"profileKey","parameterTypes":[] }, - {"name":"uuid","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["long","java.lang.String","java.lang.String","java.lang.String","java.lang.String","org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient$Contact","org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient$Profile"] }, {"name":"contact","parameterTypes":[] }, {"name":"expiringProfileKeyCredential","parameterTypes":[] }, {"name":"id","parameterTypes":[] }, {"name":"number","parameterTypes":[] }, {"name":"profile","parameterTypes":[] }, {"name":"profileKey","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient$Contact", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String","int","boolean","boolean","boolean"] }, - {"name":"archived","parameterTypes":[] }, - {"name":"blocked","parameterTypes":[] }, - {"name":"color","parameterTypes":[] }, - {"name":"messageExpirationTime","parameterTypes":[] }, - {"name":"name","parameterTypes":[] }, - {"name":"profileSharingEnabled","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","int","boolean","boolean","boolean"] }, {"name":"archived","parameterTypes":[] }, {"name":"blocked","parameterTypes":[] }, {"name":"color","parameterTypes":[] }, {"name":"messageExpirationTime","parameterTypes":[] }, {"name":"name","parameterTypes":[] }, {"name":"profileSharingEnabled","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2$Storage$Recipient$Profile", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["long","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.util.Set"] }, - {"name":"about","parameterTypes":[] }, - {"name":"aboutEmoji","parameterTypes":[] }, - {"name":"avatarUrlPath","parameterTypes":[] }, - {"name":"capabilities","parameterTypes":[] }, - {"name":"familyName","parameterTypes":[] }, - {"name":"givenName","parameterTypes":[] }, - {"name":"lastUpdateTimestamp","parameterTypes":[] }, - {"name":"mobileCoinAddress","parameterTypes":[] }, - {"name":"unidentifiedAccessMode","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["long","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.util.Set"] }, {"name":"about","parameterTypes":[] }, {"name":"aboutEmoji","parameterTypes":[] }, {"name":"avatarUrlPath","parameterTypes":[] }, {"name":"capabilities","parameterTypes":[] }, {"name":"familyName","parameterTypes":[] }, {"name":"givenName","parameterTypes":[] }, {"name":"lastUpdateTimestamp","parameterTypes":[] }, {"name":"mobileCoinAddress","parameterTypes":[] }, {"name":"unidentifiedAccessMode","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.senderKeys.LegacySenderKeySharedStore$Storage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.util.List"] }, - {"name":"sharedSenderKeys","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.util.List"] }, {"name":"sharedSenderKeys","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.senderKeys.LegacySenderKeySharedStore$Storage$SharedSenderKey", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["long","int","java.lang.String"] }, - {"name":"deviceId","parameterTypes":[] }, - {"name":"distributionId","parameterTypes":[] }, - {"name":"recipientId","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["long","int","java.lang.String"] }, {"name":"deviceId","parameterTypes":[] }, {"name":"distributionId","parameterTypes":[] }, {"name":"recipientId","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String","org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack$JsonSticker","java.util.List"] }, - {"name":"author","parameterTypes":[] }, - {"name":"cover","parameterTypes":[] }, - {"name":"stickers","parameterTypes":[] }, - {"name":"title","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack$JsonSticker","java.util.List"] }, {"name":"author","parameterTypes":[] }, {"name":"cover","parameterTypes":[] }, {"name":"stickers","parameterTypes":[] }, {"name":"title","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack$JsonSticker", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.Integer","java.lang.String","java.lang.String","java.lang.String"] }, - {"name":"contentType","parameterTypes":[] }, - {"name":"emoji","parameterTypes":[] }, - {"name":"file","parameterTypes":[] }, - {"name":"id","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.Integer","java.lang.String","java.lang.String","java.lang.String"] }, {"name":"contentType","parameterTypes":[] }, {"name":"emoji","parameterTypes":[] }, {"name":"file","parameterTypes":[] }, {"name":"id","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.stickers.LegacyStickerStore$Storage", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.util.List"] }, - {"name":"stickers","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.util.List"] }, {"name":"stickers","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.storage.stickers.LegacyStickerStore$Storage$Sticker", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"","parameterTypes":["java.lang.String","java.lang.String","boolean"] }, - {"name":"installed","parameterTypes":[] }, - {"name":"packId","parameterTypes":[] }, - {"name":"packKey","parameterTypes":[] } - ] + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","boolean"] }, {"name":"installed","parameterTypes":[] }, {"name":"packId","parameterTypes":[] }, {"name":"packKey","parameterTypes":[] }] }, { "name":"org.asamk.signal.util.SecurityProvider$DefaultRandom", @@ -1976,24 +1578,11 @@ }, { "name":"org.signal.cdsi.proto.ClientRequest", - "fields":[ - {"name":"aciUakPairs_"}, - {"name":"discardE164S_"}, - {"name":"newE164S_"}, - {"name":"prevE164S_"}, - {"name":"returnAcisWithoutUaks_"}, - {"name":"tokenAck_"}, - {"name":"token_"} - ] + "fields":[{"name":"aciUakPairs_"}, {"name":"discardE164S_"}, {"name":"newE164S_"}, {"name":"prevE164S_"}, {"name":"returnAcisWithoutUaks_"}, {"name":"tokenAck_"}, {"name":"token_"}] }, { "name":"org.signal.cdsi.proto.ClientResponse", - "fields":[ - {"name":"debugPermitsUsed_"}, - {"name":"e164PniAciTriples_"}, - {"name":"retryAfterSecs_"}, - {"name":"token_"} - ] + "fields":[{"name":"debugPermitsUsed_"}, {"name":"e164PniAciTriples_"}, {"name":"retryAfterSecs_"}, {"name":"token_"}] }, { "name":"org.signal.libsignal.protocol.state.IdentityKeyStore", @@ -2034,92 +1623,31 @@ }, { "name":"org.signal.storageservice.protos.groups.AccessControl", - "fields":[ - {"name":"addFromInviteLink_"}, - {"name":"attributes_"}, - {"name":"members_"} - ] + "fields":[{"name":"addFromInviteLink_"}, {"name":"attributes_"}, {"name":"members_"}] }, { "name":"org.signal.storageservice.protos.groups.AvatarUploadAttributes", - "fields":[ - {"name":"acl_"}, - {"name":"algorithm_"}, - {"name":"credential_"}, - {"name":"date_"}, - {"name":"key_"}, - {"name":"policy_"}, - {"name":"signature_"} - ] + "fields":[{"name":"acl_"}, {"name":"algorithm_"}, {"name":"credential_"}, {"name":"date_"}, {"name":"key_"}, {"name":"policy_"}, {"name":"signature_"}] }, { "name":"org.signal.storageservice.protos.groups.BannedMember", - "fields":[ - {"name":"timestamp_"}, - {"name":"userId_"} - ] + "fields":[{"name":"timestamp_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.Group", - "fields":[ - {"name":"accessControl_"}, - {"name":"announcementsOnly_"}, - {"name":"avatar_"}, - {"name":"bannedMembers_"}, - {"name":"description_"}, - {"name":"disappearingMessagesTimer_"}, - {"name":"inviteLinkPassword_"}, - {"name":"members_"}, - {"name":"pendingMembers_"}, - {"name":"publicKey_"}, - {"name":"requestingMembers_"}, - {"name":"revision_"}, - {"name":"title_"} - ] + "fields":[{"name":"accessControl_"}, {"name":"announcementsOnly_"}, {"name":"avatar_"}, {"name":"bannedMembers_"}, {"name":"description_"}, {"name":"disappearingMessagesTimer_"}, {"name":"inviteLinkPassword_"}, {"name":"members_"}, {"name":"pendingMembers_"}, {"name":"publicKey_"}, {"name":"requestingMembers_"}, {"name":"revision_"}, {"name":"title_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupAttributeBlob", - "fields":[ - {"name":"contentCase_"}, - {"name":"content_"} - ] + "fields":[{"name":"contentCase_"}, {"name":"content_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange", - "fields":[ - {"name":"actions_"}, - {"name":"changeEpoch_"}, - {"name":"serverSignature_"} - ] + "fields":[{"name":"actions_"}, {"name":"changeEpoch_"}, {"name":"serverSignature_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions", - "fields":[ - {"name":"addBannedMembers_"}, - {"name":"addMembers_"}, - {"name":"addPendingMembers_"}, - {"name":"addRequestingMembers_"}, - {"name":"deleteBannedMembers_"}, - {"name":"deleteMembers_"}, - {"name":"deletePendingMembers_"}, - {"name":"deleteRequestingMembers_"}, - {"name":"modifyAddFromInviteLinkAccess_"}, - {"name":"modifyAnnouncementsOnly_"}, - {"name":"modifyAttributesAccess_"}, - {"name":"modifyAvatar_"}, - {"name":"modifyDescription_"}, - {"name":"modifyDisappearingMessagesTimer_"}, - {"name":"modifyInviteLinkPassword_"}, - {"name":"modifyMemberAccess_"}, - {"name":"modifyMemberProfileKeys_"}, - {"name":"modifyMemberRoles_"}, - {"name":"modifyTitle_"}, - {"name":"promotePendingMembers_"}, - {"name":"promotePendingPniAciMembers_"}, - {"name":"promoteRequestingMembers_"}, - {"name":"revision_"}, - {"name":"sourceUuid_"} - ] + "fields":[{"name":"addBannedMembers_"}, {"name":"addMembers_"}, {"name":"addPendingMembers_"}, {"name":"addRequestingMembers_"}, {"name":"deleteBannedMembers_"}, {"name":"deleteMembers_"}, {"name":"deletePendingMembers_"}, {"name":"deleteRequestingMembers_"}, {"name":"modifyAddFromInviteLinkAccess_"}, {"name":"modifyAnnouncementsOnly_"}, {"name":"modifyAttributesAccess_"}, {"name":"modifyAvatar_"}, {"name":"modifyDescription_"}, {"name":"modifyDisappearingMessagesTimer_"}, {"name":"modifyInviteLinkPassword_"}, {"name":"modifyMemberAccess_"}, {"name":"modifyMemberProfileKeys_"}, {"name":"modifyMemberRoles_"}, {"name":"modifyTitle_"}, {"name":"promotePendingMembers_"}, {"name":"promotePendingPniAciMembers_"}, {"name":"promoteRequestingMembers_"}, {"name":"revision_"}, {"name":"sourceUuid_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$AddBannedMemberAction", @@ -2127,10 +1655,7 @@ }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$AddMemberAction", - "fields":[ - {"name":"added_"}, - {"name":"joinFromInviteLink_"} - ] + "fields":[{"name":"added_"}, {"name":"joinFromInviteLink_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$AddPendingMemberAction", @@ -2186,18 +1711,11 @@ }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyMemberProfileKeyAction", - "fields":[ - {"name":"presentation_"}, - {"name":"profileKey_"}, - {"name":"userId_"} - ] + "fields":[{"name":"presentation_"}, {"name":"profileKey_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyMemberRoleAction", - "fields":[ - {"name":"role_"}, - {"name":"userId_"} - ] + "fields":[{"name":"role_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyMembersAccessControlAction", @@ -2209,27 +1727,15 @@ }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$PromotePendingMemberAction", - "fields":[ - {"name":"presentation_"}, - {"name":"profileKey_"}, - {"name":"userId_"} - ] + "fields":[{"name":"presentation_"}, {"name":"profileKey_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$PromotePendingPniAciMemberProfileKeyAction", - "fields":[ - {"name":"pni_"}, - {"name":"presentation_"}, - {"name":"profileKey_"}, - {"name":"userId_"} - ] + "fields":[{"name":"pni_"}, {"name":"presentation_"}, {"name":"profileKey_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$PromoteRequestingMemberAction", - "fields":[ - {"name":"role_"}, - {"name":"userId_"} - ] + "fields":[{"name":"role_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupChanges", @@ -2237,179 +1743,71 @@ }, { "name":"org.signal.storageservice.protos.groups.GroupChanges$GroupChangeState", - "fields":[ - {"name":"groupChange_"}, - {"name":"groupState_"} - ] + "fields":[{"name":"groupChange_"}, {"name":"groupState_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupInviteLink", - "fields":[ - {"name":"contentsCase_"}, - {"name":"contents_"} - ] + "fields":[{"name":"contentsCase_"}, {"name":"contents_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupInviteLink$GroupInviteLinkContentsV1", - "fields":[ - {"name":"groupMasterKey_"}, - {"name":"inviteLinkPassword_"} - ] + "fields":[{"name":"groupMasterKey_"}, {"name":"inviteLinkPassword_"}] }, { "name":"org.signal.storageservice.protos.groups.GroupJoinInfo", - "fields":[ - {"name":"addFromInviteLink_"}, - {"name":"avatar_"}, - {"name":"description_"}, - {"name":"memberCount_"}, - {"name":"pendingAdminApproval_"}, - {"name":"publicKey_"}, - {"name":"revision_"}, - {"name":"title_"} - ] + "fields":[{"name":"addFromInviteLink_"}, {"name":"avatar_"}, {"name":"description_"}, {"name":"memberCount_"}, {"name":"pendingAdminApproval_"}, {"name":"publicKey_"}, {"name":"revision_"}, {"name":"title_"}] }, { "name":"org.signal.storageservice.protos.groups.Member", - "fields":[ - {"name":"joinedAtRevision_"}, - {"name":"presentation_"}, - {"name":"profileKey_"}, - {"name":"role_"}, - {"name":"userId_"} - ] + "fields":[{"name":"joinedAtRevision_"}, {"name":"presentation_"}, {"name":"profileKey_"}, {"name":"role_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.PendingMember", - "fields":[ - {"name":"addedByUserId_"}, - {"name":"member_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"addedByUserId_"}, {"name":"member_"}, {"name":"timestamp_"}] }, { "name":"org.signal.storageservice.protos.groups.RequestingMember", - "fields":[ - {"name":"presentation_"}, - {"name":"profileKey_"}, - {"name":"timestamp_"}, - {"name":"userId_"} - ] + "fields":[{"name":"presentation_"}, {"name":"profileKey_"}, {"name":"timestamp_"}, {"name":"userId_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedApproveMember", - "fields":[ - {"name":"role_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"role_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedBannedMember", - "fields":[ - {"name":"timestamp_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"timestamp_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedGroup", - "fields":[ - {"name":"accessControl_"}, - {"name":"avatar_"}, - {"name":"bannedMembers_"}, - {"name":"description_"}, - {"name":"disappearingMessagesTimer_"}, - {"name":"inviteLinkPassword_"}, - {"name":"isAnnouncementGroup_"}, - {"name":"members_"}, - {"name":"pendingMembers_"}, - {"name":"requestingMembers_"}, - {"name":"revision_"}, - {"name":"title_"} - ] + "fields":[{"name":"accessControl_"}, {"name":"avatar_"}, {"name":"bannedMembers_"}, {"name":"description_"}, {"name":"disappearingMessagesTimer_"}, {"name":"inviteLinkPassword_"}, {"name":"isAnnouncementGroup_"}, {"name":"members_"}, {"name":"pendingMembers_"}, {"name":"requestingMembers_"}, {"name":"revision_"}, {"name":"title_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedGroupChange", - "fields":[ - {"name":"deleteBannedMembers_"}, - {"name":"deleteMembers_"}, - {"name":"deletePendingMembers_"}, - {"name":"deleteRequestingMembers_"}, - {"name":"editor_"}, - {"name":"modifiedProfileKeys_"}, - {"name":"modifyMemberRoles_"}, - {"name":"newAttributeAccess_"}, - {"name":"newAvatar_"}, - {"name":"newBannedMembers_"}, - {"name":"newDescription_"}, - {"name":"newInviteLinkAccess_"}, - {"name":"newInviteLinkPassword_"}, - {"name":"newIsAnnouncementGroup_"}, - {"name":"newMemberAccess_"}, - {"name":"newMembers_"}, - {"name":"newPendingMembers_"}, - {"name":"newRequestingMembers_"}, - {"name":"newTimer_"}, - {"name":"newTitle_"}, - {"name":"promotePendingMembers_"}, - {"name":"promotePendingPniAciMembers_"}, - {"name":"promoteRequestingMembers_"}, - {"name":"revision_"} - ] + "fields":[{"name":"deleteBannedMembers_"}, {"name":"deleteMembers_"}, {"name":"deletePendingMembers_"}, {"name":"deleteRequestingMembers_"}, {"name":"editor_"}, {"name":"modifiedProfileKeys_"}, {"name":"modifyMemberRoles_"}, {"name":"newAttributeAccess_"}, {"name":"newAvatar_"}, {"name":"newBannedMembers_"}, {"name":"newDescription_"}, {"name":"newInviteLinkAccess_"}, {"name":"newInviteLinkPassword_"}, {"name":"newIsAnnouncementGroup_"}, {"name":"newMemberAccess_"}, {"name":"newMembers_"}, {"name":"newPendingMembers_"}, {"name":"newRequestingMembers_"}, {"name":"newTimer_"}, {"name":"newTitle_"}, {"name":"promotePendingMembers_"}, {"name":"promotePendingPniAciMembers_"}, {"name":"promoteRequestingMembers_"}, {"name":"revision_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedGroupJoinInfo", - "fields":[ - {"name":"addFromInviteLink_"}, - {"name":"avatar_"}, - {"name":"description_"}, - {"name":"isAnnouncementGroup_"}, - {"name":"memberCount_"}, - {"name":"pendingAdminApproval_"}, - {"name":"revision_"}, - {"name":"title_"} - ] + "fields":[{"name":"addFromInviteLink_"}, {"name":"avatar_"}, {"name":"description_"}, {"name":"isAnnouncementGroup_"}, {"name":"memberCount_"}, {"name":"pendingAdminApproval_"}, {"name":"revision_"}, {"name":"title_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedMember", - "fields":[ - {"name":"joinedAtRevision_"}, - {"name":"pni_"}, - {"name":"profileKey_"}, - {"name":"role_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"joinedAtRevision_"}, {"name":"pni_"}, {"name":"profileKey_"}, {"name":"role_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedModifyMemberRole", - "fields":[ - {"name":"role_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"role_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMember", - "fields":[ - {"name":"addedByUuid_"}, - {"name":"role_"}, - {"name":"timestamp_"}, - {"name":"uuidCipherText_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"addedByUuid_"}, {"name":"role_"}, {"name":"timestamp_"}, {"name":"uuidCipherText_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval", - "fields":[ - {"name":"uuidCipherText_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"uuidCipherText_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedRequestingMember", - "fields":[ - {"name":"profileKey_"}, - {"name":"timestamp_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"profileKey_"}, {"name":"timestamp_"}, {"name":"uuid_"}] }, { "name":"org.signal.storageservice.protos.groups.local.DecryptedString", @@ -2427,48 +1825,21 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"getCapabilities","parameterTypes":[] }, - {"name":"getDiscoverableByPhoneNumber","parameterTypes":[] }, - {"name":"getFetchesMessages","parameterTypes":[] }, - {"name":"getName","parameterTypes":[] }, - {"name":"getPin","parameterTypes":[] }, - {"name":"getPniRegistrationId","parameterTypes":[] }, - {"name":"getRecoveryPassword","parameterTypes":[] }, - {"name":"getRegistrationId","parameterTypes":[] }, - {"name":"getRegistrationLock","parameterTypes":[] }, - {"name":"getSignalingKey","parameterTypes":[] }, - {"name":"getUnidentifiedAccessKey","parameterTypes":[] }, - {"name":"getUnrestrictedUnidentifiedAccess","parameterTypes":[] }, - {"name":"getVideo","parameterTypes":[] }, - {"name":"getVoice","parameterTypes":[] } - ] + "methods":[{"name":"getCapabilities","parameterTypes":[] }, {"name":"getDiscoverableByPhoneNumber","parameterTypes":[] }, {"name":"getFetchesMessages","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"getPin","parameterTypes":[] }, {"name":"getPniRegistrationId","parameterTypes":[] }, {"name":"getRecoveryPassword","parameterTypes":[] }, {"name":"getRegistrationId","parameterTypes":[] }, {"name":"getRegistrationLock","parameterTypes":[] }, {"name":"getSignalingKey","parameterTypes":[] }, {"name":"getUnidentifiedAccessKey","parameterTypes":[] }, {"name":"getUnrestrictedUnidentifiedAccess","parameterTypes":[] }, {"name":"getVideo","parameterTypes":[] }, {"name":"getVoice","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.api.account.AccountAttributes$Capabilities", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"getAnnouncementGroup","parameterTypes":[] }, - {"name":"getChangeNumber","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":"getGiftBadges","parameterTypes":[] }, {"name":"getPaymentActivation","parameterTypes":[] }, {"name":"getPni","parameterTypes":[] }, {"name":"getSenderKey","parameterTypes":[] }, {"name":"getStorage","parameterTypes":[] }, {"name":"getStories","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"getNumber","parameterTypes":[] }, - {"name":"getRegistrationLock","parameterTypes":[] } - ] + "methods":[{"name":"getNumber","parameterTypes":[] }, {"name":"getRegistrationLock","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.api.groupsv2.CredentialResponse", @@ -2652,80 +2023,35 @@ }, { "name":"org.whispersystems.signalservice.internal.devices.DeviceNameProtos$DeviceName", - "fields":[ - {"name":"bitField0_"}, - {"name":"ciphertext_"}, - {"name":"ephemeralPublic_"}, - {"name":"syntheticIv_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"ciphertext_"}, {"name":"ephemeralPublic_"}, {"name":"syntheticIv_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.BackupRequest", - "fields":[ - {"name":"backupId_"}, - {"name":"bitField0_"}, - {"name":"data_"}, - {"name":"pin_"}, - {"name":"serviceId_"}, - {"name":"token_"}, - {"name":"tries_"}, - {"name":"validFrom_"} - ] + "fields":[{"name":"backupId_"}, {"name":"bitField0_"}, {"name":"data_"}, {"name":"pin_"}, {"name":"serviceId_"}, {"name":"token_"}, {"name":"tries_"}, {"name":"validFrom_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.BackupResponse", - "fields":[ - {"name":"bitField0_"}, - {"name":"status_"}, - {"name":"token_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"status_"}, {"name":"token_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.DeleteRequest", - "fields":[ - {"name":"backupId_"}, - {"name":"bitField0_"}, - {"name":"serviceId_"} - ] + "fields":[{"name":"backupId_"}, {"name":"bitField0_"}, {"name":"serviceId_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.Request", - "fields":[ - {"name":"backup_"}, - {"name":"bitField0_"}, - {"name":"delete_"}, - {"name":"restore_"} - ] + "fields":[{"name":"backup_"}, {"name":"bitField0_"}, {"name":"delete_"}, {"name":"restore_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.Response", - "fields":[ - {"name":"backup_"}, - {"name":"bitField0_"}, - {"name":"delete_"}, - {"name":"restore_"} - ] + "fields":[{"name":"backup_"}, {"name":"bitField0_"}, {"name":"delete_"}, {"name":"restore_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.RestoreRequest", - "fields":[ - {"name":"backupId_"}, - {"name":"bitField0_"}, - {"name":"pin_"}, - {"name":"serviceId_"}, - {"name":"token_"}, - {"name":"validFrom_"} - ] + "fields":[{"name":"backupId_"}, {"name":"bitField0_"}, {"name":"pin_"}, {"name":"serviceId_"}, {"name":"token_"}, {"name":"validFrom_"}] }, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.RestoreResponse", - "fields":[ - {"name":"bitField0_"}, - {"name":"data_"}, - {"name":"status_"}, - {"name":"token_"}, - {"name":"tries_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"data_"}, {"name":"status_"}, {"name":"token_"}, {"name":"tries_"}] }, { "name":"org.whispersystems.signalservice.internal.push.AttachmentV2UploadAttributes", @@ -2839,13 +2165,7 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[ - {"name":"getDestination","parameterTypes":[] }, - {"name":"getMessages","parameterTypes":[] }, - {"name":"getTimestamp","parameterTypes":[] }, - {"name":"isOnline","parameterTypes":[] }, - {"name":"isUrgent","parameterTypes":[] } - ] + "methods":[{"name":"getDestination","parameterTypes":[] }, {"name":"getMessages","parameterTypes":[] }, {"name":"getTimestamp","parameterTypes":[] }, {"name":"isOnline","parameterTypes":[] }, {"name":"isUrgent","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.PreKeyEntity", @@ -2903,36 +2223,15 @@ }, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningProtos$ProvisionEnvelope", - "fields":[ - {"name":"bitField0_"}, - {"name":"body_"}, - {"name":"publicKey_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"body_"}, {"name":"publicKey_"}] }, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningProtos$ProvisionMessage", - "fields":[ - {"name":"aciIdentityKeyPrivate_"}, - {"name":"aciIdentityKeyPublic_"}, - {"name":"aci_"}, - {"name":"bitField0_"}, - {"name":"number_"}, - {"name":"pniIdentityKeyPrivate_"}, - {"name":"pniIdentityKeyPublic_"}, - {"name":"pni_"}, - {"name":"profileKey_"}, - {"name":"provisioningCode_"}, - {"name":"provisioningVersion_"}, - {"name":"readReceipts_"}, - {"name":"userAgent_"} - ] + "fields":[{"name":"aciIdentityKeyPrivate_"}, {"name":"aciIdentityKeyPublic_"}, {"name":"aci_"}, {"name":"bitField0_"}, {"name":"number_"}, {"name":"pniIdentityKeyPrivate_"}, {"name":"pniIdentityKeyPublic_"}, {"name":"pni_"}, {"name":"profileKey_"}, {"name":"provisioningCode_"}, {"name":"provisioningVersion_"}, {"name":"readReceipts_"}, {"name":"userAgent_"}] }, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningProtos$ProvisioningUuid", - "fields":[ - {"name":"bitField0_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"uuid_"}] }, { "name":"org.whispersystems.signalservice.internal.push.PushServiceSocket$RegistrationLockFailure", @@ -2958,12 +2257,7 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"getAccountAttributes","parameterTypes":[] }, - {"name":"getRecoveryPassword","parameterTypes":[] }, - {"name":"getSessionId","parameterTypes":[] }, - {"name":"getSkipDeviceTransfer","parameterTypes":[] } - ] + "methods":[{"name":"getAccountAttributes","parameterTypes":[] }, {"name":"getRecoveryPassword","parameterTypes":[] }, {"name":"getSessionId","parameterTypes":[] }, {"name":"getSkipDeviceTransfer","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.ReserveUsernameRequest", @@ -3005,698 +2299,267 @@ }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$AttachmentPointer", - "fields":[ - {"name":"attachmentIdentifierCase_"}, - {"name":"attachmentIdentifier_"}, - {"name":"bitField0_"}, - {"name":"blurHash_"}, - {"name":"caption_"}, - {"name":"cdnNumber_"}, - {"name":"contentType_"}, - {"name":"digest_"}, - {"name":"fileName_"}, - {"name":"flags_"}, - {"name":"height_"}, - {"name":"key_"}, - {"name":"size_"}, - {"name":"thumbnail_"}, - {"name":"uploadTimestamp_"}, - {"name":"width_"} - ] + "fields":[{"name":"attachmentIdentifierCase_"}, {"name":"attachmentIdentifier_"}, {"name":"bitField0_"}, {"name":"blurHash_"}, {"name":"caption_"}, {"name":"cdnNumber_"}, {"name":"contentType_"}, {"name":"digest_"}, {"name":"fileName_"}, {"name":"flags_"}, {"name":"height_"}, {"name":"key_"}, {"name":"size_"}, {"name":"thumbnail_"}, {"name":"uploadTimestamp_"}, {"name":"width_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$BodyRange", - "fields":[ - {"name":"associatedValueCase_"}, - {"name":"associatedValue_"}, - {"name":"bitField0_"}, - {"name":"length_"}, - {"name":"start_"} - ] + "fields":[{"name":"associatedValueCase_"}, {"name":"associatedValue_"}, {"name":"bitField0_"}, {"name":"length_"}, {"name":"start_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage", - "fields":[ - {"name":"answer_"}, - {"name":"bitField0_"}, - {"name":"busy_"}, - {"name":"destinationDeviceId_"}, - {"name":"hangup_"}, - {"name":"iceUpdate_"}, - {"name":"legacyHangup_"}, - {"name":"multiRing_"}, - {"name":"offer_"}, - {"name":"opaque_"} - ] + "fields":[{"name":"answer_"}, {"name":"bitField0_"}, {"name":"busy_"}, {"name":"destinationDeviceId_"}, {"name":"hangup_"}, {"name":"iceUpdate_"}, {"name":"legacyHangup_"}, {"name":"multiRing_"}, {"name":"offer_"}, {"name":"opaque_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Answer", - "fields":[ - {"name":"bitField0_"}, - {"name":"id_"}, - {"name":"opaque_"}, - {"name":"sdp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"id_"}, {"name":"opaque_"}, {"name":"sdp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Hangup", - "fields":[ - {"name":"bitField0_"}, - {"name":"deviceId_"}, - {"name":"id_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"deviceId_"}, {"name":"id_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$IceUpdate", - "fields":[ - {"name":"bitField0_"}, - {"name":"id_"}, - {"name":"line_"}, - {"name":"mid_"}, - {"name":"opaque_"}, - {"name":"sdp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"id_"}, {"name":"line_"}, {"name":"mid_"}, {"name":"opaque_"}, {"name":"sdp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Offer", - "fields":[ - {"name":"bitField0_"}, - {"name":"id_"}, - {"name":"opaque_"}, - {"name":"sdp_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"id_"}, {"name":"opaque_"}, {"name":"sdp_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Opaque", - "fields":[ - {"name":"bitField0_"}, - {"name":"data_"}, - {"name":"urgency_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"data_"}, {"name":"urgency_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails", - "fields":[ - {"name":"archived_"}, - {"name":"avatar_"}, - {"name":"bitField0_"}, - {"name":"blocked_"}, - {"name":"color_"}, - {"name":"expireTimer_"}, - {"name":"inboxPosition_"}, - {"name":"name_"}, - {"name":"number_"}, - {"name":"profileKey_"}, - {"name":"uuid_"}, - {"name":"verified_"} - ] + "fields":[{"name":"archived_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"blocked_"}, {"name":"color_"}, {"name":"expireTimer_"}, {"name":"inboxPosition_"}, {"name":"name_"}, {"name":"number_"}, {"name":"profileKey_"}, {"name":"uuid_"}, {"name":"verified_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails$Avatar", - "fields":[ - {"name":"bitField0_"}, - {"name":"contentType_"}, - {"name":"length_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"length_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Content", - "fields":[ - {"name":"bitField0_"}, - {"name":"callMessage_"}, - {"name":"dataMessage_"}, - {"name":"decryptionErrorMessage_"}, - {"name":"editMessage_"}, - {"name":"nullMessage_"}, - {"name":"pniSignatureMessage_"}, - {"name":"receiptMessage_"}, - {"name":"senderKeyDistributionMessage_"}, - {"name":"storyMessage_"}, - {"name":"syncMessage_"}, - {"name":"typingMessage_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"callMessage_"}, {"name":"dataMessage_"}, {"name":"decryptionErrorMessage_"}, {"name":"editMessage_"}, {"name":"nullMessage_"}, {"name":"pniSignatureMessage_"}, {"name":"receiptMessage_"}, {"name":"senderKeyDistributionMessage_"}, {"name":"storyMessage_"}, {"name":"syncMessage_"}, {"name":"typingMessage_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage", - "fields":[ - {"name":"attachments_"}, - {"name":"bitField0_"}, - {"name":"bodyRanges_"}, - {"name":"body_"}, - {"name":"contact_"}, - {"name":"delete_"}, - {"name":"expireTimer_"}, - {"name":"flags_"}, - {"name":"giftBadge_"}, - {"name":"groupCallUpdate_"}, - {"name":"groupV2_"}, - {"name":"group_"}, - {"name":"isViewOnce_"}, - {"name":"payment_"}, - {"name":"preview_"}, - {"name":"profileKey_"}, - {"name":"quote_"}, - {"name":"reaction_"}, - {"name":"requiredProtocolVersion_"}, - {"name":"sticker_"}, - {"name":"storyContext_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"attachments_"}, {"name":"bitField0_"}, {"name":"bodyRanges_"}, {"name":"body_"}, {"name":"contact_"}, {"name":"delete_"}, {"name":"expireTimer_"}, {"name":"flags_"}, {"name":"giftBadge_"}, {"name":"groupCallUpdate_"}, {"name":"groupV2_"}, {"name":"group_"}, {"name":"isViewOnce_"}, {"name":"payment_"}, {"name":"preview_"}, {"name":"profileKey_"}, {"name":"quote_"}, {"name":"reaction_"}, {"name":"requiredProtocolVersion_"}, {"name":"sticker_"}, {"name":"storyContext_"}, {"name":"timestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact", - "fields":[ - {"name":"address_"}, - {"name":"avatar_"}, - {"name":"bitField0_"}, - {"name":"email_"}, - {"name":"name_"}, - {"name":"number_"}, - {"name":"organization_"} - ] + "fields":[{"name":"address_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"email_"}, {"name":"name_"}, {"name":"number_"}, {"name":"organization_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Avatar", - "fields":[ - {"name":"avatar_"}, - {"name":"bitField0_"}, - {"name":"isProfile_"} - ] + "fields":[{"name":"avatar_"}, {"name":"bitField0_"}, {"name":"isProfile_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Email", - "fields":[ - {"name":"bitField0_"}, - {"name":"label_"}, - {"name":"type_"}, - {"name":"value_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"label_"}, {"name":"type_"}, {"name":"value_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Name", - "fields":[ - {"name":"bitField0_"}, - {"name":"displayName_"}, - {"name":"familyName_"}, - {"name":"givenName_"}, - {"name":"middleName_"}, - {"name":"prefix_"}, - {"name":"suffix_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"displayName_"}, {"name":"familyName_"}, {"name":"givenName_"}, {"name":"middleName_"}, {"name":"prefix_"}, {"name":"suffix_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Phone", - "fields":[ - {"name":"bitField0_"}, - {"name":"label_"}, - {"name":"type_"}, - {"name":"value_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"label_"}, {"name":"type_"}, {"name":"value_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$PostalAddress", - "fields":[ - {"name":"bitField0_"}, - {"name":"city_"}, - {"name":"country_"}, - {"name":"label_"}, - {"name":"neighborhood_"}, - {"name":"pobox_"}, - {"name":"postcode_"}, - {"name":"region_"}, - {"name":"street_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"city_"}, {"name":"country_"}, {"name":"label_"}, {"name":"neighborhood_"}, {"name":"pobox_"}, {"name":"postcode_"}, {"name":"region_"}, {"name":"street_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Delete", - "fields":[ - {"name":"bitField0_"}, - {"name":"targetSentTimestamp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"targetSentTimestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$GroupCallUpdate", - "fields":[ - {"name":"bitField0_"}, - {"name":"eraId_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"eraId_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Payment", - "fields":[ - {"name":"itemCase_"}, - {"name":"item_"} - ] + "fields":[{"name":"itemCase_"}, {"name":"item_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Payment$Notification", - "fields":[ - {"name":"bitField0_"}, - {"name":"note_"}, - {"name":"transactionCase_"}, - {"name":"transaction_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"note_"}, {"name":"transactionCase_"}, {"name":"transaction_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Payment$Notification$MobileCoin", - "fields":[ - {"name":"bitField0_"}, - {"name":"receipt_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"receipt_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Quote", - "fields":[ - {"name":"attachments_"}, - {"name":"authorUuid_"}, - {"name":"bitField0_"}, - {"name":"bodyRanges_"}, - {"name":"id_"}, - {"name":"text_"}, - {"name":"type_"} - ] + "fields":[{"name":"attachments_"}, {"name":"authorUuid_"}, {"name":"bitField0_"}, {"name":"bodyRanges_"}, {"name":"id_"}, {"name":"text_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Quote$QuotedAttachment", - "fields":[ - {"name":"bitField0_"}, - {"name":"contentType_"}, - {"name":"fileName_"}, - {"name":"thumbnail_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"fileName_"}, {"name":"thumbnail_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Reaction", - "fields":[ - {"name":"bitField0_"}, - {"name":"emoji_"}, - {"name":"remove_"}, - {"name":"targetAuthorUuid_"}, - {"name":"targetSentTimestamp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"emoji_"}, {"name":"remove_"}, {"name":"targetAuthorUuid_"}, {"name":"targetSentTimestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Sticker", - "fields":[ - {"name":"bitField0_"}, - {"name":"data_"}, - {"name":"emoji_"}, - {"name":"packId_"}, - {"name":"packKey_"}, - {"name":"stickerId_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"data_"}, {"name":"emoji_"}, {"name":"packId_"}, {"name":"packKey_"}, {"name":"stickerId_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$StoryContext", - "fields":[ - {"name":"authorUuid_"}, - {"name":"bitField0_"}, - {"name":"sentTimestamp_"} - ] + "fields":[{"name":"authorUuid_"}, {"name":"bitField0_"}, {"name":"sentTimestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$EditMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"dataMessage_"}, - {"name":"targetSentTimestamp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"dataMessage_"}, {"name":"targetSentTimestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Envelope", - "fields":[ - {"name":"bitField0_"}, - {"name":"content_"}, - {"name":"destinationUuid_"}, - {"name":"reportingToken_"}, - {"name":"serverGuid_"}, - {"name":"serverTimestamp_"}, - {"name":"sourceDevice_"}, - {"name":"sourceUuid_"}, - {"name":"story_"}, - {"name":"timestamp_"}, - {"name":"type_"}, - {"name":"updatedPni_"}, - {"name":"urgent_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"content_"}, {"name":"destinationUuid_"}, {"name":"reportingToken_"}, {"name":"serverGuid_"}, {"name":"serverTimestamp_"}, {"name":"sourceDevice_"}, {"name":"sourceUuid_"}, {"name":"story_"}, {"name":"timestamp_"}, {"name":"type_"}, {"name":"updatedPni_"}, {"name":"urgent_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContext", - "fields":[ - {"name":"avatar_"}, - {"name":"bitField0_"}, - {"name":"id_"}, - {"name":"membersE164_"}, - {"name":"members_"}, - {"name":"name_"}, - {"name":"type_"} - ] + "fields":[{"name":"avatar_"}, {"name":"bitField0_"}, {"name":"id_"}, {"name":"membersE164_"}, {"name":"members_"}, {"name":"name_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContext$Member", - "fields":[ - {"name":"bitField0_"}, - {"name":"e164_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"e164_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContextV2", - "fields":[ - {"name":"bitField0_"}, - {"name":"groupChange_"}, - {"name":"masterKey_"}, - {"name":"revision_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"groupChange_"}, {"name":"masterKey_"}, {"name":"revision_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupDetails", - "fields":[ - {"name":"active_"}, - {"name":"archived_"}, - {"name":"avatar_"}, - {"name":"bitField0_"}, - {"name":"blocked_"}, - {"name":"color_"}, - {"name":"expireTimer_"}, - {"name":"id_"}, - {"name":"inboxPosition_"}, - {"name":"membersE164_"}, - {"name":"members_"}, - {"name":"name_"} - ] + "fields":[{"name":"active_"}, {"name":"archived_"}, {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"blocked_"}, {"name":"color_"}, {"name":"expireTimer_"}, {"name":"id_"}, {"name":"inboxPosition_"}, {"name":"membersE164_"}, {"name":"members_"}, {"name":"name_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupDetails$Avatar", - "fields":[ - {"name":"bitField0_"}, - {"name":"contentType_"}, - {"name":"length_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"length_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupDetails$Member", - "fields":[ - {"name":"bitField0_"}, - {"name":"e164_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"e164_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$NullMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"padding_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"padding_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$PaymentAddress", - "fields":[ - {"name":"addressCase_"}, - {"name":"address_"} - ] + "fields":[{"name":"addressCase_"}, {"name":"address_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$PaymentAddress$MobileCoinAddress", - "fields":[ - {"name":"address_"}, - {"name":"bitField0_"}, - {"name":"signature_"} - ] + "fields":[{"name":"address_"}, {"name":"bitField0_"}, {"name":"signature_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$PniSignatureMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"pni_"}, - {"name":"signature_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"pni_"}, {"name":"signature_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Preview", - "fields":[ - {"name":"bitField0_"}, - {"name":"date_"}, - {"name":"description_"}, - {"name":"image_"}, - {"name":"title_"}, - {"name":"url_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"date_"}, {"name":"description_"}, {"name":"image_"}, {"name":"title_"}, {"name":"url_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ReceiptMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"timestamp_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"timestamp_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$StoryMessage", - "fields":[ - {"name":"allowsReplies_"}, - {"name":"attachmentCase_"}, - {"name":"attachment_"}, - {"name":"bitField0_"}, - {"name":"bodyRanges_"}, - {"name":"group_"}, - {"name":"profileKey_"} - ] + "fields":[{"name":"allowsReplies_"}, {"name":"attachmentCase_"}, {"name":"attachment_"}, {"name":"bitField0_"}, {"name":"bodyRanges_"}, {"name":"group_"}, {"name":"profileKey_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"blocked_"}, - {"name":"callEvent_"}, - {"name":"callLinkUpdate_"}, - {"name":"configuration_"}, - {"name":"contacts_"}, - {"name":"fetchLatest_"}, - {"name":"groups_"}, - {"name":"keys_"}, - {"name":"messageRequestResponse_"}, - {"name":"outgoingPayment_"}, - {"name":"padding_"}, - {"name":"pniChangeNumber_"}, - {"name":"read_"}, - {"name":"request_"}, - {"name":"sent_"}, - {"name":"stickerPackOperation_"}, - {"name":"verified_"}, - {"name":"viewOnceOpen_"}, - {"name":"viewed_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"blocked_"}, {"name":"callEvent_"}, {"name":"callLinkUpdate_"}, {"name":"configuration_"}, {"name":"contacts_"}, {"name":"fetchLatest_"}, {"name":"groups_"}, {"name":"keys_"}, {"name":"messageRequestResponse_"}, {"name":"outgoingPayment_"}, {"name":"padding_"}, {"name":"pniChangeNumber_"}, {"name":"read_"}, {"name":"request_"}, {"name":"sent_"}, {"name":"stickerPackOperation_"}, {"name":"verified_"}, {"name":"viewOnceOpen_"}, {"name":"viewed_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Blocked", - "fields":[ - {"name":"groupIds_"}, - {"name":"numbers_"}, - {"name":"uuids_"} - ] + "fields":[{"name":"groupIds_"}, {"name":"numbers_"}, {"name":"uuids_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$CallEvent", - "fields":[ - {"name":"bitField0_"}, - {"name":"conversationId_"}, - {"name":"direction_"}, - {"name":"event_"}, - {"name":"id_"}, - {"name":"timestamp_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"conversationId_"}, {"name":"direction_"}, {"name":"event_"}, {"name":"id_"}, {"name":"timestamp_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Configuration", - "fields":[ - {"name":"bitField0_"}, - {"name":"linkPreviews_"}, - {"name":"provisioningVersion_"}, - {"name":"readReceipts_"}, - {"name":"typingIndicators_"}, - {"name":"unidentifiedDeliveryIndicators_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"linkPreviews_"}, {"name":"provisioningVersion_"}, {"name":"readReceipts_"}, {"name":"typingIndicators_"}, {"name":"unidentifiedDeliveryIndicators_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Contacts", - "fields":[ - {"name":"bitField0_"}, - {"name":"blob_"}, - {"name":"complete_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"blob_"}, {"name":"complete_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$FetchLatest", - "fields":[ - {"name":"bitField0_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Groups", - "fields":[ - {"name":"bitField0_"}, - {"name":"blob_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"blob_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Keys", - "fields":[ - {"name":"bitField0_"}, - {"name":"storageService_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"storageService_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$MessageRequestResponse", - "fields":[ - {"name":"bitField0_"}, - {"name":"groupId_"}, - {"name":"threadUuid_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"groupId_"}, {"name":"threadUuid_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$OutgoingPayment", - "fields":[ - {"name":"bitField0_"}, - {"name":"note_"}, - {"name":"paymentDetailCase_"}, - {"name":"paymentDetail_"}, - {"name":"recipientUuid_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"note_"}, {"name":"paymentDetailCase_"}, {"name":"paymentDetail_"}, {"name":"recipientUuid_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$OutgoingPayment$MobileCoin", - "fields":[ - {"name":"amountPicoMob_"}, - {"name":"bitField0_"}, - {"name":"feePicoMob_"}, - {"name":"ledgerBlockIndex_"}, - {"name":"ledgerBlockTimestamp_"}, - {"name":"outputPublicKeys_"}, - {"name":"receipt_"}, - {"name":"recipientAddress_"}, - {"name":"spentKeyImages_"} - ] + "fields":[{"name":"amountPicoMob_"}, {"name":"bitField0_"}, {"name":"feePicoMob_"}, {"name":"ledgerBlockIndex_"}, {"name":"ledgerBlockTimestamp_"}, {"name":"outputPublicKeys_"}, {"name":"receipt_"}, {"name":"recipientAddress_"}, {"name":"spentKeyImages_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Read", - "fields":[ - {"name":"bitField0_"}, - {"name":"senderUuid_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"senderUuid_"}, {"name":"timestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Request", - "fields":[ - {"name":"bitField0_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent", - "fields":[ - {"name":"bitField0_"}, - {"name":"destinationE164_"}, - {"name":"destinationUuid_"}, - {"name":"editMessage_"}, - {"name":"expirationStartTimestamp_"}, - {"name":"isRecipientUpdate_"}, - {"name":"message_"}, - {"name":"storyMessageRecipients_"}, - {"name":"storyMessage_"}, - {"name":"timestamp_"}, - {"name":"unidentifiedStatus_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"destinationE164_"}, {"name":"destinationUuid_"}, {"name":"editMessage_"}, {"name":"expirationStartTimestamp_"}, {"name":"isRecipientUpdate_"}, {"name":"message_"}, {"name":"storyMessageRecipients_"}, {"name":"storyMessage_"}, {"name":"timestamp_"}, {"name":"unidentifiedStatus_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$StoryMessageRecipient", - "fields":[ - {"name":"bitField0_"}, - {"name":"destinationUuid_"}, - {"name":"distributionListIds_"}, - {"name":"isAllowedToReply_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"destinationUuid_"}, {"name":"distributionListIds_"}, {"name":"isAllowedToReply_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$UnidentifiedDeliveryStatus", - "fields":[ - {"name":"bitField0_"}, - {"name":"destinationUuid_"}, - {"name":"unidentified_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"destinationUuid_"}, {"name":"unidentified_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$StickerPackOperation", - "fields":[ - {"name":"bitField0_"}, - {"name":"packId_"}, - {"name":"packKey_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"packId_"}, {"name":"packKey_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$ViewOnceOpen", - "fields":[ - {"name":"bitField0_"}, - {"name":"senderUuid_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"senderUuid_"}, {"name":"timestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Viewed", - "fields":[ - {"name":"bitField0_"}, - {"name":"senderUuid_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"senderUuid_"}, {"name":"timestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TextAttachment", - "fields":[ - {"name":"backgroundCase_"}, - {"name":"background_"}, - {"name":"bitField0_"}, - {"name":"preview_"}, - {"name":"textBackgroundColor_"}, - {"name":"textForegroundColor_"}, - {"name":"textStyle_"}, - {"name":"text_"} - ] + "fields":[{"name":"backgroundCase_"}, {"name":"background_"}, {"name":"bitField0_"}, {"name":"preview_"}, {"name":"textBackgroundColor_"}, {"name":"textForegroundColor_"}, {"name":"textStyle_"}, {"name":"text_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TextAttachment$Gradient", - "fields":[ - {"name":"angle_"}, - {"name":"bitField0_"}, - {"name":"colors_"}, - {"name":"endColor_"}, - {"name":"positions_"}, - {"name":"startColor_"} - ] + "fields":[{"name":"angle_"}, {"name":"bitField0_"}, {"name":"colors_"}, {"name":"endColor_"}, {"name":"positions_"}, {"name":"startColor_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TypingMessage", - "fields":[ - {"name":"action_"}, - {"name":"bitField0_"}, - {"name":"groupId_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"action_"}, {"name":"bitField0_"}, {"name":"groupId_"}, {"name":"timestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Verified", - "fields":[ - {"name":"bitField0_"}, - {"name":"destinationUuid_"}, - {"name":"identityKey_"}, - {"name":"nullMessage_"}, - {"name":"state_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"destinationUuid_"}, {"name":"identityKey_"}, {"name":"nullMessage_"}, {"name":"state_"}] }, { "name":"org.whispersystems.signalservice.internal.push.StaleDevices", @@ -3710,27 +2573,14 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"getCaptcha","parameterTypes":[] }, - {"name":"getMcc","parameterTypes":[] }, - {"name":"getMnc","parameterTypes":[] }, - {"name":"getPushChallenge","parameterTypes":[] }, - {"name":"getPushToken","parameterTypes":[] }, - {"name":"getPushTokenType","parameterTypes":[] } - ] + "methods":[{"name":"getCaptcha","parameterTypes":[] }, {"name":"getMcc","parameterTypes":[] }, {"name":"getMnc","parameterTypes":[] }, {"name":"getPushChallenge","parameterTypes":[] }, {"name":"getPushToken","parameterTypes":[] }, {"name":"getPushTokenType","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.VerificationSessionMetadataRequestBody", "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[ - {"name":"getMcc","parameterTypes":[] }, - {"name":"getMnc","parameterTypes":[] }, - {"name":"getNumber","parameterTypes":[] }, - {"name":"getPushToken","parameterTypes":[] }, - {"name":"getPushTokenType","parameterTypes":[] } - ] + "methods":[{"name":"getMcc","parameterTypes":[] }, {"name":"getMnc","parameterTypes":[] }, {"name":"getNumber","parameterTypes":[] }, {"name":"getPushToken","parameterTypes":[] }, {"name":"getPushTokenType","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.VerifyAccountResponse", @@ -3747,55 +2597,23 @@ }, { "name":"org.whispersystems.signalservice.internal.serialize.protos.AddressProto", - "fields":[ - {"name":"bitField0_"}, - {"name":"e164_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"e164_"}, {"name":"uuid_"}] }, { "name":"org.whispersystems.signalservice.internal.serialize.protos.MetadataProto", - "fields":[ - {"name":"address_"}, - {"name":"bitField0_"}, - {"name":"destinationUuid_"}, - {"name":"groupId_"}, - {"name":"needsReceipt_"}, - {"name":"senderDevice_"}, - {"name":"serverDeliveredTimestamp_"}, - {"name":"serverGuid_"}, - {"name":"serverReceivedTimestamp_"}, - {"name":"timestamp_"} - ] + "fields":[{"name":"address_"}, {"name":"bitField0_"}, {"name":"destinationUuid_"}, {"name":"groupId_"}, {"name":"needsReceipt_"}, {"name":"senderDevice_"}, {"name":"serverDeliveredTimestamp_"}, {"name":"serverGuid_"}, {"name":"serverReceivedTimestamp_"}, {"name":"timestamp_"}] }, { "name":"org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto", - "fields":[ - {"name":"bitField0_"}, - {"name":"dataCase_"}, - {"name":"data_"}, - {"name":"localAddress_"}, - {"name":"metadata_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"dataCase_"}, {"name":"data_"}, {"name":"localAddress_"}, {"name":"metadata_"}] }, { "name":"org.whispersystems.signalservice.internal.sticker.StickerProtos$Pack", - "fields":[ - {"name":"author_"}, - {"name":"bitField0_"}, - {"name":"cover_"}, - {"name":"stickers_"}, - {"name":"title_"} - ] + "fields":[{"name":"author_"}, {"name":"bitField0_"}, {"name":"cover_"}, {"name":"stickers_"}, {"name":"title_"}] }, { "name":"org.whispersystems.signalservice.internal.sticker.StickerProtos$Pack$Sticker", - "fields":[ - {"name":"bitField0_"}, - {"name":"contentType_"}, - {"name":"emoji_"}, - {"name":"id_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"contentType_"}, {"name":"emoji_"}, {"name":"id_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord", @@ -3803,17 +2621,11 @@ }, { "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord$PinnedConversation", - "fields":[ - {"name":"identifierCase_"}, - {"name":"identifier_"} - ] + "fields":[{"name":"identifierCase_"}, {"name":"identifier_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.AccountRecord$PinnedConversation$Contact", - "fields":[ - {"name":"e164_"}, - {"name":"uuid_"} - ] + "fields":[{"name":"e164_"}, {"name":"uuid_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.ContactRecord", @@ -3829,18 +2641,11 @@ }, { "name":"org.whispersystems.signalservice.internal.storage.protos.ManifestRecord", - "fields":[ - {"name":"identifiers_"}, - {"name":"sourceDevice_"}, - {"name":"version_"} - ] + "fields":[{"name":"identifiers_"}, {"name":"sourceDevice_"}, {"name":"version_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.ManifestRecord$Identifier", - "fields":[ - {"name":"raw_"}, - {"name":"type_"} - ] + "fields":[{"name":"raw_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.Payments", @@ -3852,10 +2657,7 @@ }, { "name":"org.whispersystems.signalservice.internal.storage.protos.StorageItem", - "fields":[ - {"name":"key_"}, - {"name":"value_"} - ] + "fields":[{"name":"key_"}, {"name":"value_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.StorageItems", @@ -3863,17 +2665,11 @@ }, { "name":"org.whispersystems.signalservice.internal.storage.protos.StorageManifest", - "fields":[ - {"name":"value_"}, - {"name":"version_"} - ] + "fields":[{"name":"value_"}, {"name":"version_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.StorageRecord", - "fields":[ - {"name":"recordCase_"}, - {"name":"record_"} - ] + "fields":[{"name":"recordCase_"}, {"name":"record_"}] }, { "name":"org.whispersystems.signalservice.internal.storage.protos.StoryDistributionListRecord", @@ -3901,75 +2697,20 @@ }, { "name":"org.whispersystems.signalservice.internal.websocket.WebSocketProtos$WebSocketMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"request_"}, - {"name":"response_"}, - {"name":"type_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"request_"}, {"name":"response_"}, {"name":"type_"}] }, { "name":"org.whispersystems.signalservice.internal.websocket.WebSocketProtos$WebSocketRequestMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"body_"}, - {"name":"headers_"}, - {"name":"id_"}, - {"name":"path_"}, - {"name":"verb_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"body_"}, {"name":"headers_"}, {"name":"id_"}, {"name":"path_"}, {"name":"verb_"}] }, { "name":"org.whispersystems.signalservice.internal.websocket.WebSocketProtos$WebSocketResponseMessage", - "fields":[ - {"name":"bitField0_"}, - {"name":"body_"}, - {"name":"headers_"}, - {"name":"id_"}, - {"name":"message_"}, - {"name":"status_"} - ] + "fields":[{"name":"bitField0_"}, {"name":"body_"}, {"name":"headers_"}, {"name":"id_"}, {"name":"message_"}, {"name":"status_"}] }, { "name":"sun.misc.Unsafe", "allDeclaredFields":true, - "methods":[ - {"name":"allocateMemory","parameterTypes":["long"] }, - {"name":"arrayBaseOffset","parameterTypes":["java.lang.Class"] }, - {"name":"arrayIndexScale","parameterTypes":["java.lang.Class"] }, - {"name":"copyMemory","parameterTypes":["long","long","long"] }, - {"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] }, - {"name":"freeMemory","parameterTypes":["long"] }, - {"name":"getAddress","parameterTypes":["long"] }, - {"name":"getBoolean","parameterTypes":["java.lang.Object","long"] }, - {"name":"getByte","parameterTypes":["long"] }, - {"name":"getByte","parameterTypes":["java.lang.Object","long"] }, - {"name":"getDouble","parameterTypes":["long"] }, - {"name":"getDouble","parameterTypes":["java.lang.Object","long"] }, - {"name":"getFloat","parameterTypes":["long"] }, - {"name":"getFloat","parameterTypes":["java.lang.Object","long"] }, - {"name":"getInt","parameterTypes":["long"] }, - {"name":"getInt","parameterTypes":["java.lang.Object","long"] }, - {"name":"getLong","parameterTypes":["long"] }, - {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, - {"name":"getObject","parameterTypes":["java.lang.Object","long"] }, - {"name":"getShort","parameterTypes":["long"] }, - {"name":"objectFieldOffset","parameterTypes":["java.lang.reflect.Field"] }, - {"name":"putAddress","parameterTypes":["long","long"] }, - {"name":"putBoolean","parameterTypes":["java.lang.Object","long","boolean"] }, - {"name":"putByte","parameterTypes":["long","byte"] }, - {"name":"putByte","parameterTypes":["java.lang.Object","long","byte"] }, - {"name":"putDouble","parameterTypes":["long","double"] }, - {"name":"putDouble","parameterTypes":["java.lang.Object","long","double"] }, - {"name":"putFloat","parameterTypes":["long","float"] }, - {"name":"putFloat","parameterTypes":["java.lang.Object","long","float"] }, - {"name":"putInt","parameterTypes":["long","int"] }, - {"name":"putInt","parameterTypes":["java.lang.Object","long","int"] }, - {"name":"putLong","parameterTypes":["long","long"] }, - {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] }, - {"name":"putObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, - {"name":"putShort","parameterTypes":["long","short"] } - ] + "methods":[{"name":"allocateMemory","parameterTypes":["long"] }, {"name":"arrayBaseOffset","parameterTypes":["java.lang.Class"] }, {"name":"arrayIndexScale","parameterTypes":["java.lang.Class"] }, {"name":"copyMemory","parameterTypes":["long","long","long"] }, {"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] }, {"name":"freeMemory","parameterTypes":["long"] }, {"name":"getAddress","parameterTypes":["long"] }, {"name":"getBoolean","parameterTypes":["java.lang.Object","long"] }, {"name":"getByte","parameterTypes":["long"] }, {"name":"getByte","parameterTypes":["java.lang.Object","long"] }, {"name":"getDouble","parameterTypes":["long"] }, {"name":"getDouble","parameterTypes":["java.lang.Object","long"] }, {"name":"getFloat","parameterTypes":["long"] }, {"name":"getFloat","parameterTypes":["java.lang.Object","long"] }, {"name":"getInt","parameterTypes":["long"] }, {"name":"getInt","parameterTypes":["java.lang.Object","long"] }, {"name":"getLong","parameterTypes":["long"] }, {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, {"name":"getObject","parameterTypes":["java.lang.Object","long"] }, {"name":"getShort","parameterTypes":["long"] }, {"name":"objectFieldOffset","parameterTypes":["java.lang.reflect.Field"] }, {"name":"putAddress","parameterTypes":["long","long"] }, {"name":"putBoolean","parameterTypes":["java.lang.Object","long","boolean"] }, {"name":"putByte","parameterTypes":["long","byte"] }, {"name":"putByte","parameterTypes":["java.lang.Object","long","byte"] }, {"name":"putDouble","parameterTypes":["long","double"] }, {"name":"putDouble","parameterTypes":["java.lang.Object","long","double"] }, {"name":"putFloat","parameterTypes":["long","float"] }, {"name":"putFloat","parameterTypes":["java.lang.Object","long","float"] }, {"name":"putInt","parameterTypes":["long","int"] }, {"name":"putInt","parameterTypes":["java.lang.Object","long","int"] }, {"name":"putLong","parameterTypes":["long","long"] }, {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] }, {"name":"putObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, {"name":"putShort","parameterTypes":["long","short"] }] }, { "name":"sun.security.provider.DSA$SHA224withDSA", diff --git a/graalvm-config-dir/resource-config.json b/graalvm-config-dir/resource-config.json index 2ebe8973..17fbddb7 100644 --- a/graalvm-config-dir/resource-config.json +++ b/graalvm-config-dir/resource-config.json @@ -1,250 +1,168 @@ { "resources":{ - "includes":[ - { - "pattern":"\\QMETA-INF/maven/org.xerial/sqlite-jdbc/pom.properties\\E" - }, - { - "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E" - }, - { - "pattern":"\\QMETA-INF/services/java.sql.Driver\\E" - }, - { - "pattern":"\\QMETA-INF/services/org.freedesktop.dbus.spi.transport.ITransportProvider\\E" - }, - { - "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE\\E" - }, - { - "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK\\E" - }, - { - "pattern":"\\Qjni/x86_64-Linux/libjffi-1.2.so\\E" - }, - { - "pattern":"\\Qlibsignal_jni.dylib\\E" - }, - { - "pattern":"\\Qlibsignal_jni.so\\E" - }, - { - "pattern":"\\Qorg/asamk/signal/manager/config/ias.store\\E" - }, - { - "pattern":"\\Qorg/asamk/signal/manager/config/whisper.store\\E" - }, - { - "pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E" - }, - { - "pattern":"\\Qorg/sqlite/native/Linux/x86_64/libsqlitejdbc.so\\E" - }, - { - "pattern":"\\Qsignal_jni.dll\\E" - }, - { - "pattern":"\\Qsqlite-jdbc.properties\\E" - }, - { - "pattern":"com/google/i18n/phonenumbers/data/.*" - } - ]}, + "includes":[{ + "pattern":"\\QMETA-INF/maven/org.xerial/sqlite-jdbc/pom.properties\\E" + }, { + "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E" + }, { + "pattern":"\\QMETA-INF/services/java.sql.Driver\\E" + }, { + "pattern":"\\QMETA-INF/services/org.freedesktop.dbus.spi.transport.ITransportProvider\\E" + }, { + "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE\\E" + }, { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_XK\\E" + }, { + "pattern":"\\Qjni/x86_64-Linux/libjffi-1.2.so\\E" + }, { + "pattern":"\\Qlibsignal_jni.dylib\\E" + }, { + "pattern":"\\Qlibsignal_jni.so\\E" + }, { + "pattern":"\\Qorg/asamk/signal/manager/config/ias.store\\E" + }, { + "pattern":"\\Qorg/asamk/signal/manager/config/whisper.store\\E" + }, { + "pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E" + }, { + "pattern":"\\Qorg/sqlite/native/Linux/x86_64/libsqlitejdbc.so\\E" + }, { + "pattern":"\\Qsignal_jni.dll\\E" + }, { + "pattern":"\\Qsqlite-jdbc.properties\\E" + }, { + "pattern":"com/google/i18n/phonenumbers/data/.*" + }, { + "pattern":"java.base:\\Qsun/text/resources/LineBreakIteratorData\\E" + }]}, "bundles":[{ - "name":"net.sourceforge.argparse4j.internal.ArgumentParserImpl", - "locales":[ - "", - "en", - "und" - ] - }] + "name":"net.sourceforge.argparse4j.internal.ArgumentParserImpl", + "locales":["", "en", "und"] + }] } -- 2.51.0 From a3f7de89f103fd1abdc8684672f9b2e6af4e6326 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 17 Jun 2023 12:21:15 +0200 Subject: [PATCH 08/16] Update graalvm buildtools --- build.gradle.kts | 2 +- graalvm-config-dir/reflect-config.json | 53 ++++++++++++++++++++++--- graalvm-config-dir/resource-config.json | 6 +++ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9c436568..e2e0b51d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { application eclipse `check-lib-versions` - id("org.graalvm.buildtools.native") version "0.9.22" + id("org.graalvm.buildtools.native") version "0.9.23" } version = "0.11.11" diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index f053cead..0952cd1b 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -81,10 +81,22 @@ "allDeclaredFields":true, "allDeclaredMethods":true }, +{ + "name":"com.google.protobuf.DescriptorMessageInfoFactory" +}, +{ + "name":"com.google.protobuf.ExtensionRegistry" +}, +{ + "name":"com.google.protobuf.ExtensionSchemaFull" +}, { "name":"com.google.protobuf.GeneratedMessageLite", "fields":[{"name":"unknownFields"}] }, +{ + "name":"com.google.protobuf.GeneratedMessageV3" +}, { "name":"com.google.protobuf.Internal$LongList", "allDeclaredMethods":true @@ -99,10 +111,19 @@ "allDeclaredMethods":true, "allDeclaredConstructors":true }, +{ + "name":"com.google.protobuf.MapFieldSchemaFull" +}, +{ + "name":"com.google.protobuf.NewInstanceSchemaFull" +}, { "name":"com.google.protobuf.PrimitiveNonBoxingCollection", "allDeclaredMethods":true }, +{ + "name":"com.google.protobuf.UnknownFieldSetSchema" +}, { "name":"com.sun.crypto.provider.AESCipher$General", "methods":[{"name":"","parameterTypes":[] }] @@ -155,7 +176,15 @@ "name":"com.zaxxer.hikari.HikariConfig", "allDeclaredFields":true, "queryAllPublicMethods":true, - "methods":[{"name":"getCatalog","parameterTypes":[] }, {"name":"getConnectionInitSql","parameterTypes":[] }, {"name":"getConnectionTestQuery","parameterTypes":[] }, {"name":"getConnectionTimeout","parameterTypes":[] }, {"name":"getDataSource","parameterTypes":[] }, {"name":"getDataSourceClassName","parameterTypes":[] }, {"name":"getDataSourceJNDI","parameterTypes":[] }, {"name":"getDataSourceProperties","parameterTypes":[] }, {"name":"getDriverClassName","parameterTypes":[] }, {"name":"getExceptionOverrideClassName","parameterTypes":[] }, {"name":"getHealthCheckProperties","parameterTypes":[] }, {"name":"getHealthCheckRegistry","parameterTypes":[] }, {"name":"getIdleTimeout","parameterTypes":[] }, {"name":"getInitializationFailTimeout","parameterTypes":[] }, {"name":"getJdbcUrl","parameterTypes":[] }, {"name":"getKeepaliveTime","parameterTypes":[] }, {"name":"getLeakDetectionThreshold","parameterTypes":[] }, {"name":"getMaxLifetime","parameterTypes":[] }, {"name":"getMaximumPoolSize","parameterTypes":[] }, {"name":"getMetricRegistry","parameterTypes":[] }, {"name":"getMetricsTrackerFactory","parameterTypes":[] }, {"name":"getMinimumIdle","parameterTypes":[] }, {"name":"getPassword","parameterTypes":[] }, {"name":"getPoolName","parameterTypes":[] }, {"name":"getScheduledExecutor","parameterTypes":[] }, {"name":"getSchema","parameterTypes":[] }, {"name":"getThreadFactory","parameterTypes":[] }, {"name":"getTransactionIsolation","parameterTypes":[] }, {"name":"getUsername","parameterTypes":[] }, {"name":"getValidationTimeout","parameterTypes":[] }, {"name":"isAllowPoolSuspension","parameterTypes":[] }, {"name":"isAutoCommit","parameterTypes":[] }, {"name":"isIsolateInternalQueries","parameterTypes":[] }, {"name":"isReadOnly","parameterTypes":[] }, {"name":"isRegisterMbeans","parameterTypes":[] }, {"name":"setAllowPoolSuspension","parameterTypes":["boolean"] }, {"name":"setAutoCommit","parameterTypes":["boolean"] }, {"name":"setCatalog","parameterTypes":["java.lang.String"] }, {"name":"setConnectionInitSql","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTestQuery","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTimeout","parameterTypes":["long"] }, {"name":"setDataSource","parameterTypes":["javax.sql.DataSource"] }, {"name":"setDataSourceClassName","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceJNDI","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceProperties","parameterTypes":["java.util.Properties"] }, {"name":"setDriverClassName","parameterTypes":["java.lang.String"] }, {"name":"setExceptionOverrideClassName","parameterTypes":["java.lang.String"] }, {"name":"setHealthCheckProperties","parameterTypes":["java.util.Properties"] }, {"name":"setHealthCheckRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setIdleTimeout","parameterTypes":["long"] }, {"name":"setInitializationFailTimeout","parameterTypes":["long"] }, {"name":"setIsolateInternalQueries","parameterTypes":["boolean"] }, {"name":"setJdbcUrl","parameterTypes":["java.lang.String"] }, {"name":"setKeepaliveTime","parameterTypes":["long"] }, {"name":"setLeakDetectionThreshold","parameterTypes":["long"] }, {"name":"setMaxLifetime","parameterTypes":["long"] }, {"name":"setMaximumPoolSize","parameterTypes":["int"] }, {"name":"setMetricRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setMetricsTrackerFactory","parameterTypes":["com.zaxxer.hikari.metrics.MetricsTrackerFactory"] }, {"name":"setMinimumIdle","parameterTypes":["int"] }, {"name":"setPassword","parameterTypes":["java.lang.String"] }, {"name":"setPoolName","parameterTypes":["java.lang.String"] }, {"name":"setReadOnly","parameterTypes":["boolean"] }, {"name":"setRegisterMbeans","parameterTypes":["boolean"] }, {"name":"setScheduledExecutor","parameterTypes":["java.util.concurrent.ScheduledExecutorService"] }, {"name":"setSchema","parameterTypes":["java.lang.String"] }, {"name":"setThreadFactory","parameterTypes":["java.util.concurrent.ThreadFactory"] }, {"name":"setTransactionIsolation","parameterTypes":["java.lang.String"] }, {"name":"setUsername","parameterTypes":["java.lang.String"] }, {"name":"setValidationTimeout","parameterTypes":["long"] }] + "methods":[{"name":"getAllowPoolSuspension","parameterTypes":[] }, {"name":"getAutoCommit","parameterTypes":[] }, {"name":"getCatalog","parameterTypes":[] }, {"name":"getConnectionInitSql","parameterTypes":[] }, {"name":"getConnectionTestQuery","parameterTypes":[] }, {"name":"getConnectionTimeout","parameterTypes":[] }, {"name":"getDataSource","parameterTypes":[] }, {"name":"getDataSourceClassName","parameterTypes":[] }, {"name":"getDataSourceJNDI","parameterTypes":[] }, {"name":"getDataSourceProperties","parameterTypes":[] }, {"name":"getDriverClassName","parameterTypes":[] }, {"name":"getExceptionOverrideClassName","parameterTypes":[] }, {"name":"getHealthCheckProperties","parameterTypes":[] }, {"name":"getHealthCheckRegistry","parameterTypes":[] }, {"name":"getIdleTimeout","parameterTypes":[] }, {"name":"getInitializationFailTimeout","parameterTypes":[] }, {"name":"getIsolateInternalQueries","parameterTypes":[] }, {"name":"getJdbcUrl","parameterTypes":[] }, {"name":"getKeepaliveTime","parameterTypes":[] }, {"name":"getLeakDetectionThreshold","parameterTypes":[] }, {"name":"getMaxLifetime","parameterTypes":[] }, {"name":"getMaximumPoolSize","parameterTypes":[] }, {"name":"getMetricRegistry","parameterTypes":[] }, {"name":"getMetricsTrackerFactory","parameterTypes":[] }, {"name":"getMinimumIdle","parameterTypes":[] }, {"name":"getPassword","parameterTypes":[] }, {"name":"getPoolName","parameterTypes":[] }, {"name":"getReadOnly","parameterTypes":[] }, {"name":"getRegisterMbeans","parameterTypes":[] }, {"name":"getScheduledExecutor","parameterTypes":[] }, {"name":"getSchema","parameterTypes":[] }, {"name":"getThreadFactory","parameterTypes":[] }, {"name":"getTransactionIsolation","parameterTypes":[] }, {"name":"getUsername","parameterTypes":[] }, {"name":"getValidationTimeout","parameterTypes":[] }, {"name":"isAllowPoolSuspension","parameterTypes":[] }, {"name":"isAutoCommit","parameterTypes":[] }, {"name":"isIsolateInternalQueries","parameterTypes":[] }, {"name":"isReadOnly","parameterTypes":[] }, {"name":"isRegisterMbeans","parameterTypes":[] }, {"name":"setAllowPoolSuspension","parameterTypes":["boolean"] }, {"name":"setAutoCommit","parameterTypes":["boolean"] }, {"name":"setCatalog","parameterTypes":["java.lang.String"] }, {"name":"setClass","parameterTypes":["java.lang.Class"] }, {"name":"setConnectionInitSql","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTestQuery","parameterTypes":["java.lang.String"] }, {"name":"setConnectionTimeout","parameterTypes":["long"] }, {"name":"setDataSource","parameterTypes":["javax.sql.DataSource"] }, {"name":"setDataSourceClassName","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceJNDI","parameterTypes":["java.lang.String"] }, {"name":"setDataSourceProperties","parameterTypes":["java.util.Properties"] }, {"name":"setDriverClassName","parameterTypes":["java.lang.String"] }, {"name":"setExceptionOverrideClassName","parameterTypes":["java.lang.String"] }, {"name":"setHealthCheckProperties","parameterTypes":["java.util.Properties"] }, {"name":"setHealthCheckRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setIdleTimeout","parameterTypes":["long"] }, {"name":"setInitializationFailTimeout","parameterTypes":["long"] }, {"name":"setIsolateInternalQueries","parameterTypes":["boolean"] }, {"name":"setJdbcUrl","parameterTypes":["java.lang.String"] }, {"name":"setKeepaliveTime","parameterTypes":["long"] }, {"name":"setLeakDetectionThreshold","parameterTypes":["long"] }, {"name":"setMaxLifetime","parameterTypes":["long"] }, {"name":"setMaximumPoolSize","parameterTypes":["int"] }, {"name":"setMetricRegistry","parameterTypes":["java.lang.Object"] }, {"name":"setMetricsTrackerFactory","parameterTypes":["com.zaxxer.hikari.metrics.MetricsTrackerFactory"] }, {"name":"setMinimumIdle","parameterTypes":["int"] }, {"name":"setPassword","parameterTypes":["java.lang.String"] }, {"name":"setPoolName","parameterTypes":["java.lang.String"] }, {"name":"setReadOnly","parameterTypes":["boolean"] }, {"name":"setRegisterMbeans","parameterTypes":["boolean"] }, {"name":"setScheduledExecutor","parameterTypes":["java.util.concurrent.ScheduledExecutorService"] }, {"name":"setSchema","parameterTypes":["java.lang.String"] }, {"name":"setThreadFactory","parameterTypes":["java.util.concurrent.ThreadFactory"] }, {"name":"setTransactionIsolation","parameterTypes":["java.lang.String"] }, {"name":"setUsername","parameterTypes":["java.lang.String"] }, {"name":"setValidationTimeout","parameterTypes":["long"] }] +}, +{ + "name":"com.zaxxer.hikari.pool.PoolBase", + "fields":[{"name":"catalog"}] +}, +{ + "name":"com.zaxxer.hikari.pool.PoolEntry", + "fields":[{"name":"state"}] }, { "name":"int", @@ -169,7 +198,7 @@ }, { "name":"java.io.File", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] + "methods":[{"name":"","parameterTypes":["java.lang.String"] }, {"name":"valueOf","parameterTypes":["java.lang.String"] }] }, { "name":"java.io.FilePermission" @@ -240,6 +269,10 @@ "name":"java.lang.String", "allPublicMethods":true }, +{ + "name":"java.lang.Thread", + "fields":[{"name":"threadLocalRandomProbe"}] +}, { "name":"java.lang.Throwable", "queryAllPublicMethods":true, @@ -376,6 +409,10 @@ "name":"java.util.concurrent.atomic.AtomicReference", "fields":[{"name":"value"}] }, +{ + "name":"java.util.concurrent.atomic.Striped64", + "fields":[{"name":"base"}, {"name":"cellsBusy"}] +}, { "name":"javax.security.auth.x500.X500Principal", "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] @@ -383,6 +420,9 @@ { "name":"javax.smartcardio.CardPermission" }, +{ + "name":"libcore.io.Memory" +}, { "name":"long", "allDeclaredMethods":true, @@ -1146,7 +1186,7 @@ }, { "name":"org.asamk.signal.util.SecurityProvider$DefaultRandom", - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] }, { "name":"org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings", @@ -1576,6 +1616,9 @@ "name":"org.freedesktop.dbus.interfaces.Properties$PropertiesChanged", "allPublicConstructors":true }, +{ + "name":"org.robolectric.Robolectric" +}, { "name":"org.signal.cdsi.proto.ClientRequest", "fields":[{"name":"aciUakPairs_"}, {"name":"discardE164S_"}, {"name":"newE164S_"}, {"name":"prevE164S_"}, {"name":"returnAcisWithoutUaks_"}, {"name":"tokenAck_"}, {"name":"token_"}] @@ -2726,11 +2769,11 @@ }, { "name":"sun.security.provider.NativePRNG", - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] }, { "name":"sun.security.provider.NativePRNG$NonBlocking", - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] }, { "name":"sun.security.provider.SHA", diff --git a/graalvm-config-dir/resource-config.json b/graalvm-config-dir/resource-config.json index 17fbddb7..0d8cde58 100644 --- a/graalvm-config-dir/resource-config.json +++ b/graalvm-config-dir/resource-config.json @@ -158,6 +158,12 @@ "pattern":"\\Qsqlite-jdbc.properties\\E" }, { "pattern":"com/google/i18n/phonenumbers/data/.*" + }, { + "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt67b/nfc.nrm\\E" + }, { + "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt67b/uprops.icu\\E" + }, { + "pattern":"java.base:\\Qsun/net/idn/uidna.spp\\E" }, { "pattern":"java.base:\\Qsun/text/resources/LineBreakIteratorData\\E" }]}, -- 2.51.0 From ac815f759820a9e91cd1857159972ea8a106dbff Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 17 Jun 2023 12:59:55 +0200 Subject: [PATCH 09/16] Fix json deserialization for request params Fixes #1261 --- graalvm-config-dir/reflect-config.json | 15 +++++++++++---- .../asamk/signal/commands/FinishLinkCommand.java | 5 ++++- .../org/asamk/signal/commands/ReceiveCommand.java | 2 +- .../asamk/signal/commands/RegisterCommand.java | 2 +- .../org/asamk/signal/commands/VerifyCommand.java | 2 +- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 0952cd1b..6a754766 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -405,6 +405,10 @@ "name":"java.util.concurrent.atomic.AtomicBoolean", "fields":[{"name":"value"}] }, +{ + "name":"java.util.concurrent.atomic.AtomicMarkableReference", + "fields":[{"name":"pair"}] +}, { "name":"java.util.concurrent.atomic.AtomicReference", "fields":[{"name":"value"}] @@ -951,19 +955,22 @@ "name":"org.asamk.signal.jsonrpc.JsonRpcRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.asamk.signal.jsonrpc.JsonRpcResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"getError","parameterTypes":[] }, {"name":"getId","parameterTypes":[] }, {"name":"getJsonrpc","parameterTypes":[] }, {"name":"getResult","parameterTypes":[] }] }, { "name":"org.asamk.signal.jsonrpc.JsonRpcResponse$Error", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"getCode","parameterTypes":[] }, {"name":"getData","parameterTypes":[] }, {"name":"getMessage","parameterTypes":[] }] }, { "name":"org.asamk.signal.manager.api.PhoneNumberSharingMode", @@ -2797,7 +2804,7 @@ }, { "name":"sun.security.provider.SecureRandom", - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }] }, { "name":"sun.security.provider.certpath.PKIXCertPathValidator", diff --git a/src/main/java/org/asamk/signal/commands/FinishLinkCommand.java b/src/main/java/org/asamk/signal/commands/FinishLinkCommand.java index d08520df..2d1422aa 100644 --- a/src/main/java/org/asamk/signal/commands/FinishLinkCommand.java +++ b/src/main/java/org/asamk/signal/commands/FinishLinkCommand.java @@ -34,6 +34,9 @@ public class FinishLinkCommand implements JsonRpcMultiCommand Date: Sat, 17 Jun 2023 17:22:26 +0200 Subject: [PATCH 10/16] Update logback --- graalvm-config-dir/jni-config.json | 4 ++++ settings.gradle.kts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/graalvm-config-dir/jni-config.json b/graalvm-config-dir/jni-config.json index f5051e5b..387549dd 100644 --- a/graalvm-config-dir/jni-config.json +++ b/graalvm-config-dir/jni-config.json @@ -91,6 +91,10 @@ "name":"org.signal.libsignal.protocol.UntrustedIdentityException", "methods":[{"name":"","parameterTypes":["java.lang.String"] }] }, +{ + "name":"org.signal.libsignal.protocol.fingerprint.FingerprintParsingException", + "methods":[{"name":"","parameterTypes":["java.lang.String"] }] +}, { "name":"org.signal.libsignal.protocol.groups.state.SenderKeyRecord", "fields":[{"name":"unsafeHandle"}], diff --git a/settings.gradle.kts b/settings.gradle.kts index f21554e4..a6a66ae3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,7 @@ dependencyResolutionManagement { version("slf4j", "2.0.7") library("slf4j.api", "org.slf4j", "slf4j-api").versionRef("slf4j") library("slf4j.jul", "org.slf4j", "jul-to-slf4j").versionRef("slf4j") - library("logback", "ch.qos.logback", "logback-classic").version("1.4.7") + library("logback", "ch.qos.logback", "logback-classic").version("1.4.8") library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_73") -- 2.51.0 From 306e38c9ee3ba1d1c1038f16bdf07422ab2c34bb Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 17 Jun 2023 21:18:24 +0200 Subject: [PATCH 11/16] Implement support for kyber pre keys --- graalvm-config-dir/jni-config.json | 6 +- graalvm-config-dir/reflect-config.json | 14 +- .../signal/manager/config/ServiceConfig.java | 4 +- .../signal/manager/helper/PreKeyHelper.java | 64 +++++- .../manager/storage/AccountDatabase.java | 22 +- .../signal/manager/storage/SignalAccount.java | 172 ++++++++++++-- .../storage/prekeys/KyberPreKeyStore.java | 211 ++++++++++++++++++ .../manager/storage/prekeys/PreKeyStore.java | 2 +- .../storage/protocol/SignalProtocolStore.java | 24 +- .../storage/sessions/SessionStore.java | 4 +- .../asamk/signal/manager/util/KeyUtils.java | 26 ++- 11 files changed, 504 insertions(+), 45 deletions(-) create mode 100644 lib/src/main/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java diff --git a/graalvm-config-dir/jni-config.json b/graalvm-config-dir/jni-config.json index 387549dd..33dbd070 100644 --- a/graalvm-config-dir/jni-config.json +++ b/graalvm-config-dir/jni-config.json @@ -46,7 +46,7 @@ }, { "name":"org.asamk.signal.manager.storage.protocol.SignalProtocolStore", - "methods":[{"name":"getIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, {"name":"getIdentityKeyPair","parameterTypes":[] }, {"name":"getLocalRegistrationId","parameterTypes":[] }, {"name":"isTrustedIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey","org.signal.libsignal.protocol.state.IdentityKeyStore$Direction"] }, {"name":"loadPreKey","parameterTypes":["int"] }, {"name":"loadSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID"] }, {"name":"loadSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, {"name":"loadSignedPreKey","parameterTypes":["int"] }, {"name":"removePreKey","parameterTypes":["int"] }, {"name":"saveIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey"] }, {"name":"storeSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID","org.signal.libsignal.protocol.groups.state.SenderKeyRecord"] }, {"name":"storeSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.state.SessionRecord"] }] + "methods":[{"name":"getIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, {"name":"getIdentityKeyPair","parameterTypes":[] }, {"name":"getLocalRegistrationId","parameterTypes":[] }, {"name":"isTrustedIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey","org.signal.libsignal.protocol.state.IdentityKeyStore$Direction"] }, {"name":"loadKyberPreKey","parameterTypes":["int"] }, {"name":"loadPreKey","parameterTypes":["int"] }, {"name":"loadSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID"] }, {"name":"loadSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress"] }, {"name":"loadSignedPreKey","parameterTypes":["int"] }, {"name":"markKyberPreKeyUsed","parameterTypes":["int"] }, {"name":"removePreKey","parameterTypes":["int"] }, {"name":"saveIdentity","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.IdentityKey"] }, {"name":"storeSenderKey","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","java.util.UUID","org.signal.libsignal.protocol.groups.state.SenderKeyRecord"] }, {"name":"storeSession","parameterTypes":["org.signal.libsignal.protocol.SignalProtocolAddress","org.signal.libsignal.protocol.state.SessionRecord"] }] }, { "name":"org.asamk.signal.manager.storage.senderKeys.SenderKeyStore", @@ -133,6 +133,10 @@ "name":"org.signal.libsignal.protocol.state.IdentityKeyStore$Direction", "fields":[{"name":"RECEIVING"}, {"name":"SENDING"}] }, +{ + "name":"org.signal.libsignal.protocol.state.KyberPreKeyRecord", + "fields":[{"name":"unsafeHandle"}] +}, { "name":"org.signal.libsignal.protocol.state.KyberPreKeyStore" }, diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 6a754766..0f08810c 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -2179,16 +2179,25 @@ "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity", "allDeclaredFields":true, "queryAllDeclaredMethods":true, - "queryAllDeclaredConstructors":true + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }, {"name":"getKeyId","parameterTypes":[] }, {"name":"getPublicKey","parameterTypes":[] }, {"name":"getSignature","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$ByteArrayDeserializer", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$ByteArraySerializer", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$KEMPublicKeyDeserializer", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$KEMPublicKeySerializer", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.push.MismatchedDevices", "allDeclaredFields":true, @@ -2250,7 +2259,8 @@ "name":"org.whispersystems.signalservice.internal.push.PreKeyState", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"getIdentityKey","parameterTypes":[] }, {"name":"getPreKeys","parameterTypes":[] }, {"name":"getSignedPreKey","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.PreKeyStatus", 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 b2b45a9c..f97e8f68 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 @@ -1,6 +1,7 @@ package org.asamk.signal.manager.config; import org.asamk.signal.manager.api.ServiceEnvironment; +import org.signal.libsignal.protocol.util.Medium; import org.whispersystems.signalservice.api.account.AccountAttributes; import org.whispersystems.signalservice.api.push.TrustStore; @@ -15,8 +16,9 @@ import okhttp3.Interceptor; public class ServiceConfig { - public final static int PREKEY_MINIMUM_COUNT = 20; + public final static int PREKEY_MINIMUM_COUNT = 10; public final static int PREKEY_BATCH_SIZE = 100; + public final static int PREKEY_MAXIMUM_ID = Medium.MAX_VALUE; public final static int MAX_ATTACHMENT_SIZE = 150 * 1024 * 1024; public final static long MAX_ENVELOPE_SIZE = 0; public final static long AVATAR_DOWNLOAD_FAILSAFE_MAX_SIZE = 10 * 1024 * 1024; diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java index 06dc31b9..282b017a 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java @@ -5,6 +5,7 @@ import org.asamk.signal.manager.internal.SignalDependencies; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.util.KeyUtils; import org.signal.libsignal.protocol.IdentityKeyPair; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.slf4j.Logger; @@ -39,7 +40,9 @@ public class PreKeyHelper { if (preKeyCounts.getEcCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { refreshPreKeys(serviceIdType); } - // TODO kyber pre keys + if (preKeyCounts.getKyberCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { + refreshKyberPreKeys(serviceIdType); + } } public void refreshPreKeys() throws IOException { @@ -47,7 +50,7 @@ public class PreKeyHelper { refreshPreKeys(ServiceIdType.PNI); } - public void refreshPreKeys(ServiceIdType serviceIdType) throws IOException { + private void refreshPreKeys(ServiceIdType serviceIdType) throws IOException { final var identityKeyPair = account.getIdentityKeyPair(serviceIdType); if (identityKeyPair == null) { return; @@ -97,4 +100,61 @@ public class PreKeyHelper { return record; } + + private void refreshKyberPreKeys(ServiceIdType serviceIdType) throws IOException { + final var identityKeyPair = account.getIdentityKeyPair(serviceIdType); + if (identityKeyPair == null) { + return; + } + final var accountId = account.getAccountId(serviceIdType); + if (accountId == null) { + return; + } + try { + refreshKyberPreKeys(serviceIdType, identityKeyPair); + } catch (Exception e) { + logger.warn("Failed to store new pre keys, resetting preKey id offset", e); + account.resetKyberPreKeyOffsets(serviceIdType); + refreshKyberPreKeys(serviceIdType, identityKeyPair); + } + } + + private void refreshKyberPreKeys( + final ServiceIdType serviceIdType, final IdentityKeyPair identityKeyPair + ) throws IOException { + final var oneTimePreKeys = generateKyberPreKeys(serviceIdType, identityKeyPair); + final var lastResortPreKeyRecord = generateLastResortKyberPreKey(serviceIdType, identityKeyPair); + + final var preKeyUpload = new PreKeyUpload(serviceIdType, + identityKeyPair.getPublicKey(), + null, + null, + lastResortPreKeyRecord, + oneTimePreKeys); + dependencies.getAccountManager().setPreKeys(preKeyUpload); + } + + private List generateKyberPreKeys( + ServiceIdType serviceIdType, final IdentityKeyPair identityKeyPair + ) { + final var offset = account.getKyberPreKeyIdOffset(serviceIdType); + + var records = KeyUtils.generateKyberPreKeyRecords(offset, + ServiceConfig.PREKEY_BATCH_SIZE, + identityKeyPair.getPrivateKey()); + account.addKyberPreKeys(serviceIdType, records); + + return records; + } + + private KyberPreKeyRecord generateLastResortKyberPreKey( + ServiceIdType serviceIdType, IdentityKeyPair identityKeyPair + ) { + final var signedPreKeyId = account.getKyberPreKeyIdOffset(serviceIdType); + + var record = KeyUtils.generateKyberPreKeyRecord(signedPreKeyId, identityKeyPair.getPrivateKey()); + account.addLastResortKyberPreKey(serviceIdType, record); + + return record; + } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java b/lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java index a15b4aab..7f6babe6 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java @@ -4,6 +4,7 @@ import com.zaxxer.hikari.HikariDataSource; import org.asamk.signal.manager.storage.groups.GroupStore; import org.asamk.signal.manager.storage.identities.IdentityKeyStore; +import org.asamk.signal.manager.storage.prekeys.KyberPreKeyStore; import org.asamk.signal.manager.storage.prekeys.PreKeyStore; import org.asamk.signal.manager.storage.prekeys.SignedPreKeyStore; import org.asamk.signal.manager.storage.recipients.RecipientStore; @@ -23,7 +24,7 @@ import java.sql.SQLException; public class AccountDatabase extends Database { private final static Logger logger = LoggerFactory.getLogger(AccountDatabase.class); - private static final long DATABASE_VERSION = 13; + private static final long DATABASE_VERSION = 14; private AccountDatabase(final HikariDataSource dataSource) { super(logger, DATABASE_VERSION, dataSource); @@ -40,6 +41,7 @@ public class AccountDatabase extends Database { StickerStore.createSql(connection); PreKeyStore.createSql(connection); SignedPreKeyStore.createSql(connection); + KyberPreKeyStore.createSql(connection); GroupStore.createSql(connection); SessionStore.createSql(connection); IdentityKeyStore.createSql(connection); @@ -328,5 +330,23 @@ public class AccountDatabase extends Database { } } } + if (oldVersion < 14) { + logger.debug("Updating database: Creating kyber_pre_key table"); + { + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE kyber_pre_key ( + _id INTEGER PRIMARY KEY, + account_id_type INTEGER NOT NULL, + key_id INTEGER NOT NULL, + serialized BLOB NOT NULL, + is_last_resort INTEGER NOT NULL, + UNIQUE(account_id_type, key_id) + ) STRICT; + """); + } + } + + } } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 850b264f..76867b72 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -21,6 +21,7 @@ import org.asamk.signal.manager.storage.identities.IdentityKeyStore; import org.asamk.signal.manager.storage.identities.LegacyIdentityKeyStore; import org.asamk.signal.manager.storage.identities.SignalIdentityKeyStore; import org.asamk.signal.manager.storage.messageCache.MessageCache; +import org.asamk.signal.manager.storage.prekeys.KyberPreKeyStore; import org.asamk.signal.manager.storage.prekeys.LegacyPreKeyStore; import org.asamk.signal.manager.storage.prekeys.LegacySignedPreKeyStore; import org.asamk.signal.manager.storage.prekeys.PreKeyStore; @@ -51,11 +52,11 @@ import org.asamk.signal.manager.util.KeyUtils; import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidMessageException; import org.signal.libsignal.protocol.SignalProtocolAddress; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SessionRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.protocol.util.KeyHelper; -import org.signal.libsignal.protocol.util.Medium; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; import org.slf4j.Logger; @@ -98,6 +99,7 @@ import java.util.List; import java.util.Optional; import java.util.function.Supplier; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; import static org.asamk.signal.manager.config.ServiceConfig.getCapabilities; public class SignalAccount implements Closeable { @@ -105,7 +107,7 @@ public class SignalAccount implements Closeable { private final static Logger logger = LoggerFactory.getLogger(SignalAccount.class); private static final int MINIMUM_STORAGE_VERSION = 1; - private static final int CURRENT_STORAGE_VERSION = 6; + private static final int CURRENT_STORAGE_VERSION = 7; private final Object LOCK = new Object(); @@ -138,6 +140,10 @@ public class SignalAccount implements Closeable { private int aciNextSignedPreKeyId = 1; private int pniPreKeyIdOffset = 1; private int pniNextSignedPreKeyId = 1; + private int aciKyberPreKeyIdOffset = 1; + private int aciActiveLastResortKyberPreKeyId = -1; + private int pniKyberPreKeyIdOffset = 1; + private int pniActiveLastResortKyberPreKeyId = -1; private IdentityKeyPair aciIdentityKeyPair; private IdentityKeyPair pniIdentityKeyPair; private int localRegistrationId; @@ -151,8 +157,10 @@ public class SignalAccount implements Closeable { private SignalProtocolStore pniSignalProtocolStore; private PreKeyStore aciPreKeyStore; private SignedPreKeyStore aciSignedPreKeyStore; + private KyberPreKeyStore aciKyberPreKeyStore; private PreKeyStore pniPreKeyStore; private SignedPreKeyStore pniSignedPreKeyStore; + private KyberPreKeyStore pniKyberPreKeyStore; private SessionStore aciSessionStore; private SessionStore pniSessionStore; private IdentityKeyStore identityKeyStore; @@ -302,10 +310,14 @@ public class SignalAccount implements Closeable { private void clearAllPreKeys() { resetPreKeyOffsets(ServiceIdType.ACI); resetPreKeyOffsets(ServiceIdType.PNI); + resetKyberPreKeyOffsets(ServiceIdType.ACI); + resetKyberPreKeyOffsets(ServiceIdType.PNI); this.getAciPreKeyStore().removeAllPreKeys(); this.getAciSignedPreKeyStore().removeAllSignedPreKeys(); + this.getAciKyberPreKeyStore().removeAllKyberPreKeys(); this.getPniPreKeyStore().removeAllPreKeys(); this.getPniSignedPreKeyStore().removeAllSignedPreKeys(); + this.getPniKyberPreKeyStore().removeAllKyberPreKeys(); save(); } @@ -614,22 +626,42 @@ public class SignalAccount implements Closeable { if (rootNode.hasNonNull("preKeyIdOffset")) { aciPreKeyIdOffset = rootNode.get("preKeyIdOffset").asInt(1); } else { - aciPreKeyIdOffset = 1; + aciPreKeyIdOffset = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("nextSignedPreKeyId")) { aciNextSignedPreKeyId = rootNode.get("nextSignedPreKeyId").asInt(1); } else { - aciNextSignedPreKeyId = 1; + aciNextSignedPreKeyId = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("pniPreKeyIdOffset")) { pniPreKeyIdOffset = rootNode.get("pniPreKeyIdOffset").asInt(1); } else { - pniPreKeyIdOffset = 1; + pniPreKeyIdOffset = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("pniNextSignedPreKeyId")) { pniNextSignedPreKeyId = rootNode.get("pniNextSignedPreKeyId").asInt(1); } else { - pniNextSignedPreKeyId = 1; + pniNextSignedPreKeyId = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("kyberPreKeyIdOffset")) { + aciKyberPreKeyIdOffset = rootNode.get("kyberPreKeyIdOffset").asInt(1); + } else { + aciKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("activeLastResortKyberPreKeyId")) { + aciActiveLastResortKyberPreKeyId = rootNode.get("activeLastResortKyberPreKeyId").asInt(-1); + } else { + aciActiveLastResortKyberPreKeyId = -1; + } + if (rootNode.hasNonNull("pniKyberPreKeyIdOffset")) { + pniKyberPreKeyIdOffset = rootNode.get("pniKyberPreKeyIdOffset").asInt(1); + } else { + pniKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("pniActiveLastResortKyberPreKeyId")) { + pniActiveLastResortKyberPreKeyId = rootNode.get("pniActiveLastResortKyberPreKeyId").asInt(-1); + } else { + pniActiveLastResortKyberPreKeyId = -1; } if (rootNode.hasNonNull("profileKey")) { try { @@ -974,6 +1006,10 @@ public class SignalAccount implements Closeable { .put("nextSignedPreKeyId", aciNextSignedPreKeyId) .put("pniPreKeyIdOffset", pniPreKeyIdOffset) .put("pniNextSignedPreKeyId", pniNextSignedPreKeyId) + .put("kyberPreKeyIdOffset", aciKyberPreKeyIdOffset) + .put("activeLastResortKyberPreKeyId", aciActiveLastResortKyberPreKeyId) + .put("pniKyberPreKeyIdOffset", pniKyberPreKeyIdOffset) + .put("pniActiveLastResortKyberPreKeyId", pniActiveLastResortKyberPreKeyId) .put("profileKey", profileKey == null ? null : Base64.getEncoder().encodeToString(profileKey.serialize())) .put("registered", registered) @@ -1019,15 +1055,19 @@ public class SignalAccount implements Closeable { public void resetPreKeyOffsets(final ServiceIdType serviceIdType) { if (serviceIdType.equals(ServiceIdType.ACI)) { - this.aciPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE); - this.aciNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE); + this.aciPreKeyIdOffset = getRandomPreKeyIdOffset(); + this.aciNextSignedPreKeyId = getRandomPreKeyIdOffset(); } else { - this.pniPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE); - this.pniNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE); + this.pniPreKeyIdOffset = getRandomPreKeyIdOffset(); + this.pniNextSignedPreKeyId = getRandomPreKeyIdOffset(); } save(); } + private static int getRandomPreKeyIdOffset() { + return new SecureRandom().nextInt(PREKEY_MAXIMUM_ID); + } + public void addPreKeys(ServiceIdType serviceIdType, List records) { if (serviceIdType.equals(ServiceIdType.ACI)) { addAciPreKeys(records); @@ -1036,26 +1076,26 @@ public class SignalAccount implements Closeable { } } - public void addAciPreKeys(List records) { + private void addAciPreKeys(List records) { for (var record : records) { if (aciPreKeyIdOffset != record.getId()) { logger.error("Invalid pre key id {}, expected {}", record.getId(), aciPreKeyIdOffset); throw new AssertionError("Invalid pre key id"); } getAciPreKeyStore().storePreKey(record.getId(), record); - aciPreKeyIdOffset = (aciPreKeyIdOffset + 1) % Medium.MAX_VALUE; + aciPreKeyIdOffset = (aciPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; } save(); } - public void addPniPreKeys(List records) { + private void addPniPreKeys(List records) { for (var record : records) { if (pniPreKeyIdOffset != record.getId()) { logger.error("Invalid pre key id {}, expected {}", record.getId(), pniPreKeyIdOffset); throw new AssertionError("Invalid pre key id"); } getPniPreKeyStore().storePreKey(record.getId(), record); - pniPreKeyIdOffset = (pniPreKeyIdOffset + 1) % Medium.MAX_VALUE; + pniPreKeyIdOffset = (pniPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; } save(); } @@ -1074,7 +1114,7 @@ public class SignalAccount implements Closeable { throw new AssertionError("Invalid signed pre key id"); } getAciSignedPreKeyStore().storeSignedPreKey(record.getId(), record); - aciNextSignedPreKeyId = (aciNextSignedPreKeyId + 1) % Medium.MAX_VALUE; + aciNextSignedPreKeyId = (aciNextSignedPreKeyId + 1) % PREKEY_MAXIMUM_ID; save(); } @@ -1084,7 +1124,84 @@ public class SignalAccount implements Closeable { throw new AssertionError("Invalid signed pre key id"); } getPniSignedPreKeyStore().storeSignedPreKey(record.getId(), record); - pniNextSignedPreKeyId = (pniNextSignedPreKeyId + 1) % Medium.MAX_VALUE; + pniNextSignedPreKeyId = (pniNextSignedPreKeyId + 1) % PREKEY_MAXIMUM_ID; + save(); + } + + public void resetKyberPreKeyOffsets(final ServiceIdType serviceIdType) { + if (serviceIdType.equals(ServiceIdType.ACI)) { + this.aciKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + this.aciActiveLastResortKyberPreKeyId = -1; + } else { + this.pniKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + this.pniActiveLastResortKyberPreKeyId = -1; + } + save(); + } + + public void addKyberPreKeys(ServiceIdType serviceIdType, List records) { + if (serviceIdType.equals(ServiceIdType.ACI)) { + addAciKyberPreKeys(records); + } else { + addPniKyberPreKeys(records); + } + } + + private void addAciKyberPreKeys(List records) { + for (var record : records) { + if (aciKyberPreKeyIdOffset != record.getId()) { + logger.error("Invalid kyber pre key id {}, expected {}", record.getId(), aciKyberPreKeyIdOffset); + throw new AssertionError("Invalid kyber pre key id"); + } + getAciKyberPreKeyStore().storeKyberPreKey(record.getId(), record); + aciKyberPreKeyIdOffset = (aciKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; + } + save(); + } + + private void addPniKyberPreKeys(List records) { + for (var record : records) { + if (pniKyberPreKeyIdOffset != record.getId()) { + logger.error("Invalid kyber pre key id {}, expected {}", record.getId(), pniKyberPreKeyIdOffset); + throw new AssertionError("Invalid kyber pre key id"); + } + getPniKyberPreKeyStore().storeKyberPreKey(record.getId(), record); + pniKyberPreKeyIdOffset = (pniKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; + } + save(); + } + + public void addLastResortKyberPreKey(ServiceIdType serviceIdType, KyberPreKeyRecord record) { + if (serviceIdType.equals(ServiceIdType.ACI)) { + addAciLastResortKyberPreKey(record); + } else { + addPniLastResortKyberPreKey(record); + } + } + + public void addAciLastResortKyberPreKey(KyberPreKeyRecord record) { + if (aciKyberPreKeyIdOffset != record.getId()) { + logger.error("Invalid last resort kyber pre key id {}, expected {}", + record.getId(), + aciKyberPreKeyIdOffset); + throw new AssertionError("Invalid last resort kyber pre key id"); + } + getAciKyberPreKeyStore().storeLastResortKyberPreKey(record.getId(), record); + aciActiveLastResortKyberPreKeyId = record.getId(); + aciKyberPreKeyIdOffset = (aciKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; + save(); + } + + public void addPniLastResortKyberPreKey(KyberPreKeyRecord record) { + if (pniKyberPreKeyIdOffset != record.getId()) { + logger.error("Invalid last resort kyber pre key id {}, expected {}", + record.getId(), + pniKyberPreKeyIdOffset); + throw new AssertionError("Invalid last resort kyber pre key id"); + } + getPniKyberPreKeyStore().storeLastResortKyberPreKey(record.getId(), record); + pniActiveLastResortKyberPreKeyId = record.getId(); + pniKyberPreKeyIdOffset = (pniKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; save(); } @@ -1126,6 +1243,7 @@ public class SignalAccount implements Closeable { return getOrCreate(() -> aciSignalProtocolStore, () -> aciSignalProtocolStore = new SignalProtocolStore(getAciPreKeyStore(), getAciSignedPreKeyStore(), + getAciKyberPreKeyStore(), getAciSessionStore(), getAciIdentityKeyStore(), getSenderKeyStore(), @@ -1136,6 +1254,7 @@ public class SignalAccount implements Closeable { return getOrCreate(() -> pniSignalProtocolStore, () -> pniSignalProtocolStore = new SignalProtocolStore(getPniPreKeyStore(), getPniSignedPreKeyStore(), + getPniKyberPreKeyStore(), getPniSessionStore(), getPniIdentityKeyStore(), getSenderKeyStore(), @@ -1152,6 +1271,11 @@ public class SignalAccount implements Closeable { () -> aciSignedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); } + private KyberPreKeyStore getAciKyberPreKeyStore() { + return getOrCreate(() -> aciKyberPreKeyStore, + () -> aciKyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); + } + private PreKeyStore getPniPreKeyStore() { return getOrCreate(() -> pniPreKeyStore, () -> pniPreKeyStore = new PreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); @@ -1162,6 +1286,11 @@ public class SignalAccount implements Closeable { () -> pniSignedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); } + private KyberPreKeyStore getPniKyberPreKeyStore() { + return getOrCreate(() -> pniKyberPreKeyStore, + () -> pniKyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); + } + public SessionStore getAciSessionStore() { return getOrCreate(() -> aciSessionStore, () -> aciSessionStore = new SessionStore(getAccountDatabase(), ServiceIdType.ACI)); @@ -1362,6 +1491,9 @@ public class SignalAccount implements Closeable { identityKeyStore.deleteIdentity(this.pni); getPniPreKeyStore().removeAllPreKeys(); getPniSignedPreKeyStore().removeAllSignedPreKeys(); + getPniKyberPreKeyStore().removeAllKyberPreKeys(); + aciActiveLastResortKyberPreKeyId = -1; + pniActiveLastResortKyberPreKeyId = -1; } this.pni = updatedPni; @@ -1406,10 +1538,6 @@ public class SignalAccount implements Closeable { save(); } - public byte[] getEncryptedDeviceName() { - return encryptedDeviceName == null ? null : Base64.getDecoder().decode(encryptedDeviceName); - } - public void setEncryptedDeviceName(final String encryptedDeviceName) { this.encryptedDeviceName = encryptedDeviceName; save(); @@ -1590,6 +1718,10 @@ public class SignalAccount implements Closeable { return serviceIdType.equals(ServiceIdType.ACI) ? aciNextSignedPreKeyId : pniNextSignedPreKeyId; } + public int getKyberPreKeyIdOffset(ServiceIdType serviceIdType) { + return serviceIdType.equals(ServiceIdType.ACI) ? aciKyberPreKeyIdOffset : pniKyberPreKeyIdOffset; + } + public boolean isRegistered() { return registered; } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java new file mode 100644 index 00000000..54fbba43 --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java @@ -0,0 +1,211 @@ +package org.asamk.signal.manager.storage.prekeys; + +import org.asamk.signal.manager.storage.Database; +import org.asamk.signal.manager.storage.Utils; +import org.signal.libsignal.protocol.InvalidKeyIdException; +import org.signal.libsignal.protocol.InvalidMessageException; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.SignalServiceKyberPreKeyStore; +import org.whispersystems.signalservice.api.push.ServiceIdType; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +public class KyberPreKeyStore implements SignalServiceKyberPreKeyStore { + + private static final String TABLE_KYBER_PRE_KEY = "kyber_pre_key"; + private final static Logger logger = LoggerFactory.getLogger(KyberPreKeyStore.class); + + private final Database database; + private final int accountIdType; + + public static void createSql(Connection connection) throws SQLException { + // When modifying the CREATE statement here, also add a migration in AccountDatabase.java + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE kyber_pre_key ( + _id INTEGER PRIMARY KEY, + account_id_type INTEGER NOT NULL, + key_id INTEGER NOT NULL, + serialized BLOB NOT NULL, + is_last_resort INTEGER NOT NULL, + UNIQUE(account_id_type, key_id) + ) STRICT; + """); + } + } + + public KyberPreKeyStore(final Database database, final ServiceIdType serviceIdType) { + this.database = database; + this.accountIdType = Utils.getAccountIdType(serviceIdType); + } + + @Override + public KyberPreKeyRecord loadKyberPreKey(final int keyId) throws InvalidKeyIdException { + final var kyberPreKey = getPreKey(keyId); + if (kyberPreKey == null) { + throw new InvalidKeyIdException("No such kyber pre key record: " + keyId); + } + return kyberPreKey; + } + + @Override + public List loadKyberPreKeys() { + final var sql = ( + """ + SELECT p.serialized + FROM %s p + WHERE p.account_id_type = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + return Utils.executeQueryForStream(statement, this::getKyberPreKeyRecordFromResultSet).toList(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from kyber_pre_key store", e); + } + } + + @Override + public List loadLastResortKyberPreKeys() { + final var sql = ( + """ + SELECT p.serialized + FROM %s p + WHERE p.account_id_type = ? AND p.is_last_resort = TRUE + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + return Utils.executeQueryForStream(statement, this::getKyberPreKeyRecordFromResultSet).toList(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from kyber_pre_key store", e); + } + } + + @Override + public void storeLastResortKyberPreKey(final int keyId, final KyberPreKeyRecord record) { + storeKyberPreKey(keyId, record, true); + } + + @Override + public void storeKyberPreKey(final int keyId, final KyberPreKeyRecord record) { + storeKyberPreKey(keyId, record, false); + } + + public void storeKyberPreKey(final int keyId, final KyberPreKeyRecord record, final boolean isLastResort) { + final var sql = ( + """ + INSERT INTO %s (account_id_type, key_id, serialized, is_last_resort) + VALUES (?, ?, ?, ?) + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + statement.setBytes(3, record.serialize()); + statement.setBoolean(4, isLastResort); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + @Override + public boolean containsKyberPreKey(final int keyId) { + return getPreKey(keyId) != null; + } + + @Override + public void markKyberPreKeyUsed(final int keyId) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ? AND p.key_id = ? AND p.is_last_resort = FALSE + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + @Override + public void removeKyberPreKey(final int keyId) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ? AND p.key_id = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + public void removeAllKyberPreKeys() { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + private KyberPreKeyRecord getPreKey(int keyId) { + final var sql = ( + """ + SELECT p.serialized + FROM %s p + WHERE p.account_id_type = ? AND p.key_id = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + return Utils.executeQueryForOptional(statement, this::getKyberPreKeyRecordFromResultSet).orElse(null); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from kyber_pre_key store", e); + } + } + + private KyberPreKeyRecord getKyberPreKeyRecordFromResultSet(ResultSet resultSet) throws SQLException { + try { + final var serialized = resultSet.getBytes("serialized"); + return new KyberPreKeyRecord(serialized); + } catch (InvalidMessageException e) { + return null; + } + } +} diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java index cc51a20a..f6dc271e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java @@ -49,7 +49,7 @@ public class PreKeyStore implements org.signal.libsignal.protocol.state.PreKeySt public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException { final var preKey = getPreKey(preKeyId); if (preKey == null) { - throw new InvalidKeyIdException("No such signed pre key record: " + preKeyId); + throw new InvalidKeyIdException("No such pre key record: " + preKeyId); } return preKey; } 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 b4e27afc..e565e915 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 @@ -14,6 +14,7 @@ import org.signal.libsignal.protocol.state.SessionRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyStore; import org.whispersystems.signalservice.api.SignalServiceAccountDataStore; +import org.whispersystems.signalservice.api.SignalServiceKyberPreKeyStore; import org.whispersystems.signalservice.api.SignalServiceSenderKeyStore; import org.whispersystems.signalservice.api.SignalServiceSessionStore; import org.whispersystems.signalservice.api.push.DistributionId; @@ -28,6 +29,7 @@ public class SignalProtocolStore implements SignalServiceAccountDataStore { private final PreKeyStore preKeyStore; private final SignedPreKeyStore signedPreKeyStore; + private final SignalServiceKyberPreKeyStore kyberPreKeyStore; private final SignalServiceSessionStore sessionStore; private final IdentityKeyStore identityKeyStore; private final SignalServiceSenderKeyStore senderKeyStore; @@ -36,6 +38,7 @@ public class SignalProtocolStore implements SignalServiceAccountDataStore { public SignalProtocolStore( final PreKeyStore preKeyStore, final SignedPreKeyStore signedPreKeyStore, + final SignalServiceKyberPreKeyStore kyberPreKeyStore, final SignalServiceSessionStore sessionStore, final IdentityKeyStore identityKeyStore, final SignalServiceSenderKeyStore senderKeyStore, @@ -43,6 +46,7 @@ public class SignalProtocolStore implements SignalServiceAccountDataStore { ) { this.preKeyStore = preKeyStore; this.signedPreKeyStore = signedPreKeyStore; + this.kyberPreKeyStore = kyberPreKeyStore; this.sessionStore = sessionStore; this.identityKeyStore = identityKeyStore; this.senderKeyStore = senderKeyStore; @@ -201,45 +205,41 @@ public class SignalProtocolStore implements SignalServiceAccountDataStore { @Override public KyberPreKeyRecord loadKyberPreKey(final int kyberPreKeyId) throws InvalidKeyIdException { - // TODO - throw new InvalidKeyIdException("Missing kyber prekey with ID: $kyberPreKeyId"); + return kyberPreKeyStore.loadKyberPreKey(kyberPreKeyId); } @Override public List loadKyberPreKeys() { - // TODO - return List.of(); + return kyberPreKeyStore.loadKyberPreKeys(); } @Override public void storeKyberPreKey(final int kyberPreKeyId, final KyberPreKeyRecord record) { - // TODO + kyberPreKeyStore.storeKyberPreKey(kyberPreKeyId, record); } @Override public boolean containsKyberPreKey(final int kyberPreKeyId) { - // TODO - return false; + return kyberPreKeyStore.containsKyberPreKey(kyberPreKeyId); } @Override public void markKyberPreKeyUsed(final int kyberPreKeyId) { - // TODO + kyberPreKeyStore.markKyberPreKeyUsed(kyberPreKeyId); } @Override public List loadLastResortKyberPreKeys() { - // TODO - return List.of(); + return kyberPreKeyStore.loadLastResortKyberPreKeys(); } @Override public void removeKyberPreKey(final int i) { - // TODO + kyberPreKeyStore.removeKyberPreKey(i); } @Override public void storeLastResortKyberPreKey(final int i, final KyberPreKeyRecord kyberPreKeyRecord) { - // TODO + kyberPreKeyStore.storeLastResortKyberPreKey(i, kyberPreKeyRecord); } } 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 0f267583..3608e0c1 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 @@ -406,9 +406,7 @@ public class SessionStore implements SignalServiceSessionStore { } private static boolean isActive(SessionRecord record) { - return record != null - && record.hasSenderChain() - && record.getSessionVersion() == CiphertextMessage.CURRENT_VERSION; + return record != null && record.hasSenderChain(); } record Key(ServiceId serviceId, int deviceId) {} diff --git a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java index d87868ee..3ee5657e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java @@ -5,9 +5,11 @@ import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.ECPrivateKey; +import org.signal.libsignal.protocol.kem.KEMKeyPair; +import org.signal.libsignal.protocol.kem.KEMKeyType; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; -import org.signal.libsignal.protocol.util.Medium; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; import org.whispersystems.signalservice.api.kbs.MasterKey; @@ -17,6 +19,8 @@ import java.util.ArrayList; import java.util.Base64; import java.util.List; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; + public class KeyUtils { private static final SecureRandom secureRandom = new SecureRandom(); @@ -46,7 +50,7 @@ public class KeyUtils { public static List generatePreKeyRecords(final int offset, final int batchSize) { var records = new ArrayList(batchSize); for (var i = 0; i < batchSize; i++) { - var preKeyId = (offset + i) % Medium.MAX_VALUE; + var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID; var keyPair = Curve.generateKeyPair(); var record = new PreKeyRecord(preKeyId, keyPair); @@ -68,6 +72,24 @@ public class KeyUtils { return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature); } + public static List generateKyberPreKeyRecords( + final int offset, final int batchSize, final ECPrivateKey privateKey + ) { + var records = new ArrayList(batchSize); + for (var i = 0; i < batchSize; i++) { + var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID; + records.add(generateKyberPreKeyRecord(preKeyId, privateKey)); + } + return records; + } + + public static KyberPreKeyRecord generateKyberPreKeyRecord(final int preKeyId, final ECPrivateKey privateKey) { + KEMKeyPair keyPair = KEMKeyPair.generate(KEMKeyType.KYBER_1024); + byte[] signature = privateKey.calculateSignature(keyPair.getPublicKey().serialize()); + + return new KyberPreKeyRecord(preKeyId, System.currentTimeMillis(), keyPair, signature); + } + public static ProfileKey createProfileKey() { try { return new ProfileKey(getSecretBytes(32)); -- 2.51.0 From 0ebfd989d12f3479ec220eb98ccfc72bbb47a5c3 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 18 Jun 2023 14:44:57 +0200 Subject: [PATCH 12/16] Refactor ACI/PNI store handling --- .../manager/actions/RenewSessionAction.java | 6 +- .../SendRetryMessageRequestAction.java | 7 +- .../helper/IncomingMessageHandler.java | 42 +- .../signal/manager/internal/ManagerImpl.java | 7 +- .../signal/manager/storage/SignalAccount.java | 575 ++++++++---------- .../asamk/signal/manager/util/KeyUtils.java | 4 + 6 files changed, 302 insertions(+), 339 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/actions/RenewSessionAction.java b/lib/src/main/java/org/asamk/signal/manager/actions/RenewSessionAction.java index 2718bc26..40117246 100644 --- a/lib/src/main/java/org/asamk/signal/manager/actions/RenewSessionAction.java +++ b/lib/src/main/java/org/asamk/signal/manager/actions/RenewSessionAction.java @@ -8,15 +8,17 @@ public class RenewSessionAction implements HandleAction { private final RecipientId recipientId; private final ServiceId serviceId; + private final ServiceId accountId; - public RenewSessionAction(final RecipientId recipientId, final ServiceId serviceId) { + public RenewSessionAction(final RecipientId recipientId, final ServiceId serviceId, final ServiceId accountId) { this.recipientId = recipientId; this.serviceId = serviceId; + this.accountId = accountId; } @Override public void execute(Context context) throws Throwable { - context.getAccount().getAciSessionStore().archiveSessions(serviceId); + context.getAccount().getAccountData(accountId).getSessionStore().archiveSessions(serviceId); if (!recipientId.equals(context.getAccount().getSelfRecipientId())) { context.getSendHelper().sendNullMessage(recipientId); } diff --git a/lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java b/lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java index 2300eae9..add09e72 100644 --- a/lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java +++ b/lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java @@ -18,22 +18,25 @@ public class SendRetryMessageRequestAction implements HandleAction { private final ServiceId serviceId; private final ProtocolException protocolException; private final SignalServiceEnvelope envelope; + private final ServiceId accountId; public SendRetryMessageRequestAction( final RecipientId recipientId, final ServiceId serviceId, final ProtocolException protocolException, - final SignalServiceEnvelope envelope + final SignalServiceEnvelope envelope, + final ServiceId accountId ) { this.recipientId = recipientId; this.serviceId = serviceId; this.protocolException = protocolException; this.envelope = envelope; + this.accountId = accountId; } @Override public void execute(Context context) throws Throwable { - context.getAccount().getAciSessionStore().archiveSessions(serviceId); + context.getAccount().getAccountData(accountId).getSessionStore().archiveSessions(serviceId); int senderDevice = protocolException.getSenderDevice(); Optional groupId = protocolException.getGroupId().isPresent() ? Optional.of(GroupId.unknownVersion( 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 3b616644..7cc3d09d 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 @@ -181,12 +181,13 @@ public final class IncomingMessageHandler { .contains(Profile.Capability.senderKey); final var isSelfSenderKeyCapable = selfProfile != null && selfProfile.getCapabilities() .contains(Profile.Capability.senderKey); + final var destination = getDestination(envelope).serviceId(); if (!isSelf && isSenderSenderKeyCapable && isSelfSenderKeyCapable) { logger.debug("Received invalid message, requesting message resend."); - actions.add(new SendRetryMessageRequestAction(sender, serviceId, e, envelope)); + actions.add(new SendRetryMessageRequestAction(sender, serviceId, e, envelope, destination)); } else { logger.debug("Received invalid message, queuing renew session action."); - actions.add(new RenewSessionAction(sender, serviceId)); + actions.add(new RenewSessionAction(sender, serviceId, destination)); } } else { logger.debug("Received invalid message from invalid sender: {}", e.getSender()); @@ -346,7 +347,12 @@ public final class IncomingMessageHandler { senderDeviceId, message.getTimestamp()); if (message.getDeviceId() == account.getDeviceId()) { - handleDecryptionErrorMessage(actions, sender, senderServiceId, senderDeviceId, message); + handleDecryptionErrorMessage(actions, + sender, + senderServiceId, + senderDeviceId, + message, + destination.serviceId()); } else { logger.debug("Request is for another one of our devices"); } @@ -430,7 +436,8 @@ public final class IncomingMessageHandler { final RecipientId sender, final ServiceId senderServiceId, final int senderDeviceId, - final DecryptionErrorMessage message + final DecryptionErrorMessage message, + final ServiceId destination ) { final var logEntries = account.getMessageSendLogStore() .findMessages(senderServiceId, @@ -443,14 +450,14 @@ public final class IncomingMessageHandler { } if (message.getRatchetKey().isPresent()) { - if (account.getAciSessionStore() - .isCurrentRatchetKey(senderServiceId, senderDeviceId, message.getRatchetKey().get())) { + final var sessionStore = account.getAccountData(destination).getSessionStore(); + if (sessionStore.isCurrentRatchetKey(senderServiceId, senderDeviceId, message.getRatchetKey().get())) { if (logEntries.isEmpty()) { logger.debug("Renewing the session with sender"); - actions.add(new RenewSessionAction(sender, senderServiceId)); + actions.add(new RenewSessionAction(sender, senderServiceId, destination)); } else { logger.trace("Archiving the session with sender, a resend message has already been queued"); - context.getAccount().getAciSessionStore().archiveSessions(senderServiceId); + sessionStore.archiveSessions(senderServiceId); } } return; @@ -806,9 +813,12 @@ public final class IncomingMessageHandler { } } + final var selfAddress = isSync ? source : destination; final var conversationPartnerAddress = isSync ? destination : source; if (conversationPartnerAddress != null && message.isEndSession()) { - account.getAciSessionStore().deleteAllSessions(conversationPartnerAddress.serviceId()); + account.getAccountData(selfAddress.serviceId()) + .getSessionStore() + .deleteAllSessions(conversationPartnerAddress.serviceId()); } if (message.isExpirationUpdate() || message.getBody().isPresent()) { if (message.getGroupContext().isPresent()) { @@ -854,10 +864,12 @@ public final class IncomingMessageHandler { if (message.getQuote().isPresent()) { final var quote = message.getQuote().get(); - for (var quotedAttachment : quote.getAttachments()) { - final var thumbnail = quotedAttachment.getThumbnail(); - if (thumbnail != null) { - context.getAttachmentHelper().downloadAttachment(thumbnail); + if (quote.getAttachments() != null) { + for (var quotedAttachment : quote.getAttachments()) { + final var thumbnail = quotedAttachment.getThumbnail(); + if (thumbnail != null) { + context.getAttachmentHelper().downloadAttachment(thumbnail); + } } } } @@ -972,7 +984,9 @@ public final class IncomingMessageHandler { return new DeviceAddress(account.getSelfRecipientId(), account.getAci(), account.getDeviceId()); } final var address = addressOptional.get(); - return new DeviceAddress(context.getRecipientHelper().resolveRecipient(address), address.getServiceId(), 0); + return new DeviceAddress(context.getRecipientHelper().resolveRecipient(address), + address.getServiceId(), + account.getDeviceId()); } private record DeviceAddress(RecipientId recipientId, ServiceId serviceId, int deviceId) {} diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index 90b2f6a4..faea76d7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -82,6 +82,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage; import org.whispersystems.signalservice.api.push.ACI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.util.DeviceNameUtil; import org.whispersystems.signalservice.api.util.InvalidNumberException; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; @@ -183,8 +184,8 @@ public class ManagerImpl implements Manager { }); disposable.add(account.getIdentityKeyStore().getIdentityChanges().subscribe(serviceId -> { logger.trace("Archiving old sessions for {}", serviceId); - account.getAciSessionStore().archiveSessions(serviceId); - account.getPniSessionStore().archiveSessions(serviceId); + account.getAccountData(ServiceIdType.ACI).getSessionStore().archiveSessions(serviceId); + account.getAccountData(ServiceIdType.PNI).getSessionStore().archiveSessions(serviceId); account.getSenderKeyStore().deleteSharedWith(serviceId); final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId); final var profile = account.getProfileStore().getProfile(recipientId); @@ -775,7 +776,7 @@ public class ManagerImpl implements Manager { .resolveRecipientAddress(recipientId) .serviceId(); if (serviceId.isPresent()) { - account.getAciSessionStore().deleteAllSessions(serviceId.get()); + account.getAccountData(ServiceIdType.ACI).getSessionStore().deleteAllSessions(serviceId.get()); } } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 76867b72..931a45a2 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -89,7 +89,6 @@ import java.nio.channels.ClosedChannelException; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.file.Files; -import java.security.SecureRandom; import java.sql.Connection; import java.sql.SQLException; import java.util.Base64; @@ -136,36 +135,14 @@ public class SignalAccount implements Closeable { private StorageKey storageKey; private long storageManifestVersion = -1; private ProfileKey profileKey; - private int aciPreKeyIdOffset = 1; - private int aciNextSignedPreKeyId = 1; - private int pniPreKeyIdOffset = 1; - private int pniNextSignedPreKeyId = 1; - private int aciKyberPreKeyIdOffset = 1; - private int aciActiveLastResortKyberPreKeyId = -1; - private int pniKyberPreKeyIdOffset = 1; - private int pniActiveLastResortKyberPreKeyId = -1; - private IdentityKeyPair aciIdentityKeyPair; - private IdentityKeyPair pniIdentityKeyPair; - private int localRegistrationId; - private int localPniRegistrationId; private Settings settings; private long lastReceiveTimestamp = 0; private boolean registered = false; - private SignalProtocolStore aciSignalProtocolStore; - private SignalProtocolStore pniSignalProtocolStore; - private PreKeyStore aciPreKeyStore; - private SignedPreKeyStore aciSignedPreKeyStore; - private KyberPreKeyStore aciKyberPreKeyStore; - private PreKeyStore pniPreKeyStore; - private SignedPreKeyStore pniSignedPreKeyStore; - private KyberPreKeyStore pniKyberPreKeyStore; - private SessionStore aciSessionStore; - private SessionStore pniSessionStore; + private final AccountData aciAccountData = new AccountData(ServiceIdType.ACI); + private final AccountData pniAccountData = new AccountData(ServiceIdType.PNI); private IdentityKeyStore identityKeyStore; - private SignalIdentityKeyStore aciIdentityKeyStore; - private SignalIdentityKeyStore pniIdentityKeyStore; private SenderKeyStore senderKeyStore; private GroupStore groupStore; private RecipientStore recipientStore; @@ -231,10 +208,10 @@ public class SignalAccount implements Closeable { signalAccount.profileKey = profileKey; signalAccount.dataPath = dataPath; - signalAccount.aciIdentityKeyPair = aciIdentityKey; - signalAccount.pniIdentityKeyPair = pniIdentityKey; - signalAccount.localRegistrationId = registrationId; - signalAccount.localPniRegistrationId = pniRegistrationId; + signalAccount.aciAccountData.setIdentityKeyPair(aciIdentityKey); + signalAccount.pniAccountData.setIdentityKeyPair(pniIdentityKey); + signalAccount.aciAccountData.setLocalRegistrationId(registrationId); + signalAccount.pniAccountData.setLocalRegistrationId(pniRegistrationId); signalAccount.settings = settings; signalAccount.configurationStore = new ConfigurationStore(signalAccount::saveConfigurationStore); @@ -296,8 +273,8 @@ public class SignalAccount implements Closeable { profileKey); signalAccount.getRecipientTrustedResolver() .resolveSelfRecipientTrusted(signalAccount.getSelfRecipientAddress()); - signalAccount.getAciSessionStore().archiveAllSessions(); - signalAccount.getPniSessionStore().archiveAllSessions(); + signalAccount.aciAccountData.getSessionStore().archiveAllSessions(); + signalAccount.pniAccountData.getSessionStore().archiveAllSessions(); signalAccount.getSenderKeyStore().deleteAll(); signalAccount.clearAllPreKeys(); return signalAccount; @@ -308,16 +285,17 @@ public class SignalAccount implements Closeable { } private void clearAllPreKeys() { - resetPreKeyOffsets(ServiceIdType.ACI); - resetPreKeyOffsets(ServiceIdType.PNI); - resetKyberPreKeyOffsets(ServiceIdType.ACI); - resetKyberPreKeyOffsets(ServiceIdType.PNI); - this.getAciPreKeyStore().removeAllPreKeys(); - this.getAciSignedPreKeyStore().removeAllSignedPreKeys(); - this.getAciKyberPreKeyStore().removeAllKyberPreKeys(); - this.getPniPreKeyStore().removeAllPreKeys(); - this.getPniSignedPreKeyStore().removeAllSignedPreKeys(); - this.getPniKyberPreKeyStore().removeAllKyberPreKeys(); + clearAllPreKeys(ServiceIdType.ACI); + clearAllPreKeys(ServiceIdType.PNI); + } + + private void clearAllPreKeys(ServiceIdType serviceIdType) { + final var accountData = getAccountData(serviceIdType); + resetPreKeyOffsets(serviceIdType); + resetKyberPreKeyOffsets(serviceIdType); + accountData.getPreKeyStore().removeAllPreKeys(); + accountData.getSignedPreKeyStore().removeAllSignedPreKeys(); + accountData.getKyberPreKeyStore().removeAllKyberPreKeys(); save(); } @@ -347,8 +325,8 @@ public class SignalAccount implements Closeable { signalAccount.dataPath = dataPath; signalAccount.accountPath = accountPath; signalAccount.serviceEnvironment = serviceEnvironment; - signalAccount.localRegistrationId = registrationId; - signalAccount.localPniRegistrationId = pniRegistrationId; + signalAccount.aciAccountData.setLocalRegistrationId(registrationId); + signalAccount.pniAccountData.setLocalRegistrationId(pniRegistrationId); signalAccount.settings = settings; signalAccount.setProvisioningData(number, aci, @@ -391,8 +369,8 @@ public class SignalAccount implements Closeable { getProfileStore().storeSelfProfileKey(getSelfRecipientId(), getProfileKey()); this.encryptedDeviceName = encryptedDeviceName; this.deviceId = deviceId; - this.aciIdentityKeyPair = aciIdentity; - this.pniIdentityKeyPair = pniIdentity; + this.aciAccountData.setIdentityKeyPair(aciIdentity); + this.pniAccountData.setIdentityKeyPair(pniIdentity); this.registered = true; this.isMultiDevice = true; this.lastReceiveTimestamp = 0; @@ -400,13 +378,9 @@ public class SignalAccount implements Closeable { this.storageManifestVersion = -1; this.setStorageManifest(null); this.storageKey = null; - final var aciPublicKey = getAciIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getAci(), aciPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getAci(), aciPublicKey, TrustLevel.TRUSTED_VERIFIED); + trustSelfIdentity(ServiceIdType.ACI); if (getPniIdentityKeyPair() != null) { - final var pniPublicKey = getPniIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getPni(), pniPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getPni(), pniPublicKey, TrustLevel.TRUSTED_VERIFIED); + trustSelfIdentity(ServiceIdType.PNI); } } @@ -438,8 +412,8 @@ public class SignalAccount implements Closeable { getMessageCache().deleteMessages(recipientId); if (recipientAddress.serviceId().isPresent()) { final var serviceId = recipientAddress.serviceId().get(); - getAciSessionStore().deleteAllSessions(serviceId); - getPniSessionStore().deleteAllSessions(serviceId); + aciAccountData.getSessionStore().deleteAllSessions(serviceId); + pniAccountData.getSessionStore().deleteAllSessions(serviceId); getIdentityKeyStore().deleteIdentity(serviceId); getSenderKeyStore().deleteAll(serviceId); } @@ -595,9 +569,9 @@ public class SignalAccount implements Closeable { registrationId = rootNode.get("registrationId").asInt(); } if (rootNode.hasNonNull("pniRegistrationId")) { - localPniRegistrationId = rootNode.get("pniRegistrationId").asInt(); + pniAccountData.setLocalRegistrationId(rootNode.get("pniRegistrationId").asInt()); } else { - localPniRegistrationId = KeyHelper.generateRegistrationId(false); + pniAccountData.setLocalRegistrationId(KeyHelper.generateRegistrationId(false)); } IdentityKeyPair aciIdentityKeyPair = null; if (rootNode.hasNonNull("identityPrivateKey") && rootNode.hasNonNull("identityKey")) { @@ -608,7 +582,7 @@ public class SignalAccount implements Closeable { if (rootNode.hasNonNull("pniIdentityPrivateKey") && rootNode.hasNonNull("pniIdentityKey")) { final var publicKeyBytes = Base64.getDecoder().decode(rootNode.get("pniIdentityKey").asText()); final var privateKeyBytes = Base64.getDecoder().decode(rootNode.get("pniIdentityPrivateKey").asText()); - pniIdentityKeyPair = KeyUtils.getIdentityKeyPair(publicKeyBytes, privateKeyBytes); + pniAccountData.setIdentityKeyPair(KeyUtils.getIdentityKeyPair(publicKeyBytes, privateKeyBytes)); } if (rootNode.hasNonNull("registrationLockPin")) { @@ -624,44 +598,46 @@ public class SignalAccount implements Closeable { storageManifestVersion = rootNode.get("storageManifestVersion").asLong(); } if (rootNode.hasNonNull("preKeyIdOffset")) { - aciPreKeyIdOffset = rootNode.get("preKeyIdOffset").asInt(1); + aciAccountData.preKeyMetadata.preKeyIdOffset = rootNode.get("preKeyIdOffset").asInt(1); } else { - aciPreKeyIdOffset = getRandomPreKeyIdOffset(); + aciAccountData.preKeyMetadata.preKeyIdOffset = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("nextSignedPreKeyId")) { - aciNextSignedPreKeyId = rootNode.get("nextSignedPreKeyId").asInt(1); + aciAccountData.preKeyMetadata.nextSignedPreKeyId = rootNode.get("nextSignedPreKeyId").asInt(1); } else { - aciNextSignedPreKeyId = getRandomPreKeyIdOffset(); + aciAccountData.preKeyMetadata.nextSignedPreKeyId = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("pniPreKeyIdOffset")) { - pniPreKeyIdOffset = rootNode.get("pniPreKeyIdOffset").asInt(1); + pniAccountData.preKeyMetadata.preKeyIdOffset = rootNode.get("pniPreKeyIdOffset").asInt(1); } else { - pniPreKeyIdOffset = getRandomPreKeyIdOffset(); + pniAccountData.preKeyMetadata.preKeyIdOffset = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("pniNextSignedPreKeyId")) { - pniNextSignedPreKeyId = rootNode.get("pniNextSignedPreKeyId").asInt(1); + pniAccountData.preKeyMetadata.nextSignedPreKeyId = rootNode.get("pniNextSignedPreKeyId").asInt(1); } else { - pniNextSignedPreKeyId = getRandomPreKeyIdOffset(); + pniAccountData.preKeyMetadata.nextSignedPreKeyId = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("kyberPreKeyIdOffset")) { - aciKyberPreKeyIdOffset = rootNode.get("kyberPreKeyIdOffset").asInt(1); + aciAccountData.preKeyMetadata.kyberPreKeyIdOffset = rootNode.get("kyberPreKeyIdOffset").asInt(1); } else { - aciKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + aciAccountData.preKeyMetadata.kyberPreKeyIdOffset = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("activeLastResortKyberPreKeyId")) { - aciActiveLastResortKyberPreKeyId = rootNode.get("activeLastResortKyberPreKeyId").asInt(-1); + aciAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = rootNode.get("activeLastResortKyberPreKeyId") + .asInt(-1); } else { - aciActiveLastResortKyberPreKeyId = -1; + aciAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = -1; } if (rootNode.hasNonNull("pniKyberPreKeyIdOffset")) { - pniKyberPreKeyIdOffset = rootNode.get("pniKyberPreKeyIdOffset").asInt(1); + pniAccountData.preKeyMetadata.kyberPreKeyIdOffset = rootNode.get("pniKyberPreKeyIdOffset").asInt(1); } else { - pniKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + pniAccountData.preKeyMetadata.kyberPreKeyIdOffset = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("pniActiveLastResortKyberPreKeyId")) { - pniActiveLastResortKyberPreKeyId = rootNode.get("pniActiveLastResortKyberPreKeyId").asInt(-1); + pniAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = rootNode.get( + "pniActiveLastResortKyberPreKeyId").asInt(-1); } else { - pniActiveLastResortKyberPreKeyId = -1; + pniAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = -1; } if (rootNode.hasNonNull("profileKey")) { try { @@ -687,22 +663,22 @@ public class SignalAccount implements Closeable { } final var legacyAciPreKeysPath = getAciPreKeysPath(dataPath, accountPath); if (legacyAciPreKeysPath.exists()) { - LegacyPreKeyStore.migrate(legacyAciPreKeysPath, getAciPreKeyStore()); + LegacyPreKeyStore.migrate(legacyAciPreKeysPath, aciAccountData.getPreKeyStore()); migratedLegacyConfig = true; } final var legacyPniPreKeysPath = getPniPreKeysPath(dataPath, accountPath); if (legacyPniPreKeysPath.exists()) { - LegacyPreKeyStore.migrate(legacyPniPreKeysPath, getPniPreKeyStore()); + LegacyPreKeyStore.migrate(legacyPniPreKeysPath, pniAccountData.getPreKeyStore()); migratedLegacyConfig = true; } final var legacyAciSignedPreKeysPath = getAciSignedPreKeysPath(dataPath, accountPath); if (legacyAciSignedPreKeysPath.exists()) { - LegacySignedPreKeyStore.migrate(legacyAciSignedPreKeysPath, getAciSignedPreKeyStore()); + LegacySignedPreKeyStore.migrate(legacyAciSignedPreKeysPath, aciAccountData.getSignedPreKeyStore()); migratedLegacyConfig = true; } final var legacyPniSignedPreKeysPath = getPniSignedPreKeysPath(dataPath, accountPath); if (legacyPniSignedPreKeysPath.exists()) { - LegacySignedPreKeyStore.migrate(legacyPniSignedPreKeysPath, getPniSignedPreKeyStore()); + LegacySignedPreKeyStore.migrate(legacyPniSignedPreKeysPath, pniAccountData.getSignedPreKeyStore()); migratedLegacyConfig = true; } final var legacySessionsPath = getSessionsPath(dataPath, accountPath); @@ -710,7 +686,7 @@ public class SignalAccount implements Closeable { LegacySessionStore.migrate(legacySessionsPath, getRecipientResolver(), getRecipientAddressResolver(), - getAciSessionStore()); + aciAccountData.getSessionStore()); migratedLegacyConfig = true; } final var legacyIdentitiesPath = getIdentitiesPath(dataPath, accountPath); @@ -731,8 +707,8 @@ public class SignalAccount implements Closeable { migratedLegacyConfig = true; } - this.aciIdentityKeyPair = aciIdentityKeyPair; - this.localRegistrationId = registrationId; + this.aciAccountData.setIdentityKeyPair(aciIdentityKeyPair); + this.aciAccountData.setLocalRegistrationId(registrationId); migratedLegacyConfig = loadLegacyStores(rootNode, legacySignalProtocolStore) || migratedLegacyConfig; @@ -805,7 +781,7 @@ public class SignalAccount implements Closeable { logger.debug("Migrating legacy pre key store."); for (var entry : legacySignalProtocolStore.getLegacyPreKeyStore().getPreKeys().entrySet()) { try { - getAciPreKeyStore().storePreKey(entry.getKey(), new PreKeyRecord(entry.getValue())); + aciAccountData.getPreKeyStore().storePreKey(entry.getKey(), new PreKeyRecord(entry.getValue())); } catch (InvalidMessageException e) { logger.warn("Failed to migrate pre key, ignoring", e); } @@ -817,8 +793,8 @@ public class SignalAccount implements Closeable { logger.debug("Migrating legacy signed pre key store."); for (var entry : legacySignalProtocolStore.getLegacySignedPreKeyStore().getSignedPreKeys().entrySet()) { try { - getAciSignedPreKeyStore().storeSignedPreKey(entry.getKey(), - new SignedPreKeyRecord(entry.getValue())); + aciAccountData.getSignedPreKeyStore() + .storeSignedPreKey(entry.getKey(), new SignedPreKeyRecord(entry.getValue())); } catch (InvalidMessageException e) { logger.warn("Failed to migrate signed pre key, ignoring", e); } @@ -830,8 +806,9 @@ public class SignalAccount implements Closeable { logger.debug("Migrating legacy session store."); for (var session : legacySignalProtocolStore.getLegacySessionStore().getSessions()) { try { - getAciSessionStore().storeSession(new SignalProtocolAddress(session.address.getIdentifier(), - session.deviceId), new SessionRecord(session.sessionRecord)); + aciAccountData.getSessionStore() + .storeSession(new SignalProtocolAddress(session.address.getIdentifier(), session.deviceId), + new SessionRecord(session.sessionRecord)); } catch (Exception e) { logger.warn("Failed to migrate session, ignoring", e); } @@ -981,35 +958,44 @@ public class SignalAccount implements Closeable { .put("isMultiDevice", isMultiDevice) .put("lastReceiveTimestamp", lastReceiveTimestamp) .put("password", password) - .put("registrationId", localRegistrationId) - .put("pniRegistrationId", localPniRegistrationId) + .put("registrationId", aciAccountData.getLocalRegistrationId()) + .put("pniRegistrationId", pniAccountData.getLocalRegistrationId()) .put("identityPrivateKey", - Base64.getEncoder().encodeToString(aciIdentityKeyPair.getPrivateKey().serialize())) + Base64.getEncoder() + .encodeToString(aciAccountData.getIdentityKeyPair().getPrivateKey().serialize())) .put("identityKey", - Base64.getEncoder().encodeToString(aciIdentityKeyPair.getPublicKey().serialize())) + Base64.getEncoder() + .encodeToString(aciAccountData.getIdentityKeyPair().getPublicKey().serialize())) .put("pniIdentityPrivateKey", - pniIdentityKeyPair == null + pniAccountData.getIdentityKeyPair() == null ? null : Base64.getEncoder() - .encodeToString(pniIdentityKeyPair.getPrivateKey().serialize())) + .encodeToString(pniAccountData.getIdentityKeyPair() + .getPrivateKey() + .serialize())) .put("pniIdentityKey", - pniIdentityKeyPair == null + pniAccountData.getIdentityKeyPair() == null ? null - : Base64.getEncoder().encodeToString(pniIdentityKeyPair.getPublicKey().serialize())) + : Base64.getEncoder() + .encodeToString(pniAccountData.getIdentityKeyPair() + .getPublicKey() + .serialize())) .put("registrationLockPin", registrationLockPin) .put("pinMasterKey", pinMasterKey == null ? null : Base64.getEncoder().encodeToString(pinMasterKey.serialize())) .put("storageKey", storageKey == null ? null : Base64.getEncoder().encodeToString(storageKey.serialize())) .put("storageManifestVersion", storageManifestVersion == -1 ? null : storageManifestVersion) - .put("preKeyIdOffset", aciPreKeyIdOffset) - .put("nextSignedPreKeyId", aciNextSignedPreKeyId) - .put("pniPreKeyIdOffset", pniPreKeyIdOffset) - .put("pniNextSignedPreKeyId", pniNextSignedPreKeyId) - .put("kyberPreKeyIdOffset", aciKyberPreKeyIdOffset) - .put("activeLastResortKyberPreKeyId", aciActiveLastResortKyberPreKeyId) - .put("pniKyberPreKeyIdOffset", pniKyberPreKeyIdOffset) - .put("pniActiveLastResortKyberPreKeyId", pniActiveLastResortKyberPreKeyId) + .put("preKeyIdOffset", aciAccountData.getPreKeyMetadata().preKeyIdOffset) + .put("nextSignedPreKeyId", aciAccountData.getPreKeyMetadata().nextSignedPreKeyId) + .put("pniPreKeyIdOffset", pniAccountData.getPreKeyMetadata().preKeyIdOffset) + .put("pniNextSignedPreKeyId", pniAccountData.getPreKeyMetadata().nextSignedPreKeyId) + .put("kyberPreKeyIdOffset", aciAccountData.getPreKeyMetadata().kyberPreKeyIdOffset) + .put("activeLastResortKyberPreKeyId", + aciAccountData.getPreKeyMetadata().activeLastResortKyberPreKeyId) + .put("pniKyberPreKeyIdOffset", pniAccountData.getPreKeyMetadata().kyberPreKeyIdOffset) + .put("pniActiveLastResortKyberPreKeyId", + pniAccountData.getPreKeyMetadata().activeLastResortKyberPreKeyId) .put("profileKey", profileKey == null ? null : Base64.getEncoder().encodeToString(profileKey.serialize())) .put("registered", registered) @@ -1054,154 +1040,79 @@ public class SignalAccount implements Closeable { } public void resetPreKeyOffsets(final ServiceIdType serviceIdType) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - this.aciPreKeyIdOffset = getRandomPreKeyIdOffset(); - this.aciNextSignedPreKeyId = getRandomPreKeyIdOffset(); - } else { - this.pniPreKeyIdOffset = getRandomPreKeyIdOffset(); - this.pniNextSignedPreKeyId = getRandomPreKeyIdOffset(); - } + final var preKeyMetadata = getAccountData(serviceIdType).getPreKeyMetadata(); + preKeyMetadata.preKeyIdOffset = getRandomPreKeyIdOffset(); + preKeyMetadata.nextSignedPreKeyId = getRandomPreKeyIdOffset(); save(); } private static int getRandomPreKeyIdOffset() { - return new SecureRandom().nextInt(PREKEY_MAXIMUM_ID); + return KeyUtils.getRandomInt(PREKEY_MAXIMUM_ID); } public void addPreKeys(ServiceIdType serviceIdType, List records) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - addAciPreKeys(records); - } else { - addPniPreKeys(records); - } - } - - private void addAciPreKeys(List records) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); for (var record : records) { - if (aciPreKeyIdOffset != record.getId()) { - logger.error("Invalid pre key id {}, expected {}", record.getId(), aciPreKeyIdOffset); + if (preKeyMetadata.preKeyIdOffset != record.getId()) { + logger.error("Invalid pre key id {}, expected {}", record.getId(), preKeyMetadata.preKeyIdOffset); throw new AssertionError("Invalid pre key id"); } - getAciPreKeyStore().storePreKey(record.getId(), record); - aciPreKeyIdOffset = (aciPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; - } - save(); - } - - private void addPniPreKeys(List records) { - for (var record : records) { - if (pniPreKeyIdOffset != record.getId()) { - logger.error("Invalid pre key id {}, expected {}", record.getId(), pniPreKeyIdOffset); - throw new AssertionError("Invalid pre key id"); - } - getPniPreKeyStore().storePreKey(record.getId(), record); - pniPreKeyIdOffset = (pniPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; + accountData.getPreKeyStore().storePreKey(record.getId(), record); + preKeyMetadata.preKeyIdOffset = (preKeyMetadata.preKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; } save(); } public void addSignedPreKey(ServiceIdType serviceIdType, SignedPreKeyRecord record) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - addAciSignedPreKey(record); - } else { - addPniSignedPreKey(record); - } - } - - public void addAciSignedPreKey(SignedPreKeyRecord record) { - if (aciNextSignedPreKeyId != record.getId()) { - logger.error("Invalid signed pre key id {}, expected {}", record.getId(), aciNextSignedPreKeyId); - throw new AssertionError("Invalid signed pre key id"); - } - getAciSignedPreKeyStore().storeSignedPreKey(record.getId(), record); - aciNextSignedPreKeyId = (aciNextSignedPreKeyId + 1) % PREKEY_MAXIMUM_ID; - save(); - } - - public void addPniSignedPreKey(SignedPreKeyRecord record) { - if (pniNextSignedPreKeyId != record.getId()) { - logger.error("Invalid signed pre key id {}, expected {}", record.getId(), pniNextSignedPreKeyId); + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + if (preKeyMetadata.nextSignedPreKeyId != record.getId()) { + logger.error("Invalid signed pre key id {}, expected {}", + record.getId(), + preKeyMetadata.nextSignedPreKeyId); throw new AssertionError("Invalid signed pre key id"); } - getPniSignedPreKeyStore().storeSignedPreKey(record.getId(), record); - pniNextSignedPreKeyId = (pniNextSignedPreKeyId + 1) % PREKEY_MAXIMUM_ID; + accountData.getSignedPreKeyStore().storeSignedPreKey(record.getId(), record); + preKeyMetadata.nextSignedPreKeyId = (preKeyMetadata.nextSignedPreKeyId + 1) % PREKEY_MAXIMUM_ID; save(); } public void resetKyberPreKeyOffsets(final ServiceIdType serviceIdType) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - this.aciKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); - this.aciActiveLastResortKyberPreKeyId = -1; - } else { - this.pniKyberPreKeyIdOffset = getRandomPreKeyIdOffset(); - this.pniActiveLastResortKyberPreKeyId = -1; - } + final var preKeyMetadata = getAccountData(serviceIdType).getPreKeyMetadata(); + preKeyMetadata.kyberPreKeyIdOffset = getRandomPreKeyIdOffset(); + preKeyMetadata.activeLastResortKyberPreKeyId = -1; save(); } public void addKyberPreKeys(ServiceIdType serviceIdType, List records) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - addAciKyberPreKeys(records); - } else { - addPniKyberPreKeys(records); - } - } - - private void addAciKyberPreKeys(List records) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); for (var record : records) { - if (aciKyberPreKeyIdOffset != record.getId()) { - logger.error("Invalid kyber pre key id {}, expected {}", record.getId(), aciKyberPreKeyIdOffset); + if (preKeyMetadata.kyberPreKeyIdOffset != record.getId()) { + logger.error("Invalid kyber pre key id {}, expected {}", + record.getId(), + preKeyMetadata.kyberPreKeyIdOffset); throw new AssertionError("Invalid kyber pre key id"); } - getAciKyberPreKeyStore().storeKyberPreKey(record.getId(), record); - aciKyberPreKeyIdOffset = (aciKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; - } - save(); - } - - private void addPniKyberPreKeys(List records) { - for (var record : records) { - if (pniKyberPreKeyIdOffset != record.getId()) { - logger.error("Invalid kyber pre key id {}, expected {}", record.getId(), pniKyberPreKeyIdOffset); - throw new AssertionError("Invalid kyber pre key id"); - } - getPniKyberPreKeyStore().storeKyberPreKey(record.getId(), record); - pniKyberPreKeyIdOffset = (pniKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; + accountData.getKyberPreKeyStore().storeKyberPreKey(record.getId(), record); + preKeyMetadata.kyberPreKeyIdOffset = (preKeyMetadata.kyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; } save(); } public void addLastResortKyberPreKey(ServiceIdType serviceIdType, KyberPreKeyRecord record) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - addAciLastResortKyberPreKey(record); - } else { - addPniLastResortKyberPreKey(record); - } - } - - public void addAciLastResortKyberPreKey(KyberPreKeyRecord record) { - if (aciKyberPreKeyIdOffset != record.getId()) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + if (preKeyMetadata.kyberPreKeyIdOffset != record.getId()) { logger.error("Invalid last resort kyber pre key id {}, expected {}", record.getId(), - aciKyberPreKeyIdOffset); + preKeyMetadata.kyberPreKeyIdOffset); throw new AssertionError("Invalid last resort kyber pre key id"); } - getAciKyberPreKeyStore().storeLastResortKyberPreKey(record.getId(), record); - aciActiveLastResortKyberPreKeyId = record.getId(); - aciKyberPreKeyIdOffset = (aciKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; - save(); - } - - public void addPniLastResortKyberPreKey(KyberPreKeyRecord record) { - if (pniKyberPreKeyIdOffset != record.getId()) { - logger.error("Invalid last resort kyber pre key id {}, expected {}", - record.getId(), - pniKyberPreKeyIdOffset); - throw new AssertionError("Invalid last resort kyber pre key id"); - } - getPniKyberPreKeyStore().storeLastResortKyberPreKey(record.getId(), record); - pniActiveLastResortKyberPreKeyId = record.getId(); - pniKyberPreKeyIdOffset = (pniKyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; + accountData.getKyberPreKeyStore().storeLastResortKyberPreKey(record.getId(), record); + preKeyMetadata.activeLastResortKyberPreKeyId = record.getId(); + preKeyMetadata.kyberPreKeyIdOffset = (preKeyMetadata.kyberPreKeyIdOffset + 1) % PREKEY_MAXIMUM_ID; save(); } @@ -1209,6 +1120,23 @@ public class SignalAccount implements Closeable { return previousStorageVersion; } + public AccountData getAccountData(ServiceIdType serviceIdType) { + return switch (serviceIdType) { + case ACI -> aciAccountData; + case PNI -> pniAccountData; + }; + } + + public AccountData getAccountData(ServiceId accountIdentifier) { + if (accountIdentifier.equals(aci)) { + return aciAccountData; + } else if (accountIdentifier.equals(pni)) { + return pniAccountData; + } else { + throw new IllegalArgumentException("No matching account data found for " + accountIdentifier); + } + } + public SignalServiceDataStore getSignalServiceDataStore() { return new SignalServiceDataStore() { @Override @@ -1224,12 +1152,12 @@ public class SignalAccount implements Closeable { @Override public SignalServiceAccountDataStore aci() { - return getAciSignalServiceAccountDataStore(); + return aciAccountData.getSignalServiceAccountDataStore(); } @Override public SignalServiceAccountDataStore pni() { - return getPniSignalServiceAccountDataStore(); + return pniAccountData.getSignalServiceAccountDataStore(); } @Override @@ -1239,89 +1167,11 @@ public class SignalAccount implements Closeable { }; } - private SignalServiceAccountDataStore getAciSignalServiceAccountDataStore() { - return getOrCreate(() -> aciSignalProtocolStore, - () -> aciSignalProtocolStore = new SignalProtocolStore(getAciPreKeyStore(), - getAciSignedPreKeyStore(), - getAciKyberPreKeyStore(), - getAciSessionStore(), - getAciIdentityKeyStore(), - getSenderKeyStore(), - this::isMultiDevice)); - } - - private SignalServiceAccountDataStore getPniSignalServiceAccountDataStore() { - return getOrCreate(() -> pniSignalProtocolStore, - () -> pniSignalProtocolStore = new SignalProtocolStore(getPniPreKeyStore(), - getPniSignedPreKeyStore(), - getPniKyberPreKeyStore(), - getPniSessionStore(), - getPniIdentityKeyStore(), - getSenderKeyStore(), - this::isMultiDevice)); - } - - private PreKeyStore getAciPreKeyStore() { - return getOrCreate(() -> aciPreKeyStore, - () -> aciPreKeyStore = new PreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - private SignedPreKeyStore getAciSignedPreKeyStore() { - return getOrCreate(() -> aciSignedPreKeyStore, - () -> aciSignedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - private KyberPreKeyStore getAciKyberPreKeyStore() { - return getOrCreate(() -> aciKyberPreKeyStore, - () -> aciKyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - private PreKeyStore getPniPreKeyStore() { - return getOrCreate(() -> pniPreKeyStore, - () -> pniPreKeyStore = new PreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); - } - - private SignedPreKeyStore getPniSignedPreKeyStore() { - return getOrCreate(() -> pniSignedPreKeyStore, - () -> pniSignedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); - } - - private KyberPreKeyStore getPniKyberPreKeyStore() { - return getOrCreate(() -> pniKyberPreKeyStore, - () -> pniKyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); - } - - public SessionStore getAciSessionStore() { - return getOrCreate(() -> aciSessionStore, - () -> aciSessionStore = new SessionStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - public SessionStore getPniSessionStore() { - return getOrCreate(() -> pniSessionStore, - () -> pniSessionStore = new SessionStore(getAccountDatabase(), ServiceIdType.PNI)); - } - public IdentityKeyStore getIdentityKeyStore() { return getOrCreate(() -> identityKeyStore, () -> identityKeyStore = new IdentityKeyStore(getAccountDatabase(), settings.trustNewIdentity())); } - public SignalIdentityKeyStore getAciIdentityKeyStore() { - return getOrCreate(() -> aciIdentityKeyStore, - () -> aciIdentityKeyStore = new SignalIdentityKeyStore(getRecipientResolver(), - () -> aciIdentityKeyPair, - localRegistrationId, - getIdentityKeyStore())); - } - - public SignalIdentityKeyStore getPniIdentityKeyStore() { - return getOrCreate(() -> pniIdentityKeyStore, - () -> pniIdentityKeyStore = new SignalIdentityKeyStore(getRecipientResolver(), - () -> pniIdentityKeyPair, - localRegistrationId, - getIdentityKeyStore())); - } - public GroupStore getGroupStore() { return getOrCreate(() -> groupStore, () -> groupStore = new GroupStore(getAccountDatabase(), @@ -1489,11 +1339,7 @@ public class SignalAccount implements Closeable { if (this.pni != null && !this.pni.equals(updatedPni)) { // Clear data for old PNI identityKeyStore.deleteIdentity(this.pni); - getPniPreKeyStore().removeAllPreKeys(); - getPniSignedPreKeyStore().removeAllSignedPreKeys(); - getPniKyberPreKeyStore().removeAllKyberPreKeys(); - aciActiveLastResortKyberPreKeyId = -1; - pniActiveLastResortKyberPreKeyId = -1; + clearAllPreKeys(ServiceIdType.PNI); } this.pni = updatedPni; @@ -1509,7 +1355,7 @@ public class SignalAccount implements Closeable { setPni(updatedPni); setPniIdentityKeyPair(pniIdentityKeyPair); - addPniSignedPreKey(pniSignedPreKey); + addSignedPreKey(ServiceIdType.PNI, pniSignedPreKey); setLocalPniRegistrationId(localPniRegistrationId); } @@ -1552,35 +1398,33 @@ public class SignalAccount implements Closeable { } public IdentityKeyPair getIdentityKeyPair(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciIdentityKeyPair : pniIdentityKeyPair; + return getAccountData(serviceIdType).getIdentityKeyPair(); } public IdentityKeyPair getAciIdentityKeyPair() { - return aciIdentityKeyPair; + return aciAccountData.getIdentityKeyPair(); } public IdentityKeyPair getPniIdentityKeyPair() { - return pniIdentityKeyPair; + return pniAccountData.getIdentityKeyPair(); } public void setPniIdentityKeyPair(final IdentityKeyPair identityKeyPair) { - pniIdentityKeyPair = identityKeyPair; - final var pniPublicKey = identityKeyPair.getPublicKey(); - getIdentityKeyStore().saveIdentity(getPni(), pniPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getPni(), pniPublicKey, TrustLevel.TRUSTED_VERIFIED); + pniAccountData.setIdentityKeyPair(identityKeyPair); + trustSelfIdentity(ServiceIdType.PNI); save(); } public int getLocalRegistrationId() { - return localRegistrationId; + return aciAccountData.getLocalRegistrationId(); } public int getLocalPniRegistrationId() { - return localPniRegistrationId; + return pniAccountData.getLocalRegistrationId(); } public void setLocalPniRegistrationId(final int localPniRegistrationId) { - this.localPniRegistrationId = localPniRegistrationId; + pniAccountData.setLocalRegistrationId(localPniRegistrationId); save(); } @@ -1711,15 +1555,15 @@ public class SignalAccount implements Closeable { } public int getPreKeyIdOffset(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciPreKeyIdOffset : pniPreKeyIdOffset; + return getAccountData(serviceIdType).getPreKeyMetadata().preKeyIdOffset; } public int getNextSignedPreKeyId(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciNextSignedPreKeyId : pniNextSignedPreKeyId; + return getAccountData(serviceIdType).getPreKeyMetadata().nextSignedPreKeyId; } public int getKyberPreKeyIdOffset(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciKyberPreKeyIdOffset : pniKyberPreKeyIdOffset; + return getAccountData(serviceIdType).getPreKeyMetadata().kyberPreKeyIdOffset; } public boolean isRegistered() { @@ -1778,22 +1622,26 @@ public class SignalAccount implements Closeable { save(); clearAllPreKeys(); - getAciSessionStore().archiveAllSessions(); - getPniSessionStore().archiveAllSessions(); + aciAccountData.getSessionStore().archiveAllSessions(); + pniAccountData.getSessionStore().archiveAllSessions(); getSenderKeyStore().deleteAll(); getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); - final var aciPublicKey = getAciIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getAci(), aciPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getAci(), aciPublicKey, TrustLevel.TRUSTED_VERIFIED); + trustSelfIdentity(ServiceIdType.ACI); if (getPniIdentityKeyPair() == null) { setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); } else { - final var pniPublicKey = getPniIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getPni(), pniPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getPni(), pniPublicKey, TrustLevel.TRUSTED_VERIFIED); + trustSelfIdentity(ServiceIdType.PNI); } } + private void trustSelfIdentity(ServiceIdType serviceIdType) { + final var accountData = getAccountData(serviceIdType); + final var serviceId = accountData.getServiceId(); + final var publicKey = accountData.getIdentityKeyPair().getPublicKey(); + getIdentityKeyStore().saveIdentity(serviceId, publicKey); + getIdentityKeyStore().setIdentityTrustLevel(serviceId, publicKey, TrustLevel.TRUSTED_VERIFIED); + } + public void deleteAccountData() throws IOException { close(); try (final var files = Files.walk(getUserPath(dataPath, accountPath).toPath()) @@ -1850,4 +1698,95 @@ public class SignalAccount implements Closeable { void call(); } + + private static class PreKeyMetadata { + + private int preKeyIdOffset = 1; + private int nextSignedPreKeyId = 1; + private int kyberPreKeyIdOffset = 1; + private int activeLastResortKyberPreKeyId = -1; + } + + public class AccountData { + + private final ServiceIdType serviceIdType; + private IdentityKeyPair identityKeyPair; + private int localRegistrationId; + private final PreKeyMetadata preKeyMetadata = new PreKeyMetadata(); + + private SignalProtocolStore signalProtocolStore; + private PreKeyStore preKeyStore; + private SignedPreKeyStore signedPreKeyStore; + private KyberPreKeyStore kyberPreKeyStore; + private SessionStore sessionStore; + private SignalIdentityKeyStore identityKeyStore; + + public AccountData(final ServiceIdType serviceIdType) { + this.serviceIdType = serviceIdType; + } + + public ServiceId getServiceId() { + return getAccountId(serviceIdType); + } + + public IdentityKeyPair getIdentityKeyPair() { + return identityKeyPair; + } + + private void setIdentityKeyPair(final IdentityKeyPair identityKeyPair) { + this.identityKeyPair = identityKeyPair; + } + + public int getLocalRegistrationId() { + return localRegistrationId; + } + + private void setLocalRegistrationId(final int localRegistrationId) { + this.localRegistrationId = localRegistrationId; + this.identityKeyStore = null; + } + + public PreKeyMetadata getPreKeyMetadata() { + return preKeyMetadata; + } + + private SignalServiceAccountDataStore getSignalServiceAccountDataStore() { + return getOrCreate(() -> signalProtocolStore, + () -> signalProtocolStore = new SignalProtocolStore(getPreKeyStore(), + getSignedPreKeyStore(), + getKyberPreKeyStore(), + getSessionStore(), + getIdentityKeyStore(), + getSenderKeyStore(), + SignalAccount.this::isMultiDevice)); + } + + private PreKeyStore getPreKeyStore() { + return getOrCreate(() -> preKeyStore, + () -> preKeyStore = new PreKeyStore(getAccountDatabase(), serviceIdType)); + } + + private SignedPreKeyStore getSignedPreKeyStore() { + return getOrCreate(() -> signedPreKeyStore, + () -> signedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), serviceIdType)); + } + + private KyberPreKeyStore getKyberPreKeyStore() { + return getOrCreate(() -> kyberPreKeyStore, + () -> kyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), serviceIdType)); + } + + public SessionStore getSessionStore() { + return getOrCreate(() -> sessionStore, + () -> sessionStore = new SessionStore(getAccountDatabase(), serviceIdType)); + } + + public SignalIdentityKeyStore getIdentityKeyStore() { + return getOrCreate(() -> identityKeyStore, + () -> identityKeyStore = new SignalIdentityKeyStore(getRecipientResolver(), + () -> identityKeyPair, + localRegistrationId, + SignalAccount.this.getIdentityKeyStore())); + } + } } diff --git a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java index 3ee5657e..8db8d0a4 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java @@ -120,4 +120,8 @@ public class KeyUtils { secureRandom.nextBytes(secret); return secret; } + + public static int getRandomInt(int bound) { + return secureRandom.nextInt(bound); + } } -- 2.51.0 From c8e35991b9a9c4f920395adbd33516618e5d0991 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 23 Jun 2023 21:48:02 +0200 Subject: [PATCH 13/16] Update dependencies --- client/Cargo.lock | 410 ++++++++++++++++++++++++---------------------- 1 file changed, 215 insertions(+), 195 deletions(-) diff --git a/client/Cargo.lock b/client/Cargo.lock index 4ffb7140..9a03783e 100644 --- a/client/Cargo.lock +++ b/client/Cargo.lock @@ -11,11 +11,69 @@ dependencies = [ "memchr", ] +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "autocfg" @@ -31,9 +89,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bstr" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f0778972c64420fdedc63f09919c8a88bda7b25135357fd25a5d9f3257e832" +checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" dependencies = [ "memchr", "serde", @@ -59,41 +117,53 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.1.6" +version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0b0588d44d4d63a87dbd75c136c166bbfd9a86a31cb89e09906521c7d3f5e3" +checksum = "80672091db20273a15cf9fdd4e47ed43b5091ec9841bf4c6145c9dfbbcae09ed" dependencies = [ - "bitflags", + "clap_builder", "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1458a1df40e1e2afebb7ab60ce55c1fa8f431146205aa5f4887e0b111c27636" +dependencies = [ + "anstream", + "anstyle", + "bitflags", "clap_lex", - "is-terminal", "once_cell", "strsim", - "termcolor", "terminal_size", ] [[package]] name = "clap_derive" -version = "4.1.0" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] name = "clap_lex" -version = "0.3.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" -dependencies = [ - "os_str_bytes", -] +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "convert_case" @@ -111,18 +181,18 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 1.0.109", ] [[package]] name = "errno" -version = "0.2.8" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "winapi", + "windows-sys", ] [[package]] @@ -149,9 +219,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -164,9 +234,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -174,15 +244,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -192,38 +262,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] name = "futures-sink" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures 0.1.31", "futures-channel", @@ -255,7 +325,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ - "aho-corasick", + "aho-corasick 0.7.20", "bstr", "fnv", "log", @@ -294,31 +364,32 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ + "hermit-abi 0.3.1", "libc", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] name = "is-terminal" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "jsonrpc-client-transports" @@ -326,7 +397,7 @@ version = "18.0.0" source = "git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params#8a68f95e202943fd338fd0c14da08c2dc8f6e6a6" dependencies = [ "derive_more", - "futures 0.3.26", + "futures 0.3.28", "jsonrpc-core 18.0.0 (git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params)", "jsonrpc-pubsub", "jsonrpc-server-utils 18.0.0 (git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params)", @@ -343,7 +414,7 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ - "futures 0.3.26", + "futures 0.3.28", "futures-executor", "futures-util", "log", @@ -357,7 +428,7 @@ name = "jsonrpc-core" version = "18.0.0" source = "git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params#8a68f95e202943fd338fd0c14da08c2dc8f6e6a6" dependencies = [ - "futures 0.3.26", + "futures 0.3.28", "futures-executor", "futures-util", "log", @@ -372,7 +443,7 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" dependencies = [ - "futures 0.3.26", + "futures 0.3.28", "jsonrpc-client-transports", ] @@ -384,7 +455,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -392,7 +463,7 @@ name = "jsonrpc-pubsub" version = "18.0.0" source = "git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params#8a68f95e202943fd338fd0c14da08c2dc8f6e6a6" dependencies = [ - "futures 0.3.26", + "futures 0.3.28", "jsonrpc-core 18.0.0 (git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params)", "lazy_static", "log", @@ -408,7 +479,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" dependencies = [ "bytes", - "futures 0.3.26", + "futures 0.3.28", "globset", "jsonrpc-core 18.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static", @@ -425,7 +496,7 @@ version = "18.0.0" source = "git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params#8a68f95e202943fd338fd0c14da08c2dc8f6e6a6" dependencies = [ "bytes", - "futures 0.3.26", + "futures 0.3.28", "globset", "jsonrpc-core 18.0.0 (git+https://github.com/AsamK/jsonrpc?branch=client_subscribe_named_params)", "lazy_static", @@ -444,21 +515,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "linux-raw-sys" -version = "0.1.4" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -466,12 +537,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -481,14 +549,13 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -503,15 +570,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" - -[[package]] -name = "os_str_bytes" -version = "6.4.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "parity-tokio-ipc" @@ -519,7 +580,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" dependencies = [ - "futures 0.3.26", + "futures 0.3.28", "libc", "log", "rand", @@ -579,44 +640,20 @@ dependencies = [ "toml", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -673,20 +710,20 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ - "aho-corasick", + "aho-corasick 1.0.2", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "rustc_version" @@ -699,23 +736,23 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.8" +version = "0.37.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "scopeguard" @@ -725,35 +762,35 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] name = "serde_json" -version = "1.0.93" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" dependencies = [ "itoa", "ryu", @@ -779,9 +816,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] @@ -794,9 +831,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -810,9 +847,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -820,58 +857,59 @@ dependencies = [ ] [[package]] -name = "termcolor" -version = "1.2.0" +name = "syn" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ - "winapi-util", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] name = "terminal_size" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9afddd2cec1c0909f06b00ef33f94ab2cc0578c4a610aa208ddfec8aa2b43a" +checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" dependencies = [ "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] name = "tokio" -version = "1.25.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ "autocfg", "bytes", "libc", - "memchr", "mio", "num_cpus", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.18", ] [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", @@ -912,9 +950,15 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "utf8parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "version_check" @@ -950,15 +994,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -967,33 +1002,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1006,42 +1026,42 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" -- 2.51.0 From e57e5b090ee340dbbb7ac21b5d48a264ac44a347 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 24 Jun 2023 00:21:03 +0200 Subject: [PATCH 14/16] Update libsignal-service-java --- graalvm-config-dir/reflect-config.json | 38 ++++++---- .../signal/manager/helper/AccountHelper.java | 2 +- .../signal/manager/helper/PreKeyHelper.java | 21 +++--- .../signal/manager/internal/ManagerImpl.java | 2 +- .../internal/RegistrationManagerImpl.java | 60 ++++++++++++++-- .../signal/manager/storage/SignalAccount.java | 71 ++++++++++++++++--- .../asamk/signal/manager/util/KeyUtils.java | 15 ++-- settings.gradle.kts | 2 +- 8 files changed, 165 insertions(+), 46 deletions(-) diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 0f08810c..42c4b4aa 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -956,7 +956,7 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"getId","parameterTypes":[] }, {"name":"getJsonrpc","parameterTypes":[] }, {"name":"getMethod","parameterTypes":[] }, {"name":"getParams","parameterTypes":[] }] }, { "name":"org.asamk.signal.jsonrpc.JsonRpcResponse", @@ -1987,7 +1987,7 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"getSignature","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.api.push.SignedPreKeyEntity$ByteArrayDeserializer", @@ -2015,7 +2015,8 @@ "name":"org.whispersystems.signalservice.internal.contacts.crypto.SignatureBodyEntity", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.contacts.entities.DiscoveryRequest", @@ -2033,13 +2034,15 @@ "name":"org.whispersystems.signalservice.internal.contacts.entities.KeyBackupRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"getData","parameterTypes":[] }, {"name":"getIv","parameterTypes":[] }, {"name":"getMac","parameterTypes":[] }, {"name":"getRequestId","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.contacts.entities.KeyBackupResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.contacts.entities.MultiRemoteAttestationResponse", @@ -2057,19 +2060,22 @@ "name":"org.whispersystems.signalservice.internal.contacts.entities.RemoteAttestationRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"getClientPublic","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.contacts.entities.RemoteAttestationResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.contacts.entities.TokenResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.devices.DeviceNameProtos$DeviceName", @@ -2113,7 +2119,8 @@ "name":"org.whispersystems.signalservice.internal.push.AuthCredentials", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.CdsiAuthResponse", @@ -2154,6 +2161,12 @@ "allDeclaredConstructors":true, "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.push.GcmRegistrationId", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, { "name":"org.whispersystems.signalservice.internal.push.GetAciByUsernameResponse", "allDeclaredFields":true, @@ -2231,7 +2244,7 @@ "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "methods":[{"name":"","parameterTypes":[] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"getKeyId","parameterTypes":[] }, {"name":"getPublicKey","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.PreKeyEntity$ECPublicKeyDeserializer", @@ -2317,7 +2330,7 @@ "allDeclaredFields":true, "queryAllDeclaredMethods":true, "queryAllDeclaredConstructors":true, - "methods":[{"name":"getAccountAttributes","parameterTypes":[] }, {"name":"getRecoveryPassword","parameterTypes":[] }, {"name":"getSessionId","parameterTypes":[] }, {"name":"getSkipDeviceTransfer","parameterTypes":[] }] + "methods":[{"name":"getAccountAttributes","parameterTypes":[] }, {"name":"getAciIdentityKey","parameterTypes":[] }, {"name":"getAciPqLastResortPreKey","parameterTypes":[] }, {"name":"getAciSignedPreKey","parameterTypes":[] }, {"name":"getGcmToken","parameterTypes":[] }, {"name":"getPniIdentityKey","parameterTypes":[] }, {"name":"getPniPqLastResortPreKey","parameterTypes":[] }, {"name":"getPniSignedPreKey","parameterTypes":[] }, {"name":"getRecoveryPassword","parameterTypes":[] }, {"name":"getSessionId","parameterTypes":[] }, {"name":"getSkipDeviceTransfer","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.ReserveUsernameRequest", @@ -2646,7 +2659,8 @@ "name":"org.whispersystems.signalservice.internal.push.VerifyAccountResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true + "allDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] }, { "name":"org.whispersystems.signalservice.internal.push.WhoAmIResponse", diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index 16ab92bd..801e7987 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -113,7 +113,7 @@ public class AccountHelper { account.setNumber(number); account.setAci(aci); account.setPni(pni); - if (account.isPrimaryDevice() && account.getPniIdentityKeyPair() == null && account.getPni() != null) { + if (account.isPrimaryDevice() && account.getPniIdentityKeyPair() == null) { account.setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); } account.getRecipientTrustedResolver().resolveSelfRecipientTrusted(account.getSelfRecipientAddress()); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java index 282b017a..2bbef3c8 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java @@ -38,18 +38,21 @@ public class PreKeyHelper { public void refreshPreKeysIfNecessary(ServiceIdType serviceIdType) throws IOException { final var preKeyCounts = dependencies.getAccountManager().getPreKeyCounts(serviceIdType); if (preKeyCounts.getEcCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { + logger.debug("Refreshing {} ec pre keys, because only {} of {} pre keys remain", + serviceIdType, + preKeyCounts.getEcCount(), + ServiceConfig.PREKEY_MINIMUM_COUNT); refreshPreKeys(serviceIdType); } if (preKeyCounts.getKyberCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { + logger.debug("Refreshing {} kyber pre keys, because only {} of {} pre keys remain", + serviceIdType, + preKeyCounts.getEcCount(), + ServiceConfig.PREKEY_MINIMUM_COUNT); refreshKyberPreKeys(serviceIdType); } } - public void refreshPreKeys() throws IOException { - refreshPreKeys(ServiceIdType.ACI); - refreshPreKeys(ServiceIdType.PNI); - } - private void refreshPreKeys(ServiceIdType serviceIdType) throws IOException { final var identityKeyPair = account.getIdentityKeyPair(serviceIdType); if (identityKeyPair == null) { @@ -86,7 +89,7 @@ public class PreKeyHelper { private List generatePreKeys(ServiceIdType serviceIdType) { final var offset = account.getPreKeyIdOffset(serviceIdType); - var records = KeyUtils.generatePreKeyRecords(offset, ServiceConfig.PREKEY_BATCH_SIZE); + var records = KeyUtils.generatePreKeyRecords(offset); account.addPreKeys(serviceIdType, records); return records; @@ -95,7 +98,7 @@ public class PreKeyHelper { private SignedPreKeyRecord generateSignedPreKey(ServiceIdType serviceIdType, IdentityKeyPair identityKeyPair) { final var signedPreKeyId = account.getNextSignedPreKeyId(serviceIdType); - var record = KeyUtils.generateSignedPreKeyRecord(identityKeyPair, signedPreKeyId); + var record = KeyUtils.generateSignedPreKeyRecord(signedPreKeyId, identityKeyPair); account.addSignedPreKey(serviceIdType, record); return record; @@ -139,9 +142,7 @@ public class PreKeyHelper { ) { final var offset = account.getKyberPreKeyIdOffset(serviceIdType); - var records = KeyUtils.generateKyberPreKeyRecords(offset, - ServiceConfig.PREKEY_BATCH_SIZE, - identityKeyPair.getPrivateKey()); + var records = KeyUtils.generateKyberPreKeyRecords(offset, identityKeyPair.getPrivateKey()); account.addKyberPreKeys(serviceIdType, records); return records; diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index faea76d7..4e2fd82c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -378,7 +378,7 @@ public class ManagerImpl implements Manager { } void refreshPreKeys() throws IOException { - context.getPreKeyHelper().refreshPreKeys(); + context.getPreKeyHelper().refreshPreKeysIfNecessary(); } @Override diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java index eb51b715..dca5f7ab 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java @@ -29,16 +29,19 @@ import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.asamk.signal.manager.helper.AccountFileUpdater; import org.asamk.signal.manager.helper.PinHelper; import org.asamk.signal.manager.storage.SignalAccount; +import org.asamk.signal.manager.util.KeyUtils; import org.asamk.signal.manager.util.NumberVerificationUtils; import org.asamk.signal.manager.util.Utils; import org.signal.libsignal.usernames.BaseUsernameException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalServiceAccountManager; +import org.whispersystems.signalservice.api.account.PreKeyCollection; import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations; import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; import org.whispersystems.signalservice.api.push.ACI; import org.whispersystems.signalservice.api.push.PNI; +import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; @@ -48,6 +51,8 @@ import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider import java.io.IOException; import java.util.function.Consumer; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; + public class RegistrationManagerImpl implements RegistrationManager { private final static Logger logger = LoggerFactory.getLogger(RegistrationManagerImpl.class); @@ -138,12 +143,21 @@ public class RegistrationManagerImpl implements RegistrationManager { public void verifyAccount( String verificationCode, String pin ) throws IOException, PinLockedException, IncorrectPinException { - var sessionId = account.getSessionId(account.getNumber()); - final var result = NumberVerificationUtils.verifyNumber(sessionId, + if (account.getPniIdentityKeyPair() == null) { + account.setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); + } + + final var aciPreKeys = generatePreKeysForType(ServiceIdType.ACI); + final var pniPreKeys = generatePreKeysForType(ServiceIdType.PNI); + final var result = NumberVerificationUtils.verifyNumber(account.getSessionId(account.getNumber()), verificationCode, pin, pinHelper, - this::verifyAccountWithCode); + (sessionId1, verificationCode1, registrationLock) -> verifyAccountWithCode(sessionId1, + verificationCode1, + registrationLock, + aciPreKeys, + pniPreKeys)); final var response = result.first(); final var masterKey = result.second(); if (masterKey == null) { @@ -153,7 +167,7 @@ public class RegistrationManagerImpl implements RegistrationManager { //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID))); final var aci = ACI.parseOrNull(response.getUuid()); final var pni = PNI.parseOrNull(response.getPni()); - account.finishRegistration(aci, pni, masterKey, pin); + account.finishRegistration(aci, pni, masterKey, pin, aciPreKeys, pniPreKeys); accountFileUpdater.updateAccountIdentifiers(account.getNumber(), aci); ManagerImpl m = null; @@ -228,7 +242,11 @@ public class RegistrationManagerImpl implements RegistrationManager { } private VerifyAccountResponse verifyAccountWithCode( - final String sessionId, final String verificationCode, final String registrationLock + final String sessionId, + final String verificationCode, + final String registrationLock, + final PreKeyCollection aciPreKeys, + final PreKeyCollection pniPreKeys ) throws IOException { try { Utils.handleResponseException(accountManager.verifyAccount(verificationCode, sessionId)); @@ -238,9 +256,41 @@ public class RegistrationManagerImpl implements RegistrationManager { return Utils.handleResponseException(accountManager.registerAccount(sessionId, null, account.getAccountAttributes(registrationLock), + aciPreKeys, + pniPreKeys, + null, true)); } + private PreKeyCollection generatePreKeysForType(ServiceIdType serviceIdType) { + final var accountData = account.getAccountData(serviceIdType); + final var keyPair = accountData.getIdentityKeyPair(); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + + final var preKeyIdOffset = preKeyMetadata.getPreKeyIdOffset(); + final var oneTimeEcPreKeys = KeyUtils.generatePreKeyRecords(preKeyIdOffset); + final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId(); + final var signedPreKey = KeyUtils.generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair); + + final var privateKey = keyPair.getPrivateKey(); + final var kyberPreKeyIdOffset = preKeyMetadata.getKyberPreKeyIdOffset(); + final var oneTimeKyberPreKeys = KeyUtils.generateKyberPreKeyRecords(kyberPreKeyIdOffset, privateKey); + final var lastResortKyberPreKeyId = (kyberPreKeyIdOffset + oneTimeKyberPreKeys.size()) % PREKEY_MAXIMUM_ID; + final var lastResortKyberPreKey = KeyUtils.generateKyberPreKeyRecord(lastResortKyberPreKeyId, privateKey); + + return new PreKeyCollection(keyPair, + nextSignedPreKeyId, + preKeyIdOffset, + lastResortKyberPreKeyId, + kyberPreKeyIdOffset, + serviceIdType, + keyPair.getPublicKey(), + signedPreKey, + oneTimeEcPreKeys, + lastResortKyberPreKey, + oneTimeKyberPreKeys); + } + @Override public void close() { if (account != null) { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 931a45a2..8cb5d7ed 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalServiceAccountDataStore; import org.whispersystems.signalservice.api.SignalServiceDataStore; import org.whispersystems.signalservice.api.account.AccountAttributes; +import org.whispersystems.signalservice.api.account.PreKeyCollection; import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess; import org.whispersystems.signalservice.api.kbs.MasterKey; import org.whispersystems.signalservice.api.push.ACI; @@ -299,6 +300,26 @@ public class SignalAccount implements Closeable { save(); } + private void setPreKeys(ServiceIdType serviceIdType, PreKeyCollection preKeyCollection) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + preKeyMetadata.nextSignedPreKeyId = preKeyCollection.getNextSignedPreKeyId(); + preKeyMetadata.preKeyIdOffset = preKeyCollection.getEcOneTimePreKeyIdOffset(); + preKeyMetadata.kyberPreKeyIdOffset = preKeyCollection.getOneTimeKyberPreKeyIdOffset(); + preKeyMetadata.activeLastResortKyberPreKeyId = preKeyCollection.getLastResortKyberPreKeyId(); + + accountData.getPreKeyStore().removeAllPreKeys(); + accountData.getSignedPreKeyStore().removeAllSignedPreKeys(); + accountData.getKyberPreKeyStore().removeAllKyberPreKeys(); + + addPreKeys(serviceIdType, preKeyCollection.getOneTimeEcPreKeys()); + addSignedPreKey(serviceIdType, preKeyCollection.getSignedPreKey()); + addKyberPreKeys(serviceIdType, preKeyCollection.getOneTimeKyberPreKeys()); + addLastResortKyberPreKey(serviceIdType, preKeyCollection.getLastResortKyberPreKey()); + + save(); + } + private static SignalAccount createLinkedAccount( File dataPath, String accountPath, @@ -394,7 +415,7 @@ public class SignalAccount implements Closeable { setProfileKey(KeyUtils.createProfileKey()); } getProfileStore().storeProfileKey(getSelfRecipientId(), getProfileKey()); - if (isPrimaryDevice() && getPniIdentityKeyPair() == null && getPni() != null) { + if (isPrimaryDevice() && getPniIdentityKeyPair() == null) { setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); } } @@ -1053,6 +1074,10 @@ public class SignalAccount implements Closeable { public void addPreKeys(ServiceIdType serviceIdType, List records) { final var accountData = getAccountData(serviceIdType); final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} {} pre keys with offset {}", + records.size(), + serviceIdType, + preKeyMetadata.preKeyIdOffset); for (var record : records) { if (preKeyMetadata.preKeyIdOffset != record.getId()) { logger.error("Invalid pre key id {}, expected {}", record.getId(), preKeyMetadata.preKeyIdOffset); @@ -1067,6 +1092,7 @@ public class SignalAccount implements Closeable { public void addSignedPreKey(ServiceIdType serviceIdType, SignedPreKeyRecord record) { final var accountData = getAccountData(serviceIdType); final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} signed pre key with offset {}", serviceIdType, preKeyMetadata.nextSignedPreKeyId); if (preKeyMetadata.nextSignedPreKeyId != record.getId()) { logger.error("Invalid signed pre key id {}, expected {}", record.getId(), @@ -1088,6 +1114,10 @@ public class SignalAccount implements Closeable { public void addKyberPreKeys(ServiceIdType serviceIdType, List records) { final var accountData = getAccountData(serviceIdType); final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} {} kyber pre keys with offset {}", + records.size(), + serviceIdType, + preKeyMetadata.kyberPreKeyIdOffset); for (var record : records) { if (preKeyMetadata.kyberPreKeyIdOffset != record.getId()) { logger.error("Invalid kyber pre key id {}, expected {}", @@ -1104,6 +1134,9 @@ public class SignalAccount implements Closeable { public void addLastResortKyberPreKey(ServiceIdType serviceIdType, KyberPreKeyRecord record) { final var accountData = getAccountData(serviceIdType); final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} last resort kyber pre key with offset {}", + serviceIdType, + preKeyMetadata.kyberPreKeyIdOffset); if (preKeyMetadata.kyberPreKeyIdOffset != record.getId()) { logger.error("Invalid last resort kyber pre key id {}, expected {}", record.getId(), @@ -1606,7 +1639,14 @@ public class SignalAccount implements Closeable { return phoneNumberUnlisted == null || !phoneNumberUnlisted; } - public void finishRegistration(final ACI aci, final PNI pni, final MasterKey masterKey, final String pin) { + public void finishRegistration( + final ACI aci, + final PNI pni, + final MasterKey masterKey, + final String pin, + final PreKeyCollection aciPreKeys, + final PreKeyCollection pniPreKeys + ) { this.pinMasterKey = masterKey; this.storageManifestVersion = -1; this.setStorageManifest(null); @@ -1621,17 +1661,14 @@ public class SignalAccount implements Closeable { this.lastReceiveTimestamp = 0; save(); - clearAllPreKeys(); + setPreKeys(ServiceIdType.ACI, aciPreKeys); + setPreKeys(ServiceIdType.PNI, pniPreKeys); aciAccountData.getSessionStore().archiveAllSessions(); pniAccountData.getSessionStore().archiveAllSessions(); getSenderKeyStore().deleteAll(); getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); trustSelfIdentity(ServiceIdType.ACI); - if (getPniIdentityKeyPair() == null) { - setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); - } else { - trustSelfIdentity(ServiceIdType.PNI); - } + trustSelfIdentity(ServiceIdType.PNI); } private void trustSelfIdentity(ServiceIdType serviceIdType) { @@ -1699,12 +1736,28 @@ public class SignalAccount implements Closeable { void call(); } - private static class PreKeyMetadata { + public static class PreKeyMetadata { private int preKeyIdOffset = 1; private int nextSignedPreKeyId = 1; private int kyberPreKeyIdOffset = 1; private int activeLastResortKyberPreKeyId = -1; + + public int getPreKeyIdOffset() { + return preKeyIdOffset; + } + + public int getNextSignedPreKeyId() { + return nextSignedPreKeyId; + } + + public int getKyberPreKeyIdOffset() { + return kyberPreKeyIdOffset; + } + + public int getActiveLastResortKyberPreKeyId() { + return activeLastResortKyberPreKeyId; + } } public class AccountData { diff --git a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java index 8db8d0a4..3fd6e308 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Base64; import java.util.List; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_BATCH_SIZE; import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; public class KeyUtils { @@ -47,9 +48,9 @@ public class KeyUtils { return new IdentityKeyPair(djbIdentityKey, djbPrivateKey); } - public static List generatePreKeyRecords(final int offset, final int batchSize) { - var records = new ArrayList(batchSize); - for (var i = 0; i < batchSize; i++) { + public static List generatePreKeyRecords(final int offset) { + var records = new ArrayList(PREKEY_BATCH_SIZE); + for (var i = 0; i < PREKEY_BATCH_SIZE; i++) { var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID; var keyPair = Curve.generateKeyPair(); var record = new PreKeyRecord(preKeyId, keyPair); @@ -60,7 +61,7 @@ public class KeyUtils { } public static SignedPreKeyRecord generateSignedPreKeyRecord( - final IdentityKeyPair identityKeyPair, final int signedPreKeyId + final int signedPreKeyId, final IdentityKeyPair identityKeyPair ) { var keyPair = Curve.generateKeyPair(); byte[] signature; @@ -73,10 +74,10 @@ public class KeyUtils { } public static List generateKyberPreKeyRecords( - final int offset, final int batchSize, final ECPrivateKey privateKey + final int offset, final ECPrivateKey privateKey ) { - var records = new ArrayList(batchSize); - for (var i = 0; i < batchSize; i++) { + var records = new ArrayList(PREKEY_BATCH_SIZE); + for (var i = 0; i < PREKEY_BATCH_SIZE; i++) { var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID; records.add(generateKyberPreKeyRecord(preKeyId, privateKey)); } diff --git a/settings.gradle.kts b/settings.gradle.kts index a6a66ae3..9b5ae2d7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { library("logback", "ch.qos.logback", "logback-classic").version("1.4.8") - library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_73") + library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_74") library("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.23.0") library("sqlite", "org.xerial", "sqlite-jdbc").version("3.42.0.0") library("hikari", "com.zaxxer", "HikariCP").version("5.0.1") -- 2.51.0 From ffeae1a95adf542d8b263101091952841da7ae24 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 1 Jul 2023 14:06:35 +0200 Subject: [PATCH 15/16] Store last resort kyber pre key from PniChangeNumber message --- .../signal/manager/helper/AccountHelper.java | 12 +++++++----- .../manager/helper/IncomingMessageHandler.java | 8 +++++++- .../signal/manager/storage/SignalAccount.java | 15 ++++++++++----- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index 801e7987..4841bdbd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -14,6 +14,7 @@ import org.asamk.signal.manager.util.NumberVerificationUtils; import org.asamk.signal.manager.util.Utils; import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidKeyException; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.usernames.BaseUsernameException; import org.signal.libsignal.usernames.Username; @@ -120,20 +121,21 @@ public class AccountHelper { // TODO check and update remote storage context.getUnidentifiedAccessHelper().rotateSenderCertificates(); dependencies.resetAfterAddressChange(); + context.getGroupV2Helper().clearAuthCredentialCache(); context.getAccountFileUpdater().updateAccountIdentifiers(account.getNumber(), account.getAci()); } public void setPni( final PNI updatedPni, final IdentityKeyPair pniIdentityKeyPair, + final String number, + final int localPniRegistrationId, final SignedPreKeyRecord pniSignedPreKey, - final int localPniRegistrationId + final KyberPreKeyRecord lastResortKyberPreKey ) throws IOException { - account.setPni(updatedPni, pniIdentityKeyPair, pniSignedPreKey, localPniRegistrationId); + updateSelfIdentifiers(number != null ? number : account.getNumber(), account.getAci(), updatedPni); + account.setNewPniIdentity(pniIdentityKeyPair, pniSignedPreKey, lastResortKyberPreKey, localPniRegistrationId); context.getPreKeyHelper().refreshPreKeysIfNecessary(ServiceIdType.PNI); - if (account.getPni() == null || !account.getPni().equals(updatedPni)) { - context.getGroupV2Helper().clearAuthCredentialCache(); - } } public void startChangeNumber( 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 7cc3d09d..0692a06e 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 @@ -44,6 +44,7 @@ import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidMessageException; import org.signal.libsignal.protocol.groups.GroupSessionBuilder; import org.signal.libsignal.protocol.message.DecryptionErrorMessage; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; @@ -646,8 +647,13 @@ public final class IncomingMessageHandler { context.getAccountHelper() .setPni(updatedPni, new IdentityKeyPair(pniChangeNumber.getIdentityKeyPair().toByteArray()), + pniChangeNumber.hasNewE164() ? pniChangeNumber.getNewE164() : null, + pniChangeNumber.getRegistrationId(), new SignedPreKeyRecord(pniChangeNumber.getSignedPreKey().toByteArray()), - pniChangeNumber.getRegistrationId()); + pniChangeNumber.hasLastResortKyberPreKey() + ? new KyberPreKeyRecord(pniChangeNumber.getLastResortKyberPreKey() + .toByteArray()) + : null); } catch (Exception e) { logger.warn("Failed to handle change number message", e); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 8cb5d7ed..c45e772f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -1379,17 +1379,22 @@ public class SignalAccount implements Closeable { save(); } - public void setPni( - final PNI updatedPni, + public void setNewPniIdentity( final IdentityKeyPair pniIdentityKeyPair, final SignedPreKeyRecord pniSignedPreKey, + final KyberPreKeyRecord lastResortKyberPreKey, final int localPniRegistrationId ) { - setPni(updatedPni); - setPniIdentityKeyPair(pniIdentityKeyPair); - addSignedPreKey(ServiceIdType.PNI, pniSignedPreKey); setLocalPniRegistrationId(localPniRegistrationId); + + final var preKeyMetadata = getAccountData(ServiceIdType.PNI).getPreKeyMetadata(); + preKeyMetadata.nextSignedPreKeyId = pniSignedPreKey.getId(); + addSignedPreKey(ServiceIdType.PNI, pniSignedPreKey); + if (lastResortKyberPreKey != null) { + preKeyMetadata.kyberPreKeyIdOffset = lastResortKyberPreKey.getId(); + addLastResortKyberPreKey(ServiceIdType.PNI, lastResortKyberPreKey); + } } public SignalServiceAddress getSelfAddress() { -- 2.51.0 From 2487fff44a03f9a7461d166073ad58eab1b4820c Mon Sep 17 00:00:00 2001 From: Benjamin Loison <12752145+Benjamin-Loison@users.noreply.github.com> Date: Wed, 5 Jul 2023 08:13:21 +0000 Subject: [PATCH 16/16] Remove unnecessary spaces in `README.md` and add `sh` syntax highlighting (#1270) --- README.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 093b0eef..6d857fb6 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ of all country codes.) * Register a number (with SMS verification) - signal-cli -a ACCOUNT register + signal-cli -a ACCOUNT register You can register Signal using a landline number. In this case you can skip SMS verification process and jump directly to the voice call verification by adding the `--voice` switch at the end of above register command. @@ -64,19 +64,21 @@ of all country codes.) * Verify the number using the code received via SMS or voice, optionally add `--pin PIN_CODE` if you've added a pin code to your account - signal-cli -a ACCOUNT verify CODE + signal-cli -a ACCOUNT verify CODE * Send a message - signal-cli -a ACCOUNT send -m "This is a message" RECIPIENT + ```sh + signal-cli -a ACCOUNT send -m "This is a message" RECIPIENT + ``` * Pipe the message content from another process. - uname -a | signal-cli -a ACCOUNT send --message-from-stdin RECIPIENT + uname -a | signal-cli -a ACCOUNT send --message-from-stdin RECIPIENT * Receive messages - signal-cli -a ACCOUNT receive + signal-cli -a ACCOUNT receive **Hint**: The Signal protocol expects that incoming messages are regularly received (using `daemon` or `receive` command). This is required for the encryption to work efficiently and for getting updates to groups, expiration timer @@ -86,8 +88,8 @@ and other features. The password and cryptographic keys are created when registering and stored in the current users home directory: - $XDG_DATA_HOME/signal-cli/data/ - $HOME/.local/share/signal-cli/data/ + $XDG_DATA_HOME/signal-cli/data/ + $HOME/.local/share/signal-cli/data/ ## Building @@ -96,27 +98,29 @@ version installed, you can replace `./gradlew` with `gradle` in the following st 1. Checkout the source somewhere on your filesystem with - git clone https://github.com/AsamK/signal-cli.git + git clone https://github.com/AsamK/signal-cli.git 2. Execute Gradle: - ./gradlew build + ./gradlew build 2a. Create shell wrapper in *build/install/signal-cli/bin*: - ./gradlew installDist + ./gradlew installDist 2b. Create tar file in *build/distributions*: - ./gradlew distTar + ./gradlew distTar 2c. Create a fat tar file in *build/libs/signal-cli-fat*: - ./gradlew fatJar + ./gradlew fatJar 2d. Compile and run signal-cli: - ./gradlew run --args="--help" + ```sh + ./gradlew run --args="--help" + ``` ### Building a native binary with GraalVM (EXPERIMENTAL) @@ -127,13 +131,13 @@ work in all situations. 2. [Install prerequisites](https://www.graalvm.org/reference-manual/native-image/#prerequisites) 3. Execute Gradle: - ./gradlew nativeCompile + ./gradlew nativeCompile The binary is available at *build/native/nativeCompile/signal-cli* ## FAQ and Troubleshooting -For frequently asked questions and issues have a look at the [wiki](https://github.com/AsamK/signal-cli/wiki/FAQ) +For frequently asked questions and issues have a look at the [wiki](https://github.com/AsamK/signal-cli/wiki/FAQ). ## License -- 2.51.0