From 3b685190a807dc1e91f169be716055a84e9ef7d0 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 15 Oct 2021 21:00:21 +0200 Subject: [PATCH 01/16] Add missing unexport groups call --- src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 2cf3c813..ae7fc0de 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -78,6 +78,7 @@ public class DbusSignalImpl implements Signal { public void close() { unExportDevices(); + unExportGroups(); } @Override -- 2.51.0 From 1c27723083ed98eba054794dbab5a6ed8e7c9d1b Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 15 Oct 2021 21:01:37 +0200 Subject: [PATCH 02/16] Update build pipeline to java 17 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28f5039e..1fb5f7f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ '11', '16' ] + java: [ '11', '17' ] steps: - uses: actions/checkout@v1 -- 2.51.0 From 0e56d1c32a266eeaa98f002e287e5a7a0cc3e2c5 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 15 Oct 2021 21:18:18 +0200 Subject: [PATCH 03/16] Update reflect-config --- graalvm-config-dir/reflect-config.json | 17 +++++++++++++++++ run_tests.sh | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 819eafa7..945da972 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -1491,6 +1491,12 @@ "allDeclaredMethods":true, "allDeclaredConstructors":true }, +{ + "name":"org.whispersystems.signalservice.api.profiles.SignalServiceProfile$Badge", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true +}, { "name":"org.whispersystems.signalservice.api.profiles.SignalServiceProfile$Capabilities", "allDeclaredFields":true, @@ -2181,6 +2187,17 @@ {"name":"uuids_"} ] }, +{ + "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Configuration", + "fields":[ + {"name":"bitField0_"}, + {"name":"linkPreviews_"}, + {"name":"provisioningVersion_"}, + {"name":"readReceipts_"}, + {"name":"typingIndicators_"}, + {"name":"unidentifiedDeliveryIndicators_"} + ] +}, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Contacts", "fields":[ diff --git a/run_tests.sh b/run_tests.sh index d306dfa9..7ed88da9 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -15,7 +15,7 @@ fi NUMBER_1="$1" NUMBER_2="$2" TEST_PIN_1=456test_pin_foo123 -NATIVE=1 +NATIVE=0 PATH_TEST_CONFIG="$PWD/build/test-config" PATH_MAIN="$PATH_TEST_CONFIG/main" -- 2.51.0 From cf31ad6ccf209f3d69f5ee9de4349f9141e60a4b Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 15 Oct 2021 21:18:47 +0200 Subject: [PATCH 04/16] Check if configuration message contains value before using it --- .../manager/helper/IncomingMessageHandler.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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 16f47d3c..47aa6156 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 @@ -358,11 +358,19 @@ public final class IncomingMessageHandler { if (syncMessage.getConfiguration().isPresent()) { final var configurationMessage = syncMessage.getConfiguration().get(); final var configurationStore = account.getConfigurationStore(); - configurationStore.setReadReceipts(configurationMessage.getReadReceipts().orNull()); - configurationStore.setLinkPreviews(configurationMessage.getLinkPreviews().orNull()); - configurationStore.setTypingIndicators(configurationMessage.getTypingIndicators().orNull()); - configurationStore.setUnidentifiedDeliveryIndicators(configurationMessage.getUnidentifiedDeliveryIndicators() - .orNull()); + if (configurationMessage.getReadReceipts().isPresent()) { + configurationStore.setReadReceipts(configurationMessage.getReadReceipts().get()); + } + if (configurationMessage.getLinkPreviews().isPresent()) { + configurationStore.setLinkPreviews(configurationMessage.getLinkPreviews().get()); + } + if (configurationMessage.getTypingIndicators().isPresent()) { + configurationStore.setTypingIndicators(configurationMessage.getTypingIndicators().get()); + } + if (configurationMessage.getUnidentifiedDeliveryIndicators().isPresent()) { + configurationStore.setUnidentifiedDeliveryIndicators(configurationMessage.getUnidentifiedDeliveryIndicators() + .get()); + } } return actions; } -- 2.51.0 From f57db857da1033d8bb65a9e9e80c3d9be1d75518 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 15 Oct 2021 22:36:57 +0200 Subject: [PATCH 05/16] Update CHANGELOG.md --- CHANGELOG.md | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26b96784..ab4bb65d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,25 @@ # Changelog ## [Unreleased] +**Attention**: Now requires native libzkgroup version 0.8 + +### Added +- New command `updateConfiguration` which allows setting configurations for linked devices +- Improved dbus daemon for group handling, groups are now exported as separate dbus objects +- Linked devices can be managed via dbus +- New dbus methods sendTyping and sendReadReceipt (Thanks @JtheSaw) +- New dbus methods submitRateLimitChallenge, isRegistered, listDevices, setExpirationTimer, sendContacts, sendSyncRequest, uploadStickerPack, setPin and removePin (Thanks @John Freed) +- New dbus method getSelfNumber + +### Fixed +- Do not send message resend request to own device +- Allow message from pending member to accept group invitations +- Fix issue which could cause signal-cli to repeatedly sending the same delivery receipts +- Reconnect websocket after connection loss + +### Changed +- Use new provisioning URL `sgnl://linkdevice` instead of `tsdevice:/` +- The gradle command to build a graalvm native image is now `./gradlew nativeCompile` ## [0.9.0] - 2021-09-12 **Attention**: Now requires native libsignal-client version 0.9 @@ -189,6 +208,142 @@ See https://github.com/AsamK/signal-cli/wiki/Provide-native-lib-for-libsignal fo ### Fixed - Issue where some messages were sent with an old counter index -## Older - -Look at the [release tags](https://github.com/AsamK/signal-cli/releases) for information about older releases. +## [0.6.11] - 2020-10-14 +- Fix issue with receiving message reactions + +## [0.6.10] - 2020-09-11 +- Fix issue when retrieving profiles +- Workaround issue with libzkgroup on platforms other than linux x86_64 + +## [0.6.9] - 2020-09-10 +- Minor bug fixes and improvements +- dbus functionality now works on FreeBSD +- signal-cli now requires Java 11 + +**Warning: this version only works on Linux x86_64, will be fixed in 0.6.10** + +## [0.6.8] - 2020-05-22 +- Switch to hypfvieh dbus-java, which doesn't require a native library anymore (drops requirement of libmatthew-unix-java) +- Bugfixes for messages with uuids +- Add `--expiration` parameter to `updateContact` command to set expiration timer + +## [0.6.7] - 2020-04-03 +- Send command now returns the timestamp of the sent message +- DBus daemon: Publish received sync message to SyncMessageReceived signal +- Fix issue with resolving e164/uuid addresses for sessions +- Fix pack key length for sticker upload + +## [0.6.6] - 2020-03-29 +- Added listContacts command +- Added block/unblock commands to block contacts and groups +- Added uploadStickerPack command to upload sticker packs (see man page for more details) +- Full support for sending and receiving unidentified sender messages +- Support for message reactions with emojis +- Internal: support recipients with uuids + +## [0.6.5] - 2019-11-11 +Supports receiving messages sent with unidentified sender + +## [0.6.4] - 2019-11-02 +- Fix rounding error for attachment ids in json output +- Add additional info to json output +- Add commands to update profile name and avatar +- Add command to update contact names + +## [0.6.3] - 2019-09-05 +Bug fixes and small improvements + +## [0.6.2] - 2018-12-16 +- Fixes sending of group messages + +## [0.6.1] - 2018-12-09 +- Added getGroupIds dbus command +- Use "NativePRNG" pseudo random number generator, if available +- Switch default data path: + `$XDG_DATA_HOME/signal-cli` (`$HOME/.local/share/signal-cli`) + Existing data paths will continue to work (used as fallback) + +## [0.6.0] - 2018-05-03 +- Simple json output +- dbus signal for receiving messages +- Registration lock PIN +- Output quoted message + +## [0.5.6] - 2017-06-16 +* new listGroups command +* Support for attachments with file names +* Support for complete contacts sync +* Support for contact verification sync +* DBus interface: + * Get/Set group info + * Get/Set contact info + +## [0.5.5] - 2017-02-18 +- fix receiving messages on linked devices +- add unregister command + +## [0.5.4] - 2017-02-17 +- Fix linking of new devices + +## [0.5.3] - 2017-01-29 +* New commandline paramter for receive: --ignore-attachments +* Updated dependencies + +## [0.5.2] - 2016-12-16 +- Add support for group info requests +- Improve closing of file streams + +## [0.5.1] - 2016-11-18 +- Support new safety numbers (https://whispersystems.org/blog/safety-number-updates/) +- Add a man page +- Support sending disappearing messages, if the recipient has activated it + +## [0.5.0] - 2016-08-29 +- Check if a number is registered on Signal, before adding it to a group +- Prevent sending to groups that the user has quit +- Commands to trust new identity keys (see README) +- Messages from untrusted identities are stored on disk and decrypted when the user trusts the identity +- Timestamps shown in ISO 8601 format + +## [0.4.1] - 2016-07-18 +- Fix issue with creating groups +- Lock config file to prevent parallel access by multiple instances of signal-cli +- Improve return codes, always return non-zero code, when sending failed + +## [0.4.0] - 2016-06-19 +- Linking to Signal-Desktop and Signal-Android is now possible (Provisioning) +- Added a contact store, mainly for syncing contacts with linked devices (editing not yet possible via cli) +- Avatars for groups and contacts are now stored (new folder "avatars" in the config path) + +## [0.3.1] - 2016-04-03 +- Fix running with Oracle JRE 8 +- Fix registering +- Fix unicode warning when compiling with non utf8 locale + +## [0.3.0] - 2016-04-02 +- Renamed textsecure-cli to signal-cli, following the rename of libtextsecure-java to libsignal-service-java +- The experimental dbus interface was also renamed to org.asamk.Signal +- Upload new prekeys to the server, when there are less than 20 left, prekeys are needed to create new sessions + +## [0.2.1] - 2016-02-10 +- Improve dbus service +- New command line argument --config to specify config directory + +## [0.2.0] - 2015-12-30 +Added an experimental dbus interface, for sending and receiving messages (The interface is unstable and may change with future releases). + +This release works with Java 7 and 8. + +## [0.1.0] - 2015-11-28 +Add support for creating/updating groups and sending to them + +## [0.0.5] - 2015-11-21 +- Add receive timeout commandline parameter +- Show message group info + +## [0.0.4] - 2015-09-22 + +## [0.0.3] - 2015-08-07 + +## [0.0.2] - 2015-07-08 +First release -- 2.51.0 From f5089789fb964403abeceef3be0cd98523a77dd4 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 16 Oct 2021 10:05:41 +0200 Subject: [PATCH 06/16] Bump version --- CHANGELOG.md | 4 +++- build.gradle.kts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab4bb65d..463419b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [Unreleased] + +## [0.9.1] - 2021-10-16 **Attention**: Now requires native libzkgroup version 0.8 ### Added @@ -14,7 +16,7 @@ ### Fixed - Do not send message resend request to own device - Allow message from pending member to accept group invitations -- Fix issue which could cause signal-cli to repeatedly sending the same delivery receipts +- Fix issue which could cause signal-cli to repeatedly send the same delivery receipts - Reconnect websocket after connection loss ### Changed diff --git a/build.gradle.kts b/build.gradle.kts index 5d18e9e0..a419df8a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { id("org.graalvm.buildtools.native") version "0.9.6" } -version = "0.9.0" +version = "0.9.1" java { sourceCompatibility = JavaVersion.VERSION_11 -- 2.51.0 From bff0030aed13173e6b90106730b60f09266c6fd7 Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 18 Oct 2021 16:47:26 +0200 Subject: [PATCH 07/16] Update reflect-config.json --- graalvm-config-dir/reflect-config.json | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 945da972..b1939327 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -316,6 +316,16 @@ "allDeclaredMethods":true, "allDeclaredClasses":true }, +{ + "name":"org.asamk.Signal$Device", + "allDeclaredMethods":true, + "allDeclaredClasses":true +}, +{ + "name":"org.asamk.Signal$Group", + "allDeclaredMethods":true, + "allDeclaredClasses":true +}, { "name":"org.asamk.Signal$MessageReceived", "allDeclaredConstructors":true, @@ -326,11 +336,24 @@ "allDeclaredConstructors":true, "allPublicConstructors":true }, +{ + "name":"org.asamk.Signal$StructDevice", + "allDeclaredFields":true +}, +{ + "name":"org.asamk.Signal$StructGroup", + "allDeclaredFields":true +}, { "name":"org.asamk.Signal$SyncMessageReceived", "allDeclaredConstructors":true, "allPublicConstructors":true }, +{ + "name":"org.asamk.SignalControl", + "allDeclaredMethods":true, + "allDeclaredClasses":true +}, { "name":"org.asamk.signal.commands.GetUserStatusCommand$JsonUserStatus", "allDeclaredFields":true, @@ -1114,6 +1137,15 @@ "allDeclaredMethods":true, "allDeclaredClasses":true }, +{ + "name":"org.freedesktop.dbus.interfaces.Properties", + "allDeclaredMethods":true, + "allDeclaredClasses":true +}, +{ + "name":"org.freedesktop.dbus.interfaces.Properties$PropertiesChanged", + "allPublicConstructors":true +}, { "name":"org.objectweb.asm.util.TraceMethodVisitor" }, -- 2.51.0 From d4b9356c5c05e36f217ad803d51b8808598d3ae7 Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 18 Oct 2021 16:48:07 +0200 Subject: [PATCH 08/16] Add missing null check Fixes #784 --- lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index 0deafc83..cc90de5c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -1081,11 +1081,12 @@ public class ManagerImpl implements Manager { } final var address = account.getRecipientStore().resolveRecipientAddress(identityInfo.getRecipientId()); + final var scannableFingerprint = identityHelper.computeSafetyNumberForScanning(identityInfo.getRecipientId(), + identityInfo.getIdentityKey()); return new Identity(address, identityInfo.getIdentityKey(), identityHelper.computeSafetyNumber(identityInfo.getRecipientId(), identityInfo.getIdentityKey()), - identityHelper.computeSafetyNumberForScanning(identityInfo.getRecipientId(), - identityInfo.getIdentityKey()).getSerialized(), + scannableFingerprint == null ? null : scannableFingerprint.getSerialized(), identityInfo.getTrustLevel(), identityInfo.getDateAdded()); } -- 2.51.0 From 3636023cb8f2202eb9b95f507b22ca3db2b6c3c8 Mon Sep 17 00:00:00 2001 From: AsamK Date: Tue, 19 Oct 2021 22:16:35 +0200 Subject: [PATCH 09/16] Improve error message when the last provisioning steps fail --- .../java/org/asamk/signal/manager/ProvisioningManager.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java index 226de9be..c7876569 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java @@ -134,16 +134,15 @@ public class ProvisioningManager { try { m.refreshPreKeys(); } catch (Exception e) { - logger.error("Failed to check new account state."); - throw e; + logger.error("Failed to refresh pre keys."); } logger.debug("Requesting sync data"); try { m.requestAllSyncData(); } catch (Exception e) { - logger.error("Failed to request sync messages from linked device."); - throw e; + logger.error( + "Failed to request sync messages from linked device, data can be requested again with `sendSyncRequest`."); } final var result = m; -- 2.51.0 From f5ba7894ae06909baeebfe9c23ccb9ab6b00a147 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 21 Oct 2021 21:01:48 +0200 Subject: [PATCH 10/16] Add setIgnoreAttachments method --- .../org/asamk/signal/manager/Manager.java | 8 +++----- .../org/asamk/signal/manager/ManagerImpl.java | 20 ++++++++++--------- .../asamk/signal/commands/DaemonCommand.java | 10 ++++++---- .../commands/JsonRpcDispatcherCommand.java | 9 ++++----- .../asamk/signal/commands/ReceiveCommand.java | 7 ++----- .../asamk/signal/dbus/DbusManagerImpl.java | 11 +++++----- 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 733e3dcc..f70c4e29 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -194,13 +194,11 @@ public interface Manager extends Closeable { void requestAllSyncData() throws IOException; void receiveMessages( - long timeout, - TimeUnit unit, - boolean returnOnTimeout, - boolean ignoreAttachments, - ReceiveMessageHandler handler + long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler ) throws IOException; + void setIgnoreAttachments(boolean ignoreAttachments); + boolean hasCaughtUpWithOldMessages(); boolean isContactBlocked(RecipientIdentifier.Single recipient); diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index cc90de5c..bec7f521 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -135,6 +135,7 @@ public class ManagerImpl implements Manager { private final Context context; private boolean hasCaughtUpWithOldMessages = false; + private boolean ignoreAttachments = false; ManagerImpl( SignalAccount account, @@ -824,10 +825,10 @@ public class ManagerImpl implements Manager { return registeredUsers; } - private void retryFailedReceivedMessages(ReceiveMessageHandler handler, boolean ignoreAttachments) { + private void retryFailedReceivedMessages(ReceiveMessageHandler handler) { Set queuedActions = new HashSet<>(); for (var cachedMessage : account.getMessageCache().getCachedMessages()) { - var actions = retryFailedReceivedMessage(handler, ignoreAttachments, cachedMessage); + var actions = retryFailedReceivedMessage(handler, cachedMessage); if (actions != null) { queuedActions.addAll(actions); } @@ -836,7 +837,7 @@ public class ManagerImpl implements Manager { } private List retryFailedReceivedMessage( - final ReceiveMessageHandler handler, final boolean ignoreAttachments, final CachedMessage cachedMessage + final ReceiveMessageHandler handler, final CachedMessage cachedMessage ) { var envelope = cachedMessage.loadEnvelope(); if (envelope == null) { @@ -873,13 +874,9 @@ public class ManagerImpl implements Manager { @Override public void receiveMessages( - long timeout, - TimeUnit unit, - boolean returnOnTimeout, - boolean ignoreAttachments, - ReceiveMessageHandler handler + long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler ) throws IOException { - retryFailedReceivedMessages(handler, ignoreAttachments); + retryFailedReceivedMessages(handler); Set queuedActions = new HashSet<>(); @@ -980,6 +977,11 @@ public class ManagerImpl implements Manager { queuedActions.clear(); } + @Override + public void setIgnoreAttachments(final boolean ignoreAttachments) { + this.ignoreAttachments = ignoreAttachments; + } + @Override public boolean hasCaughtUpWithOldMessages() { return hasCaughtUpWithOldMessages; diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index 02063b87..9997f56a 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -55,6 +55,7 @@ public class DaemonCommand implements MultiLocalCommand { final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); + m.setIgnoreAttachments(ignoreAttachments); DBusConnection.DBusBusType busType; if (Boolean.TRUE.equals(ns.getBoolean("system"))) { @@ -65,7 +66,7 @@ public class DaemonCommand implements MultiLocalCommand { try (var conn = DBusConnection.getConnection(busType)) { var objectPath = DbusConfig.getObjectPath(); - var t = run(conn, objectPath, m, outputWriter, ignoreAttachments); + var t = run(conn, objectPath, m, outputWriter); conn.requestBusName(DbusConfig.getBusname()); @@ -94,9 +95,10 @@ public class DaemonCommand implements MultiLocalCommand { try (var conn = DBusConnection.getConnection(busType)) { final var signalControl = new DbusSignalControlImpl(c, m -> { + m.setIgnoreAttachments(ignoreAttachments); try { final var objectPath = DbusConfig.getObjectPath(m.getSelfNumber()); - return run(conn, objectPath, m, outputWriter, ignoreAttachments); + return run(conn, objectPath, m, outputWriter); } catch (DBusException e) { logger.error("Failed to export object", e); return null; @@ -118,7 +120,7 @@ public class DaemonCommand implements MultiLocalCommand { } private Thread run( - DBusConnection conn, String objectPath, Manager m, OutputWriter outputWriter, boolean ignoreAttachments + DBusConnection conn, String objectPath, Manager m, OutputWriter outputWriter ) throws DBusException { final var signal = new DbusSignalImpl(m, conn, objectPath); conn.exportObject(signal); @@ -133,7 +135,7 @@ public class DaemonCommand implements MultiLocalCommand { final var receiveMessageHandler = outputWriter instanceof JsonWriter ? new JsonDbusReceiveMessageHandler(m, (JsonWriter) outputWriter, conn, objectPath) : new DbusReceiveMessageHandler(m, (PlainTextWriter) outputWriter, conn, objectPath); - m.receiveMessages(1, TimeUnit.HOURS, false, ignoreAttachments, receiveMessageHandler); + m.receiveMessages(1, TimeUnit.HOURS, false, receiveMessageHandler); break; } catch (IOException e) { logger.warn("Receiving messages failed, retrying", e); diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index 9af67322..349bd0c4 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -66,6 +66,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { final boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); + m.setIgnoreAttachments(ignoreAttachments); final var objectMapper = Util.createJsonObjectMapper(); final var jsonRpcSender = new JsonRpcSender((JsonWriter) outputWriter); @@ -73,7 +74,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { final var receiveThread = receiveMessages(s -> jsonRpcSender.sendRequest(JsonRpcRequest.forNotification( "receive", objectMapper.valueToTree(s), - null)), m, ignoreAttachments); + null)), m); // Maybe this should be handled inside the Manager while (!m.hasCaughtUpWithOldMessages()) { @@ -167,14 +168,12 @@ public class JsonRpcDispatcherCommand implements LocalCommand { command.handleCommand(requestParams, m, outputWriter); } - private Thread receiveMessages( - JsonWriter jsonWriter, Manager m, boolean ignoreAttachments - ) { + private Thread receiveMessages(JsonWriter jsonWriter, Manager m) { final var thread = new Thread(() -> { while (!Thread.interrupted()) { try { final var receiveMessageHandler = new JsonReceiveMessageHandler(m, jsonWriter); - m.receiveMessages(1, TimeUnit.HOURS, false, ignoreAttachments, receiveMessageHandler); + m.receiveMessages(1, TimeUnit.HOURS, false, receiveMessageHandler); break; } catch (IOException e) { logger.warn("Receiving messages failed, retrying", e); diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index 4686f26d..b4797be3 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -148,14 +148,11 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand { timeout = 3600; } boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); + m.setIgnoreAttachments(ignoreAttachments); try { final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m, (JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter); - m.receiveMessages((long) (timeout * 1000), - TimeUnit.MILLISECONDS, - returnOnTimeout, - ignoreAttachments, - handler); + m.receiveMessages((long) (timeout * 1000), TimeUnit.MILLISECONDS, returnOnTimeout, handler); } catch (IOException e) { throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e); } diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 59422e69..93d36888 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -425,15 +425,16 @@ public class DbusManagerImpl implements Manager { @Override public void receiveMessages( - final long timeout, - final TimeUnit unit, - final boolean returnOnTimeout, - final boolean ignoreAttachments, - final ReceiveMessageHandler handler + final long timeout, final TimeUnit unit, final boolean returnOnTimeout, final ReceiveMessageHandler handler ) throws IOException { throw new UnsupportedOperationException(); } + @Override + public void setIgnoreAttachments(final boolean ignoreAttachments) { + throw new UnsupportedOperationException(); + } + @Override public boolean hasCaughtUpWithOldMessages() { throw new UnsupportedOperationException(); -- 2.51.0 From 430c155f7ee0a13b63cd37856e94853eb218f876 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 21 Oct 2021 21:02:02 +0200 Subject: [PATCH 11/16] Fix comment --- .../java/org/asamk/signal/commands/JsonRpcLocalCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java index 5b926732..47229538 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java @@ -32,7 +32,7 @@ public interface JsonRpcLocalCommand extends JsonRpcCommand> } /** - * Namepace implementation, that defaults booleans to false and converts camel case keys to dashed strings + * Namespace implementation, that has plural handling for list arguments and converts camel case keys to dashed strings */ final class JsonRpcNamespace extends Namespace { -- 2.51.0 From 5c389c875d91bacba127d0e9cbdc1746b022e5aa Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 21 Oct 2021 21:19:14 +0200 Subject: [PATCH 12/16] Split receiveMessages method --- .../main/java/org/asamk/signal/manager/Manager.java | 12 +++++++++--- .../java/org/asamk/signal/manager/ManagerImpl.java | 11 ++++++++++- .../org/asamk/signal/commands/DaemonCommand.java | 3 +-- .../signal/commands/JsonRpcDispatcherCommand.java | 3 +-- .../org/asamk/signal/commands/ReceiveCommand.java | 11 +++++------ .../java/org/asamk/signal/dbus/DbusManagerImpl.java | 7 ++++++- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index f70c4e29..ac0cc02f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -193,9 +193,15 @@ public interface Manager extends Closeable { void requestAllSyncData() throws IOException; - void receiveMessages( - long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler - ) throws IOException; + /** + * Receive new messages from server, returns if no new message arrive in a timespan of timeout. + */ + void receiveMessages(long timeout, TimeUnit unit, ReceiveMessageHandler handler) throws IOException; + + /** + * Receive new messages from server, returns only if the thread is interrupted. + */ + void receiveMessages(ReceiveMessageHandler handler) throws IOException; void setIgnoreAttachments(boolean ignoreAttachments); diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index bec7f521..0421a401 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -873,7 +873,16 @@ public class ManagerImpl implements Manager { } @Override - public void receiveMessages( + public void receiveMessages(long timeout, TimeUnit unit, ReceiveMessageHandler handler) throws IOException { + receiveMessages(timeout, unit, true, handler); + } + + @Override + public void receiveMessages(ReceiveMessageHandler handler) throws IOException { + receiveMessages(1L, TimeUnit.HOURS, false, handler); + } + + private void receiveMessages( long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler ) throws IOException { retryFailedReceivedMessages(handler); diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index 9997f56a..9627d9fb 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -23,7 +23,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.List; -import java.util.concurrent.TimeUnit; public class DaemonCommand implements MultiLocalCommand { @@ -135,7 +134,7 @@ public class DaemonCommand implements MultiLocalCommand { final var receiveMessageHandler = outputWriter instanceof JsonWriter ? new JsonDbusReceiveMessageHandler(m, (JsonWriter) outputWriter, conn, objectPath) : new DbusReceiveMessageHandler(m, (PlainTextWriter) outputWriter, conn, objectPath); - m.receiveMessages(1, TimeUnit.HOURS, false, receiveMessageHandler); + m.receiveMessages(receiveMessageHandler); break; } catch (IOException e) { logger.warn("Receiving messages failed, retrying", e); diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index 349bd0c4..2a95a880 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -33,7 +33,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; public class JsonRpcDispatcherCommand implements LocalCommand { @@ -173,7 +172,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { while (!Thread.interrupted()) { try { final var receiveMessageHandler = new JsonReceiveMessageHandler(m, jsonWriter); - m.receiveMessages(1, TimeUnit.HOURS, false, receiveMessageHandler); + m.receiveMessages(receiveMessageHandler); break; } catch (IOException e) { logger.warn("Receiving messages failed, retrying", e); diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index b4797be3..e72d8090 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -142,17 +142,16 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand { final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { double timeout = ns.getDouble("timeout"); - var returnOnTimeout = true; - if (timeout < 0) { - returnOnTimeout = false; - timeout = 3600; - } boolean ignoreAttachments = Boolean.TRUE.equals(ns.getBoolean("ignore-attachments")); m.setIgnoreAttachments(ignoreAttachments); try { final var handler = outputWriter instanceof JsonWriter ? new JsonReceiveMessageHandler(m, (JsonWriter) outputWriter) : new ReceiveMessageHandler(m, (PlainTextWriter) outputWriter); - m.receiveMessages((long) (timeout * 1000), TimeUnit.MILLISECONDS, returnOnTimeout, handler); + if (timeout < 0) { + m.receiveMessages(handler); + } else { + m.receiveMessages((long) (timeout * 1000), TimeUnit.MILLISECONDS, handler); + } } catch (IOException e) { throw new IOErrorException("Error while receiving messages: " + e.getMessage(), e); } diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 93d36888..31e29ac9 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -423,9 +423,14 @@ public class DbusManagerImpl implements Manager { signal.sendSyncRequest(); } + @Override + public void receiveMessages(final ReceiveMessageHandler handler) throws IOException { + throw new UnsupportedOperationException(); + } + @Override public void receiveMessages( - final long timeout, final TimeUnit unit, final boolean returnOnTimeout, final ReceiveMessageHandler handler + final long timeout, final TimeUnit unit, final ReceiveMessageHandler handler ) throws IOException { throw new UnsupportedOperationException(); } -- 2.51.0 From fc0a9b4102feef185e4a09881e3b079b82df3da7 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 21 Oct 2021 22:59:52 +0200 Subject: [PATCH 13/16] Move receive thread handling to manager --- .../org/asamk/signal/manager/Manager.java | 14 +++ .../org/asamk/signal/manager/ManagerImpl.java | 112 ++++++++++++++++++ .../asamk/signal/commands/DaemonCommand.java | 31 ++--- .../commands/JsonRpcDispatcherCommand.java | 33 +----- .../asamk/signal/dbus/DbusManagerImpl.java | 15 +++ 5 files changed, 156 insertions(+), 49 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index ac0cc02f..0a8762d9 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -193,6 +193,20 @@ public interface Manager extends Closeable { void requestAllSyncData() throws IOException; + /** + * Add a handler to receive new messages. + * Will start receiving messages from server, if not already started. + */ + void addReceiveHandler(ReceiveMessageHandler handler); + + /** + * Remove a handler to receive new messages. + * Will stop receiving messages from server, if this was the last registered receiver. + */ + void removeReceiveHandler(ReceiveMessageHandler handler); + + boolean isReceiving(); + /** * Receive new messages from server, returns if no new message arrive in a timespan of timeout. */ diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index 0421a401..2ea96591 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -137,6 +137,10 @@ public class ManagerImpl implements Manager { private boolean hasCaughtUpWithOldMessages = false; private boolean ignoreAttachments = false; + private Thread receiveThread; + private final Set messageHandlers = new HashSet<>(); + private boolean isReceivingSynchronous; + ManagerImpl( SignalAccount account, PathConfig pathConfig, @@ -872,6 +876,88 @@ public class ManagerImpl implements Manager { return actions; } + @Override + public void addReceiveHandler(final ReceiveMessageHandler handler) { + if (isReceivingSynchronous) { + throw new IllegalStateException("Already receiving message synchronously."); + } + synchronized (messageHandlers) { + messageHandlers.add(handler); + + startReceiveThreadIfRequired(); + } + } + + private void startReceiveThreadIfRequired() { + if (receiveThread != null) { + return; + } + receiveThread = new Thread(() -> { + while (!Thread.interrupted()) { + try { + receiveMessagesInternal(1L, TimeUnit.HOURS, false, (envelope, decryptedContent, e) -> { + synchronized (messageHandlers) { + for (ReceiveMessageHandler h : messageHandlers) { + try { + h.handleMessage(envelope, decryptedContent, e); + } catch (Exception ex) { + logger.warn("Message handler failed, ignoring", ex); + } + } + } + }); + break; + } catch (IOException e) { + logger.warn("Receiving messages failed, retrying", e); + } + } + hasCaughtUpWithOldMessages = false; + synchronized (messageHandlers) { + receiveThread = null; + + // Check if in the meantime another handler has been registered + if (!messageHandlers.isEmpty()) { + startReceiveThreadIfRequired(); + } + } + }); + + receiveThread.start(); + } + + @Override + public void removeReceiveHandler(final ReceiveMessageHandler handler) { + final Thread thread; + synchronized (messageHandlers) { + thread = receiveThread; + receiveThread = null; + messageHandlers.remove(handler); + if (!messageHandlers.isEmpty() || isReceivingSynchronous) { + return; + } + } + + stopReceiveThread(thread); + } + + private void stopReceiveThread(final Thread thread) { + thread.interrupt(); + try { + thread.join(); + } catch (InterruptedException ignored) { + } + } + + @Override + public boolean isReceiving() { + if (isReceivingSynchronous) { + return true; + } + synchronized (messageHandlers) { + return messageHandlers.size() > 0; + } + } + @Override public void receiveMessages(long timeout, TimeUnit unit, ReceiveMessageHandler handler) throws IOException { receiveMessages(timeout, unit, true, handler); @@ -884,6 +970,23 @@ public class ManagerImpl implements Manager { private void receiveMessages( long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler + ) throws IOException { + if (isReceiving()) { + throw new IllegalStateException("Already receiving message."); + } + isReceivingSynchronous = true; + receiveThread = Thread.currentThread(); + try { + receiveMessagesInternal(timeout, unit, returnOnTimeout, handler); + } finally { + receiveThread = null; + hasCaughtUpWithOldMessages = false; + isReceivingSynchronous = false; + } + } + + private void receiveMessagesInternal( + long timeout, TimeUnit unit, boolean returnOnTimeout, ReceiveMessageHandler handler ) throws IOException { retryFailedReceivedMessages(handler); @@ -1249,6 +1352,15 @@ public class ManagerImpl implements Manager { } private void close(boolean closeAccount) throws IOException { + Thread thread; + synchronized (messageHandlers) { + messageHandlers.clear(); + thread = receiveThread; + receiveThread = null; + } + if (thread != null) { + stopReceiveThread(thread); + } executor.shutdown(); dependencies.getSignalWebSocket().disconnect(); diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index 9627d9fb..a121c7e9 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -71,6 +71,9 @@ public class DaemonCommand implements MultiLocalCommand { try { t.join(); + synchronized (this) { + wait(); + } } catch (InterruptedException ignored) { } } catch (DBusException | IOException e) { @@ -128,27 +131,11 @@ public class DaemonCommand implements MultiLocalCommand { logger.info("Exported dbus object: " + objectPath); - final var thread = new Thread(() -> { - while (!Thread.interrupted()) { - try { - final var receiveMessageHandler = outputWriter instanceof JsonWriter - ? new JsonDbusReceiveMessageHandler(m, (JsonWriter) outputWriter, conn, objectPath) - : new DbusReceiveMessageHandler(m, (PlainTextWriter) outputWriter, conn, objectPath); - m.receiveMessages(receiveMessageHandler); - break; - } catch (IOException e) { - logger.warn("Receiving messages failed, retrying", e); - } - } - try { - initThread.join(); - } catch (InterruptedException ignored) { - } - signal.close(); - }); - - thread.start(); - - return thread; + final var receiveMessageHandler = outputWriter instanceof JsonWriter ? new JsonDbusReceiveMessageHandler(m, + (JsonWriter) outputWriter, + conn, + objectPath) : new DbusReceiveMessageHandler(m, (PlainTextWriter) outputWriter, conn, objectPath); + m.addReceiveHandler(receiveMessageHandler); + return initThread; } } diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index 2a95a880..6e0c3173 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -70,10 +70,11 @@ public class JsonRpcDispatcherCommand implements LocalCommand { final var objectMapper = Util.createJsonObjectMapper(); final var jsonRpcSender = new JsonRpcSender((JsonWriter) outputWriter); - final var receiveThread = receiveMessages(s -> jsonRpcSender.sendRequest(JsonRpcRequest.forNotification( - "receive", - objectMapper.valueToTree(s), - null)), m); + final var receiveMessageHandler = new JsonReceiveMessageHandler(m, + s -> jsonRpcSender.sendRequest(JsonRpcRequest.forNotification("receive", + objectMapper.valueToTree(s), + null))); + m.addReceiveHandler(receiveMessageHandler); // Maybe this should be handled inside the Manager while (!m.hasCaughtUpWithOldMessages()) { @@ -97,11 +98,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { jsonRpcReader.readRequests((method, params) -> handleRequest(m, objectMapper, method, params), response -> logger.debug("Received unexpected response for id {}", response.getId())); - receiveThread.interrupt(); - try { - receiveThread.join(); - } catch (InterruptedException ignored) { - } + m.removeReceiveHandler(receiveMessageHandler); } private JsonNode handleRequest( @@ -166,22 +163,4 @@ public class JsonRpcDispatcherCommand implements LocalCommand { } command.handleCommand(requestParams, m, outputWriter); } - - private Thread receiveMessages(JsonWriter jsonWriter, Manager m) { - final var thread = new Thread(() -> { - while (!Thread.interrupted()) { - try { - final var receiveMessageHandler = new JsonReceiveMessageHandler(m, jsonWriter); - m.receiveMessages(receiveMessageHandler); - break; - } catch (IOException e) { - logger.warn("Receiving messages failed, retrying", e); - } - } - }); - - thread.start(); - - return thread; - } } diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index 31e29ac9..fcbadd38 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -423,6 +423,21 @@ public class DbusManagerImpl implements Manager { signal.sendSyncRequest(); } + @Override + public void addReceiveHandler(final ReceiveMessageHandler handler) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeReceiveHandler(final ReceiveMessageHandler handler) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isReceiving() { + throw new UnsupportedOperationException(); + } + @Override public void receiveMessages(final ReceiveMessageHandler handler) throws IOException { throw new UnsupportedOperationException(); -- 2.51.0 From 004293362eed2871e2645c5388e7a8a62a754f73 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 24 Oct 2021 19:16:01 +0200 Subject: [PATCH 14/16] Update libsignal-service-java --- graalvm-config-dir/jni-config.json | 125 +- graalvm-config-dir/proxy-config.json | 8 +- graalvm-config-dir/reflect-config.json | 1765 +++++++++-------- graalvm-config-dir/resource-config.json | 116 +- lib/build.gradle.kts | 2 +- .../signal/manager/helper/ProfileHelper.java | 13 +- run_tests.sh | 25 +- 7 files changed, 1081 insertions(+), 973 deletions(-) diff --git a/graalvm-config-dir/jni-config.json b/graalvm-config-dir/jni-config.json index 8c8c30f5..bceda6f3 100644 --- a/graalvm-config-dir/jni-config.json +++ b/graalvm-config-dir/jni-config.json @@ -1,29 +1,33 @@ [ +{ + "name":"java.lang.Boolean", + "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]} +, { "name":"java.lang.ClassLoader", "methods":[ {"name":"getPlatformClassLoader","parameterTypes":[] }, {"name":"loadClass","parameterTypes":["java.lang.String"] } - ] -}, + ]} +, { "name":"java.lang.IllegalStateException", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, { - "name":"java.lang.NoSuchMethodError" -}, + "name":"java.lang.NoSuchMethodError"} +, { "name":"java.lang.UnsatisfiedLinkError", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, { "name":"java.util.UUID", - "methods":[{"name":"","parameterTypes":["long","long"] }] -}, + "methods":[{"name":"","parameterTypes":["long","long"] }]} +, { - "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" -}, + "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"} +, { "name":"org.asamk.signal.manager.storage.protocol.SignalProtocolStore", "methods":[ @@ -39,106 +43,111 @@ {"name":"saveIdentity","parameterTypes":["org.whispersystems.libsignal.SignalProtocolAddress","org.whispersystems.libsignal.IdentityKey"] }, {"name":"storeSenderKey","parameterTypes":["org.whispersystems.libsignal.SignalProtocolAddress","java.util.UUID","org.whispersystems.libsignal.groups.state.SenderKeyRecord"] }, {"name":"storeSession","parameterTypes":["org.whispersystems.libsignal.SignalProtocolAddress","org.whispersystems.libsignal.state.SessionRecord"] } - ] -}, + ]} +, { "name":"org.graalvm.nativebridge.jni.JNIExceptionWrapperEntryPoints", - "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }] -}, + "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }]} +, { "name":"org.whispersystems.libsignal.DuplicateMessageException", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, { "name":"org.whispersystems.libsignal.IdentityKey", "methods":[ {"name":"","parameterTypes":["byte[]"] }, {"name":"serialize","parameterTypes":[] } - ] -}, + ]} +, { "name":"org.whispersystems.libsignal.IdentityKeyPair", - "methods":[{"name":"serialize","parameterTypes":[] }] -}, + "methods":[{"name":"serialize","parameterTypes":[] }]} +, { "name":"org.whispersystems.libsignal.InvalidMessageException", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, { "name":"org.whispersystems.libsignal.SignalProtocolAddress", - "methods":[{"name":"","parameterTypes":["java.lang.String","int"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String","int"] }]} +, { "name":"org.whispersystems.libsignal.UntrustedIdentityException", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, { "name":"org.whispersystems.libsignal.groups.state.SenderKeyRecord", "methods":[ {"name":"","parameterTypes":["long"] }, {"name":"nativeHandle","parameterTypes":[] } - ] -}, + ]} +, { - "name":"org.whispersystems.libsignal.groups.state.SenderKeyStore" -}, + "name":"org.whispersystems.libsignal.groups.state.SenderKeyStore"} +, { "name":"org.whispersystems.libsignal.logging.Log", - "methods":[{"name":"log","parameterTypes":["int","java.lang.String","java.lang.String"] }] -}, + "methods":[{"name":"log","parameterTypes":["int","java.lang.String","java.lang.String"] }]} +, { "name":"org.whispersystems.libsignal.protocol.PlaintextContent", - "methods":[{"name":"nativeHandle","parameterTypes":[] }] -}, + "methods":[{"name":"nativeHandle","parameterTypes":[] }]} +, { "name":"org.whispersystems.libsignal.protocol.PreKeySignalMessage", + "fields":[{"name":"unsafeHandle"}], "methods":[ {"name":"","parameterTypes":["long"] }, {"name":"nativeHandle","parameterTypes":[] } - ] -}, + ]} +, { - "name":"org.whispersystems.libsignal.protocol.SenderKeyMessage" -}, + "name":"org.whispersystems.libsignal.protocol.SenderKeyMessage"} +, { "name":"org.whispersystems.libsignal.protocol.SignalMessage", + "fields":[{"name":"unsafeHandle"}], "methods":[ {"name":"","parameterTypes":["long"] }, {"name":"nativeHandle","parameterTypes":[] } - ] -}, + ]} +, { - "name":"org.whispersystems.libsignal.state.IdentityKeyStore" -}, + "name":"org.whispersystems.libsignal.state.IdentityKeyStore"} +, { "name":"org.whispersystems.libsignal.state.IdentityKeyStore$Direction", "fields":[ {"name":"RECEIVING"}, {"name":"SENDING"} - ] -}, + ]} +, { "name":"org.whispersystems.libsignal.state.PreKeyRecord", - "methods":[{"name":"nativeHandle","parameterTypes":[] }] -}, + "fields":[{"name":"unsafeHandle"}], + "methods":[{"name":"nativeHandle","parameterTypes":[] }]} +, { - "name":"org.whispersystems.libsignal.state.PreKeyStore" -}, + "name":"org.whispersystems.libsignal.state.PreKeyStore"} +, { "name":"org.whispersystems.libsignal.state.SessionRecord", + "fields":[{"name":"unsafeHandle"}], "methods":[ {"name":"","parameterTypes":["byte[]"] }, {"name":"nativeHandle","parameterTypes":[] } - ] -}, + ]} +, { - "name":"org.whispersystems.libsignal.state.SessionStore" -}, + "name":"org.whispersystems.libsignal.state.SessionStore"} +, { "name":"org.whispersystems.libsignal.state.SignedPreKeyRecord", - "methods":[{"name":"nativeHandle","parameterTypes":[] }] -}, + "fields":[{"name":"unsafeHandle"}], + "methods":[{"name":"nativeHandle","parameterTypes":[] }]} +, { - "name":"org.whispersystems.libsignal.state.SignedPreKeyStore" -} + "name":"org.whispersystems.libsignal.state.SignedPreKeyStore"} + ] diff --git a/graalvm-config-dir/proxy-config.json b/graalvm-config-dir/proxy-config.json index 7abe9244..be8f8d3c 100644 --- a/graalvm-config-dir/proxy-config.json +++ b/graalvm-config-dir/proxy-config.json @@ -1,4 +1,8 @@ [ - ["org.asamk.Signal"], - ["org.freedesktop.dbus.interfaces.DBus"] + { + "interfaces":["org.asamk.Signal"]} + , + { + "interfaces":["org.freedesktop.dbus.interfaces.DBus"]} + ] diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index b1939327..aa3effb8 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -1,1162 +1,1187 @@ [ +{ + "name":"[B", + "queryAllDeclaredMethods":true, + "queryAllPublicMethods":true} +, +{ + "name":"[C"} +, +{ + "name":"[I", + "queryAllDeclaredMethods":true, + "queryAllPublicMethods":true} +, +{ + "name":"[J"} +, +{ + "name":"[Lorg.whispersystems.signalservice.api.groupsv2.TemporalCredential;"} +, { "name":"byte[]", "allDeclaredMethods":true, - "allPublicMethods":true -}, + "allPublicMethods":true} +, { - "name":"char[]" -}, + "name":"char[]"} +, { "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"com.google.protobuf.AbstractProtobufList", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"com.google.protobuf.Internal$LongList", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"com.google.protobuf.Internal$ProtobufList", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"com.google.protobuf.LongArrayList", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"com.google.protobuf.PrimitiveNonBoxingCollection", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"com.kenai.jffi.Invoker", "methods":[ {"name":"invokeI6","parameterTypes":["com.kenai.jffi.CallContext","long","int","int","int","int","int","int"] }, {"name":"invokeL6","parameterTypes":["com.kenai.jffi.CallContext","long","long","long","long","long","long","long"] }, {"name":"invokeN6","parameterTypes":["com.kenai.jffi.CallContext","long","long","long","long","long","long","long"] } - ] -}, + ]} +, { "name":"com.kenai.jffi.Version", "fields":[ {"name":"MAJOR"}, {"name":"MICRO"}, {"name":"MINOR"} - ] -}, + ]} +, { "name":"com.kenai.jffi.internal.StubLoader", - "methods":[{"name":"isLoaded","parameterTypes":[] }] -}, + "methods":[{"name":"isLoaded","parameterTypes":[] }]} +, { "name":"com.sun.crypto.provider.AESCipher$General", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"com.sun.crypto.provider.DHParameters", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"com.sun.crypto.provider.HmacCore$HmacSHA256", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, +{ + "name":"com.sun.crypto.provider.HmacCore$HmacSHA384", + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"com.sun.crypto.provider.TlsKeyMaterialGenerator", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"com.sun.crypto.provider.TlsMasterSecretGenerator", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"com.sun.crypto.provider.TlsPrfGenerator$V12", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"int", "allDeclaredMethods":true, - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"int[]", "allDeclaredMethods":true, - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"java.io.Serializable", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.lang.Boolean", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"java.lang.Comparable", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.lang.Double", - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]} +, { "name":"java.lang.Enum", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.lang.Integer", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true, - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, + "allDeclaredConstructors":true} +, { "name":"java.lang.Iterable", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.lang.Long", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true, - "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }] -}, + "allDeclaredConstructors":true} +, { "name":"java.lang.Number", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.lang.String", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"java.lang.reflect.Method", - "methods":[{"name":"isDefault","parameterTypes":[] }] -}, + "methods":[{"name":"isDefault","parameterTypes":[] }]} +, { "name":"java.nio.Buffer", "allDeclaredMethods":true, - "fields":[{"name":"address"}] -}, + "fields":[{"name":"address"}]} +, { "name":"java.nio.ByteBuffer", "allDeclaredMethods":true, - "allPublicMethods":true -}, + "allPublicMethods":true} +, { - "name":"java.security.KeyStoreSpi" -}, + "name":"java.security.KeyStoreSpi"} +, { - "name":"java.security.SecureRandomParameters" -}, + "name":"java.security.SecureRandomParameters"} +, { - "name":"java.security.cert.PKIXRevocationChecker" -}, + "name":"java.security.cert.PKIXRevocationChecker"} +, { - "name":"java.security.interfaces.ECPrivateKey" -}, + "name":"java.security.interfaces.ECPrivateKey"} +, { - "name":"java.security.interfaces.ECPublicKey" -}, + "name":"java.security.interfaces.ECPublicKey"} +, { - "name":"java.security.interfaces.RSAPrivateKey" -}, + "name":"java.security.interfaces.RSAPrivateKey"} +, { - "name":"java.security.interfaces.RSAPublicKey" -}, + "name":"java.security.interfaces.RSAPublicKey"} +, { "name":"java.util.AbstractCollection", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.util.AbstractList", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.util.ArrayList", "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"java.util.Collection", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.util.HashSet", "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"java.util.LinkedHashMap", "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"java.util.List", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.util.Locale", - "methods":[{"name":"getUnicodeLocaleType","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"getUnicodeLocaleType","parameterTypes":["java.lang.String"] }]} +, { "name":"java.util.RandomAccess", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"java.util.UUID", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, +{ + "name":"javax.security.auth.x500.X500Principal", + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }]} +, { - "name":"jnr.constants.platform.linux.ProtocolFamily" -}, + "name":"jnr.constants.platform.linux.ProtocolFamily"} +, { - "name":"jnr.constants.platform.linux.Shutdown" -}, + "name":"jnr.constants.platform.linux.Shutdown"} +, { - "name":"jnr.constants.platform.linux.Sock" -}, + "name":"jnr.constants.platform.linux.Sock"} +, { - "name":"jnr.constants.platform.linux.SocketLevel" -}, + "name":"jnr.constants.platform.linux.SocketLevel"} +, { - "name":"jnr.constants.platform.linux.SocketOption" -}, + "name":"jnr.constants.platform.linux.SocketOption"} +, { "name":"jnr.enxio.channels.Native$LibC", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.enxio.channels.Native$LibC$jnr$ffi$1", - "methods":[{"name":"","parameterTypes":["jnr.ffi.Runtime","jnr.ffi.provider.jffi.NativeLibrary","java.lang.Object[]"] }] -}, + "methods":[{"name":"","parameterTypes":["jnr.ffi.Runtime","jnr.ffi.provider.jffi.NativeLibrary","java.lang.Object[]"] }]} +, { "name":"jnr.ffi.Pointer", "allDeclaredMethods":true, - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.ffi.StructLayout$gid_t", - "methods":[{"name":"","parameterTypes":["jnr.ffi.StructLayout"] }] -}, + "methods":[{"name":"","parameterTypes":["jnr.ffi.StructLayout"] }]} +, { "name":"jnr.ffi.byref.IntByReference", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.ffi.provider.converters.ByReferenceParameterConverter", - "methods":[{"name":"nativeType","parameterTypes":[] }] -}, + "methods":[{"name":"nativeType","parameterTypes":[] }]} +, { "name":"jnr.ffi.provider.converters.ByReferenceParameterConverter$Out", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.ffi.provider.converters.StringResultConverter", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.ffi.provider.converters.StructByReferenceToNativeConverter", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.ffi.provider.jffi.BufferParameterStrategy", - "methods":[{"name":"address","parameterTypes":["java.nio.Buffer"] }] -}, + "methods":[{"name":"address","parameterTypes":["java.nio.Buffer"] }]} +, { "name":"jnr.ffi.provider.jffi.PointerParameterStrategy", - "methods":[{"name":"address","parameterTypes":["jnr.ffi.Pointer"] }] -}, + "methods":[{"name":"address","parameterTypes":["jnr.ffi.Pointer"] }]} +, { "name":"jnr.ffi.provider.jffi.Provider", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"jnr.ffi.provider.jffi.platform.x86_64.linux.TypeAliases", - "fields":[{"name":"ALIASES"}] -}, + "fields":[{"name":"ALIASES"}]} +, { "name":"jnr.posix.Timeval", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.unixsocket.Native$LibC", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"jnr.unixsocket.Native$LibC$jnr$ffi$0", - "methods":[{"name":"","parameterTypes":["jnr.ffi.Runtime","jnr.ffi.provider.jffi.NativeLibrary","java.lang.Object[]"] }] -}, + "methods":[{"name":"","parameterTypes":["jnr.ffi.Runtime","jnr.ffi.provider.jffi.NativeLibrary","java.lang.Object[]"] }]} +, { "name":"jnr.unixsocket.SockAddrUnix", - "allPublicMethods":true -}, + "allPublicMethods":true} +, { "name":"long", "allDeclaredMethods":true, - "allPublicMethods":true -}, + "allPublicMethods":true} +, { - "name":"long[]" -}, + "name":"long[]"} +, { "name":"org.asamk.Signal", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.asamk.Signal$Device", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.asamk.Signal$Group", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.asamk.Signal$MessageReceived", "allDeclaredConstructors":true, - "allPublicConstructors":true -}, + "allPublicConstructors":true} +, { "name":"org.asamk.Signal$ReceiptReceived", "allDeclaredConstructors":true, - "allPublicConstructors":true -}, + "allPublicConstructors":true} +, { "name":"org.asamk.Signal$StructDevice", - "allDeclaredFields":true -}, + "allDeclaredFields":true} +, { "name":"org.asamk.Signal$StructGroup", - "allDeclaredFields":true -}, + "allDeclaredFields":true} +, { "name":"org.asamk.Signal$SyncMessageReceived", "allDeclaredConstructors":true, - "allPublicConstructors":true -}, + "allPublicConstructors":true} +, { "name":"org.asamk.SignalControl", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.asamk.signal.commands.GetUserStatusCommand$JsonUserStatus", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.commands.ListContactsCommand$JsonContact", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.commands.ListDevicesCommand$JsonDevice", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.commands.ListGroupsCommand$JsonGroup", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.commands.ListGroupsCommand$JsonGroupMember", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.commands.ListIdentitiesCommand$JsonIdentity", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonAttachment", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonCallMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonContactAddress", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonContactAvatar", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonContactEmail", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonContactName", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonContactPhone", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonDataMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonError", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonGroupInfo", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonMention", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonMessageEnvelope", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonQuote", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonQuotedAttachment", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonReaction", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonReceiptMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonRemoteDelete", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonSharedContact", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonSticker", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonSyncDataMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonSyncMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonSyncMessageType", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.asamk.signal.json.JsonSyncReadMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.json.JsonTypingMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.jsonrpc.JsonRpcBulkMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.jsonrpc.JsonRpcException", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.jsonrpc.JsonRpcMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.jsonrpc.JsonRpcRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.jsonrpc.JsonRpcResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.jsonrpc.JsonRpcResponse$Error", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.contacts.LegacyJsonContactsStore", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "fields":[{"name":"contacts", "allowWrite":true}] -}, + "fields":[{"name":"contacts", "allowWrite":true}]} +, { "name":"org.asamk.signal.manager.storage.groups.GroupInfo", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.asamk.signal.manager.storage.groups.GroupInfoV1", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$GroupsDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$Storage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$Storage$Group", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$Storage$GroupV1", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$Storage$GroupV1$MembersDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$Storage$GroupV1$MembersSerializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.groups.GroupStore$Storage$GroupV2", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.identities.IdentityKeyStore$IdentityStorage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.profiles.LegacyProfileStore", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "fields":[{"name":"profiles", "allowWrite":true}] -}, + "fields":[{"name":"profiles", "allowWrite":true}]} +, { "name":"org.asamk.signal.manager.storage.profiles.LegacyProfileStore$ProfileStoreDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.profiles.LegacySignalProfileEntry", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.profiles.ProfileStore", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.profiles.SignalProfile", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.profiles.SignalProfile$Capabilities", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.protocol.LegacyJsonIdentityKeyStore$JsonIdentityKeyStoreDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.protocol.LegacyJsonPreKeyStore$JsonPreKeyStoreDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.protocol.LegacyJsonSessionStore$JsonSessionStoreDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.protocol.LegacyJsonSignalProtocolStore", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.protocol.LegacyJsonSignedPreKeyStore$JsonSignedPreKeyStoreDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.recipients.LegacyRecipientStore", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "fields":[{"name":"addresses", "allowWrite":true}] -}, + "fields":[{"name":"addresses", "allowWrite":true}]} +, { "name":"org.asamk.signal.manager.storage.recipients.LegacyRecipientStore$RecipientStoreDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.asamk.signal.manager.storage.recipients.RecipientStore$Storage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.recipients.RecipientStore$Storage$Recipient", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.recipients.RecipientStore$Storage$Recipient$Contact", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.recipients.RecipientStore$Storage$Recipient$Profile", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.senderKeys.SenderKeySharedStore$Storage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.senderKeys.SenderKeySharedStore$Storage$SharedSenderKey", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.stickers.StickerStore", "allDeclaredFields":true, "allDeclaredMethods":true, "allDeclaredConstructors":true, - "fields":[{"name":"stickers", "allowWrite":true}] -}, + "fields":[{"name":"stickers", "allowWrite":true}]} +, { "name":"org.asamk.signal.manager.storage.stickers.StickerStore$Storage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.manager.storage.stickers.StickerStore$Storage$Sticker", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.asamk.signal.util.SecurityProvider$DefaultRandom", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.ECGOST$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.EdEC$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.ElGamal$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.GM$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.GOST$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.IES$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.SignatureSpi$Ed25519", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.SignatureSpi$Ed448", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Blake2b$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Blake2s$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.DSTU7564$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Haraka$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Keccak$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.MD2$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.MD4$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.MD5$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD128$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD160$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD256$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD320$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA1$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA224$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Digest", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA3$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA384$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SHA512$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.SM3$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Skein$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Tiger$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.digest.Whirlpool$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.drbg.DRBG$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.keystore.BC$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.keystore.BCFKS$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.AES$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.ARIA$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Blowfish$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.CAST5$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.CAST6$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Camellia$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.ChaCha$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.DES$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.DSTU7624$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.GOST28147$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.GOST3412_2015$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Grain128$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Grainv1$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.HC128$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.HC256$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.IDEA$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Noekeon$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.OpenSSLPBKDF$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF1$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPKCS12$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Poly1305$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.RC2$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.RC5$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.RC6$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Rijndael$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.SCRYPT$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.SEED$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.SM4$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Salsa20$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Serpent$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Shacal2$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash128$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Skipjack$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.TEA$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.TLSKDF$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Threefish$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.VMPC$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.VMPCKSA3$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.XSalsa20$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.XTEA$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.bouncycastle.jcajce.provider.symmetric.Zuc$Mappings", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.freedesktop.dbus.errors.ServiceUnknown", - "methods":[{"name":"","parameterTypes":["java.lang.String"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }]} +, { "name":"org.freedesktop.dbus.interfaces.DBus$NameAcquired", - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.freedesktop.dbus.interfaces.Introspectable", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.freedesktop.dbus.interfaces.Peer", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.freedesktop.dbus.interfaces.Properties", "allDeclaredMethods":true, - "allDeclaredClasses":true -}, + "allDeclaredClasses":true} +, { "name":"org.freedesktop.dbus.interfaces.Properties$PropertiesChanged", - "allPublicConstructors":true -}, + "allPublicConstructors":true} +, { - "name":"org.objectweb.asm.util.TraceMethodVisitor" -}, + "name":"org.objectweb.asm.util.TraceMethodVisitor"} +, { "name":"org.signal.storageservice.protos.groups.AccessControl", "fields":[ {"name":"addFromInviteLink_"}, {"name":"attributes_"}, {"name":"members_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.AvatarUploadAttributes", "fields":[ @@ -1167,8 +1192,8 @@ {"name":"key_"}, {"name":"policy_"}, {"name":"signature_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.Group", "fields":[ @@ -1184,23 +1209,23 @@ {"name":"requestingMembers_"}, {"name":"revision_"}, {"name":"title_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupAttributeBlob", "fields":[ {"name":"contentCase_"}, {"name":"content_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange", "fields":[ {"name":"actions_"}, {"name":"changeEpoch_"}, {"name":"serverSignature_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions", "fields":[ @@ -1225,99 +1250,99 @@ {"name":"promoteRequestingMembers_"}, {"name":"revision_"}, {"name":"sourceUuid_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$AddMemberAction", "fields":[ {"name":"added_"}, {"name":"joinFromInviteLink_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$AddPendingMemberAction", - "fields":[{"name":"added_"}] -}, + "fields":[{"name":"added_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$AddRequestingMemberAction", - "fields":[{"name":"added_"}] -}, + "fields":[{"name":"added_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$DeleteMemberAction", - "fields":[{"name":"deletedUserId_"}] -}, + "fields":[{"name":"deletedUserId_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$DeletePendingMemberAction", - "fields":[{"name":"deletedUserId_"}] -}, + "fields":[{"name":"deletedUserId_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$DeleteRequestingMemberAction", - "fields":[{"name":"deletedUserId_"}] -}, + "fields":[{"name":"deletedUserId_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyAddFromInviteLinkAccessControlAction", - "fields":[{"name":"addFromInviteLinkAccess_"}] -}, + "fields":[{"name":"addFromInviteLinkAccess_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyAttributesAccessControlAction", - "fields":[{"name":"attributesAccess_"}] -}, + "fields":[{"name":"attributesAccess_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyDescriptionAction", - "fields":[{"name":"description_"}] -}, + "fields":[{"name":"description_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyDisappearingMessagesTimerAction", - "fields":[{"name":"timer_"}] -}, + "fields":[{"name":"timer_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyInviteLinkPasswordAction", - "fields":[{"name":"inviteLinkPassword_"}] -}, + "fields":[{"name":"inviteLinkPassword_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyMemberProfileKeyAction", - "fields":[{"name":"presentation_"}] -}, + "fields":[{"name":"presentation_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyMemberRoleAction", "fields":[ {"name":"role_"}, {"name":"userId_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyMembersAccessControlAction", - "fields":[{"name":"membersAccess_"}] -}, + "fields":[{"name":"membersAccess_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$ModifyTitleAction", - "fields":[{"name":"title_"}] -}, + "fields":[{"name":"title_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$PromotePendingMemberAction", - "fields":[{"name":"presentation_"}] -}, + "fields":[{"name":"presentation_"}]} +, { "name":"org.signal.storageservice.protos.groups.GroupChange$Actions$PromoteRequestingMemberAction", "fields":[ {"name":"role_"}, {"name":"userId_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupInviteLink", "fields":[ {"name":"contentsCase_"}, {"name":"contents_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.GroupInviteLink$GroupInviteLinkContentsV1", "fields":[ {"name":"groupMasterKey_"}, {"name":"inviteLinkPassword_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.Member", "fields":[ @@ -1326,16 +1351,16 @@ {"name":"profileKey_"}, {"name":"role_"}, {"name":"userId_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.PendingMember", "fields":[ {"name":"addedByUserId_"}, {"name":"member_"}, {"name":"timestamp_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.RequestingMember", "fields":[ @@ -1343,8 +1368,8 @@ {"name":"profileKey_"}, {"name":"timestamp_"}, {"name":"userId_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedGroup", "fields":[ @@ -1359,8 +1384,8 @@ {"name":"requestingMembers_"}, {"name":"revision_"}, {"name":"title_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedGroupChange", "fields":[ @@ -1385,8 +1410,8 @@ {"name":"promotePendingMembers_"}, {"name":"promoteRequestingMembers_"}, {"name":"revision_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedMember", "fields":[ @@ -1394,15 +1419,15 @@ {"name":"profileKey_"}, {"name":"role_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedModifyMemberRole", "fields":[ {"name":"role_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMember", "fields":[ @@ -1411,216 +1436,216 @@ {"name":"timestamp_"}, {"name":"uuidCipherText_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval", "fields":[ {"name":"uuidCipherText_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedRequestingMember", "fields":[ {"name":"profileKey_"}, {"name":"timestamp_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedString", - "fields":[{"name":"value_"}] -}, + "fields":[{"name":"value_"}]} +, { "name":"org.signal.storageservice.protos.groups.local.DecryptedTimer", - "fields":[{"name":"duration_"}] -}, + "fields":[{"name":"duration_"}]} +, { "name":"org.whispersystems.libsignal.state.IdentityKeyStore", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.libsignal.state.PreKeyStore", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.libsignal.state.SessionStore", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.libsignal.state.SignalProtocolStore", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.libsignal.state.SignedPreKeyStore", - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.signalservice.api.account.AccountAttributes", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.account.AccountAttributes$Capabilities", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.groupsv2.CredentialResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.groupsv2.TemporalCredential", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { - "name":"org.whispersystems.signalservice.api.groupsv2.TemporalCredential[]" -}, + "name":"org.whispersystems.signalservice.api.groupsv2.TemporalCredential[]"} +, { "name":"org.whispersystems.signalservice.api.messages.calls.HangupMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.messages.calls.HangupMessage$Type", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.signalservice.api.messages.calls.IceUpdateMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.messages.calls.OfferMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.messages.calls.OfferMessage$Type", "allDeclaredFields":true, - "allDeclaredMethods":true -}, + "allDeclaredMethods":true} +, { "name":"org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.profiles.SignalServiceProfile", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.profiles.SignalServiceProfile$Badge", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.profiles.SignalServiceProfile$Capabilities", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.profiles.SignalServiceProfileWrite", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.push.SignedPreKeyEntity", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.api.push.SignedPreKeyEntity$ByteArrayDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.api.push.SignedPreKeyEntity$ByteArraySerializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.api.storage.StorageAuthResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.crypto.SignatureBodyEntity", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.DiscoveryRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.DiscoveryResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.KeyBackupRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.KeyBackupResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.MultiRemoteAttestationResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.QueryEnvelope", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.RemoteAttestationRequest", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.RemoteAttestationResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.contacts.entities.TokenResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.devices.DeviceNameProtos$DeviceName", "fields":[ @@ -1628,8 +1653,8 @@ {"name":"ciphertext_"}, {"name":"ephemeralPublic_"}, {"name":"syntheticIv_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.BackupRequest", "fields":[ @@ -1641,24 +1666,24 @@ {"name":"token_"}, {"name":"tries_"}, {"name":"validFrom_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.BackupResponse", "fields":[ {"name":"bitField0_"}, {"name":"status_"}, {"name":"token_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.DeleteRequest", "fields":[ {"name":"backupId_"}, {"name":"bitField0_"}, {"name":"serviceId_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.Request", "fields":[ @@ -1666,8 +1691,8 @@ {"name":"bitField0_"}, {"name":"delete_"}, {"name":"restore_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.Response", "fields":[ @@ -1675,8 +1700,8 @@ {"name":"bitField0_"}, {"name":"delete_"}, {"name":"restore_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.RestoreRequest", "fields":[ @@ -1686,8 +1711,8 @@ {"name":"serviceId_"}, {"name":"token_"}, {"name":"validFrom_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.keybackup.protos.RestoreResponse", "fields":[ @@ -1696,120 +1721,120 @@ {"name":"status_"}, {"name":"token_"}, {"name":"tries_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.AttachmentV2UploadAttributes", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.AuthCredentials", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.ConfirmCodeMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.DeviceCode", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.DeviceId", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.DeviceInfoList", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.MismatchedDevices", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.OutgoingPushMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.OutgoingPushMessageList", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyEntity", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyEntity$ECPublicKeyDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyEntity$ECPublicKeySerializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyResponseItem", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyState", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.PreKeyStatus", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.ProfileAvatarUploadAttributes", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningMessage", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningProtos$ProvisionEnvelope", "fields":[ {"name":"bitField0_"}, {"name":"body_"}, {"name":"publicKey_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningProtos$ProvisionMessage", "fields":[ @@ -1823,43 +1848,43 @@ {"name":"readReceipts_"}, {"name":"userAgent_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.ProvisioningProtos$ProvisioningUuid", "fields":[ {"name":"bitField0_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.PushServiceSocket$RegistrationLockFailure", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.PushServiceSocket$RegistrationLockV2", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.SendMessageResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.SenderCertificate", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.push.SenderCertificate$ByteArrayDesieralizer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$AttachmentPointer", "fields":[ @@ -1879,8 +1904,8 @@ {"name":"thumbnail_"}, {"name":"uploadTimestamp_"}, {"name":"width_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage", "fields":[ @@ -1894,8 +1919,8 @@ {"name":"multiRing_"}, {"name":"offer_"}, {"name":"opaque_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Hangup", "fields":[ @@ -1903,8 +1928,8 @@ {"name":"deviceId_"}, {"name":"id_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$IceUpdate", "fields":[ @@ -1914,8 +1939,8 @@ {"name":"mid_"}, {"name":"opaque_"}, {"name":"sdp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Offer", "fields":[ @@ -1924,15 +1949,15 @@ {"name":"opaque_"}, {"name":"sdp_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$CallMessage$Opaque", "fields":[ {"name":"bitField0_"}, {"name":"data_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails", "fields":[ @@ -1948,16 +1973,16 @@ {"name":"profileKey_"}, {"name":"uuid_"}, {"name":"verified_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ContactDetails$Avatar", "fields":[ {"name":"bitField0_"}, {"name":"contentType_"}, {"name":"length_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Content", "fields":[ @@ -1970,8 +1995,8 @@ {"name":"senderKeyDistributionMessage_"}, {"name":"syncMessage_"}, {"name":"typingMessage_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage", "fields":[ @@ -1995,8 +2020,8 @@ {"name":"requiredProtocolVersion_"}, {"name":"sticker_"}, {"name":"timestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$BodyRange", "fields":[ @@ -2005,8 +2030,8 @@ {"name":"bitField0_"}, {"name":"length_"}, {"name":"start_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact", "fields":[ @@ -2017,16 +2042,16 @@ {"name":"name_"}, {"name":"number_"}, {"name":"organization_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Avatar", "fields":[ {"name":"avatar_"}, {"name":"bitField0_"}, {"name":"isProfile_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Email", "fields":[ @@ -2034,8 +2059,8 @@ {"name":"label_"}, {"name":"type_"}, {"name":"value_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Name", "fields":[ @@ -2046,8 +2071,8 @@ {"name":"middleName_"}, {"name":"prefix_"}, {"name":"suffix_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$Phone", "fields":[ @@ -2055,8 +2080,8 @@ {"name":"label_"}, {"name":"type_"}, {"name":"value_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Contact$PostalAddress", "fields":[ @@ -2070,22 +2095,22 @@ {"name":"region_"}, {"name":"street_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Delete", "fields":[ {"name":"bitField0_"}, {"name":"targetSentTimestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$GroupCallUpdate", "fields":[ {"name":"bitField0_"}, {"name":"eraId_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Preview", "fields":[ @@ -2095,8 +2120,8 @@ {"name":"image_"}, {"name":"title_"}, {"name":"url_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Quote", "fields":[ @@ -2107,8 +2132,8 @@ {"name":"bodyRanges_"}, {"name":"id_"}, {"name":"text_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Reaction", "fields":[ @@ -2117,8 +2142,8 @@ {"name":"remove_"}, {"name":"targetAuthorUuid_"}, {"name":"targetSentTimestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$DataMessage$Sticker", "fields":[ @@ -2128,8 +2153,8 @@ {"name":"packId_"}, {"name":"packKey_"}, {"name":"stickerId_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Envelope", "fields":[ @@ -2144,8 +2169,8 @@ {"name":"sourceUuid_"}, {"name":"timestamp_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContext", "fields":[ @@ -2156,15 +2181,15 @@ {"name":"members_"}, {"name":"name_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContext$Member", "fields":[ {"name":"bitField0_"}, {"name":"e164_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$GroupContextV2", "fields":[ @@ -2172,23 +2197,23 @@ {"name":"groupChange_"}, {"name":"masterKey_"}, {"name":"revision_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$NullMessage", "fields":[ {"name":"bitField0_"}, {"name":"padding_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$ReceiptMessage", "fields":[ {"name":"bitField0_"}, {"name":"timestamp_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage", "fields":[ @@ -2209,16 +2234,16 @@ {"name":"verified_"}, {"name":"viewOnceOpen_"}, {"name":"viewed_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Blocked", "fields":[ {"name":"groupIds_"}, {"name":"numbers_"}, {"name":"uuids_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Configuration", "fields":[ @@ -2228,30 +2253,30 @@ {"name":"readReceipts_"}, {"name":"typingIndicators_"}, {"name":"unidentifiedDeliveryIndicators_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Contacts", "fields":[ {"name":"bitField0_"}, {"name":"blob_"}, {"name":"complete_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$FetchLatest", "fields":[ {"name":"bitField0_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Keys", "fields":[ {"name":"bitField0_"}, {"name":"storageService_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Read", "fields":[ @@ -2259,15 +2284,15 @@ {"name":"senderE164_"}, {"name":"senderUuid_"}, {"name":"timestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Request", "fields":[ {"name":"bitField0_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent", "fields":[ @@ -2279,8 +2304,8 @@ {"name":"message_"}, {"name":"timestamp_"}, {"name":"unidentifiedStatus_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Sent$UnidentifiedDeliveryStatus", "fields":[ @@ -2288,8 +2313,8 @@ {"name":"destinationE164_"}, {"name":"destinationUuid_"}, {"name":"unidentified_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$StickerPackOperation", "fields":[ @@ -2297,8 +2322,8 @@ {"name":"packId_"}, {"name":"packKey_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$SyncMessage$Viewed", "fields":[ @@ -2306,8 +2331,8 @@ {"name":"senderE164_"}, {"name":"senderUuid_"}, {"name":"timestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$TypingMessage", "fields":[ @@ -2315,8 +2340,8 @@ {"name":"bitField0_"}, {"name":"groupId_"}, {"name":"timestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.SignalServiceProtos$Verified", "fields":[ @@ -2326,22 +2351,22 @@ {"name":"identityKey_"}, {"name":"nullMessage_"}, {"name":"state_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.push.VerifyAccountResponse", "allDeclaredFields":true, "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, + "allDeclaredConstructors":true} +, { "name":"org.whispersystems.signalservice.internal.serialize.protos.AddressProto", "fields":[ {"name":"bitField0_"}, {"name":"e164_"}, {"name":"uuid_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.serialize.protos.MetadataProto", "fields":[ @@ -2354,8 +2379,8 @@ {"name":"serverGuid_"}, {"name":"serverReceivedTimestamp_"}, {"name":"timestamp_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto", "fields":[ @@ -2364,20 +2389,20 @@ {"name":"data_"}, {"name":"localAddress_"}, {"name":"metadata_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.util.JsonUtil$IdentityKeyDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.internal.util.JsonUtil$IdentityKeySerializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.internal.util.JsonUtil$UuidDeserializer", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"org.whispersystems.signalservice.internal.websocket.WebSocketProtos$WebSocketMessage", "fields":[ @@ -2385,8 +2410,8 @@ {"name":"request_"}, {"name":"response_"}, {"name":"type_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.websocket.WebSocketProtos$WebSocketRequestMessage", "fields":[ @@ -2396,8 +2421,8 @@ {"name":"id_"}, {"name":"path_"}, {"name":"verb_"} - ] -}, + ]} +, { "name":"org.whispersystems.signalservice.internal.websocket.WebSocketProtos$WebSocketResponseMessage", "fields":[ @@ -2407,8 +2432,8 @@ {"name":"id_"}, {"name":"message_"}, {"name":"status_"} - ] -}, + ]} +, { "name":"sun.misc.Unsafe", "allDeclaredFields":true, @@ -2448,106 +2473,106 @@ {"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", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.JavaKeyStore$DualFormatJKS", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.JavaKeyStore$JKS", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.NativePRNG", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.SHA", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.SHA2$SHA224", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.SHA2$SHA256", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.SHA5$SHA384", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.SHA5$SHA512", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.SecureRandom", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.provider.certpath.PKIXCertPathValidator", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.rsa.PSSParameters", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.rsa.RSAKeyFactory$Legacy", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.rsa.RSAPSSSignature", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.rsa.RSASignature$SHA224withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.rsa.RSASignature$SHA256withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.rsa.RSASignature$SHA512withRSA", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.ssl.SSLContextImpl$TLSContext", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory", - "methods":[{"name":"","parameterTypes":[] }] -}, + "methods":[{"name":"","parameterTypes":[] }]} +, { "name":"sun.security.x509.AuthorityKeyIdentifierExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]} +, { "name":"sun.security.x509.BasicConstraintsExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]} +, { "name":"sun.security.x509.CRLDistributionPointsExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]} +, { "name":"sun.security.x509.KeyUsageExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]} +, { "name":"sun.security.x509.SubjectAlternativeNameExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -}, + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]} +, { "name":"sun.security.x509.SubjectKeyIdentifierExtension", - "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] -} + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]} + ] diff --git a/graalvm-config-dir/resource-config.json b/graalvm-config-dir/resource-config.json index 8153bb1c..e6532ae8 100644 --- a/graalvm-config-dir/resource-config.json +++ b/graalvm-config-dir/resource-config.json @@ -1,34 +1,92 @@ { "resources":{ "includes":[ - {"pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT\\E"}, - {"pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD\\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_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_IN\\E"}, - {"pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL\\E"}, - {"pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU\\E"}, - {"pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA\\E"}, - {"pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US\\E"}, - {"pattern":"\\Qjni/x86_64-Linux/libjffi-1.2.so\\E"}, - {"pattern":"\\Qjnr/constants/ConstantSet.class\\E"}, - {"pattern":"\\Qjnr/constants/platform/linux/ProtocolFamily.class\\E"}, - {"pattern":"\\Qjnr/constants/platform/linux/Shutdown.class\\E"}, - {"pattern":"\\Qjnr/constants/platform/linux/Sock.class\\E"}, - {"pattern":"\\Qjnr/constants/platform/linux/SocketLevel.class\\E"}, - {"pattern":"\\Qjnr/constants/platform/linux/SocketOption.class\\E"}, - {"pattern":"\\Qlibsignal_jni.so\\E"}, - {"pattern":"\\Qlibzkgroup.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":"com/google/i18n/phonenumbers/data/.*"} + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD\\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_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_IN\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA\\E" + }, + { + "pattern":"\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US\\E" + }, + { + "pattern":"\\Qjni/x86_64-Linux/libjffi-1.2.so\\E" + }, + { + "pattern":"\\Qjnr/constants/ConstantSet.class\\E" + }, + { + "pattern":"\\Qjnr/constants/platform/linux/ProtocolFamily.class\\E" + }, + { + "pattern":"\\Qjnr/constants/platform/linux/Shutdown.class\\E" + }, + { + "pattern":"\\Qjnr/constants/platform/linux/Sock.class\\E" + }, + { + "pattern":"\\Qjnr/constants/platform/linux/SocketLevel.class\\E" + }, + { + "pattern":"\\Qjnr/constants/platform/linux/SocketOption.class\\E" + }, + { + "pattern":"\\Qlibsignal_jni.so\\E" + }, + { + "pattern":"\\Qlibzkgroup.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":"com/google/i18n/phonenumbers/data/.*" + } ]}, - "bundles":[{"name":"net.sourceforge.argparse4j.internal.ArgumentParserImpl"}] + "bundles":[{ + "name":"net.sourceforge.argparse4j.internal.ArgumentParserImpl" + }] } diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 57c80c01..6f367ddb 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -14,7 +14,7 @@ repositories { } dependencies { - api("com.github.turasa:signal-service-java:2.15.3_unofficial_30") + api("com.github.turasa:signal-service-java:2.15.3_unofficial_31") implementation("com.google.protobuf:protobuf-javalite:3.10.0") implementation("org.bouncycastle:bcprov-jdk15on:1.69") implementation("org.slf4j:slf4j-api:1.7.30") diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java index 7a492d9f..96188c4e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java @@ -33,6 +33,7 @@ import java.util.Base64; import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Set; @@ -228,7 +229,8 @@ public final class ProfileHelper { } private SignalServiceProfile retrieveProfileSync(String username) throws IOException { - return dependencies.getMessageReceiver().retrieveProfileByUsername(username, Optional.absent()); + final var locale = Locale.getDefault(); + return dependencies.getMessageReceiver().retrieveProfileByUsername(username, Optional.absent(), locale); } private ProfileAndCredential retrieveProfileAndCredential( @@ -308,11 +310,16 @@ public final class ProfileHelper { var profileService = dependencies.getProfileService(); Single> responseSingle; + final var locale = Locale.getDefault(); try { - responseSingle = profileService.getProfile(address, profileKey, unidentifiedAccess, requestType); + responseSingle = profileService.getProfile(address, profileKey, unidentifiedAccess, requestType, locale); } catch (NoClassDefFoundError e) { // Native zkgroup lib not available for ProfileKey - responseSingle = profileService.getProfile(address, Optional.absent(), unidentifiedAccess, requestType); + responseSingle = profileService.getProfile(address, + Optional.absent(), + unidentifiedAccess, + requestType, + locale); } return responseSingle.map(pair -> { diff --git a/run_tests.sh b/run_tests.sh index 7ed88da9..c53dcc77 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -45,7 +45,7 @@ run_linked() { register() { NUMBER=$1 PIN=$2 - echo -n "Enter a captcha token (https://signalcaptchas.org/registration/generate.html): " + echo -n "Enter a captcha token (https://signalcaptchas.org/staging/challenge/generate.html): " read CAPTCHA run_main -u "$NUMBER" register --captcha "$CAPTCHA" echo -n "Enter validation code for ${NUMBER}: " @@ -81,6 +81,20 @@ register "$NUMBER_2" sleep 5 + +## DBus +run_main -u "$NUMBER_1" --dbus send "$NUMBER_2" -m daemon_not_running || true +run_main daemon & +DAEMON_PID=$! +sleep 10 +echo send +run_main -u "$NUMBER_1" --dbus send "$NUMBER_2" -m hii +run_main -u "$NUMBER_2" --dbus receive +echo kill +kill "$DAEMON_PID" +echo killed + + # JSON-RPC FIFO_FILE="${PATH_MAIN}/dbus-fifo" @@ -184,15 +198,6 @@ done run_main -u "$NUMBER_1" removeDevice -d 2 -## DBus -#run_main -u "$NUMBER_1" --dbus send "$NUMBER_2" -m daemon_not_running -#run_main daemon & -#DAEMON_PID=$! -#sleep 5 -#run_main -u "$NUMBER_1" --dbus send "$NUMBER_2" -m hii -#run_main -u "$NUMBER_2" --dbus receive -#kill "$DAEMON_PID" - ## Unregister run_main -u "$NUMBER_1" unregister run_main -u "$NUMBER_2" unregister --delete-account -- 2.51.0 From 9b102c49d06bd6dcd59f032ddd17663f47991118 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 24 Oct 2021 19:16:35 +0200 Subject: [PATCH 15/16] Adapt behavior of receive command as dbus client to match normal mode --- .../org/asamk/signal/commands/ReceiveCommand.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java index e72d8090..6b2e497e 100644 --- a/src/main/java/org/asamk/signal/commands/ReceiveCommand.java +++ b/src/main/java/org/asamk/signal/commands/ReceiveCommand.java @@ -128,11 +128,18 @@ public class ReceiveCommand implements ExtendedDbusCommand, LocalCommand { logger.error("Dbus client failed", e); throw new UnexpectedErrorException("Dbus client failed", e); } + + double timeout = ns.getDouble("timeout"); + long timeoutMilliseconds = timeout < 0 ? 10000 : (long) (timeout * 1000); + while (true) { try { - Thread.sleep(10000); + Thread.sleep(timeoutMilliseconds); } catch (InterruptedException ignored) { - return; + break; + } + if (timeout >= 0) { + break; } } } -- 2.51.0 From b07200342ae661da49be1359852ffc5deaa6b79d Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 24 Oct 2021 19:32:13 +0200 Subject: [PATCH 16/16] Use challenge captchas for proof required exception --- src/main/java/org/asamk/signal/util/ErrorUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asamk/signal/util/ErrorUtils.java b/src/main/java/org/asamk/signal/util/ErrorUtils.java index 8e824d34..e40ed218 100644 --- a/src/main/java/org/asamk/signal/util/ErrorUtils.java +++ b/src/main/java/org/asamk/signal/util/ErrorUtils.java @@ -65,7 +65,7 @@ public class ErrorUtils { + ( failure.getOptions().contains(ProofRequiredException.Option.RECAPTCHA) ? - "To get the captcha token, go to https://signalcaptchas.org/registration/generate.html\n" + "To get the captcha token, go to https://signalcaptchas.org/challenge/generate.html\n" + "Check the developer tools (F12) console for a failed redirect to signalcaptcha://\n" + "Everything after signalcaptcha:// is the captcha token.\n" + "Use the following command to submit the captcha token:\n" -- 2.51.0