From 4a5bd4d8131c54d96550a985d28561324d7aff56 Mon Sep 17 00:00:00 2001 From: Gwendal Roulleau Date: Fri, 10 Nov 2023 14:58:30 +0100 Subject: [PATCH] [signal] signal-cli 0.12.4 --- bundles/org.openhab.binding.signal/pom.xml | 62 +- .../org/asamk/signal/manager/Manager.java | 57 +- .../org/asamk/signal/manager/Settings.java | 2 +- .../signal/manager/SignalAccountFiles.java | 5 - .../manager/actions/RenewSessionAction.java | 6 +- .../SendRetryMessageRequestAction.java | 25 +- .../manager/api/GroupInviteLinkUrl.java | 44 +- .../manager/api/IdentityVerificationCode.java | 28 + .../org/asamk/signal/manager/api/Message.java | 8 +- .../signal/manager/api/MessageEnvelope.java | 65 +- .../signal/manager/api/RecipientAddress.java | 6 +- .../signal/manager/api/SendMessageResult.java | 27 +- .../manager/api/SendMessageResults.java | 7 + .../signal/manager/api/StickerPackUrl.java | 20 +- .../asamk/signal/manager/api/TextStyle.java | 36 +- .../asamk/signal/manager/api/TrustLevel.java | 1 - .../signal/manager/config/IasTrustStore.java | 18 - .../manager/config/KeyBackupConfig.java | 25 +- .../signal/manager/config/LiveConfig.java | 31 +- .../signal/manager/config/ServiceConfig.java | 46 +- .../config/ServiceEnvironmentConfig.java | 61 +- .../signal/manager/config/StagingConfig.java | 29 +- .../signal/manager/groups/GroupUtils.java | 2 +- .../manager/helper/AccountFileUpdater.java | 2 +- .../signal/manager/helper/AccountHelper.java | 183 ++- .../asamk/signal/manager/helper/Context.java | 4 +- .../signal/manager/helper/GroupHelper.java | 56 +- .../signal/manager/helper/GroupV2Helper.java | 149 +- .../signal/manager/helper/IdentityHelper.java | 27 +- .../helper/IncomingMessageHandler.java | 149 +- .../signal/manager/helper/PinHelper.java | 156 +-- .../signal/manager/helper/PreKeyHelper.java | 178 ++- .../signal/manager/helper/ProfileHelper.java | 9 +- .../signal/manager/helper/ReceiveHelper.java | 79 +- .../manager/helper/RecipientHelper.java | 87 +- .../signal/manager/helper/SendHelper.java | 83 +- .../signal/manager/helper/StickerHelper.java | 35 +- .../signal/manager/helper/StorageHelper.java | 40 +- .../signal/manager/helper/SyncHelper.java | 67 +- .../internal/AccountFileUpdaterImpl.java | 2 +- .../signal/manager/internal/ManagerImpl.java | 155 +- .../internal/MultiAccountManagerImpl.java | 6 +- .../internal/ProvisioningManagerImpl.java | 60 +- .../internal/RegistrationManagerImpl.java | 76 +- .../manager/internal/SignalDependencies.java | 44 +- .../SignalWebSocketHealthMonitor.java | 2 +- .../manager/jobs/RetrieveStickerPackJob.java | 4 - .../manager/storage/AccountDatabase.java | 209 ++- .../signal/manager/storage/Database.java | 2 +- .../signal/manager/storage/SignalAccount.java | 1246 +++++++++-------- .../asamk/signal/manager/storage/Utils.java | 6 +- .../storage/accounts/AccountsStore.java | 22 +- .../configuration/ConfigurationStore.java | 101 +- .../LegacyConfigurationStore.java | 33 + .../storage/contacts/LegacyContactInfo.java | 4 +- .../manager/storage/groups/GroupInfoV2.java | 58 +- .../manager/storage/groups/GroupStore.java | 19 +- .../storage/groups/LegacyGroupStore.java | 2 +- .../storage/identities/IdentityInfo.java | 12 +- .../storage/identities/IdentityKeyStore.java | 82 +- .../identities/LegacyIdentityKeyStore.java | 2 +- .../identities/SignalIdentityKeyStore.java | 14 +- .../storage/keyValue/KeyValueEntry.java | 8 + .../storage/keyValue/KeyValueStore.java | 162 +++ .../storage/messageCache/MessageCache.java | 17 +- .../storage/prekeys/KyberPreKeyStore.java | 299 ++++ .../manager/storage/prekeys/PreKeyStore.java | 60 +- .../storage/prekeys/SignedPreKeyStore.java | 29 + .../profiles/LegacySignalProfileEntry.java | 41 +- .../storage/protocol/LegacyIdentityInfo.java | 6 +- .../protocol/LegacyJsonIdentityKeyStore.java | 6 +- .../protocol/LegacyJsonSessionStore.java | 6 +- .../storage/protocol/LegacySessionInfo.java | 6 +- .../storage/protocol/SignalProtocolStore.java | 58 +- .../manager/storage/recipients/CdsiStore.java | 170 +++ .../storage/recipients/RecipientAddress.java | 9 +- .../storage/recipients/RecipientStore.java | 191 ++- .../recipients/RecipientTrustedResolver.java | 11 +- .../recipients/RecipientWithAddress.java | 2 +- .../storage/sendLog/MessageSendLogEntry.java | 4 +- .../storage/sendLog/MessageSendLogStore.java | 54 +- .../LegacySenderKeyRecordStore.java | 4 +- .../LegacySenderKeySharedStore.java | 2 +- .../senderKeys/SenderKeyRecordStore.java | 33 +- .../senderKeys/SenderKeySharedStore.java | 35 +- .../storage/sessions/LegacySessionStore.java | 2 +- .../storage/sessions/SessionStore.java | 70 +- .../storage/stickers/StickerStore.java | 3 +- .../threads/LegacyJsonThreadStore.java | 2 +- .../asamk/signal/manager/util/KeyUtils.java | 41 +- .../manager/util/MessageCacheUtils.java | 8 +- .../manager/util/NumberVerificationUtils.java | 11 +- .../signal/manager/util/PaymentUtils.java | 24 +- .../signal/manager/util/ProfileUtils.java | 10 +- .../org/asamk/signal/manager/util/Utils.java | 6 + .../internal/protocol/SignalService.java | 10 +- .../lib/apple/aarch64/libsignal_jni.dylib | Bin 4009696 -> 3976080 bytes .../lib/apple/amd64/libsignal_jni.dylib | Bin 4415472 -> 4641056 bytes .../lib/linux/arm64/libsignal_jni.so | Bin 4279280 -> 4254736 bytes .../lib/linux/armv7/libsignal_jni.so | Bin 3815460 -> 3799116 bytes .../lib/linux/x86-64/libsignal_jni.so | Bin 4873272 -> 5033072 bytes .../lib/windows/x86-64/signal_jni.dll | Bin 4469248 -> 4661760 bytes 102 files changed, 3432 insertions(+), 2044 deletions(-) create mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/IdentityVerificationCode.java delete mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/IasTrustStore.java create mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/LegacyConfigurationStore.java create mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueEntry.java create mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueStore.java create mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java create mode 100644 bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/CdsiStore.java diff --git a/bundles/org.openhab.binding.signal/pom.xml b/bundles/org.openhab.binding.signal/pom.xml index 288686e6cfe14..4b89f992c6c1f 100644 --- a/bundles/org.openhab.binding.signal/pom.xml +++ b/bundles/org.openhab.binding.signal/pom.xml @@ -15,7 +15,7 @@ openHAB Add-ons :: Bundles :: Signal Binding - !android.*,!com.android.*,!dalvik.*,!javax.annotation.meta,!org.apache.harmony.xnet.provider.jsse,!org.conscrypt,!sun.security.ssl,!kotlin.*,!org.bouncycastle.jsse.*,!org.openjsse.javax.net.ssl.*,!org.openjsse.net.ssl.*,!com.codahale.metrics.health,!com.codahale.metrics,!io.prometheus.client,!org.bouncycastle.asn1.*,!org.jetbrains.kotlin.*,!org.hibernate,!org.hibernate.*,!okio,!io.micrometer.core,!io.micrometer.core.*,!javassist,!javassist.*,!okhttp3,!org.signal.libsignal.*,!com.squareup.*,org.sqlite;resolution:=optional,org.sqlite.jdbc4;resolution:=optional + !android.*,!com.android.*,!dalvik.*,!javax.annotation.meta,!org.apache.harmony.xnet.provider.jsse,!org.conscrypt,!sun.security.ssl,!kotlin.*,!org.bouncycastle.jsse.*,!org.openjsse.javax.net.ssl.*,!org.openjsse.net.ssl.*,!com.codahale.metrics.health,!com.codahale.metrics,!io.prometheus.client,!org.bouncycastle.asn1.*,!org.jetbrains.kotlin.*,!org.hibernate,!org.hibernate.*,!okio,!io.micrometer.core,!io.micrometer.core.*,!javassist,!javassist.*,!okhttp3,!org.signal.*,!com.squareup.*,org.sqlite;resolution:=optional,org.sqlite.jdbc4;resolution:=optional,!com.fasterxml.jackson.module.kotlin,!org.bouncycastle.oer.its.*,!com.google.i18n.phonenumbers sqlite-jdbc 1.7.32 @@ -24,13 +24,24 @@ signal-service-java com.github.turasa - 2.15.3_unofficial_72 + 2.15.3_unofficial_86 + compile + + + com.github.turasa + core-util-jvm + 2.15.3_unofficial_86 + + + com.squareup.wire + wire-runtime-jvm + 4.4.3 compile org.signal libsignal-client - 0.25.0 + 0.32.1 compile @@ -51,9 +62,9 @@ compile - bcpkix-jdk15on + bcpkix-jdk18on org.bouncycastle - 1.70 + 1.76 compile @@ -71,44 +82,61 @@ com.googlecode.libphonenumber libphonenumber - 8.12.54 + 8.13.19 compile com.google.protobuf protobuf-javalite - 3.23.0 + 3.24.0 compile com.squareup.okhttp3 okhttp - 4.10.0 + 4.11.0 compile com.squareup.okio okio - 2.10.0 + 3.0.0 compile + + com.squareup.okio + okio-jvm + 3.6.0 + com.fasterxml.jackson.core jackson-annotations - 2.14.1 - provided + 2.15.1 + compile com.fasterxml.jackson.core jackson-core - 2.14.1 - provided + 2.15.1 + compile com.fasterxml.jackson.core jackson-databind - 2.14.1 - provided + 2.15.1 + compile + + + com.fasterxml.jackson.module + jackson-module-kotlin + 2.15.1 + compile + + + org.jetbrains.kotlin + kotlin-reflect + 1.5.32 + compile io.reactivex.rxjava3 @@ -119,13 +147,13 @@ org.jetbrains.kotlin kotlin-stdlib - 1.6.20 + 1.9.10 compile org.jetbrains.kotlin kotlin-stdlib-common - 1.6.20 + 1.9.10 compile diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Manager.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Manager.java index 884871c6aea97..41e08fb6309c9 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Manager.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Manager.java @@ -2,6 +2,7 @@ import org.asamk.signal.manager.api.AlreadyReceivingException; import org.asamk.signal.manager.api.AttachmentInvalidException; +import org.asamk.signal.manager.api.CaptchaRequiredException; import org.asamk.signal.manager.api.Configuration; import org.asamk.signal.manager.api.Device; import org.asamk.signal.manager.api.DeviceLinkUrl; @@ -11,17 +12,22 @@ import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupSendingNotAllowedException; import org.asamk.signal.manager.api.Identity; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; +import org.asamk.signal.manager.api.IncorrectPinException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidStickerException; import org.asamk.signal.manager.api.InvalidUsernameException; import org.asamk.signal.manager.api.LastGroupAdminException; import org.asamk.signal.manager.api.Message; import org.asamk.signal.manager.api.MessageEnvelope; +import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException; import org.asamk.signal.manager.api.NotAGroupMemberException; import org.asamk.signal.manager.api.NotPrimaryDeviceException; import org.asamk.signal.manager.api.Pair; import org.asamk.signal.manager.api.PendingAdminApprovalException; +import org.asamk.signal.manager.api.PinLockedException; +import org.asamk.signal.manager.api.RateLimitException; import org.asamk.signal.manager.api.ReceiveConfig; import org.asamk.signal.manager.api.Recipient; import org.asamk.signal.manager.api.RecipientIdentifier; @@ -80,13 +86,13 @@ static boolean isSignalClientAvailable() { * @return A map of numbers to canonicalized number and uuid. If a number is not registered the uuid is null. * @throws IOException if it's unable to get the contacts to check if they're registered */ - Map getUserStatus(Set numbers) throws IOException; + Map getUserStatus(Set numbers) throws IOException, RateLimitException; void updateAccountAttributes(String deviceName) throws IOException; Configuration getConfiguration(); - void updateConfiguration(Configuration configuration) throws IOException, NotPrimaryDeviceException; + void updateConfiguration(Configuration configuration) throws NotPrimaryDeviceException; /** * Update the user's profile. @@ -106,6 +112,14 @@ static boolean isSignalClientAvailable() { */ void deleteUsername() throws IOException; + void startChangeNumber( + String newNumber, boolean voiceVerification, String captcha + ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException; + + void finishChangeNumber( + String newNumber, String verificationCode, String pin + ) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException; + void unregister() throws IOException; void deleteAccount() throws IOException; @@ -116,7 +130,7 @@ static boolean isSignalClientAvailable() { void removeLinkedDevices(int deviceId) throws IOException; - void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException; + void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException; void setRegistrationLockPin(Optional pin) throws IOException, NotPrimaryDeviceException; @@ -146,11 +160,11 @@ SendMessageResults sendTypingMessage( SendMessageResults sendReadReceipt( RecipientIdentifier.Single sender, List messageIds - ) throws IOException; + ); SendMessageResults sendViewedReceipt( RecipientIdentifier.Single sender, List messageIds - ) throws IOException; + ); SendMessageResults sendMessage( Message message, Set recipients @@ -185,7 +199,7 @@ SendMessageResults sendPaymentNotificationMessage( void setContactName( RecipientIdentifier.Single recipient, String givenName, final String familyName - ) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException; + ) throws NotPrimaryDeviceException, UnregisteredRecipientException; void setContactsBlocked( Collection recipient, boolean blocked @@ -210,6 +224,8 @@ void setExpirationTimer( */ StickerPackUrl uploadStickerPack(File path) throws IOException, StickerPackInvalidException; + void installStickerPack(StickerPackUrl url) throws IOException; + List getStickerPacks(); void requestAllSyncData() throws IOException; @@ -261,33 +277,12 @@ List getRecipients( List getIdentities(RecipientIdentifier.Single recipient); /** - * Trust this the identity with this fingerprint + * Trust this the identity with this fingerprint/safetyNumber * - * @param recipient account of the identity - * @param fingerprint Fingerprint + * @param recipient account of the identity */ boolean trustIdentityVerified( - RecipientIdentifier.Single recipient, byte[] fingerprint - ) throws UnregisteredRecipientException; - - /** - * Trust this the identity with this safety number - * - * @param recipient account of the identity - * @param safetyNumber Safety number - */ - boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, String safetyNumber - ) throws UnregisteredRecipientException; - - /** - * Trust this the identity with this scannable safety number - * - * @param recipient account of the identity - * @param safetyNumber Scannable safety number - */ - boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, byte[] safetyNumber + RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode ) throws UnregisteredRecipientException; /** @@ -304,7 +299,7 @@ boolean trustIdentityVerifiedSafetyNumber( InputStream retrieveAttachment(final String id) throws IOException; @Override - void close() throws IOException; + void close(); interface ReceiveMessageHandler { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Settings.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Settings.java index 878545141d9bd..5fd4e36bad592 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Settings.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/Settings.java @@ -4,5 +4,5 @@ public record Settings(TrustNewIdentity trustNewIdentity, boolean disableMessageSendLog) { - public static Settings DEFAULT = new Settings(TrustNewIdentity.ON_FIRST_USE, false); + public static final Settings DEFAULT = new Settings(TrustNewIdentity.ON_FIRST_USE, false); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/SignalAccountFiles.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/SignalAccountFiles.java index da8a3f3a837bf..ef1606211fb04 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/SignalAccountFiles.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/SignalAccountFiles.java @@ -14,7 +14,6 @@ import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.accounts.AccountsStore; import org.asamk.signal.manager.util.KeyUtils; -import org.signal.libsignal.protocol.util.KeyHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; @@ -160,8 +159,6 @@ public RegistrationManager initRegistrationManager( final var newAccountPath = accountPath == null ? accountsStore.addAccount(number, null) : accountPath; var aciIdentityKey = KeyUtils.generateIdentityKeyPair(); var pniIdentityKey = KeyUtils.generateIdentityKeyPair(); - var registrationId = KeyHelper.generateRegistrationId(false); - var pniRegistrationId = KeyHelper.generateRegistrationId(false); var profileKey = KeyUtils.createProfileKey(); var account = SignalAccount.create(pathConfig.dataPath(), @@ -170,8 +167,6 @@ public RegistrationManager initRegistrationManager( serviceEnvironment, aciIdentityKey, pniIdentityKey, - registrationId, - pniRegistrationId, profileKey, settings); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/RenewSessionAction.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/RenewSessionAction.java index 2718bc2634964..401172463af9d 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/RenewSessionAction.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/RenewSessionAction.java @@ -8,15 +8,17 @@ public class RenewSessionAction implements HandleAction { private final RecipientId recipientId; private final ServiceId serviceId; + private final ServiceId accountId; - public RenewSessionAction(final RecipientId recipientId, final ServiceId serviceId) { + public RenewSessionAction(final RecipientId recipientId, final ServiceId serviceId, final ServiceId accountId) { this.recipientId = recipientId; this.serviceId = serviceId; + this.accountId = accountId; } @Override public void execute(Context context) throws Throwable { - context.getAccount().getAciSessionStore().archiveSessions(serviceId); + context.getAccount().getAccountData(accountId).getSessionStore().archiveSessions(serviceId); if (!recipientId.equals(context.getAccount().getSelfRecipientId())) { context.getSendHelper().sendNullMessage(recipientId); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java index 2300eae9d39c8..865f062f3ca83 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java @@ -8,7 +8,7 @@ import org.signal.libsignal.protocol.message.DecryptionErrorMessage; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; import org.whispersystems.signalservice.api.push.ServiceId; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.Envelope; import java.util.Optional; @@ -18,22 +18,25 @@ public class SendRetryMessageRequestAction implements HandleAction { private final ServiceId serviceId; private final ProtocolException protocolException; private final SignalServiceEnvelope envelope; + private final ServiceId accountId; public SendRetryMessageRequestAction( final RecipientId recipientId, final ServiceId serviceId, final ProtocolException protocolException, - final SignalServiceEnvelope envelope + final SignalServiceEnvelope envelope, + final ServiceId accountId ) { this.recipientId = recipientId; this.serviceId = serviceId; this.protocolException = protocolException; this.envelope = envelope; + this.accountId = accountId; } @Override public void execute(Context context) throws Throwable { - context.getAccount().getAciSessionStore().archiveSessions(serviceId); + context.getAccount().getAccountData(accountId).getSessionStore().archiveSessions(serviceId); int senderDevice = protocolException.getSenderDevice(); Optional groupId = protocolException.getGroupId().isPresent() ? Optional.of(GroupId.unknownVersion( @@ -47,7 +50,9 @@ public void execute(Context context) throws Throwable { envelopeType = messageContent.getType(); } else { originalContent = envelope.getContent(); - envelopeType = envelopeTypeToCiphertextMessageType(envelope.getType()); + envelopeType = envelope.getType() == null + ? CiphertextMessage.WHISPER_TYPE + : envelopeTypeToCiphertextMessageType(envelope.getType()); } DecryptionErrorMessage decryptionErrorMessage = DecryptionErrorMessage.forOriginalMessage(originalContent, @@ -59,10 +64,14 @@ public void execute(Context context) throws Throwable { } private static int envelopeTypeToCiphertextMessageType(int envelopeType) { - return switch (envelopeType) { - case SignalServiceProtos.Envelope.Type.PREKEY_BUNDLE_VALUE -> CiphertextMessage.PREKEY_TYPE; - case SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER_VALUE -> CiphertextMessage.SENDERKEY_TYPE; - case SignalServiceProtos.Envelope.Type.PLAINTEXT_CONTENT_VALUE -> CiphertextMessage.PLAINTEXT_CONTENT_TYPE; + final var type = Envelope.Type.fromValue(envelopeType); + if (type == null) { + return CiphertextMessage.WHISPER_TYPE; + } + return switch (type) { + case PREKEY_BUNDLE -> CiphertextMessage.PREKEY_TYPE; + case UNIDENTIFIED_SENDER -> CiphertextMessage.SENDERKEY_TYPE; + case PLAINTEXT_CONTENT -> CiphertextMessage.PLAINTEXT_CONTENT_TYPE; default -> CiphertextMessage.WHISPER_TYPE; }; } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/GroupInviteLinkUrl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/GroupInviteLinkUrl.java index b21aeb97c2b15..0c00b3096ff46 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/GroupInviteLinkUrl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/GroupInviteLinkUrl.java @@ -1,18 +1,18 @@ package org.asamk.signal.manager.api; -import com.google.protobuf.ByteString; - import org.asamk.signal.manager.groups.GroupLinkPassword; +import org.signal.core.util.Base64; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.groups.GroupMasterKey; import org.signal.storageservice.protos.groups.GroupInviteLink; import org.signal.storageservice.protos.groups.local.DecryptedGroup; -import org.whispersystems.util.Base64UrlSafe; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import okio.ByteString; + public final class GroupInviteLinkUrl { private static final String GROUP_URL_HOST = "signal.group"; @@ -24,7 +24,7 @@ public final class GroupInviteLinkUrl { public static GroupInviteLinkUrl forGroup(GroupMasterKey groupMasterKey, DecryptedGroup group) { return new GroupInviteLinkUrl(groupMasterKey, - GroupLinkPassword.fromBytes(group.getInviteLinkPassword().toByteArray())); + GroupLinkPassword.fromBytes(group.inviteLinkPassword.toByteArray())); } /** @@ -39,30 +39,27 @@ public static GroupInviteLinkUrl fromUri(String urlString) throws InvalidGroupLi } try { - if (!"/".equals(uri.getPath()) && uri.getPath().length() > 0) { + if (!"/".equals(uri.getPath()) && !uri.getPath().isEmpty()) { throw new InvalidGroupLinkException("No path was expected in uri"); } var encoding = uri.getFragment(); - if (encoding == null || encoding.length() == 0) { + if (encoding == null || encoding.isEmpty()) { throw new InvalidGroupLinkException("No reference was in the uri"); } - var bytes = Base64UrlSafe.decodePaddingAgnostic(encoding); - var groupInviteLink = GroupInviteLink.parseFrom(bytes); + var bytes = Base64.decode(encoding); + GroupInviteLink groupInviteLink = GroupInviteLink.ADAPTER.decode(bytes); - switch (groupInviteLink.getContentsCase()) { - case V1CONTENTS -> { - var groupInviteLinkContentsV1 = groupInviteLink.getV1Contents(); - var groupMasterKey = new GroupMasterKey(groupInviteLinkContentsV1.getGroupMasterKey() - .toByteArray()); - var password = GroupLinkPassword.fromBytes(groupInviteLinkContentsV1.getInviteLinkPassword() - .toByteArray()); + if (groupInviteLink.v1Contents != null) { + var groupInviteLinkContentsV1 = groupInviteLink.v1Contents; + var groupMasterKey = new GroupMasterKey(groupInviteLinkContentsV1.groupMasterKey.toByteArray()); + var password = GroupLinkPassword.fromBytes(groupInviteLinkContentsV1.inviteLinkPassword.toByteArray()); - return new GroupInviteLinkUrl(groupMasterKey, password); - } - default -> throw new UnknownGroupLinkVersionException("Url contains no known group link content"); + return new GroupInviteLinkUrl(groupMasterKey, password); + } else { + throw new UnknownGroupLinkVersionException("Url contains no known group link content"); } } catch (InvalidInputException | IOException e) { throw new InvalidGroupLinkException(e); @@ -93,13 +90,12 @@ private GroupInviteLinkUrl(GroupMasterKey groupMasterKey, GroupLinkPassword pass } private static String createUrl(GroupMasterKey groupMasterKey, GroupLinkPassword password) { - var groupInviteLink = GroupInviteLink.newBuilder() - .setV1Contents(GroupInviteLink.GroupInviteLinkContentsV1.newBuilder() - .setGroupMasterKey(ByteString.copyFrom(groupMasterKey.serialize())) - .setInviteLinkPassword(ByteString.copyFrom(password.serialize()))) - .build(); + var groupInviteLink = new GroupInviteLink.Builder().v1Contents(new GroupInviteLink.GroupInviteLinkContentsV1.Builder().groupMasterKey( + ByteString.of(groupMasterKey.serialize())) + .inviteLinkPassword(ByteString.of(password.serialize())) + .build()).build(); - var encoding = Base64UrlSafe.encodeBytesWithoutPadding(groupInviteLink.toByteArray()); + var encoding = Base64.encodeUrlSafeWithoutPadding(groupInviteLink.encode()); return GROUP_URL_PREFIX + encoding; } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/IdentityVerificationCode.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/IdentityVerificationCode.java new file mode 100644 index 0000000000000..0f05b480ead24 --- /dev/null +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/IdentityVerificationCode.java @@ -0,0 +1,28 @@ +package org.asamk.signal.manager.api; + +import org.signal.libsignal.protocol.util.Hex; + +import java.util.Base64; +import java.util.Locale; + +public sealed interface IdentityVerificationCode { + + record Fingerprint(byte[] fingerprint) implements IdentityVerificationCode {} + + record SafetyNumber(String safetyNumber) implements IdentityVerificationCode {} + + record ScannableSafetyNumber(byte[] safetyNumber) implements IdentityVerificationCode {} + + static IdentityVerificationCode parse(String code) throws Exception { + code = code.replaceAll(" ", ""); + if (code.length() == 66) { + final var fingerprintBytes = Hex.fromStringCondensed(code.toLowerCase(Locale.ROOT)); + return new Fingerprint(fingerprintBytes); + } else if (code.length() == 60) { + return new SafetyNumber(code); + } else { + final var scannableSafetyNumber = Base64.getDecoder().decode(code); + return new ScannableSafetyNumber(scannableSafetyNumber); + } + } +} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/Message.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/Message.java index ac9e4999b6b71..48277e6dc9d27 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/Message.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/Message.java @@ -21,8 +21,12 @@ public record Quote( RecipientIdentifier.Single author, String message, List mentions, - List textStyles - ) {} + List textStyles, + List attachments + ) { + + public record Attachment(String contentType, String filename, String preview) {} + } public record Sticker(byte[] packId, int stickerId) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/MessageEnvelope.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/MessageEnvelope.java index 9cc34aba54902..f4b6332422628 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/MessageEnvelope.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/MessageEnvelope.java @@ -34,13 +34,12 @@ import org.whispersystems.signalservice.api.messages.multidevice.ViewedMessage; import java.io.File; +import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.BodyRange; - public record MessageEnvelope( Optional sourceAddress, int sourceDevice, @@ -160,7 +159,7 @@ static Data from( .map(a -> a.stream().map(preview -> Preview.from(preview, fileProvider)).toList()) .orElse(List.of()), dataMessage.getBodyRanges() - .map(a -> a.stream().filter(BodyRange::hasStyle).map(TextStyle::from).toList()) + .map(a -> a.stream().filter(r -> r.style != null).map(TextStyle::from).toList()) .orElse(List.of())); } @@ -236,7 +235,7 @@ static Quote from( return new Quote(quote.getId(), addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor())) .toApiRecipientAddress(), - Optional.ofNullable(quote.getText()), + Optional.of(quote.getText()), quote.getMentions() == null ? List.of() : quote.getMentions() @@ -250,7 +249,7 @@ static Quote from( ? List.of() : quote.getBodyRanges() .stream() - .filter(BodyRange::hasStyle) + .filter(r -> r.style != null) .map(TextStyle::from) .toList()); } @@ -293,9 +292,9 @@ public record Attachment( boolean isBorderless ) { - static Attachment from(SignalServiceAttachment attachment, AttachmentFileProvider fileProvider) { - if (attachment.isPointer()) { - final var a = attachment.asPointer(); + static Attachment from(SignalServiceAttachment signalAttachment, AttachmentFileProvider fileProvider) { + if (signalAttachment.isPointer()) { + final var a = signalAttachment.asPointer(); final var attachmentFile = fileProvider.getFile(a); return new Attachment(Optional.of(attachmentFile.getName()), Optional.of(attachmentFile), @@ -312,21 +311,26 @@ static Attachment from(SignalServiceAttachment attachment, AttachmentFileProvide a.isGif(), a.isBorderless()); } else { - final var a = attachment.asStream(); - return new Attachment(Optional.empty(), - Optional.empty(), - a.getFileName(), - a.getContentType(), - a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()), - Optional.of(a.getLength()), - a.getPreview(), - Optional.empty(), - a.getCaption(), - a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()), - a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()), - a.getVoiceNote(), - a.isGif(), - a.isBorderless()); + Attachment attachment = null; + try (final var a = signalAttachment.asStream()) { + attachment = new Attachment(Optional.empty(), + Optional.empty(), + a.getFileName(), + a.getContentType(), + a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()), + Optional.of(a.getLength()), + a.getPreview(), + Optional.empty(), + a.getCaption(), + a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()), + a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()), + a.getVoiceNote(), + a.isGif(), + a.isBorderless()); + return attachment; + } catch (IOException e) { + return attachment; + } } } @@ -708,7 +712,9 @@ public record Call( Optional hangup, Optional busy, List iceUpdate, - Optional opaque + Optional opaque, + boolean isMultiRing, + boolean isUrgent ) { public static Call from(final SignalServiceCallMessage callMessage) { @@ -722,7 +728,9 @@ public static Call from(final SignalServiceCallMessage callMessage) { callMessage.getIceUpdateMessages() .map(m -> m.stream().map(IceUpdate::from).toList()) .orElse(List.of()), - callMessage.getOpaqueMessage().map(Opaque::from)); + callMessage.getOpaqueMessage().map(Opaque::from), + callMessage.isMultiRing(), + callMessage.isUrgent()); } public record Offer(long id, String sdp, Type type, byte[] opaque) { @@ -761,13 +769,12 @@ static Busy from(BusyMessage busyMessage) { } } - public record Hangup(long id, Type type, int deviceId, boolean isLegacy) { + public record Hangup(long id, Type type, int deviceId) { static Hangup from(HangupMessage hangupMessage) { return new Hangup(hangupMessage.getId(), Type.from(hangupMessage.getType()), - hangupMessage.getDeviceId(), - hangupMessage.isLegacy()); + hangupMessage.getDeviceId()); } public enum Type { @@ -895,7 +902,7 @@ public static MessageEnvelope from( final AttachmentFileProvider fileProvider, Exception exception ) { - final var source = !envelope.isUnidentifiedSender() && envelope.hasSourceUuid() + final var source = !envelope.isUnidentifiedSender() && envelope.hasSourceServiceId() ? recipientResolver.resolveRecipient(envelope.getSourceAddress()) : envelope.isUnidentifiedSender() && content != null ? recipientResolver.resolveRecipient(content.getSender()) diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/RecipientAddress.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/RecipientAddress.java index f500e3a93e60c..f042f8fbab8ce 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/RecipientAddress.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/RecipientAddress.java @@ -1,14 +1,14 @@ package org.asamk.signal.manager.api; -import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.util.UuidUtil; import java.util.Optional; import java.util.UUID; public record RecipientAddress(Optional uuid, Optional number, Optional username) { - public static final UUID UNKNOWN_UUID = ServiceId.UNKNOWN.uuid(); + public static final UUID UNKNOWN_UUID = UuidUtil.UNKNOWN_UUID; /** * Construct a RecipientAddress. @@ -32,7 +32,7 @@ public RecipientAddress(UUID uuid, String e164, String username) { } public RecipientAddress(SignalServiceAddress address) { - this(Optional.of(address.getServiceId().uuid()), address.getNumber(), Optional.empty()); + this(Optional.of(address.getServiceId().getRawUuid()), address.getNumber(), Optional.empty()); } public RecipientAddress(UUID uuid) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResult.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResult.java index 1507390bba4b1..4158b60e7dc93 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResult.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResult.java @@ -2,7 +2,6 @@ import org.asamk.signal.manager.helper.RecipientAddressResolver; import org.asamk.signal.manager.storage.recipients.RecipientResolver; -import org.signal.libsignal.protocol.IdentityKey; public record SendMessageResult( RecipientAddress address, @@ -11,29 +10,12 @@ public record SendMessageResult( boolean isUnregisteredFailure, boolean isIdentityFailure, boolean isRateLimitFailure, - ProofRequiredException proofRequiredFailure + ProofRequiredException proofRequiredFailure, + boolean isInvalidPreKeyFailure ) { - public static SendMessageResult success(RecipientAddress address) { - return new SendMessageResult(address, true, false, false, false, false, null); - } - - public static SendMessageResult networkFailure(RecipientAddress address) { - return new SendMessageResult(address, false, true, false, false, false, null); - } - public static SendMessageResult unregisteredFailure(RecipientAddress address) { - return new SendMessageResult(address, false, false, true, false, false, null); - } - - public static SendMessageResult identityFailure(RecipientAddress address, IdentityKey identityKey) { - return new SendMessageResult(address, false, false, false, true, false, null); - } - - public static SendMessageResult proofRequiredFailure( - RecipientAddress address, ProofRequiredException proofRequiredException - ) { - return new SendMessageResult(address, false, true, false, false, false, proofRequiredException); + return new SendMessageResult(address, false, false, true, false, false, null, false); } public static SendMessageResult from( @@ -50,6 +32,7 @@ public static SendMessageResult from( sendMessageResult.getRateLimitFailure() != null || sendMessageResult.getProofRequiredFailure() != null, sendMessageResult.getProofRequiredFailure() == null ? null - : new ProofRequiredException(sendMessageResult.getProofRequiredFailure())); + : new ProofRequiredException(sendMessageResult.getProofRequiredFailure()), + sendMessageResult.isInvalidPreKeyFailure()); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResults.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResults.java index 5b8cfc03624e9..de25016359c71 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResults.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/SendMessageResults.java @@ -19,4 +19,11 @@ public boolean hasOnlyUntrustedIdentity() { .allMatch(identityFailure -> identityFailure) && results.values().stream().mapToInt(List::size).sum() > 0; } + + public boolean hasOnlyRateLimitFailure() { + return results.values() + .stream() + .flatMap(res -> res.stream().map(SendMessageResult::isRateLimitFailure)) + .allMatch(r -> r) && results.values().stream().mapToInt(List::size).sum() > 0; + } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/StickerPackUrl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/StickerPackUrl.java index d018ac3902364..7113b4b8b4ac7 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/StickerPackUrl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/StickerPackUrl.java @@ -11,10 +11,7 @@ import static org.whispersystems.signalservice.internal.util.Util.isEmpty; -public final class StickerPackUrl { - - private final StickerPackId packId; - private final byte[] packKey; +public record StickerPackUrl(StickerPackId packId, byte[] packKey) { /** * @throws InvalidStickerPackLinkException If url cannot be parsed. @@ -22,7 +19,7 @@ public final class StickerPackUrl { public static StickerPackUrl fromUri(URI uri) throws InvalidStickerPackLinkException { final var rawQuery = uri.getRawFragment(); if (isEmpty(rawQuery)) { - throw new RuntimeException("Invalid sticker pack uri"); + throw new InvalidStickerPackLinkException("Invalid sticker pack uri"); } var query = Utils.getQueryMap(rawQuery); @@ -48,11 +45,6 @@ public static StickerPackUrl fromUri(URI uri) throws InvalidStickerPackLinkExcep return new StickerPackUrl(packId, packKey); } - public StickerPackUrl(final StickerPackId packId, final byte[] packKey) { - this.packId = packId; - this.packKey = packKey; - } - public URI getUrl() { try { return new URI("https", @@ -67,14 +59,6 @@ public URI getUrl() { } } - public StickerPackId getPackId() { - return packId; - } - - public byte[] getPackKey() { - return packKey; - } - public final static class InvalidStickerPackLinkException extends Exception { public InvalidStickerPackLinkException(String message) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TextStyle.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TextStyle.java index 483163088738b..bec504f0f3266 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TextStyle.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TextStyle.java @@ -1,8 +1,8 @@ package org.asamk.signal.manager.api; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.BodyRange; -public record TextStyle(Style style, int start, int length) { +public record TextStyle(Style style, Integer start, Integer length) { public enum Style { NONE, @@ -12,7 +12,10 @@ public enum Style { STRIKETHROUGH, MONOSPACE; - static Style fromInternal(SignalServiceProtos.BodyRange.Style style) { + static Style fromInternal(BodyRange.Style style) { + if (style == null) { + return NONE; + } return switch (style) { case NONE -> NONE; case BOLD -> BOLD; @@ -35,27 +38,26 @@ public static Style from(String style) { }; } - SignalServiceProtos.BodyRange.Style toBodyRangeStyle() { + BodyRange.Style toBodyRangeStyle() { return switch (this) { - case NONE -> SignalServiceProtos.BodyRange.Style.NONE; - case BOLD -> SignalServiceProtos.BodyRange.Style.BOLD; - case ITALIC -> SignalServiceProtos.BodyRange.Style.ITALIC; - case SPOILER -> SignalServiceProtos.BodyRange.Style.SPOILER; - case STRIKETHROUGH -> SignalServiceProtos.BodyRange.Style.STRIKETHROUGH; - case MONOSPACE -> SignalServiceProtos.BodyRange.Style.MONOSPACE; + case NONE -> BodyRange.Style.NONE; + case BOLD -> BodyRange.Style.BOLD; + case ITALIC -> BodyRange.Style.ITALIC; + case SPOILER -> BodyRange.Style.SPOILER; + case STRIKETHROUGH -> BodyRange.Style.STRIKETHROUGH; + case MONOSPACE -> BodyRange.Style.MONOSPACE; }; } } - static TextStyle from(SignalServiceProtos.BodyRange bodyRange) { - return new TextStyle(Style.fromInternal(bodyRange.getStyle()), bodyRange.getStart(), bodyRange.getLength()); + static TextStyle from(BodyRange bodyRange) { + return new TextStyle(Style.fromInternal(bodyRange.style), bodyRange.start, bodyRange.length); } - public SignalServiceProtos.BodyRange toBodyRange() { - return SignalServiceProtos.BodyRange.newBuilder() - .setStart(this.start()) - .setLength(this.length()) - .setStyle(this.style().toBodyRangeStyle()) + public BodyRange toBodyRange() { + return new BodyRange.Builder().start(this.start()) + .length(this.length()) + .style(this.style().toBodyRangeStyle()) .build(); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TrustLevel.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TrustLevel.java index 4016f487a6b13..cbfa0bd52447b 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TrustLevel.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/api/TrustLevel.java @@ -22,7 +22,6 @@ public static TrustLevel fromIdentityState(ContactRecord.IdentityState identityS case DEFAULT -> TRUSTED_UNVERIFIED; case UNVERIFIED -> UNTRUSTED; case VERIFIED -> TRUSTED_VERIFIED; - case UNRECOGNIZED -> null; }; } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/IasTrustStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/IasTrustStore.java deleted file mode 100644 index 4d70809b08875..0000000000000 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/IasTrustStore.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.asamk.signal.manager.config; - -import org.whispersystems.signalservice.api.push.TrustStore; - -import java.io.InputStream; - -class IasTrustStore implements TrustStore { - - @Override - public InputStream getKeyStoreInputStream() { - return IasTrustStore.class.getResourceAsStream("ias.store"); - } - - @Override - public String getKeyStorePassword() { - return "whisper"; - } -} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/KeyBackupConfig.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/KeyBackupConfig.java index 60173c1d1a72d..8872a2d886a83 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/KeyBackupConfig.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/KeyBackupConfig.java @@ -1,26 +1,3 @@ package org.asamk.signal.manager.config; -public class KeyBackupConfig { - - private final String enclaveName; - private final byte[] serviceId; - private final String mrenclave; - - public KeyBackupConfig(final String enclaveName, final byte[] serviceId, final String mrenclave) { - this.enclaveName = enclaveName; - this.serviceId = serviceId; - this.mrenclave = mrenclave; - } - - public String getEnclaveName() { - return enclaveName; - } - - public byte[] getServiceId() { - return serviceId; - } - - public String getMrenclave() { - return mrenclave; - } -} +public record KeyBackupConfig(String enclaveName, byte[] serviceId, String mrenclave) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/LiveConfig.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/LiveConfig.java index 80322b8ba713c..2756f292922a5 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/LiveConfig.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/LiveConfig.java @@ -1,13 +1,11 @@ package org.asamk.signal.manager.config; -import org.bouncycastle.util.encoders.Hex; import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.ECPublicKey; import org.whispersystems.signalservice.api.push.TrustStore; import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl; import org.whispersystems.signalservice.internal.configuration.SignalCdsiUrl; -import org.whispersystems.signalservice.internal.configuration.SignalKeyBackupServiceUrl; import org.whispersystems.signalservice.internal.configuration.SignalProxy; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl; @@ -15,7 +13,6 @@ import org.whispersystems.signalservice.internal.configuration.SignalSvr2Url; import java.util.Base64; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -28,23 +25,14 @@ class LiveConfig { private final static byte[] UNIDENTIFIED_SENDER_TRUST_ROOT = Base64.getDecoder() .decode("BXu6QIKVz5MA8gstzfOgRQGqyLqOwNKHL6INkv3IHWMF"); private final static String CDSI_MRENCLAVE = "0f6fd79cdfdaa5b2e6337f534d3baf999318b0c462a7ac1f41297a3e4b424a57"; - - private final static String KEY_BACKUP_ENCLAVE_NAME = "e18376436159cda3ad7a45d9320e382e4a497f26b0dca34d8eab0bd0139483b5"; - private final static byte[] KEY_BACKUP_SERVICE_ID = Hex.decode( - "3a485adb56e2058ef7737764c738c4069dd62bc457637eafb6bbce1ce29ddb89"); - private final static String KEY_BACKUP_MRENCLAVE = "45627094b2ea4a66f4cf0b182858a8dcf4b8479122c3820fe7fd0551a6d4cf5c"; - private final static String FALLBACK_KEY_BACKUP_ENCLAVE_NAME = "0cedba03535b41b67729ce9924185f831d7767928a1d1689acb689bc079c375f"; - private final static byte[] FALLBACK_KEY_BACKUP_SERVICE_ID = Hex.decode( - "187d2739d22be65e74b65f0055e74d31310e4267e5fac2b1246cc8beba81af39"); - private final static String FALLBACK_KEY_BACKUP_MRENCLAVE = "ee19f1965b1eefa3dc4204eb70c04f397755f771b8c1909d080c04dad2a6a9ba"; + private final static String SVR2_MRENCLAVE = "6ee1042f9e20f880326686dd4ba50c25359f01e9f733eeba4382bca001d45094"; private final static String URL = "https://chat.signal.org"; private final static String CDN_URL = "https://cdn.signal.org"; private final static String CDN2_URL = "https://cdn2.signal.org"; - private final static String SIGNAL_KEY_BACKUP_URL = "https://api.backup.signal.org"; private final static String STORAGE_URL = "https://storage.signal.org"; private final static String SIGNAL_CDSI_URL = "https://cdsi.signal.org"; - private final static String SIGNAL_SVR2_URL = "https://svr2.staging.signal.org"; + private final static String SIGNAL_SVR2_URL = "https://svr2.signal.org"; private final static TrustStore TRUST_STORE = new WhisperTrustStore(); private final static Optional dns = Optional.empty(); @@ -63,7 +51,6 @@ static SignalServiceConfiguration createDefaultServiceConfiguration( new SignalCdnUrl[]{new SignalCdnUrl(CDN_URL, TRUST_STORE)}, 2, new SignalCdnUrl[]{new SignalCdnUrl(CDN2_URL, TRUST_STORE)}), - new SignalKeyBackupServiceUrl[]{new SignalKeyBackupServiceUrl(SIGNAL_KEY_BACKUP_URL, TRUST_STORE)}, new SignalStorageUrl[]{new SignalStorageUrl(STORAGE_URL, TRUST_STORE)}, new SignalCdsiUrl[]{new SignalCdsiUrl(SIGNAL_CDSI_URL, TRUST_STORE)}, new SignalSvr2Url[]{new SignalSvr2Url(SIGNAL_SVR2_URL, TRUST_STORE, null, null)}, @@ -82,20 +69,14 @@ static ECPublicKey getUnidentifiedSenderTrustRoot() { } } - static KeyBackupConfig createKeyBackupConfig() { - return new KeyBackupConfig(KEY_BACKUP_ENCLAVE_NAME, KEY_BACKUP_SERVICE_ID, KEY_BACKUP_MRENCLAVE); - } - - static Collection createFallbackKeyBackupConfigs() { - return List.of(new KeyBackupConfig(FALLBACK_KEY_BACKUP_ENCLAVE_NAME, - FALLBACK_KEY_BACKUP_SERVICE_ID, - FALLBACK_KEY_BACKUP_MRENCLAVE)); - } - static String getCdsiMrenclave() { return CDSI_MRENCLAVE; } + static String getSvr2Mrenclave() { + return SVR2_MRENCLAVE; + } + private LiveConfig() { } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceConfig.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceConfig.java index b2b45a9cf6782..5cafbdc2d4d90 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceConfig.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceConfig.java @@ -1,53 +1,35 @@ package org.asamk.signal.manager.config; import org.asamk.signal.manager.api.ServiceEnvironment; +import org.signal.libsignal.protocol.util.Medium; import org.whispersystems.signalservice.api.account.AccountAttributes; -import org.whispersystems.signalservice.api.push.TrustStore; -import java.io.IOException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; import java.util.List; +import java.util.concurrent.TimeUnit; import okhttp3.Interceptor; public class ServiceConfig { - public final static int PREKEY_MINIMUM_COUNT = 20; + public final static int PREKEY_MINIMUM_COUNT = 10; public final static int PREKEY_BATCH_SIZE = 100; + public final static int PREKEY_MAXIMUM_ID = Medium.MAX_VALUE; + public static final long PREKEY_ARCHIVE_AGE = TimeUnit.DAYS.toMillis(30); + public static final long PREKEY_STALE_AGE = TimeUnit.DAYS.toMillis(90); + public static final long SIGNED_PREKEY_ROTATE_AGE = TimeUnit.DAYS.toMillis(2); + public final static int MAX_ATTACHMENT_SIZE = 150 * 1024 * 1024; public final static long MAX_ENVELOPE_SIZE = 0; public final static long AVATAR_DOWNLOAD_FAILSAFE_MAX_SIZE = 10 * 1024 * 1024; public final static boolean AUTOMATIC_NETWORK_RETRY = true; public final static int GROUP_MAX_SIZE = 1001; - - private final static KeyStore iasKeyStore; - - static { - try { - TrustStore contactTrustStore = new IasTrustStore(); - - var keyStore = KeyStore.getInstance("BKS"); - keyStore.load(contactTrustStore.getKeyStoreInputStream(), - contactTrustStore.getKeyStorePassword().toCharArray()); - - iasKeyStore = keyStore; - } catch (KeyStoreException | CertificateException | IOException | NoSuchAlgorithmException e) { - throw new AssertionError(e); - } - } + public final static int MAXIMUM_ONE_OFF_REQUEST_SIZE = 3; public static AccountAttributes.Capabilities getCapabilities(boolean isPrimaryDevice) { final var giftBadges = !isPrimaryDevice; return new AccountAttributes.Capabilities(false, true, true, true, true, giftBadges, false, false); } - public static KeyStore getIasKeyStore() { - return iasKeyStore; - } - public static ServiceEnvironmentConfig getServiceEnvironmentConfig( ServiceEnvironment serviceEnvironment, String userAgent ) { @@ -62,15 +44,13 @@ public static ServiceEnvironmentConfig getServiceEnvironmentConfig( case LIVE -> new ServiceEnvironmentConfig(serviceEnvironment, LiveConfig.createDefaultServiceConfiguration(interceptors), LiveConfig.getUnidentifiedSenderTrustRoot(), - LiveConfig.createKeyBackupConfig(), - LiveConfig.createFallbackKeyBackupConfigs(), - LiveConfig.getCdsiMrenclave()); + LiveConfig.getCdsiMrenclave(), + LiveConfig.getSvr2Mrenclave()); case STAGING -> new ServiceEnvironmentConfig(serviceEnvironment, StagingConfig.createDefaultServiceConfiguration(interceptors), StagingConfig.getUnidentifiedSenderTrustRoot(), - StagingConfig.createKeyBackupConfig(), - StagingConfig.createFallbackKeyBackupConfigs(), - StagingConfig.getCdsiMrenclave()); + StagingConfig.getCdsiMrenclave(), + StagingConfig.getSvr2Mrenclave()); }; } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceEnvironmentConfig.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceEnvironmentConfig.java index 2a95f34f12586..9664dcae0ab96 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceEnvironmentConfig.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/ServiceEnvironmentConfig.java @@ -4,57 +4,10 @@ import org.signal.libsignal.protocol.ecc.ECPublicKey; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; -import java.util.Collection; - -public class ServiceEnvironmentConfig { - - private final ServiceEnvironment type; - private final SignalServiceConfiguration signalServiceConfiguration; - - private final ECPublicKey unidentifiedSenderTrustRoot; - - private final KeyBackupConfig keyBackupConfig; - private final Collection fallbackKeyBackupConfigs; - - private final String cdsiMrenclave; - - public ServiceEnvironmentConfig( - final ServiceEnvironment type, - final SignalServiceConfiguration signalServiceConfiguration, - final ECPublicKey unidentifiedSenderTrustRoot, - final KeyBackupConfig keyBackupConfig, - final Collection fallbackKeyBackupConfigs, - final String cdsiMrenclave - ) { - this.type = type; - this.signalServiceConfiguration = signalServiceConfiguration; - this.unidentifiedSenderTrustRoot = unidentifiedSenderTrustRoot; - this.keyBackupConfig = keyBackupConfig; - this.fallbackKeyBackupConfigs = fallbackKeyBackupConfigs; - this.cdsiMrenclave = cdsiMrenclave; - } - - public ServiceEnvironment getType() { - return type; - } - - public SignalServiceConfiguration getSignalServiceConfiguration() { - return signalServiceConfiguration; - } - - public ECPublicKey getUnidentifiedSenderTrustRoot() { - return unidentifiedSenderTrustRoot; - } - - public KeyBackupConfig getKeyBackupConfig() { - return keyBackupConfig; - } - - public Collection getFallbackKeyBackupConfigs() { - return fallbackKeyBackupConfigs; - } - - public String getCdsiMrenclave() { - return cdsiMrenclave; - } -} +public record ServiceEnvironmentConfig( + ServiceEnvironment type, + SignalServiceConfiguration signalServiceConfiguration, + ECPublicKey unidentifiedSenderTrustRoot, + String cdsiMrenclave, + String svr2Mrenclave +) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/StagingConfig.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/StagingConfig.java index 95a3dd96c4d10..af1963035a4c6 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/StagingConfig.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/config/StagingConfig.java @@ -1,13 +1,11 @@ package org.asamk.signal.manager.config; -import org.bouncycastle.util.encoders.Hex; import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.ECPublicKey; import org.whispersystems.signalservice.api.push.TrustStore; import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl; import org.whispersystems.signalservice.internal.configuration.SignalCdsiUrl; -import org.whispersystems.signalservice.internal.configuration.SignalKeyBackupServiceUrl; import org.whispersystems.signalservice.internal.configuration.SignalProxy; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl; @@ -15,7 +13,6 @@ import org.whispersystems.signalservice.internal.configuration.SignalSvr2Url; import java.util.Base64; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -28,20 +25,11 @@ class StagingConfig { private final static byte[] UNIDENTIFIED_SENDER_TRUST_ROOT = Base64.getDecoder() .decode("BbqY1DzohE4NUZoVF+L18oUPrK3kILllLEJh2UnPSsEx"); private final static String CDSI_MRENCLAVE = "0f6fd79cdfdaa5b2e6337f534d3baf999318b0c462a7ac1f41297a3e4b424a57"; - - private final static String KEY_BACKUP_ENCLAVE_NAME = "39963b736823d5780be96ab174869a9499d56d66497aa8f9b2244f777ebc366b"; - private final static byte[] KEY_BACKUP_SERVICE_ID = Hex.decode( - "9dbc6855c198e04f21b5cc35df839fdcd51b53658454dfa3f817afefaffc95ef"); - private final static String KEY_BACKUP_MRENCLAVE = "45627094b2ea4a66f4cf0b182858a8dcf4b8479122c3820fe7fd0551a6d4cf5c"; - private final static String FALLBACK_KEY_BACKUP_ENCLAVE_NAME = "dd6f66d397d9e8cf6ec6db238e59a7be078dd50e9715427b9c89b409ffe53f99"; - private final static byte[] FALLBACK_KEY_BACKUP_SERVICE_ID = Hex.decode( - "4200003414528c151e2dccafbc87aa6d3d66a5eb8f8c05979a6e97cb33cd493a"); - private final static String FALLBACK_KEY_BACKUP_MRENCLAVE = "ee19f1965b1eefa3dc4204eb70c04f397755f771b8c1909d080c04dad2a6a9ba"; + private final static String SVR2_MRENCLAVE = "a8a261420a6bb9b61aa25bf8a79e8bd20d7652531feb3381cbffd446d270be95"; private final static String URL = "https://chat.staging.signal.org"; private final static String CDN_URL = "https://cdn-staging.signal.org"; private final static String CDN2_URL = "https://cdn2-staging.signal.org"; - private final static String SIGNAL_KEY_BACKUP_URL = "https://api-staging.backup.signal.org"; private final static String STORAGE_URL = "https://storage-staging.signal.org"; private final static String SIGNAL_CDSI_URL = "https://cdsi.staging.signal.org"; private final static String SIGNAL_SVR2_URL = "https://svr2.staging.signal.org"; @@ -63,7 +51,6 @@ static SignalServiceConfiguration createDefaultServiceConfiguration( new SignalCdnUrl[]{new SignalCdnUrl(CDN_URL, TRUST_STORE)}, 2, new SignalCdnUrl[]{new SignalCdnUrl(CDN2_URL, TRUST_STORE)}), - new SignalKeyBackupServiceUrl[]{new SignalKeyBackupServiceUrl(SIGNAL_KEY_BACKUP_URL, TRUST_STORE)}, new SignalStorageUrl[]{new SignalStorageUrl(STORAGE_URL, TRUST_STORE)}, new SignalCdsiUrl[]{new SignalCdsiUrl(SIGNAL_CDSI_URL, TRUST_STORE)}, new SignalSvr2Url[]{new SignalSvr2Url(SIGNAL_SVR2_URL, TRUST_STORE, null, null)}, @@ -82,20 +69,14 @@ static ECPublicKey getUnidentifiedSenderTrustRoot() { } } - static KeyBackupConfig createKeyBackupConfig() { - return new KeyBackupConfig(KEY_BACKUP_ENCLAVE_NAME, KEY_BACKUP_SERVICE_ID, KEY_BACKUP_MRENCLAVE); - } - - static Collection createFallbackKeyBackupConfigs() { - return List.of(new KeyBackupConfig(FALLBACK_KEY_BACKUP_ENCLAVE_NAME, - FALLBACK_KEY_BACKUP_SERVICE_ID, - FALLBACK_KEY_BACKUP_MRENCLAVE)); - } - static String getCdsiMrenclave() { return CDSI_MRENCLAVE; } + static String getSvr2Mrenclave() { + return SVR2_MRENCLAVE; + } + private StagingConfig() { } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/groups/GroupUtils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/groups/GroupUtils.java index b73be0ab0ada0..76352d1ad984d 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/groups/GroupUtils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/groups/GroupUtils.java @@ -28,7 +28,7 @@ public static void setGroupContext( } else { final var groupInfoV2 = (GroupInfoV2) groupInfo; var group = SignalServiceGroupV2.newBuilder(groupInfoV2.getMasterKey()) - .withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().getRevision()) + .withRevision(groupInfoV2.getGroup() == null ? 0 : groupInfoV2.getGroup().revision) .build(); messageBuilder.asGroupMessage(group); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountFileUpdater.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountFileUpdater.java index a983e4b529925..8edd5a4e0eb5c 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountFileUpdater.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountFileUpdater.java @@ -1,6 +1,6 @@ package org.asamk.signal.manager.helper; -import org.whispersystems.signalservice.api.push.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; public interface AccountFileUpdater { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountHelper.java index edca4f9726602..4e4eb1650ecef 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -12,33 +12,44 @@ import org.asamk.signal.manager.util.KeyUtils; import org.asamk.signal.manager.util.NumberVerificationUtils; import org.asamk.signal.manager.util.Utils; +import org.signal.core.util.Base64; import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidKeyException; +import org.signal.libsignal.protocol.SignalProtocolAddress; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; +import org.signal.libsignal.protocol.util.KeyHelper; import org.signal.libsignal.usernames.BaseUsernameException; import org.signal.libsignal.usernames.Username; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; +import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.ServiceIdType; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignedPreKeyEntity; import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException; import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; +import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity; import org.whispersystems.signalservice.internal.push.OutgoingPushMessage; -import org.whispersystems.util.Base64UrlSafe; +import org.whispersystems.signalservice.internal.push.SyncMessage; +import org.whispersystems.signalservice.internal.push.exceptions.MismatchedDevicesException; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.concurrent.TimeUnit; +import okio.ByteString; + +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; import static org.whispersystems.signalservice.internal.util.Util.isEmpty; public class AccountHelper { @@ -99,8 +110,8 @@ public void checkAccountState() throws IOException { public void checkWhoAmiI() throws IOException { final var whoAmI = dependencies.getAccountManager().getWhoAmI(); final var number = whoAmI.getNumber(); - final var aci = ACI.parseOrNull(whoAmI.getAci()); - final var pni = PNI.parseOrNull(whoAmI.getPni()); + final var aci = ACI.parseOrThrow(whoAmI.getAci()); + final var pni = PNI.parseOrThrow(whoAmI.getPni()); if (number.equals(account.getNumber()) && aci.equals(account.getAci()) && pni.equals(account.getPni())) { return; } @@ -112,31 +123,32 @@ private void updateSelfIdentifiers(final String number, final ACI aci, final PNI account.setNumber(number); account.setAci(aci); account.setPni(pni); - if (account.isPrimaryDevice() && account.getPniIdentityKeyPair() == null && account.getPni() != null) { + if (account.isPrimaryDevice() && account.getPniIdentityKeyPair() == null) { account.setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); } account.getRecipientTrustedResolver().resolveSelfRecipientTrusted(account.getSelfRecipientAddress()); // TODO check and update remote storage context.getUnidentifiedAccessHelper().rotateSenderCertificates(); dependencies.resetAfterAddressChange(); + context.getGroupV2Helper().clearAuthCredentialCache(); context.getAccountFileUpdater().updateAccountIdentifiers(account.getNumber(), account.getAci()); } public void setPni( final PNI updatedPni, final IdentityKeyPair pniIdentityKeyPair, + final String number, + final int localPniRegistrationId, final SignedPreKeyRecord pniSignedPreKey, - final int localPniRegistrationId + final KyberPreKeyRecord lastResortKyberPreKey ) throws IOException { - account.setPni(updatedPni, pniIdentityKeyPair, pniSignedPreKey, localPniRegistrationId); + updateSelfIdentifiers(number != null ? number : account.getNumber(), account.getAci(), updatedPni); + account.setNewPniIdentity(pniIdentityKeyPair, pniSignedPreKey, lastResortKyberPreKey, localPniRegistrationId); context.getPreKeyHelper().refreshPreKeysIfNecessary(ServiceIdType.PNI); - if (account.getPni() == null || !account.getPni().equals(updatedPni)) { - context.getGroupV2Helper().clearAuthCredentialCache(); - } } public void startChangeNumber( - String newNumber, String captcha, boolean voiceVerification + String newNumber, boolean voiceVerification, String captcha ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException { final var accountManager = dependencies.createUnauthenticatedAccountManager(newNumber, account.getPassword()); String sessionId = NumberVerificationUtils.handleVerificationSession(accountManager, @@ -150,11 +162,92 @@ public void startChangeNumber( public void finishChangeNumber( String newNumber, String verificationCode, String pin ) throws IncorrectPinException, PinLockedException, IOException { - // TODO create new PNI identity key - final List deviceMessages = null; - final Map devicePniSignedPreKeys = null; - final Map pniRegistrationIds = null; - var sessionId = account.getSessionId(account.getNumber()); + for (var attempts = 0; attempts < 5; attempts++) { + try { + finishChangeNumberInternal(newNumber, verificationCode, pin); + break; + } catch (MismatchedDevicesException e) { + logger.debug("Change number failed with mismatched devices, retrying."); + try { + dependencies.getMessageSender().handleChangeNumberMismatchDevices(e.getMismatchedDevices()); + } catch (UntrustedIdentityException ex) { + throw new AssertionError(ex); + } + } + } + } + + private void finishChangeNumberInternal( + String newNumber, String verificationCode, String pin + ) throws IncorrectPinException, PinLockedException, IOException { + final var pniIdentity = KeyUtils.generateIdentityKeyPair(); + final var encryptedDeviceMessages = new ArrayList(); + final var devicePniSignedPreKeys = new HashMap(); + final var devicePniLastResortKyberPreKeys = new HashMap(); + final var pniRegistrationIds = new HashMap(); + + final var selfDeviceId = account.getDeviceId(); + SyncMessage.PniChangeNumber selfChangeNumber = null; + + final var deviceIds = new ArrayList(); + deviceIds.add(SignalServiceAddress.DEFAULT_DEVICE_ID); + final var aci = account.getAci(); + final var accountDataStore = account.getSignalServiceDataStore().aci(); + final var subDeviceSessions = accountDataStore.getSubDeviceSessions(aci.toString()) + .stream() + .filter(deviceId -> accountDataStore.containsSession(new SignalProtocolAddress(aci.toString(), + deviceId))) + .toList(); + deviceIds.addAll(subDeviceSessions); + + final var messageSender = dependencies.getMessageSender(); + for (final var deviceId : deviceIds) { + // Signed Prekey + final var signedPreKeyRecord = KeyUtils.generateSignedPreKeyRecord(KeyUtils.getRandomInt(PREKEY_MAXIMUM_ID), + pniIdentity.getPrivateKey()); + final var signedPreKeyEntity = new SignedPreKeyEntity(signedPreKeyRecord.getId(), + signedPreKeyRecord.getKeyPair().getPublicKey(), + signedPreKeyRecord.getSignature()); + devicePniSignedPreKeys.put(deviceId, signedPreKeyEntity); + + // Last-resort kyber prekey + final var lastResortKyberPreKeyRecord = KeyUtils.generateKyberPreKeyRecord(KeyUtils.getRandomInt( + PREKEY_MAXIMUM_ID), pniIdentity.getPrivateKey()); + final var kyberPreKeyEntity = new KyberPreKeyEntity(lastResortKyberPreKeyRecord.getId(), + lastResortKyberPreKeyRecord.getKeyPair().getPublicKey(), + lastResortKyberPreKeyRecord.getSignature()); + devicePniLastResortKyberPreKeys.put(deviceId, kyberPreKeyEntity); + + // Registration Id + var pniRegistrationId = -1; + while (pniRegistrationId < 0 || pniRegistrationIds.containsValue(pniRegistrationId)) { + pniRegistrationId = KeyHelper.generateRegistrationId(false); + } + pniRegistrationIds.put(deviceId, pniRegistrationId); + + // Device Message + final var pniChangeNumber = new SyncMessage.PniChangeNumber.Builder().identityKeyPair(ByteString.of( + pniIdentity.serialize())) + .signedPreKey(ByteString.of(signedPreKeyRecord.serialize())) + .lastResortKyberPreKey(ByteString.of(lastResortKyberPreKeyRecord.serialize())) + .registrationId(pniRegistrationId) + .newE164(newNumber) + .build(); + + if (deviceId == selfDeviceId) { + selfChangeNumber = pniChangeNumber; + } else { + try { + final var message = messageSender.getEncryptedSyncPniInitializeDeviceMessage(deviceId, + pniChangeNumber); + encryptedDeviceMessages.add(message); + } catch (UntrustedIdentityException | IOException | InvalidKeyException e) { + throw new RuntimeException(e); + } + } + } + + final var sessionId = account.getSessionId(newNumber); final var result = NumberVerificationUtils.verifyNumber(sessionId, verificationCode, pin, @@ -162,7 +255,7 @@ public void finishChangeNumber( (sessionId1, verificationCode1, registrationLock) -> { final var accountManager = dependencies.getAccountManager(); try { - Utils.handleResponseException(accountManager.verifyAccount(verificationCode, sessionId1)); + Utils.handleResponseException(accountManager.verifyAccount(verificationCode1, sessionId1)); } catch (AlreadyVerifiedException e) { // Already verified so can continue changing number } @@ -171,13 +264,42 @@ public void finishChangeNumber( null, newNumber, registrationLock, - account.getPniIdentityKeyPair().getPublicKey(), - deviceMessages, - devicePniSignedPreKeys, - pniRegistrationIds))); + pniIdentity.getPublicKey(), + encryptedDeviceMessages, + Utils.mapKeys(devicePniSignedPreKeys, Object::toString), + Utils.mapKeys(devicePniLastResortKyberPreKeys, Object::toString), + Utils.mapKeys(pniRegistrationIds, Object::toString)))); }); - // TODO handle response - updateSelfIdentifiers(newNumber, account.getAci(), PNI.parseOrThrow(result.first().getPni())); + + final var updatePni = PNI.parseOrThrow(result.first().getPni()); + if (updatePni.equals(account.getPni())) { + logger.debug("PNI is unchanged after change number"); + return; + } + + handlePniChangeNumberMessage(selfChangeNumber, updatePni); + } + + public void handlePniChangeNumberMessage( + final SyncMessage.PniChangeNumber pniChangeNumber, final PNI updatedPni + ) { + if (pniChangeNumber.identityKeyPair != null + && pniChangeNumber.registrationId != null + && pniChangeNumber.signedPreKey != null) { + logger.debug("New PNI: {}", updatedPni); + try { + setPni(updatedPni, + new IdentityKeyPair(pniChangeNumber.identityKeyPair.toByteArray()), + pniChangeNumber.newE164, + pniChangeNumber.registrationId, + new SignedPreKeyRecord(pniChangeNumber.signedPreKey.toByteArray()), + pniChangeNumber.lastResortKyberPreKey != null + ? new KyberPreKeyRecord(pniChangeNumber.lastResortKyberPreKey.toByteArray()) + : null); + } catch (Exception e) { + logger.warn("Failed to handle change number message", e); + } + } } public static final int USERNAME_MIN_LENGTH = 3; @@ -193,10 +315,10 @@ public String reserveUsername(String nickname) throws IOException, BaseUsernameE } } - final var candidates = Username.generateCandidates(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH); + final var candidates = Username.candidatesFrom(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH); final var candidateHashes = new ArrayList(); for (final var candidate : candidates) { - candidateHashes.add(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(candidate))); + candidateHashes.add(Base64.encodeUrlSafeWithoutPadding(candidate.getHash())); } final var response = dependencies.getAccountManager().reserveUsername(candidateHashes); @@ -207,7 +329,7 @@ public String reserveUsername(String nickname) throws IOException, BaseUsernameE } logger.debug("[reserveUsername] Successfully reserved username."); - final var username = candidates.get(hashIndex); + final var username = candidates.get(hashIndex).getUsername(); dependencies.getAccountManager().confirmUsername(username, response); account.setUsername(username); @@ -226,7 +348,7 @@ public void refreshCurrentUsername() throws IOException, BaseUsernameException { final var whoAmIResponse = dependencies.getAccountManager().getWhoAmI(); final var serverUsernameHash = whoAmIResponse.getUsernameHash(); final var hasServerUsername = !isEmpty(serverUsernameHash); - final var localUsernameHash = Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(localUsername)); + final var localUsernameHash = Base64.encodeUrlSafeWithoutPadding(new Username(localUsername).getHash()); if (!hasServerUsername) { logger.debug("No remote username is set."); @@ -294,12 +416,14 @@ public void migrateRegistrationPin() throws IOException { var masterKey = account.getOrCreatePinMasterKey(); context.getPinHelper().migrateRegistrationLockPin(account.getRegistrationLockPin(), masterKey); + dependencies.getAccountManager().enableRegistrationLock(masterKey); } public void setRegistrationPin(String pin) throws IOException { var masterKey = account.getOrCreatePinMasterKey(); context.getPinHelper().setRegistrationLockPin(pin, masterKey); + dependencies.getAccountManager().enableRegistrationLock(masterKey); account.setRegistrationLockPin(pin); } @@ -307,6 +431,7 @@ public void setRegistrationPin(String pin) throws IOException { public void removeRegistrationPin() throws IOException { // Remove KBS Pin context.getPinHelper().removeRegistrationLockPin(); + dependencies.getAccountManager().disableRegistrationLock(); account.setRegistrationLockPin(null); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/Context.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/Context.java index 2caeb0fb5dfaf..e5824a5af26a4 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/Context.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/Context.java @@ -114,9 +114,7 @@ public IncomingMessageHandler getIncomingMessageHandler() { } PinHelper getPinHelper() { - return getOrCreate(() -> pinHelper, - () -> pinHelper = new PinHelper(dependencies.getKeyBackupService(), - dependencies.getFallbackKeyBackupServices())); + return getOrCreate(() -> pinHelper, () -> pinHelper = new PinHelper(dependencies.getSecureValueRecoveryV2())); } public PreKeyHelper getPreKeyHelper() { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupHelper.java index d987d3d1e4c72..5991202e5e43f 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupHelper.java @@ -125,11 +125,11 @@ public GroupInfoV2 getOrMigrateGroup( groupInfoV2 = new GroupInfoV2(groupId, groupMasterKey, account.getRecipientResolver()); } - if (groupInfoV2.getGroup() == null || groupInfoV2.getGroup().getRevision() < revision) { + if (groupInfoV2.getGroup() == null || groupInfoV2.getGroup().revision < revision) { DecryptedGroup group = null; if (signedGroupChange != null && groupInfoV2.getGroup() != null - && groupInfoV2.getGroup().getRevision() + 1 == revision) { + && groupInfoV2.getGroup().revision + 1 == revision) { final var decryptedGroupChange = context.getGroupV2Helper() .getDecryptedGroupChange(signedGroupChange, groupMasterKey); @@ -151,8 +151,8 @@ public GroupInfoV2 getOrMigrateGroup( } if (group != null) { storeProfileKeysFromMembers(group); - final var avatar = group.getAvatar(); - if (avatar != null && !avatar.isEmpty()) { + final var avatar = group.avatar; + if (!avatar.isEmpty()) { downloadGroupAvatar(groupId, groupSecretParams, avatar); } } @@ -300,14 +300,14 @@ public Pair joinGroup( } catch (GroupLinkNotActiveException e) { throw new InactiveGroupLinkException("Group link inactive (reason: " + e.getReason() + ")", e); } - if (groupJoinInfo.getPendingAdminApproval()) { + if (groupJoinInfo.pendingAdminApproval) { throw new PendingAdminApprovalException("You have already requested to join the group."); } final var groupChange = context.getGroupV2Helper() .joinGroup(inviteLinkUrl.getGroupMasterKey(), inviteLinkUrl.getPassword(), groupJoinInfo); final var group = getOrMigrateGroup(inviteLinkUrl.getGroupMasterKey(), - groupJoinInfo.getRevision() + 1, - groupChange.toByteArray()); + groupJoinInfo.revision + 1, + groupChange.encode()); if (group.getGroup() == null) { // Only requested member, can't send update to group members @@ -400,8 +400,8 @@ private GroupInfo getGroup(GroupId groupId, boolean forceUpdate) { } catch (NotAGroupMemberException ignored) { } storeProfileKeysFromMembers(decryptedGroup); - final var avatar = decryptedGroup.getAvatar(); - if (avatar != null && !avatar.isEmpty()) { + final var avatar = decryptedGroup.avatar; + if (!avatar.isEmpty()) { downloadGroupAvatar(groupInfoV2.getGroupId(), groupSecretParams, avatar); } } @@ -446,8 +446,8 @@ private void retrieveGroupV2Avatar( } private void storeProfileKeysFromMembers(final DecryptedGroup group) { - for (var member : group.getMembersList()) { - final var serviceId = ServiceId.fromByteString(member.getUuid()); + for (var member : group.members) { + final var serviceId = ServiceId.parseOrThrow(member.aciBytes); final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId); final var profileStore = account.getProfileStore(); if (profileStore.getProfileKey(recipientId) != null) { @@ -455,7 +455,7 @@ private void storeProfileKeysFromMembers(final DecryptedGroup group) { continue; } try { - profileStore.storeProfileKey(recipientId, new ProfileKey(member.getProfileKey().toByteArray())); + profileStore.storeProfileKey(recipientId, new ProfileKey(member.profileKey.toByteArray())); } catch (InvalidInputException ignored) { } } @@ -479,7 +479,7 @@ private void storeProfileKeysFromHistory( final DecryptedGroup newDecryptedGroup ) throws NotAGroupMemberException { final var revisionWeWereAdded = context.getGroupV2Helper().findRevisionWeWereAdded(newDecryptedGroup); - final var localRevision = localGroup.getGroup() == null ? 0 : localGroup.getGroup().getRevision(); + final var localRevision = localGroup.getGroup() == null ? 0 : localGroup.getGroup().revision; var fromRevision = Math.max(revisionWeWereAdded, localRevision); final var newProfileKeys = new HashMap(); while (true) { @@ -594,14 +594,14 @@ private SendGroupMessageResults updateGroupV2( if (members != null) { final var requestingMembers = new HashSet<>(members); requestingMembers.retainAll(group.getRequestingMembers()); - if (requestingMembers.size() > 0) { + if (!requestingMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.approveJoinRequestMembers(group, requestingMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } final var newMembers = new HashSet<>(members); newMembers.removeAll(group.getMembers()); newMembers.removeAll(group.getRequestingMembers()); - if (newMembers.size() > 0) { + if (!newMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.addMembers(group, newMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } @@ -617,20 +617,20 @@ private SendGroupMessageResults updateGroupV2( existingRemoveMembers.removeAll(members); } existingRemoveMembers.remove(account.getSelfRecipientId());// self can be removed with sendQuitGroupMessage - if (existingRemoveMembers.size() > 0) { + if (!existingRemoveMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.removeMembers(group, existingRemoveMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } var pendingRemoveMembers = new HashSet<>(removeMembers); pendingRemoveMembers.retainAll(group.getPendingMembers()); - if (pendingRemoveMembers.size() > 0) { + if (!pendingRemoveMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.revokeInvitedMembers(group, pendingRemoveMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } var requestingRemoveMembers = new HashSet<>(removeMembers); requestingRemoveMembers.retainAll(group.getRequestingMembers()); - if (requestingRemoveMembers.size() > 0) { + if (!requestingRemoveMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.refuseJoinRequestMembers(group, requestingRemoveMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } @@ -640,7 +640,7 @@ private SendGroupMessageResults updateGroupV2( final var newAdmins = new HashSet<>(admins); newAdmins.retainAll(group.getMembers()); newAdmins.removeAll(group.getAdminMembers()); - if (newAdmins.size() > 0) { + if (!newAdmins.isEmpty()) { for (var admin : newAdmins) { var groupGroupChangePair = groupV2Helper.setMemberAdmin(group, admin, true); result = sendUpdateGroupV2Message(group, @@ -653,7 +653,7 @@ private SendGroupMessageResults updateGroupV2( if (removeAdmins != null) { final var existingRemoveAdmins = new HashSet<>(removeAdmins); existingRemoveAdmins.retainAll(group.getAdminMembers()); - if (existingRemoveAdmins.size() > 0) { + if (!existingRemoveAdmins.isEmpty()) { for (var admin : existingRemoveAdmins) { var groupGroupChangePair = groupV2Helper.setMemberAdmin(group, admin, false); result = sendUpdateGroupV2Message(group, @@ -666,7 +666,7 @@ private SendGroupMessageResults updateGroupV2( if (banMembers != null) { final var newlyBannedMembers = new HashSet<>(banMembers); newlyBannedMembers.removeAll(group.getBannedMembers()); - if (newlyBannedMembers.size() > 0) { + if (!newlyBannedMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.banMembers(group, newlyBannedMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } @@ -675,7 +675,7 @@ private SendGroupMessageResults updateGroupV2( if (unbanMembers != null) { var existingUnbanMembers = new HashSet<>(unbanMembers); existingUnbanMembers.retainAll(group.getBannedMembers()); - if (existingUnbanMembers.size() > 0) { + if (!existingUnbanMembers.isEmpty()) { var groupGroupChangePair = groupV2Helper.unbanMembers(group, existingUnbanMembers); result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second()); } @@ -745,7 +745,7 @@ private SendGroupMessageResults quitGroupV2( if (currentAdmins.contains(account.getSelfRecipientId()) && currentAdmins.size() == 1 && groupInfoV2.getMembers().size() > 1 - && newAdmins.size() == 0) { + && newAdmins.isEmpty()) { // Last admin can't leave the group, unless she's also the last member throw new LastGroupAdminException(groupInfoV2.getGroupId(), groupInfoV2.getTitle()); } @@ -753,7 +753,7 @@ private SendGroupMessageResults quitGroupV2( groupInfoV2.setGroup(groupGroupChangePair.first()); account.getGroupStore().updateGroup(groupInfoV2); - var messageBuilder = getGroupUpdateMessageBuilder(groupInfoV2, groupGroupChangePair.second().toByteArray()); + var messageBuilder = getGroupUpdateMessageBuilder(groupInfoV2, groupGroupChangePair.second().encode()); return sendGroupMessage(messageBuilder, groupInfoV2.getMembersIncludingPendingWithout(account.getSelfRecipientId()), groupInfoV2.getDistributionId()); @@ -782,7 +782,7 @@ private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfoV private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfoV2 g, byte[] signedGroupChange) { var group = SignalServiceGroupV2.newBuilder(g.getMasterKey()) - .withRevision(g.getGroup().getRevision()) + .withRevision(g.getGroup().revision) .withSignedGroupChange(signedGroupChange); return SignalServiceDataMessage.newBuilder() .asGroupMessage(group.build()) @@ -798,7 +798,7 @@ private SendGroupMessageResults sendUpdateGroupV2Message( members.addAll(group.getMembersIncludingPendingWithout(selfRecipientId)); account.getGroupStore().updateGroup(group); - final var messageBuilder = getGroupUpdateMessageBuilder(group, groupChange.toByteArray()); + final var messageBuilder = getGroupUpdateMessageBuilder(group, groupChange.encode()); return sendGroupMessage(messageBuilder, members, group.getDistributionId()); } @@ -822,8 +822,8 @@ private byte[] readAvatarBytes(final String avatarFile) throws IOException { if (avatarFile == null) { return null; } - try (final var avatar = Utils.createStreamDetails(avatarFile).first().getStream()) { - return IOUtils.readFully(avatar); + try (final var avatar = Utils.createStreamDetails(avatarFile).first()) { + return IOUtils.readFully(avatar.getStream()); } } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupV2Helper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupV2Helper.java index 7cc28d6afdcc0..96ecf2c076e12 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupV2Helper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/GroupV2Helper.java @@ -1,8 +1,5 @@ package org.asamk.signal.manager.helper; -import com.google.protobuf.ByteString; -import com.google.protobuf.InvalidProtocolBufferException; - import org.asamk.signal.manager.api.GroupLinkState; import org.asamk.signal.manager.api.GroupPermission; import org.asamk.signal.manager.api.NotAGroupMemberException; @@ -28,7 +25,6 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroupJoinInfo; import org.signal.storageservice.protos.groups.local.DecryptedMember; import org.signal.storageservice.protos.groups.local.DecryptedPendingMember; -import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; @@ -39,9 +35,9 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; import org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException; import org.whispersystems.signalservice.api.groupsv2.NotAbleToApplyGroupV2ChangeException; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import org.whispersystems.signalservice.api.util.UuidUtil; @@ -59,6 +55,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import okio.ByteString; + class GroupV2Helper { private final static Logger logger = LoggerFactory.getLogger(GroupV2Helper.class); @@ -124,13 +122,14 @@ GroupHistoryPage getDecryptedGroupHistoryPage( } int findRevisionWeWereAdded(DecryptedGroup partialDecryptedGroup) { - ByteString bytes = UuidUtil.toByteString(getSelfAci().uuid()); - for (DecryptedMember decryptedMember : partialDecryptedGroup.getMembersList()) { - if (decryptedMember.getUuid().equals(bytes)) { - return decryptedMember.getJoinedAtRevision(); + ByteString aciBytes = getSelfAci().toByteString(); + ByteString pniBytes = getSelfPni().toByteString(); + for (DecryptedMember decryptedMember : partialDecryptedGroup.members) { + if (decryptedMember.aciBytes.equals(aciBytes) || decryptedMember.pniBytes.equals(pniBytes)) { + return decryptedMember.joinedAtRevision; } } - return partialDecryptedGroup.getRevision(); + return partialDecryptedGroup.revision; } Pair createGroup( @@ -175,11 +174,11 @@ private GroupsV2Operations.NewGroup buildNewGroup( return null; } - final var self = new GroupCandidate(getSelfAci().uuid(), Optional.of(profileKeyCredential)); + final var self = new GroupCandidate(getSelfAci(), Optional.of(profileKeyCredential)); final var memberList = new ArrayList<>(members); final var credentials = context.getProfileHelper().getExpiringProfileKeyCredential(memberList).stream(); final var uuids = memberList.stream() - .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid()); + .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId()); var candidates = Utils.zip(uuids, credentials, (uuid, credential) -> new GroupCandidate(uuid, Optional.ofNullable(credential))) @@ -202,19 +201,19 @@ Pair updateGroup( final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams); - var change = name != null ? groupOperations.createModifyGroupTitle(name) : GroupChange.Actions.newBuilder(); + var change = name != null ? groupOperations.createModifyGroupTitle(name) : new GroupChange.Actions.Builder(); if (description != null) { - change.setModifyDescription(groupOperations.createModifyGroupDescriptionAction(description)); + change.modifyDescription(groupOperations.createModifyGroupDescriptionAction(description).build()); } if (avatarFile != null) { var avatarCdnKey = dependencies.getGroupsV2Api() .uploadAvatar(avatarFile, groupSecretParams, getGroupAuthForToday(groupSecretParams)); - change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey)); + change.modifyAvatar(new GroupChange.Actions.ModifyAvatarAction.Builder().avatar(avatarCdnKey).build()); } - change.setSourceUuid(getSelfAci().toByteString()); + change.sourceServiceId(getSelfAci().toByteString()); return commitChange(groupInfoV2, change); } @@ -227,20 +226,20 @@ Pair addMembers( final var memberList = new ArrayList<>(newMembers); final var credentials = context.getProfileHelper().getExpiringProfileKeyCredential(memberList).stream(); final var uuids = memberList.stream() - .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid()); + .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId()); var candidates = Utils.zip(uuids, credentials, (uuid, credential) -> new GroupCandidate(uuid, Optional.ofNullable(credential))) .collect(Collectors.toSet()); final var bannedUuids = groupInfoV2.getBannedMembers() .stream() - .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid()) + .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId()) .collect(Collectors.toSet()); final var aci = getSelfAci(); - final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci.uuid()); + final var change = groupOperations.createModifyGroupMembershipChange(candidates, bannedUuids, aci); - change.setSourceUuid(getSelfAci().toByteString()); + change.sourceServiceId(getSelfAci().toByteString()); return commitChange(groupInfoV2, change); } @@ -248,9 +247,9 @@ Pair addMembers( Pair leaveGroup( GroupInfoV2 groupInfoV2, Set membersToMakeAdmin ) throws IOException { - var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList(); + var pendingMembersList = groupInfoV2.getGroup().pendingMembers; final var selfAci = getSelfAci(); - var selfPendingMember = DecryptedGroupUtil.findPendingByUuid(pendingMembersList, selfAci.uuid()); + var selfPendingMember = DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, selfAci); if (selfPendingMember.isPresent()) { return revokeInvites(groupInfoV2, Set.of(selfPendingMember.get())); @@ -259,11 +258,10 @@ Pair leaveGroup( final var adminUuids = membersToMakeAdmin.stream() .map(context.getRecipientHelper()::resolveSignalServiceAddress) .map(SignalServiceAddress::getServiceId) - .map(ServiceId::uuid) + .map(ServiceId::getRawUuid) .toList(); final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); - return commitChange(groupInfoV2, - groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci.uuid(), adminUuids)); + return commitChange(groupInfoV2, groupOperations.createLeaveAndPromoteMembersToAdmin(selfAci, adminUuids)); } Pair removeMembers( @@ -272,7 +270,8 @@ Pair removeMembers( final var memberUuids = members.stream() .map(context.getRecipientHelper()::resolveSignalServiceAddress) .map(SignalServiceAddress::getServiceId) - .map(ServiceId::uuid) + .filter(m -> m instanceof ACI) + .map(m -> (ACI) m) .collect(Collectors.toSet()); return ejectMembers(groupInfoV2, memberUuids); } @@ -283,7 +282,7 @@ Pair approveJoinRequestMembers( final var memberUuids = members.stream() .map(context.getRecipientHelper()::resolveSignalServiceAddress) .map(SignalServiceAddress::getServiceId) - .map(ServiceId::uuid) + .map(ServiceId::getRawUuid) .collect(Collectors.toSet()); return approveJoinRequest(groupInfoV2, memberUuids); } @@ -294,7 +293,6 @@ Pair refuseJoinRequestMembers( final var memberUuids = members.stream() .map(context.getRecipientHelper()::resolveSignalServiceAddress) .map(SignalServiceAddress::getServiceId) - .map(ServiceId::uuid) .collect(Collectors.toSet()); return refuseJoinRequest(groupInfoV2, memberUuids); } @@ -302,12 +300,11 @@ Pair refuseJoinRequestMembers( Pair revokeInvitedMembers( GroupInfoV2 groupInfoV2, Set members ) throws IOException { - var pendingMembersList = groupInfoV2.getGroup().getPendingMembersList(); + var pendingMembersList = groupInfoV2.getGroup().pendingMembers; final var memberUuids = members.stream() .map(context.getRecipientHelper()::resolveSignalServiceAddress) .map(SignalServiceAddress::getServiceId) - .map(ServiceId::uuid) - .map(uuid -> DecryptedGroupUtil.findPendingByUuid(pendingMembersList, uuid)) + .map(uuid -> DecryptedGroupUtil.findPendingByServiceId(pendingMembersList, uuid)) .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toSet()); @@ -319,15 +316,15 @@ Pair banMembers( ) throws IOException { GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); - final var uuids = block.stream() - .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid()) + final var serviceIds = block.stream() + .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId()) .collect(Collectors.toSet()); - final var change = groupOperations.createBanUuidsChange(uuids, + final var change = groupOperations.createBanServiceIdsChange(serviceIds, false, - groupInfoV2.getGroup().getBannedMembersList()); + groupInfoV2.getGroup().bannedMembers); - change.setSourceUuid(getSelfAci().toByteString()); + change.sourceServiceId(getSelfAci().toByteString()); return commitChange(groupInfoV2, change); } @@ -337,13 +334,13 @@ Pair unbanMembers( ) throws IOException { GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); - final var uuids = block.stream() - .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId().uuid()) + final var serviceIds = block.stream() + .map(member -> context.getRecipientHelper().resolveSignalServiceAddress(member).getServiceId()) .collect(Collectors.toSet()); - final var change = groupOperations.createUnbanUuidsChange(uuids); + final var change = groupOperations.createUnbanServiceIdsChange(serviceIds); - change.setSourceUuid(getSelfAci().toByteString()); + change.sourceServiceId(getSelfAci().toByteString()); return commitChange(groupInfoV2, change); } @@ -361,9 +358,8 @@ Pair setGroupLinkState( final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final var accessRequired = toAccessControl(state); - final var requiresNewPassword = state != GroupLinkState.DISABLED && groupInfoV2.getGroup() - .getInviteLinkPassword() - .isEmpty(); + final var requiresNewPassword = state != GroupLinkState.DISABLED + && groupInfoV2.getGroup().inviteLinkPassword.toByteArray().length == 0; final var change = requiresNewPassword ? groupOperations.createModifyGroupLinkPasswordAndRightsChange( GroupLinkPassword.createNew().serialize(), @@ -394,14 +390,14 @@ Pair setAddMemberPermission( Pair updateSelfProfileKey(GroupInfoV2 groupInfoV2) throws IOException { Optional selfInGroup = groupInfoV2.getGroup() == null ? Optional.empty() - : DecryptedGroupUtil.findMemberByUuid(groupInfoV2.getGroup().getMembersList(), getSelfAci().uuid()); + : DecryptedGroupUtil.findMemberByAci(groupInfoV2.getGroup().members, getSelfAci()); if (selfInGroup.isEmpty()) { logger.trace("Not updating group, self not in group " + groupInfoV2.getGroupId().toBase64()); return null; } final var profileKey = context.getAccount().getProfileKey(); - if (Arrays.equals(profileKey.serialize(), selfInGroup.get().getProfileKey().toByteArray())) { + if (Arrays.equals(profileKey.serialize(), selfInGroup.get().profileKey.toByteArray())) { logger.trace("Not updating group, own Profile Key is already up to date in group " + groupInfoV2.getGroupId().toBase64()); return null; @@ -417,7 +413,7 @@ Pair updateSelfProfileKey(GroupInfoV2 groupInfoV2) final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final var change = groupOperations.createUpdateProfileKeyCredentialChange(profileKeyCredential); - change.setSourceUuid(getSelfAci().toByteString()); + change.sourceServiceId(getSelfAci().toByteString()); return commitChange(groupInfoV2, change); } @@ -435,17 +431,17 @@ GroupChange joinGroup( throw new IOException("Cannot join a V2 group as self does not have a versioned profile"); } - var requestToJoin = decryptedGroupJoinInfo.getAddFromInviteLink() == AccessControl.AccessRequired.ADMINISTRATOR; + var requestToJoin = decryptedGroupJoinInfo.addFromInviteLink == AccessControl.AccessRequired.ADMINISTRATOR; var change = requestToJoin ? groupOperations.createGroupJoinRequest(profileKeyCredential) : groupOperations.createGroupJoinDirect(profileKeyCredential); - change.setSourceUuid(context.getRecipientHelper() + change.sourceServiceId(context.getRecipientHelper() .resolveSignalServiceAddress(selfRecipientId) .getServiceId() .toByteString()); - return commitChange(groupSecretParams, decryptedGroupJoinInfo.getRevision(), change, groupLinkPassword); + return commitChange(groupSecretParams, decryptedGroupJoinInfo.revision, change, groupLinkPassword); } Pair acceptInvite(GroupInfoV2 groupInfoV2) throws IOException { @@ -460,7 +456,7 @@ Pair acceptInvite(GroupInfoV2 groupInfoV2) throws I final var change = groupOperations.createAcceptInviteChange(profileKeyCredential); final var aci = context.getRecipientHelper().resolveSignalServiceAddress(selfRecipientId).getServiceId(); - change.setSourceUuid(aci.toByteString()); + change.sourceServiceId(aci.toByteString()); return commitChange(groupInfoV2, change); } @@ -471,8 +467,12 @@ Pair setMemberAdmin( final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final var address = context.getRecipientHelper().resolveSignalServiceAddress(recipientId); final var newRole = admin ? Member.Role.ADMINISTRATOR : Member.Role.DEFAULT; - final var change = groupOperations.createChangeMemberRole(address.getServiceId().uuid(), newRole); - return commitChange(groupInfoV2, change); + if (address.getServiceId() instanceof ACI aci) { + final var change = groupOperations.createChangeMemberRole(aci, newRole); + return commitChange(groupInfoV2, change); + } else { + throw new IllegalArgumentException("Can't make a PNI a group admin."); + } } Pair setMessageExpirationTimer( @@ -517,7 +517,7 @@ private Pair revokeInvites( final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); final var uuidCipherTexts = pendingMembers.stream().map(member -> { try { - return new UuidCiphertext(member.getUuidCipherText().toByteArray()); + return new UuidCiphertext(member.serviceIdCipherText.toByteArray()); } catch (InvalidInputException e) { throw new AssertionError(e); } @@ -533,17 +533,17 @@ private Pair approveJoinRequest( } private Pair refuseJoinRequest( - GroupInfoV2 groupInfoV2, Set uuids + GroupInfoV2 groupInfoV2, Set serviceIds ) throws IOException { final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); - return commitChange(groupInfoV2, groupOperations.createRefuseGroupJoinRequest(uuids, false, List.of())); + return commitChange(groupInfoV2, groupOperations.createRefuseGroupJoinRequest(serviceIds, false, List.of())); } private Pair ejectMembers( - GroupInfoV2 groupInfoV2, Set uuids + GroupInfoV2 groupInfoV2, Set members ) throws IOException { final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2); - return commitChange(groupInfoV2, groupOperations.createRemoveMembersChange(uuids, false, List.of())); + return commitChange(groupInfoV2, groupOperations.createRemoveMembersChange(members, false, List.of())); } private Pair commitChange( @@ -552,13 +552,13 @@ private Pair commitChange( final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); final var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams); final var previousGroupState = groupInfoV2.getGroup(); - final var nextRevision = previousGroupState.getRevision() + 1; - final var changeActions = change.setRevision(nextRevision).build(); + final var nextRevision = previousGroupState.revision + 1; + final var changeActions = change.revision(nextRevision).build(); final DecryptedGroupChange decryptedChange; final DecryptedGroup decryptedGroupState; try { - decryptedChange = groupOperations.decryptChange(changeActions, getSelfAci().uuid()); + decryptedChange = groupOperations.decryptChange(changeActions, getSelfAci()); decryptedGroupState = DecryptedGroupUtil.apply(previousGroupState, decryptedChange); } catch (VerificationFailedException | InvalidGroupStateException | NotAbleToApplyGroupV2ChangeException e) { throw new IOException(e); @@ -577,7 +577,7 @@ private GroupChange commitChange( GroupLinkPassword password ) throws IOException { final var nextRevision = currentRevision + 1; - final var changeActions = change.setRevision(nextRevision).build(); + final var changeActions = change.revision(nextRevision).build(); return dependencies.getGroupsV2Api() .patchGroup(changeActions, @@ -586,17 +586,16 @@ private GroupChange commitChange( } Pair getAuthoritativeProfileKeyFromChange(final DecryptedGroupChange change) { - UUID editor = UuidUtil.fromByteStringOrNull(change.getEditor()); - final var editorProfileKeyBytes = Stream.concat(Stream.of(change.getNewMembersList().stream(), - change.getPromotePendingMembersList().stream(), - change.getModifiedProfileKeysList().stream()) + UUID editor = UuidUtil.fromByteStringOrNull(change.editorServiceIdBytes); + final var editorProfileKeyBytes = Stream.concat(Stream.of(change.newMembers.stream(), + change.promotePendingMembers.stream(), + change.modifiedProfileKeys.stream()) .flatMap(Function.identity()) - .filter(m -> UuidUtil.fromByteString(m.getUuid()).equals(editor)) - .map(DecryptedMember::getProfileKey), - change.getNewRequestingMembersList() - .stream() - .filter(m -> UuidUtil.fromByteString(m.getUuid()).equals(editor)) - .map(DecryptedRequestingMember::getProfileKey)).findFirst(); + .filter(m -> UuidUtil.fromByteString(m.aciBytes).equals(editor)) + .map(m -> m.profileKey), + change.newRequestingMembers.stream() + .filter(m -> UuidUtil.fromByteString(m.aciBytes).equals(editor)) + .map(m -> m.profileKey)).findFirst(); if (editorProfileKeyBytes.isEmpty()) { return null; @@ -610,7 +609,7 @@ Pair getAuthoritativeProfileKeyFromChange(final Decrypted return null; } - return new Pair<>(ServiceId.from(editor), profileKey); + return new Pair<>(ACI.from(editor), profileKey); } DecryptedGroup getUpdatedDecryptedGroup(DecryptedGroup group, DecryptedGroupChange decryptedGroupChange) { @@ -627,8 +626,8 @@ DecryptedGroupChange getDecryptedGroupChange(byte[] signedGroupChange, GroupMast .forGroup(GroupSecretParams.deriveFromMasterKey(groupMasterKey)); try { - return groupOperations.decryptChange(GroupChange.parseFrom(signedGroupChange), true).orElse(null); - } catch (VerificationFailedException | InvalidGroupStateException | InvalidProtocolBufferException e) { + return groupOperations.decryptChange(GroupChange.ADAPTER.decode(signedGroupChange), true).orElse(null); + } catch (VerificationFailedException | InvalidGroupStateException | IOException e) { return null; } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IdentityHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IdentityHelper.java index c150abedcbbd9..b9281889dab84 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IdentityHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IdentityHelper.java @@ -14,7 +14,6 @@ import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.push.ServiceId; -import java.io.IOException; import java.util.Arrays; import java.util.function.BiFunction; @@ -58,22 +57,25 @@ public boolean trustIdentityAllKeys(RecipientId recipientId) { } public String computeSafetyNumber(ServiceId serviceId, IdentityKey theirIdentityKey) { - final Fingerprint fingerprint = computeSafetyNumberFingerprint(serviceId, theirIdentityKey); + final var fingerprint = computeSafetyNumberFingerprint(serviceId, theirIdentityKey, false); return fingerprint == null ? null : fingerprint.getDisplayableFingerprint().getDisplayText(); } public ScannableFingerprint computeSafetyNumberForScanning(ServiceId serviceId, IdentityKey theirIdentityKey) { - final Fingerprint fingerprint = computeSafetyNumberFingerprint(serviceId, theirIdentityKey); + var fingerprint = computeSafetyNumberFingerprint(serviceId, theirIdentityKey, false); + if (fingerprint == null) { + fingerprint = computeSafetyNumberFingerprint(serviceId, theirIdentityKey, true); + } return fingerprint == null ? null : fingerprint.getScannableFingerprint(); } private Fingerprint computeSafetyNumberFingerprint( - final ServiceId serviceId, final IdentityKey theirIdentityKey + final ServiceId serviceId, final IdentityKey theirIdentityKey, boolean useServiceId ) { final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId); final var address = account.getRecipientAddressResolver().resolveRecipientAddress(recipientId); - if (false) { + if (useServiceId) { if (serviceId.isUnknown()) { return null; } @@ -94,10 +96,8 @@ private Fingerprint computeSafetyNumberFingerprint( private boolean trustIdentity( RecipientId recipientId, BiFunction verifier, TrustLevel trustLevel ) { - final var serviceId = account.getRecipientAddressResolver() - .resolveRecipientAddress(recipientId) - .serviceId() - .orElse(null); + final var address = account.getRecipientAddressResolver().resolveRecipientAddress(recipientId); + final var serviceId = address.serviceId().orElse(null); if (serviceId == null) { return false; } @@ -111,13 +111,8 @@ private boolean trustIdentity( } account.getIdentityKeyStore().setIdentityTrustLevel(serviceId, identity.getIdentityKey(), trustLevel); - try { - final var address = context.getRecipientHelper() - .resolveSignalServiceAddress(account.getRecipientResolver().resolveRecipient(serviceId)); - context.getSyncHelper().sendVerifiedMessage(address, identity.getIdentityKey(), trustLevel); - } catch (IOException e) { - logger.warn("Failed to send verification sync message: {}", e.getMessage()); - } + context.getSyncHelper() + .sendVerifiedMessage(address.toSignalServiceAddress(), identity.getIdentityKey(), trustLevel); return true; } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java index 3b616644d80be..3f0abc4812c94 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java @@ -40,11 +40,9 @@ import org.signal.libsignal.metadata.ProtocolNoSessionException; import org.signal.libsignal.metadata.ProtocolUntrustedIdentityException; import org.signal.libsignal.metadata.SelfSendException; -import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidMessageException; import org.signal.libsignal.protocol.groups.GroupSessionBuilder; import org.signal.libsignal.protocol.message.DecryptionErrorMessage; -import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; import org.slf4j.Logger; @@ -59,21 +57,16 @@ import org.whispersystems.signalservice.api.messages.SignalServiceGroup; import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext; import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2; -import org.whispersystems.signalservice.api.messages.SignalServiceMetadata; import org.whispersystems.signalservice.api.messages.SignalServicePniSignatureMessage; import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; import org.whispersystems.signalservice.api.messages.SignalServiceStoryMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.Envelope; import org.whispersystems.signalservice.internal.push.UnsupportedDataMessageException; -import org.whispersystems.signalservice.internal.serialize.SignalServiceAddressProtobufSerializer; -import org.whispersystems.signalservice.internal.serialize.SignalServiceMetadataProtobufSerializer; -import org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto; import java.util.ArrayList; import java.util.List; @@ -136,13 +129,17 @@ public Pair, Exception> handleEnvelope( final Manager.ReceiveMessageHandler handler ) { final var actions = new ArrayList(); - if (envelope.hasSourceUuid()) { - // Store uuid if we don't have it already - // address/uuid in envelope is sent by server - account.getRecipientTrustedResolver().resolveRecipientTrusted(envelope.getSourceAddress()); - } SignalServiceContent content = null; Exception exception = null; + try { + if (envelope.hasSourceServiceId()) { + // Store uuid if we don't have it already + // uuid in envelope is sent by server + account.getRecipientTrustedResolver().resolveRecipientTrusted(envelope.getSourceAddress()); + } + } catch (Exception e) { + exception = e; + } if (!envelope.isReceipt()) { try { final var cipherResult = dependencies.getCipher() @@ -181,12 +178,13 @@ public Pair, Exception> handleEnvelope( .contains(Profile.Capability.senderKey); final var isSelfSenderKeyCapable = selfProfile != null && selfProfile.getCapabilities() .contains(Profile.Capability.senderKey); + final var destination = getDestination(envelope).serviceId(); if (!isSelf && isSenderSenderKeyCapable && isSelfSenderKeyCapable) { logger.debug("Received invalid message, requesting message resend."); - actions.add(new SendRetryMessageRequestAction(sender, serviceId, e, envelope)); + actions.add(new SendRetryMessageRequestAction(sender, serviceId, e, envelope, destination)); } else { logger.debug("Received invalid message, queuing renew session action."); - actions.add(new RenewSessionAction(sender, serviceId)); + actions.add(new RenewSessionAction(sender, serviceId, destination)); } } else { logger.debug("Received invalid message from invalid sender: {}", e.getSender()); @@ -207,7 +205,7 @@ public Pair, Exception> handleEnvelope( } private SignalServiceContent validate( - SignalServiceProtos.Envelope envelope, SignalServiceCipherResult cipherResult, long serverDeliveredTimestamp + Envelope envelope, SignalServiceCipherResult cipherResult, long serverDeliveredTimestamp ) throws ProtocolInvalidKeyException, ProtocolInvalidMessageException, UnsupportedDataMessageException, InvalidMessageStructureException { final var content = cipherResult.getContent(); final var envelopeMetadata = cipherResult.getMetadata(); @@ -225,26 +223,11 @@ private SignalServiceContent validate( return null; } - final var localAddress = new SignalServiceAddress(envelopeMetadata.getDestinationServiceId(), - Optional.ofNullable(account.getNumber())); - final var metadata = new SignalServiceMetadata(new SignalServiceAddress(envelopeMetadata.getSourceServiceId(), - Optional.ofNullable(envelopeMetadata.getSourceE164())), - envelopeMetadata.getSourceDeviceId(), - envelope.getTimestamp(), - envelope.getServerTimestamp(), - serverDeliveredTimestamp, - envelopeMetadata.getSealedSender(), - envelope.getServerGuid(), - Optional.ofNullable(envelopeMetadata.getGroupId()), - envelopeMetadata.getDestinationServiceId().toString()); - - final var contentProto = SignalServiceContentProto.newBuilder() - .setLocalAddress(SignalServiceAddressProtobufSerializer.toProtobuf(localAddress)) - .setMetadata(SignalServiceMetadataProtobufSerializer.toProtobuf(metadata)) - .setContent(content) - .build(); - - return SignalServiceContent.createFromProto(contentProto); + return SignalServiceContent.Companion.createFrom(account.getNumber(), + envelope, + envelopeMetadata, + content, + serverDeliveredTimestamp); } private List checkAndHandleMessage( @@ -346,14 +329,21 @@ public List handleMessage( senderDeviceId, message.getTimestamp()); if (message.getDeviceId() == account.getDeviceId()) { - handleDecryptionErrorMessage(actions, sender, senderServiceId, senderDeviceId, message); + handleDecryptionErrorMessage(actions, + sender, + senderServiceId, + senderDeviceId, + message, + destination.serviceId()); } else { logger.debug("Request is for another one of our devices"); } } - if (content.getDataMessage().isPresent()) { - var message = content.getDataMessage().get(); + if (content.getDataMessage().isPresent() || content.getEditMessage().isPresent()) { + var message = content.getDataMessage().isPresent() + ? content.getDataMessage().get() + : content.getEditMessage().get().getDataMessage(); if (content.isNeedsReceipt()) { actions.add(new SendReceiptAction(sender, @@ -402,7 +392,7 @@ public List handleMessage( private boolean handlePniSignatureMessage( final SignalServicePniSignatureMessage message, final SignalServiceAddress senderAddress ) { - final var aci = ACI.from(senderAddress.getServiceId()); + final var aci = senderAddress.getServiceId(); final var aciIdentity = account.getIdentityKeyStore().getIdentityInfo(aci); final var pni = message.getPni(); final var pniIdentity = account.getIdentityKeyStore().getIdentityInfo(pni); @@ -421,7 +411,9 @@ private boolean handlePniSignatureMessage( logger.debug("Verified association of ACI {} with PNI {}", aci, pni); account.getRecipientTrustedResolver() - .resolveRecipientTrusted(Optional.of(aci), Optional.of(pni), senderAddress.getNumber()); + .resolveRecipientTrusted(Optional.of(ACI.from(aci.getRawUuid())), + Optional.of(pni), + senderAddress.getNumber()); return true; } @@ -430,7 +422,8 @@ private void handleDecryptionErrorMessage( final RecipientId sender, final ServiceId senderServiceId, final int senderDeviceId, - final DecryptionErrorMessage message + final DecryptionErrorMessage message, + final ServiceId destination ) { final var logEntries = account.getMessageSendLogStore() .findMessages(senderServiceId, @@ -443,14 +436,14 @@ private void handleDecryptionErrorMessage( } if (message.getRatchetKey().isPresent()) { - if (account.getAciSessionStore() - .isCurrentRatchetKey(senderServiceId, senderDeviceId, message.getRatchetKey().get())) { + final var sessionStore = account.getAccountData(destination).getSessionStore(); + if (sessionStore.isCurrentRatchetKey(senderServiceId, senderDeviceId, message.getRatchetKey().get())) { if (logEntries.isEmpty()) { logger.debug("Renewing the session with sender"); - actions.add(new RenewSessionAction(sender, senderServiceId)); + actions.add(new RenewSessionAction(sender, senderServiceId, destination)); } else { logger.trace("Archiving the session with sender, a resend message has already been queued"); - context.getAccount().getAciSessionStore().archiveSessions(senderServiceId); + sessionStore.archiveSessions(senderServiceId); } } return; @@ -575,23 +568,15 @@ private List handleSyncMessage( continue; } final var stickerPackId = StickerPackId.deserialize(m.getPackId().get()); + final var stickerPackKey = m.getPackKey().orElse(null); final var installed = m.getType().isEmpty() || m.getType().get() == StickerPackOperationMessage.Type.INSTALL; - var sticker = account.getStickerStore().getStickerPack(stickerPackId); - if (m.getPackKey().isPresent()) { - if (sticker == null) { - sticker = new StickerPack(-1, stickerPackId, m.getPackKey().get(), installed); - account.getStickerStore().addStickerPack(sticker); - } - if (installed) { - context.getJobExecutor() - .enqueueJob(new RetrieveStickerPackJob(stickerPackId, m.getPackKey().get())); - } - } + final var sticker = context.getStickerHelper() + .addOrUpdateStickerPack(stickerPackId, stickerPackKey, installed); - if (sticker != null && sticker.isInstalled() != installed) { - account.getStickerStore().updateStickerPackInstalled(sticker.packId(), installed); + if (sticker != null && installed) { + context.getJobExecutor().enqueueJob(new RetrieveStickerPackJob(stickerPackId, sticker.packKey())); } } } @@ -629,21 +614,10 @@ private List handleSyncMessage( if (syncMessage.getPniChangeNumber().isPresent()) { final var pniChangeNumber = syncMessage.getPniChangeNumber().get(); logger.debug("Received PNI change number sync message, applying."); - if (pniChangeNumber.hasIdentityKeyPair() - && pniChangeNumber.hasRegistrationId() - && pniChangeNumber.hasSignedPreKey() - && !envelope.getUpdatedPni().isEmpty()) { - logger.debug("New PNI: {}", envelope.getUpdatedPni()); - try { - final var updatedPni = PNI.parseOrThrow(envelope.getUpdatedPni()); - context.getAccountHelper() - .setPni(updatedPni, - new IdentityKeyPair(pniChangeNumber.getIdentityKeyPair().toByteArray()), - new SignedPreKeyRecord(pniChangeNumber.getSignedPreKey().toByteArray()), - pniChangeNumber.getRegistrationId()); - } catch (Exception e) { - logger.warn("Failed to handle change number message", e); - } + final var updatedPniString = envelope.getUpdatedPni(); + if (updatedPniString != null && !updatedPniString.isEmpty()) { + final var updatedPni = ServiceId.PNI.parseOrThrow(updatedPniString); + context.getAccountHelper().handlePniChangeNumberMessage(pniChangeNumber, updatedPni); } } return actions; @@ -806,9 +780,12 @@ private List handleSignalServiceDataMessage( } } + final var selfAddress = isSync ? source : destination; final var conversationPartnerAddress = isSync ? destination : source; if (conversationPartnerAddress != null && message.isEndSession()) { - account.getAciSessionStore().deleteAllSessions(conversationPartnerAddress.serviceId()); + account.getAccountData(selfAddress.serviceId()) + .getSessionStore() + .deleteAllSessions(conversationPartnerAddress.serviceId()); } if (message.isExpirationUpdate() || message.getBody().isPresent()) { if (message.getGroupContext().isPresent()) { @@ -854,10 +831,12 @@ private List handleSignalServiceDataMessage( if (message.getQuote().isPresent()) { final var quote = message.getQuote().get(); - for (var quotedAttachment : quote.getAttachments()) { - final var thumbnail = quotedAttachment.getThumbnail(); - if (thumbnail != null) { - context.getAttachmentHelper().downloadAttachment(thumbnail); + if (quote.getAttachments() != null) { + for (var quotedAttachment : quote.getAttachments()) { + final var thumbnail = quotedAttachment.getThumbnail(); + if (thumbnail != null) { + context.getAttachmentHelper().downloadAttachment(thumbnail); + } } } } @@ -942,7 +921,7 @@ private void handleIncomingProfileKey(final byte[] profileKeyBytes, final Recipi } private SignalServiceAddress getSenderAddress(SignalServiceEnvelope envelope, SignalServiceContent content) { - if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) { + if (!envelope.isUnidentifiedSender() && envelope.hasSourceServiceId()) { return envelope.getSourceAddress(); } else if (content != null) { return content.getSender(); @@ -952,7 +931,7 @@ private SignalServiceAddress getSenderAddress(SignalServiceEnvelope envelope, Si } private DeviceAddress getSender(SignalServiceEnvelope envelope, SignalServiceContent content) { - if (!envelope.isUnidentifiedSender() && envelope.hasSourceUuid()) { + if (!envelope.isUnidentifiedSender() && envelope.hasSourceServiceId()) { return new DeviceAddress(context.getRecipientHelper().resolveRecipient(envelope.getSourceAddress()), envelope.getSourceAddress().getServiceId(), envelope.getSourceDevice()); @@ -967,12 +946,14 @@ private DeviceAddress getDestination(SignalServiceEnvelope envelope) { if (!envelope.hasDestinationUuid()) { return new DeviceAddress(account.getSelfRecipientId(), account.getAci(), account.getDeviceId()); } - final var addressOptional = SignalServiceAddress.fromRaw(envelope.getDestinationUuid(), null); + final var addressOptional = SignalServiceAddress.fromRaw(envelope.getDestinationServiceId(), null); if (addressOptional.isEmpty()) { return new DeviceAddress(account.getSelfRecipientId(), account.getAci(), account.getDeviceId()); } final var address = addressOptional.get(); - return new DeviceAddress(context.getRecipientHelper().resolveRecipient(address), address.getServiceId(), 0); + return new DeviceAddress(context.getRecipientHelper().resolveRecipient(address), + address.getServiceId(), + account.getDeviceId()); } private record DeviceAddress(RecipientId recipientId, ServiceId serviceId, int deviceId) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PinHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PinHelper.java index 6bc3978fc7485..3b3a5c6f9bcc3 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PinHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PinHelper.java @@ -1,141 +1,95 @@ package org.asamk.signal.manager.helper; import org.asamk.signal.manager.api.IncorrectPinException; -import org.asamk.signal.manager.api.Pair; -import org.signal.libsignal.protocol.InvalidKeyException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.signalservice.api.KbsPinData; -import org.whispersystems.signalservice.api.KeyBackupService; -import org.whispersystems.signalservice.api.KeyBackupServicePinException; -import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException; import org.whispersystems.signalservice.api.kbs.MasterKey; -import org.whispersystems.signalservice.api.kbs.PinHashUtil; -import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException; -import org.whispersystems.signalservice.internal.contacts.entities.TokenResponse; +import org.whispersystems.signalservice.api.svr.SecureValueRecovery; +import org.whispersystems.signalservice.api.svr.SecureValueRecoveryV2; +import org.whispersystems.signalservice.internal.push.AuthCredentials; import org.whispersystems.signalservice.internal.push.LockedException; import java.io.IOException; -import java.util.Collection; -import java.util.stream.Stream; public class PinHelper { private final static Logger logger = LoggerFactory.getLogger(PinHelper.class); - private final KeyBackupService keyBackupService; - private final Collection fallbackKeyBackupServices; + private final SecureValueRecoveryV2 secureValueRecoveryV2; - public PinHelper( - final KeyBackupService keyBackupService, final Collection fallbackKeyBackupServices - ) { - this.keyBackupService = keyBackupService; - this.fallbackKeyBackupServices = fallbackKeyBackupServices; + public PinHelper(final SecureValueRecoveryV2 secureValueRecoveryV2) { + this.secureValueRecoveryV2 = secureValueRecoveryV2; } public void setRegistrationLockPin( String pin, MasterKey masterKey ) throws IOException { - final var pinChangeSession = keyBackupService.newPinChangeSession(); - final var hashedPin = PinHashUtil.hashPin(pin, pinChangeSession.hashSalt()); - - try { - pinChangeSession.setPin(hashedPin, masterKey); - } catch (UnauthenticatedResponseException e) { - throw new IOException(e); + final var backupResponse = secureValueRecoveryV2.setPin(pin, masterKey).execute(); + if (backupResponse instanceof SecureValueRecovery.BackupResponse.Success) { + } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.ServerRejected) { + logger.warn("Backup svr2 failed: ServerRejected"); + } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.EnclaveNotFound) { + logger.warn("Backup svr2 failed: EnclaveNotFound"); + } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.ExposeFailure) { + logger.warn("Backup svr2 failed: ExposeFailure"); + } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.ApplicationError error) { + throw new IOException(error.getException()); + } else if (backupResponse instanceof SecureValueRecovery.BackupResponse.NetworkError error) { + throw error.getException(); + } else { + throw new AssertionError("Unexpected response"); } - pinChangeSession.enableRegistrationLock(masterKey); } public void migrateRegistrationLockPin(String pin, MasterKey masterKey) throws IOException { setRegistrationLockPin(pin, masterKey); - - for (final var keyBackupService : fallbackKeyBackupServices) { - try { - final var pinChangeSession = keyBackupService.newPinChangeSession(); - pinChangeSession.removePin(); - } catch (Exception e) { - logger.warn("Failed to remove PIN from fallback KBS: {}", e.getMessage()); - } - } } public void removeRegistrationLockPin() throws IOException { - final var pinChangeSession = keyBackupService.newPinChangeSession(); - pinChangeSession.disableRegistrationLock(); - try { - pinChangeSession.removePin(); - } catch (UnauthenticatedResponseException e) { - throw new IOException(e); + final var deleteResponse = secureValueRecoveryV2.deleteData(); + if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.Success) { + } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.ServerRejected) { + logger.warn("Delete svr2 failed: ServerRejected"); + } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.EnclaveNotFound) { + logger.warn("Delete svr2 failed: EnclaveNotFound"); + } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.ApplicationError error) { + throw new IOException(error.getException()); + } else if (deleteResponse instanceof SecureValueRecovery.DeleteResponse.NetworkError error) { + throw error.getException(); + } else { + throw new AssertionError("Unexpected response"); } } - public KbsPinData getRegistrationLockData( + public SecureValueRecovery.RestoreResponse.Success getRegistrationLockData( String pin, LockedException e ) throws IOException, IncorrectPinException { - var basicStorageCredentials = e.getBasicStorageCredentials(); - if (basicStorageCredentials == null) { - return null; - } - - try { - return getRegistrationLockData(pin, basicStorageCredentials); - } catch (KeyBackupSystemNoDataException ex) { - throw new IOException(e); - } catch (KeyBackupServicePinException ex) { - throw new IncorrectPinException(ex.getTriesRemaining()); - } - } - - private KbsPinData getRegistrationLockData( - String pin, String basicStorageCredentials - ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException { - var tokenResponsePair = getTokenResponse(basicStorageCredentials); - final var tokenResponse = tokenResponsePair.first(); - final var keyBackupService = tokenResponsePair.second(); - - var registrationLockData = restoreMasterKey(pin, basicStorageCredentials, tokenResponse, keyBackupService); - if (registrationLockData == null) { - throw new AssertionError("Failed to restore master key"); + var svr2Credentials = e.getSvr2Credentials(); + if (svr2Credentials != null) { + return getRegistrationLockData(secureValueRecoveryV2, svr2Credentials, pin); } - return registrationLockData; - } - private Pair getTokenResponse(String basicStorageCredentials) throws IOException { - final var keyBackupServices = Stream.concat(Stream.of(keyBackupService), fallbackKeyBackupServices.stream()) - .toList(); - for (final var keyBackupService : keyBackupServices) { - var tokenResponse = keyBackupService.getToken(basicStorageCredentials); - if (tokenResponse != null && tokenResponse.getTries() > 0) { - return new Pair<>(tokenResponse, keyBackupService); - } - } - throw new IOException("KBS Account locked, maximum pin attempts reached."); + return null; } - private KbsPinData restoreMasterKey( - String pin, - String basicStorageCredentials, - TokenResponse tokenResponse, - final KeyBackupService keyBackupService - ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException { - if (pin == null) return null; - - if (basicStorageCredentials == null) { - throw new AssertionError("Cannot restore KBS key, no storage credentials supplied"); - } - - var session = keyBackupService.newRegistrationSession(basicStorageCredentials, tokenResponse); - - try { - var hashedPin = PinHashUtil.hashPin(pin, session.hashSalt()); - var kbsData = session.restorePin(hashedPin); - if (kbsData == null) { - throw new AssertionError("Null not expected"); - } - return kbsData; - } catch (UnauthenticatedResponseException | InvalidKeyException e) { - throw new IOException(e); + public SecureValueRecovery.RestoreResponse.Success getRegistrationLockData( + SecureValueRecovery secureValueRecovery, AuthCredentials authCredentials, String pin + ) throws IOException, IncorrectPinException { + final var restoreResponse = secureValueRecovery.restoreDataPreRegistration(authCredentials, pin); + + if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.Success s) { + return s; + } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.PinMismatch pinMismatch) { + throw new IncorrectPinException(pinMismatch.getTriesRemaining()); + } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.ApplicationError error) { + throw new IOException(error.getException()); + } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.NetworkError error) { + throw error.getException(); + } else if (restoreResponse instanceof SecureValueRecovery.RestoreResponse.Missing) { + logger.debug("No SVR data stored for the given credentials."); + return null; + } else { + throw new AssertionError("Unexpected response: " + restoreResponse.getClass().getSimpleName()); } } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PreKeyHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PreKeyHelper.java index 24cd675ce3613..c08da92c7efc5 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PreKeyHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/PreKeyHelper.java @@ -5,15 +5,23 @@ import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.util.KeyUtils; import org.signal.libsignal.protocol.IdentityKeyPair; +import org.signal.libsignal.protocol.InvalidKeyIdException; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.account.PreKeyUpload; import org.whispersystems.signalservice.api.push.ServiceIdType; +import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; +import org.whispersystems.signalservice.internal.push.OneTimePreKeyCounts; import java.io.IOException; import java.util.List; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_STALE_AGE; +import static org.asamk.signal.manager.config.ServiceConfig.SIGNED_PREKEY_ROTATE_AGE; + public class PreKeyHelper { private final static Logger logger = LoggerFactory.getLogger(PreKeyHelper.class); @@ -34,17 +42,6 @@ public void refreshPreKeysIfNecessary() throws IOException { } public void refreshPreKeysIfNecessary(ServiceIdType serviceIdType) throws IOException { - if (dependencies.getAccountManager().getPreKeysCount(serviceIdType) < ServiceConfig.PREKEY_MINIMUM_COUNT) { - refreshPreKeys(serviceIdType); - } - } - - public void refreshPreKeys() throws IOException { - refreshPreKeys(ServiceIdType.ACI); - refreshPreKeys(ServiceIdType.PNI); - } - - public void refreshPreKeys(ServiceIdType serviceIdType) throws IOException { final var identityKeyPair = account.getIdentityKeyPair(serviceIdType); if (identityKeyPair == null) { return; @@ -53,40 +50,171 @@ public void refreshPreKeys(ServiceIdType serviceIdType) throws IOException { if (accountId == null) { return; } + + OneTimePreKeyCounts preKeyCounts; + try { + preKeyCounts = dependencies.getAccountManager().getPreKeyCounts(serviceIdType); + } catch (AuthorizationFailedException e) { + logger.debug("Failed to get pre key count, ignoring: " + e.getClass().getSimpleName()); + preKeyCounts = new OneTimePreKeyCounts(0, 0); + } + + SignedPreKeyRecord signedPreKeyRecord = null; + List preKeyRecords = null; + KyberPreKeyRecord lastResortKyberPreKeyRecord = null; + List kyberPreKeyRecords = null; + try { - refreshPreKeys(serviceIdType, identityKeyPair); + if (preKeyCounts.getEcCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { + logger.debug("Refreshing {} ec pre keys, because only {} of min {} pre keys remain", + serviceIdType, + preKeyCounts.getEcCount(), + ServiceConfig.PREKEY_MINIMUM_COUNT); + preKeyRecords = generatePreKeys(serviceIdType); + } + if (signedPreKeyNeedsRefresh(serviceIdType)) { + logger.debug("Refreshing {} signed pre key.", serviceIdType); + signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair); + } } catch (Exception e) { logger.warn("Failed to store new pre keys, resetting preKey id offset", e); account.resetPreKeyOffsets(serviceIdType); - refreshPreKeys(serviceIdType, identityKeyPair); + preKeyRecords = generatePreKeys(serviceIdType); + signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair); } - } - private void refreshPreKeys( - final ServiceIdType serviceIdType, final IdentityKeyPair identityKeyPair - ) throws IOException { - final var oneTimePreKeys = generatePreKeys(serviceIdType); - final var signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair); + try { + if (preKeyCounts.getKyberCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { + logger.debug("Refreshing {} kyber pre keys, because only {} of min {} pre keys remain", + serviceIdType, + preKeyCounts.getKyberCount(), + ServiceConfig.PREKEY_MINIMUM_COUNT); + kyberPreKeyRecords = generateKyberPreKeys(serviceIdType, identityKeyPair); + } + if (lastResortKyberPreKeyNeedsRefresh(serviceIdType)) { + logger.debug("Refreshing {} last resort kyber pre key.", serviceIdType); + lastResortKyberPreKeyRecord = generateLastResortKyberPreKey(serviceIdType, identityKeyPair); + } + } catch (Exception e) { + logger.warn("Failed to store new kyber pre keys, resetting preKey id offset", e); + account.resetKyberPreKeyOffsets(serviceIdType); + kyberPreKeyRecords = generateKyberPreKeys(serviceIdType, identityKeyPair); + lastResortKyberPreKeyRecord = generateLastResortKyberPreKey(serviceIdType, identityKeyPair); + } - dependencies.getAccountManager() - .setPreKeys(serviceIdType, identityKeyPair.getPublicKey(), signedPreKeyRecord, oneTimePreKeys); + if (signedPreKeyRecord != null + || preKeyRecords != null + || lastResortKyberPreKeyRecord != null + || kyberPreKeyRecords != null) { + final var preKeyUpload = new PreKeyUpload(serviceIdType, + identityKeyPair.getPublicKey(), + signedPreKeyRecord, + preKeyRecords, + lastResortKyberPreKeyRecord, + kyberPreKeyRecords); + try { + dependencies.getAccountManager().setPreKeys(preKeyUpload); + } catch (AuthorizationFailedException e) { + // This can happen when the primary device has changed phone number + logger.warn("Failed to updated pre keys: {}", e.getMessage()); + } + } + + cleanSignedPreKeys((serviceIdType)); + cleanOneTimePreKeys(serviceIdType); } private List generatePreKeys(ServiceIdType serviceIdType) { - final var offset = account.getPreKeyIdOffset(serviceIdType); + final var accountData = account.getAccountData(serviceIdType); + final var offset = accountData.getPreKeyMetadata().getNextPreKeyId(); - var records = KeyUtils.generatePreKeyRecords(offset, ServiceConfig.PREKEY_BATCH_SIZE); + var records = KeyUtils.generatePreKeyRecords(offset); account.addPreKeys(serviceIdType, records); return records; } + private boolean signedPreKeyNeedsRefresh(ServiceIdType serviceIdType) { + final var accountData = account.getAccountData(serviceIdType); + + final var activeSignedPreKeyId = accountData.getPreKeyMetadata().getActiveSignedPreKeyId(); + if (activeSignedPreKeyId == -1) { + return true; + } + try { + final var signedPreKeyRecord = accountData.getSignedPreKeyStore().loadSignedPreKey(activeSignedPreKeyId); + return signedPreKeyRecord.getTimestamp() < System.currentTimeMillis() - SIGNED_PREKEY_ROTATE_AGE; + } catch (InvalidKeyIdException e) { + return true; + } + } + private SignedPreKeyRecord generateSignedPreKey(ServiceIdType serviceIdType, IdentityKeyPair identityKeyPair) { - final var signedPreKeyId = account.getNextSignedPreKeyId(serviceIdType); + final var accountData = account.getAccountData(serviceIdType); + final var signedPreKeyId = accountData.getPreKeyMetadata().getNextSignedPreKeyId(); - var record = KeyUtils.generateSignedPreKeyRecord(identityKeyPair, signedPreKeyId); + var record = KeyUtils.generateSignedPreKeyRecord(signedPreKeyId, identityKeyPair.getPrivateKey()); account.addSignedPreKey(serviceIdType, record); return record; } + + private List generateKyberPreKeys( + ServiceIdType serviceIdType, final IdentityKeyPair identityKeyPair + ) { + final var accountData = account.getAccountData(serviceIdType); + final var offset = accountData.getPreKeyMetadata().getNextKyberPreKeyId(); + + var records = KeyUtils.generateKyberPreKeyRecords(offset, identityKeyPair.getPrivateKey()); + account.addKyberPreKeys(serviceIdType, records); + + return records; + } + + private boolean lastResortKyberPreKeyNeedsRefresh(ServiceIdType serviceIdType) { + final var accountData = account.getAccountData(serviceIdType); + + final var activeLastResortKyberPreKeyId = accountData.getPreKeyMetadata().getActiveLastResortKyberPreKeyId(); + if (activeLastResortKyberPreKeyId == -1) { + return true; + } + try { + final var kyberPreKeyRecord = accountData.getKyberPreKeyStore() + .loadKyberPreKey(activeLastResortKyberPreKeyId); + return kyberPreKeyRecord.getTimestamp() < System.currentTimeMillis() - SIGNED_PREKEY_ROTATE_AGE; + } catch (InvalidKeyIdException e) { + return true; + } + } + + private KyberPreKeyRecord generateLastResortKyberPreKey( + ServiceIdType serviceIdType, IdentityKeyPair identityKeyPair + ) { + final var accountData = account.getAccountData(serviceIdType); + final var signedPreKeyId = accountData.getPreKeyMetadata().getNextKyberPreKeyId(); + + var record = KeyUtils.generateKyberPreKeyRecord(signedPreKeyId, identityKeyPair.getPrivateKey()); + account.addLastResortKyberPreKey(serviceIdType, record); + + return record; + } + + private void cleanSignedPreKeys(ServiceIdType serviceIdType) { + final var accountData = account.getAccountData(serviceIdType); + + final var activeSignedPreKeyId = accountData.getPreKeyMetadata().getActiveSignedPreKeyId(); + accountData.getSignedPreKeyStore().removeOldSignedPreKeys(activeSignedPreKeyId); + + final var activeLastResortKyberPreKeyId = accountData.getPreKeyMetadata().getActiveLastResortKyberPreKeyId(); + accountData.getKyberPreKeyStore().removeOldLastResortKyberPreKeys(activeLastResortKyberPreKeyId); + } + + private void cleanOneTimePreKeys(ServiceIdType serviceIdType) { + long threshold = System.currentTimeMillis() - PREKEY_STALE_AGE; + int minCount = 200; + + final var accountData = account.getAccountData(serviceIdType); + accountData.getPreKeyStore().deleteAllStaleOneTimeEcPreKeys(threshold, minCount); + accountData.getKyberPreKeyStore().deleteAllStaleOneTimeKyberPreKeys(threshold, minCount); + } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ProfileHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ProfileHelper.java index 6d5f2aa180c9e..1631ad9d37323 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ProfileHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ProfileHelper.java @@ -212,10 +212,11 @@ public void setProfile( if (avatar != null) { if (avatar.isPresent()) { - final var streamDetails = Utils.createStreamDetails(avatar.get()).first(); - context.getAvatarStore() - .storeProfileAvatar(account.getSelfRecipientAddress(), - outputStream -> IOUtils.copyStream(streamDetails.getStream(), outputStream)); + try (final var streamDetails = Utils.createStreamDetails(avatar.get()).first()) { + context.getAvatarStore() + .storeProfileAvatar(account.getSelfRecipientAddress(), + outputStream -> IOUtils.copyStream(streamDetails.getStream(), outputStream)); + } } else { context.getAvatarStore().deleteProfileAvatar(account.getSelfRecipientAddress()); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ReceiveHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ReceiveHelper.java index b226222350159..0c003682b93b1 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ReceiveHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/ReceiveHelper.java @@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalWebSocket; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; -import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState; import org.whispersystems.signalservice.api.websocket.WebSocketUnavailableException; @@ -147,13 +147,17 @@ private void receiveMessagesInternal( for (final var it : batch) { SignalServiceEnvelope envelope1 = new SignalServiceEnvelope(it.getEnvelope(), it.getServerDeliveredTimestamp()); - final var recipientId = envelope1.hasSourceUuid() ? account.getRecipientResolver() + final var recipientId = envelope1.hasSourceServiceId() ? account.getRecipientResolver() .resolveRecipient(envelope1.getSourceAddress()) : null; logger.trace("Storing new message from {}", recipientId); // store message on disk, before acknowledging receipt to the server cachedMessage[0] = account.getMessageCache().cacheMessage(envelope1, recipientId); + try { + signalWebSocket.sendAck(it); + } catch (IOException e) { + logger.warn("Failed to ack envelope to server after storing it: {}", e.getMessage()); + } } - return true; }); isWaitingForMessage = false; backOffCounter = 0; @@ -201,40 +205,49 @@ private void receiveMessagesInternal( backOffCounter = 0; if (returnOnTimeout) return; continue; + } catch (Exception e) { + logger.error("Unknown error when receiving messages", e); + continue; } - final var result = context.getIncomingMessageHandler().handleEnvelope(envelope, receiveConfig, handler); - for (final var h : result.first()) { - final var existingAction = queuedActions.get(h); - if (existingAction == null) { - queuedActions.put(h, h); - } else { - existingAction.mergeOther(h); + try { + final var result = context.getIncomingMessageHandler().handleEnvelope(envelope, receiveConfig, handler); + for (final var h : result.first()) { + final var existingAction = queuedActions.get(h); + if (existingAction == null) { + queuedActions.put(h, h); + } else { + existingAction.mergeOther(h); + } } - } - final var exception = result.second(); + final var exception = result.second(); - if (hasCaughtUpWithOldMessages) { - handleQueuedActions(queuedActions.keySet()); - queuedActions.clear(); - } - if (cachedMessage[0] != null) { - if (exception instanceof UntrustedIdentityException) { - logger.debug("Keeping message with untrusted identity in message cache"); - final var address = ((UntrustedIdentityException) exception).getSender(); - if (!envelope.hasSourceUuid() && address.uuid().isPresent()) { - final var recipientId = account.getRecipientResolver() - .resolveRecipient(ServiceId.from(address.uuid().get())); - try { - cachedMessage[0] = account.getMessageCache().replaceSender(cachedMessage[0], recipientId); - } catch (IOException ioException) { - logger.warn("Failed to move cached message to recipient folder: {}", - ioException.getMessage()); + if (hasCaughtUpWithOldMessages) { + handleQueuedActions(queuedActions.keySet()); + queuedActions.clear(); + } + if (cachedMessage[0] != null) { + if (exception instanceof UntrustedIdentityException) { + logger.debug("Keeping message with untrusted identity in message cache"); + final var address = ((UntrustedIdentityException) exception).getSender(); + if (!envelope.hasSourceServiceId() && address.uuid().isPresent()) { + final var recipientId = account.getRecipientResolver() + .resolveRecipient(ACI.from(address.uuid().get())); + try { + cachedMessage[0] = account.getMessageCache() + .replaceSender(cachedMessage[0], recipientId); + } catch (IOException ioException) { + logger.warn("Failed to move cached message to recipient folder: {}", + ioException.getMessage(), + ioException); + } } + } else { + cachedMessage[0].delete(); } - } else { - cachedMessage[0].delete(); } + } catch (Exception e) { + logger.error("Unknown error when handling messages", e); } } } @@ -269,14 +282,16 @@ private List retryFailedReceivedMessage( cachedMessage.delete(); return null; } - if (!envelope.hasSourceUuid()) { + if (!envelope.hasSourceServiceId()) { final var identifier = ((UntrustedIdentityException) exception).getSender(); final var recipientId = account.getRecipientResolver() .resolveRecipient(new RecipientAddress(identifier)); try { account.getMessageCache().replaceSender(cachedMessage, recipientId); } catch (IOException ioException) { - logger.warn("Failed to move cached message to recipient folder: {}", ioException.getMessage()); + logger.warn("Failed to move cached message to recipient folder: {}", + ioException.getMessage(), + ioException); } } return null; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/RecipientHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/RecipientHelper.java index 384d1fa07a6b8..4694c099031d7 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/RecipientHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/RecipientHelper.java @@ -6,16 +6,17 @@ import org.asamk.signal.manager.internal.SignalDependencies; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.recipients.RecipientId; +import org.signal.core.util.Base64; import org.signal.libsignal.usernames.BaseUsernameException; import org.signal.libsignal.usernames.Username; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.push.exceptions.CdsiInvalidTokenException; import org.whispersystems.signalservice.api.services.CdsiV2Service; -import org.whispersystems.util.Base64UrlSafe; import java.io.IOException; import java.util.Collection; @@ -25,6 +26,8 @@ import java.util.Optional; import java.util.Set; +import static org.asamk.signal.manager.config.ServiceConfig.MAXIMUM_ONE_OFF_REQUEST_SIZE; + public class RecipientHelper { private final static Logger logger = LoggerFactory.getLogger(RecipientHelper.class); @@ -80,7 +83,7 @@ public Set resolveRecipients(Collection public RecipientId resolveRecipient(final RecipientIdentifier.Single recipient) throws UnregisteredRecipientException { if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) { - return account.getRecipientResolver().resolveRecipient(ServiceId.from(uuidRecipient.uuid())); + return account.getRecipientResolver().resolveRecipient(ACI.from(uuidRecipient.uuid())); } else if (recipient instanceof RecipientIdentifier.Number numberRecipient) { final var number = numberRecipient.number(); return account.getRecipientStore().resolveRecipientByNumber(number, () -> { @@ -115,6 +118,10 @@ public Optional resolveRecipientOptional(final RecipientIdentifier. } } + public void refreshUsers() throws IOException { + getRegisteredUsers(account.getRecipientStore().getAllNumbers(), false); + } + public RecipientId refreshRegisteredUser(RecipientId recipientId) throws IOException, UnregisteredRecipientException { final var address = resolveSignalServiceAddress(recipientId); if (address.getNumber().isEmpty()) { @@ -126,8 +133,23 @@ public RecipientId refreshRegisteredUser(RecipientId recipientId) throws IOExcep .resolveRecipientTrusted(new SignalServiceAddress(serviceId, number)); } - public Map getRegisteredUsers(final Set numbers) throws IOException { - Map registeredUsers = getRegisteredUsersV2(numbers, true); + public Map getRegisteredUsers( + final Set numbers + ) throws IOException { + if (numbers.size() > MAXIMUM_ONE_OFF_REQUEST_SIZE) { + final var allNumbers = new HashSet<>(account.getRecipientStore().getAllNumbers()) {{ + addAll(numbers); + }}; + return getRegisteredUsers(allNumbers, false); + } else { + return getRegisteredUsers(numbers, true); + } + } + + private Map getRegisteredUsers( + final Set numbers, final boolean isPartialRefresh + ) throws IOException { + Map registeredUsers = getRegisteredUsersV2(numbers, isPartialRefresh, true); // Store numbers as recipients, so we have the number/uuid association registeredUsers.forEach((number, u) -> account.getRecipientTrustedResolver() @@ -139,7 +161,7 @@ public Map getRegisteredUsers(final Set numbers) private ServiceId getRegisteredUserByNumber(final String number) throws IOException, UnregisteredRecipientException { final Map aciMap; try { - aciMap = getRegisteredUsers(Set.of(number)); + aciMap = getRegisteredUsers(Set.of(number), true); } catch (NumberFormatException e) { throw new UnregisteredRecipientException(new org.asamk.signal.manager.api.RecipientAddress(null, number)); } @@ -151,21 +173,54 @@ private ServiceId getRegisteredUserByNumber(final String number) throws IOExcept } private Map getRegisteredUsersV2( - final Set numbers, boolean useCompat + final Set numbers, boolean isPartialRefresh, boolean useCompat ) throws IOException { - // Only partial refresh is implemented here + final var previousNumbers = isPartialRefresh ? Set.of() : account.getCdsiStore().getAllNumbers(); + final var newNumbers = new HashSet<>(numbers) {{ + removeAll(previousNumbers); + }}; + if (newNumbers.isEmpty() && previousNumbers.isEmpty()) { + logger.debug("No new numbers to query."); + return Map.of(); + } + logger.trace("Querying CDSI for {} new numbers ({} previous), isPartialRefresh={}", + newNumbers.size(), + previousNumbers.size(), + isPartialRefresh); + final var token = previousNumbers.isEmpty() + ? Optional.empty() + : Optional.ofNullable(account.getCdsiToken()); + final CdsiV2Service.Response response; try { response = dependencies.getAccountManager() - .getRegisteredUsersWithCdsi(Set.of(), - numbers, + .getRegisteredUsersWithCdsi(previousNumbers, + newNumbers, account.getRecipientStore().getServiceIdToProfileKeyMap(), useCompat, - Optional.empty(), - serviceEnvironmentConfig.getCdsiMrenclave(), - token -> { - // Not storing for partial refresh + token, + serviceEnvironmentConfig.cdsiMrenclave(), + null, + newToken -> { + if (isPartialRefresh) { + account.getCdsiStore().updateAfterPartialCdsQuery(newNumbers); + // Not storing newToken for partial refresh + } else { + final var fullNumbers = new HashSet<>(previousNumbers) {{ + addAll(newNumbers); + }}; + final var seenNumbers = new HashSet<>(numbers) {{ + addAll(newNumbers); + }}; + account.getCdsiStore().updateAfterFullCdsQuery(fullNumbers, seenNumbers); + account.setCdsiToken(newToken); + account.setLastRecipientsRefresh(System.currentTimeMillis()); + } }); + } catch (CdsiInvalidTokenException e) { + account.setCdsiToken(null); + account.getCdsiStore().clearAll(); + throw e; } catch (NumberFormatException e) { throw new IOException(e); } @@ -180,7 +235,7 @@ private Map getRegisteredUsersV2( private ACI getRegisteredUserByUsername(String username) throws IOException, BaseUsernameException { return dependencies.getAccountManager() - .getAciByUsernameHash(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username))); + .getAciByUsernameHash(Base64.encodeUrlSafeWithoutPadding(new Username(username).getHash())); } public record RegisteredUser(Optional aci, Optional pni) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SendHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SendHelper.java index 666867fe68834..4975848670a3e 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SendHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SendHelper.java @@ -1,7 +1,5 @@ package org.asamk.signal.manager.helper; -import com.google.protobuf.ByteString; - import org.asamk.signal.manager.api.Contact; import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.GroupNotFoundException; @@ -41,6 +39,7 @@ import org.whispersystems.signalservice.api.push.exceptions.RateLimitException; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.internal.push.exceptions.InvalidUnidentifiedAccessHeaderException; +import org.whispersystems.signalservice.internal.push.http.PartialSendCompleteListener; import java.io.IOException; import java.time.Duration; @@ -53,6 +52,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import okio.ByteString; + public class SendHelper { private final static Logger logger = LoggerFactory.getLogger(SendHelper.class); @@ -185,6 +186,10 @@ public SendMessageResult sendSelfMessage( public SendMessageResult sendSyncMessage(SignalServiceSyncMessage message) { var messageSender = dependencies.getMessageSender(); + if (!account.isMultiDevice()) { + logger.trace("Not sending sync message because there are no linked devices."); + return SendMessageResult.success(account.getSelfAddress(), List.of(), false, false, 0, Optional.empty()); + } try { return messageSender.sendSyncMessage(message, context.getUnidentifiedAccessHelper().getAccessForSync()); } catch (UnregisteredUserException e) { @@ -262,10 +267,10 @@ public SendMessageResult resendMessage( final var senderKeyDistributionMessage = dependencies.getMessageSender() .getOrCreateNewGroupSession(group.getDistributionId()); - final var distributionBytes = ByteString.copyFrom(senderKeyDistributionMessage.serialize()); + final var distributionBytes = ByteString.of(senderKeyDistributionMessage.serialize()); final var contentToSend = messageSendLogEntry.content() - .toBuilder() - .setSenderKeyDistributionMessage(distributionBytes) + .newBuilder() + .senderKeyDistributionMessage(distributionBytes) .build(); final var result = handleSendMessage(recipientId, @@ -330,29 +335,41 @@ private List sendGroupMessage( final AtomicLong entryId = new AtomicLong(-1); final var urgent = true; - final LegacySenderHandler legacySender = (recipients, unidentifiedAccess, isRecipientUpdate) -> messageSender.sendDataMessage( - recipients, - unidentifiedAccess, - isRecipientUpdate, - contentHint, - message, - SignalServiceMessageSender.LegacyGroupEvents.EMPTY, - sendResult -> { - logger.trace("Partial message send result: {}", sendResult.isSuccess()); - synchronized (entryId) { - if (entryId.get() == -1) { - final var newId = messageSendLogStore.insertIfPossible(message.getTimestamp(), - sendResult, - contentHint, - urgent); - entryId.set(newId); - } else { - messageSendLogStore.addRecipientToExistingEntryIfPossible(entryId.get(), sendResult); - } - } - }, - () -> false, - urgent); + final PartialSendCompleteListener partialSendCompleteListener = sendResult -> { + logger.trace("Partial message send result: {}", sendResult.isSuccess()); + synchronized (entryId) { + if (entryId.get() == -1) { + final var newId = messageSendLogStore.insertIfPossible(message.getTimestamp(), + sendResult, + contentHint, + urgent); + entryId.set(newId); + } else { + messageSendLogStore.addRecipientToExistingEntryIfPossible(entryId.get(), sendResult); + } + } + }; + final LegacySenderHandler legacySender = (recipients, unidentifiedAccess, isRecipientUpdate) -> + editTargetTimestamp.isEmpty() + ? messageSender.sendDataMessage(recipients, + unidentifiedAccess, + isRecipientUpdate, + contentHint, + message, + SignalServiceMessageSender.LegacyGroupEvents.EMPTY, + partialSendCompleteListener, + () -> false, + urgent) + : messageSender.sendEditMessage(recipients, + unidentifiedAccess, + isRecipientUpdate, + contentHint, + message, + SignalServiceMessageSender.LegacyGroupEvents.EMPTY, + partialSendCompleteListener, + () -> false, + urgent, + editTargetTimestamp.get()); final SenderKeySenderHandler senderKeySender = (distId, recipients, unidentifiedAccess, isRecipientUpdate) -> messageSender.sendGroupDataMessage( distId, recipients, @@ -448,7 +465,7 @@ private List sendGroupMessageInternal( : getSenderKeyCapableRecipientIds(recipientIds); final var allResults = new ArrayList(recipientIds.size()); - if (senderKeyTargets.size() > 0) { + if (!senderKeyTargets.isEmpty()) { final var results = sendGroupMessageInternalWithSenderKey(senderKeySender, senderKeyTargets, distributionId, @@ -462,7 +479,7 @@ private List sendGroupMessageInternal( .filter(r -> !r.isSuccess()) .map(r -> context.getRecipientHelper().resolveRecipient(r.getAddress())) .toList(); - if (failedTargets.size() > 0) { + if (!failedTargets.isEmpty()) { senderKeyTargets = new HashSet<>(senderKeyTargets); failedTargets.forEach(senderKeyTargets::remove); } @@ -473,8 +490,8 @@ private List sendGroupMessageInternal( legacyTargets.removeAll(senderKeyTargets); final boolean onlyTargetIsSelfWithLinkedDevice = recipientIds.isEmpty() && account.isMultiDevice(); - if (legacyTargets.size() > 0 || onlyTargetIsSelfWithLinkedDevice) { - if (legacyTargets.size() > 0) { + if (!legacyTargets.isEmpty() || onlyTargetIsSelfWithLinkedDevice) { + if (!legacyTargets.isEmpty()) { logger.debug("Need to do {} legacy sends.", legacyTargets.size()); } else { logger.debug("Need to do a legacy send to send a sync message for a group of only ourselves."); @@ -482,7 +499,7 @@ private List sendGroupMessageInternal( final List results = sendGroupMessageInternalWithLegacy(legacySender, legacyTargets, - isRecipientUpdate || allResults.size() > 0); + isRecipientUpdate || !allResults.isEmpty()); allResults.addAll(results); } final var duration = Duration.ofMillis(System.currentTimeMillis() - startTime); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StickerHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StickerHelper.java index 915f3d71fe32f..daa5aeb608204 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StickerHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StickerHelper.java @@ -5,6 +5,7 @@ import org.asamk.signal.manager.internal.SignalDependencies; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.stickerPacks.JsonStickerPack; +import org.asamk.signal.manager.storage.stickers.StickerPack; import org.asamk.signal.manager.util.IOUtils; import org.signal.libsignal.protocol.InvalidMessageException; import org.slf4j.Logger; @@ -28,15 +29,33 @@ public StickerHelper(final Context context) { this.context = context; } + public StickerPack addOrUpdateStickerPack( + final StickerPackId stickerPackId, final byte[] stickerPackKey, final boolean installed + ) { + final var sticker = account.getStickerStore().getStickerPack(stickerPackId); + if (sticker != null) { + if (sticker.isInstalled() != installed) { + account.getStickerStore().updateStickerPackInstalled(sticker.packId(), installed); + } + return sticker; + } + + if (stickerPackKey == null) { + return null; + } + + final var newSticker = new StickerPack(-1, stickerPackId, stickerPackKey, installed); + account.getStickerStore().addStickerPack(newSticker); + return newSticker; + } + public JsonStickerPack getOrRetrieveStickerPack( StickerPackId packId, byte[] packKey ) throws InvalidStickerException { - if (!context.getStickerPackStore().existsStickerPack(packId)) { - try { - retrieveStickerPack(packId, packKey); - } catch (InvalidMessageException | IOException e) { - throw new InvalidStickerException("Failed to retrieve sticker pack"); - } + try { + retrieveStickerPack(packId, packKey); + } catch (InvalidMessageException | IOException e) { + throw new InvalidStickerException("Failed to retrieve sticker pack"); } final JsonStickerPack manifest; try { @@ -48,6 +67,10 @@ public JsonStickerPack getOrRetrieveStickerPack( } public void retrieveStickerPack(StickerPackId packId, byte[] packKey) throws InvalidMessageException, IOException { + if (context.getStickerPackStore().existsStickerPack(packId)) { + logger.debug("Sticker pack {} already downloaded.", Hex.toStringCondensed(packId.serialize())); + return; + } logger.debug("Retrieving sticker pack {}.", Hex.toStringCondensed(packId.serialize())); final var messageReceiver = dependencies.getMessageReceiver(); final var manifest = messageReceiver.retrieveStickerManifest(packId.serialize(), packKey); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StorageHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StorageHelper.java index fc084f28b4bf4..e9a8d68163aa8 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StorageHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/StorageHelper.java @@ -19,7 +19,6 @@ import org.whispersystems.signalservice.api.storage.SignalStorageManifest; import org.whispersystems.signalservice.api.storage.SignalStorageRecord; import org.whispersystems.signalservice.api.storage.StorageId; -import org.whispersystems.signalservice.internal.storage.protos.AccountRecord; import org.whispersystems.signalservice.internal.storage.protos.ManifestRecord; import java.io.IOException; @@ -80,13 +79,13 @@ public void readDataFromStorage() throws IOException { logger.trace("Reading {} new records", manifest.get().getStorageIds().size()); for (final var record : getSignalStorageRecords(storageIds)) { logger.debug("Reading record of type {}", record.getType()); - if (record.getType() == ManifestRecord.Identifier.Type.ACCOUNT_VALUE) { + if (record.getType() == ManifestRecord.Identifier.Type.ACCOUNT.getValue()) { readAccountRecord(record); - } else if (record.getType() == ManifestRecord.Identifier.Type.GROUPV2_VALUE) { + } else if (record.getType() == ManifestRecord.Identifier.Type.GROUPV2.getValue()) { readGroupV2Record(record); - } else if (record.getType() == ManifestRecord.Identifier.Type.GROUPV1_VALUE) { + } else if (record.getType() == ManifestRecord.Identifier.Type.GROUPV1.getValue()) { readGroupV1Record(record); - } else if (record.getType() == ManifestRecord.Identifier.Type.CONTACT_VALUE) { + } else if (record.getType() == ManifestRecord.Identifier.Type.CONTACT.getValue()) { readContactRecord(record); } } @@ -101,15 +100,16 @@ private void readContactRecord(final SignalStorageRecord record) { } final var contactRecord = record.getContact().get(); - final var serviceId = contactRecord.getServiceId(); - if (contactRecord.getNumber().isEmpty() && serviceId.isUnknown()) { + final var aci = contactRecord.getAci().orElse(null); + final var pni = contactRecord.getPni().orElse(null); + if (contactRecord.getNumber().isEmpty() && aci == null && pni == null) { return; } - final var address = new RecipientAddress(serviceId, contactRecord.getNumber().orElse(null)); + final var address = new RecipientAddress(aci, pni, contactRecord.getNumber().orElse(null)); var recipientId = account.getRecipientResolver().resolveRecipient(address); - if (serviceId.isValid() && contactRecord.getUsername().isPresent()) { + if (aci != null && contactRecord.getUsername().isPresent()) { recipientId = account.getRecipientTrustedResolver() - .resolveRecipientTrusted(serviceId, contactRecord.getUsername().get()); + .resolveRecipientTrusted(aci, contactRecord.getUsername().get()); } final var contact = account.getContactStore().getContact(recipientId); @@ -170,15 +170,15 @@ private void readContactRecord(final SignalStorageRecord record) { logger.warn("Received invalid contact profile key from storage"); } } - if (contactRecord.getIdentityKey().isPresent() && serviceId.isValid()) { + if (contactRecord.getIdentityKey().isPresent() && aci != null) { try { logger.trace("Storing identity key {}", recipientId); final var identityKey = new IdentityKey(contactRecord.getIdentityKey().get()); - account.getIdentityKeyStore().saveIdentity(serviceId, identityKey); + account.getIdentityKeyStore().saveIdentity(aci, identityKey); final var trustLevel = TrustLevel.fromIdentityState(contactRecord.getIdentityState()); if (trustLevel != null) { - account.getIdentityKeyStore().setIdentityTrustLevel(serviceId, identityKey, trustLevel); + account.getIdentityKeyStore().setIdentityTrustLevel(aci, identityKey, trustLevel); } } catch (InvalidKeyException e) { logger.warn("Received invalid contact identity key from storage"); @@ -255,14 +255,10 @@ private void readAccountRecord(final SignalStorageRecord record) throws IOExcept account.getConfigurationStore() .setUnidentifiedDeliveryIndicators(accountRecord.isSealedSenderIndicatorsEnabled()); account.getConfigurationStore().setLinkPreviews(accountRecord.isLinkPreviewsEnabled()); - if (accountRecord.getPhoneNumberSharingMode() != AccountRecord.PhoneNumberSharingMode.UNRECOGNIZED) { - account.getConfigurationStore() - .setPhoneNumberSharingMode(switch (accountRecord.getPhoneNumberSharingMode()) { - case EVERYBODY -> PhoneNumberSharingMode.EVERYBODY; - case NOBODY -> PhoneNumberSharingMode.NOBODY; - default -> PhoneNumberSharingMode.CONTACTS; - }); - } + account.getConfigurationStore().setPhoneNumberSharingMode(switch (accountRecord.getPhoneNumberSharingMode()) { + case EVERYBODY -> PhoneNumberSharingMode.EVERYBODY; + case NOBODY, UNKNOWN -> PhoneNumberSharingMode.NOBODY; + }); account.getConfigurationStore().setPhoneNumberUnlisted(accountRecord.isPhoneNumberUnlisted()); account.setUsername(accountRecord.getUsername()); @@ -301,7 +297,7 @@ private SignalStorageRecord getSignalStorageRecord(final StorageId accountId) th logger.warn("Failed to read storage records, ignoring."); return null; } - return records.size() > 0 ? records.get(0) : null; + return !records.isEmpty() ? records.get(0) : null; } private List getSignalStorageRecords(final Collection storageIds) throws IOException { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SyncHelper.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SyncHelper.java index f015cb1ff776f..1be5a26822f09 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SyncHelper.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/helper/SyncHelper.java @@ -6,12 +6,14 @@ import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.storage.groups.GroupInfoV1; import org.asamk.signal.manager.storage.recipients.RecipientAddress; +import org.asamk.signal.manager.storage.stickers.StickerPack; import org.asamk.signal.manager.util.AttachmentUtils; import org.asamk.signal.manager.util.IOUtils; import org.asamk.signal.manager.util.MimeUtils; import org.signal.libsignal.protocol.IdentityKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage; @@ -26,9 +28,10 @@ import org.whispersystems.signalservice.api.messages.multidevice.KeysMessage; import org.whispersystems.signalservice.api.messages.multidevice.RequestMessage; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; +import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOperationMessage; import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.SyncMessage; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -40,6 +43,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; public class SyncHelper { @@ -54,24 +58,24 @@ public SyncHelper(final Context context) { } public void requestAllSyncData() { - requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.GROUPS); - requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.CONTACTS); - requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.BLOCKED); - requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.CONFIGURATION); + requestSyncData(SyncMessage.Request.Type.GROUPS); + requestSyncData(SyncMessage.Request.Type.CONTACTS); + requestSyncData(SyncMessage.Request.Type.BLOCKED); + requestSyncData(SyncMessage.Request.Type.CONFIGURATION); requestSyncKeys(); requestSyncPniIdentity(); } public void requestSyncKeys() { - requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.KEYS); + requestSyncData(SyncMessage.Request.Type.KEYS); } public void requestSyncPniIdentity() { - requestSyncData(SignalServiceProtos.SyncMessage.Request.Type.PNI_IDENTITY); + requestSyncData(SyncMessage.Request.Type.PNI_IDENTITY); } - public void sendSyncFetchProfileMessage() { - context.getSendHelper() + public SendMessageResult sendSyncFetchProfileMessage() { + return context.getSendHelper() .sendSyncMessage(SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.LOCAL_PROFILE)); } @@ -190,7 +194,7 @@ public void sendContacts() throws IOException { } } - public void sendBlockedList() { + public SendMessageResult sendBlockedList() { var addresses = new ArrayList(); for (var record : account.getContactStore().getContacts()) { if (record.second().isBlocked()) { @@ -203,32 +207,51 @@ public void sendBlockedList() { groupIds.add(record.getGroupId().serialize()); } } - context.getSendHelper() + return context.getSendHelper() .sendSyncMessage(SignalServiceSyncMessage.forBlocked(new BlockedListMessage(addresses, groupIds))); } - public void sendVerifiedMessage( + public SendMessageResult sendVerifiedMessage( SignalServiceAddress destination, IdentityKey identityKey, TrustLevel trustLevel - ) throws IOException { + ) { var verifiedMessage = new VerifiedMessage(destination, identityKey, trustLevel.toVerifiedState(), System.currentTimeMillis()); - context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forVerified(verifiedMessage)); + return context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forVerified(verifiedMessage)); } - public void sendKeysMessage() { - var keysMessage = new KeysMessage(Optional.ofNullable(account.getStorageKey())); - context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forKeys(keysMessage)); + public SendMessageResult sendKeysMessage() { + var keysMessage = new KeysMessage(Optional.ofNullable(account.getStorageKey()), + Optional.ofNullable(account.getOrCreatePinMasterKey())); + return context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forKeys(keysMessage)); } - public void sendConfigurationMessage() { + public SendMessageResult sendStickerOperationsMessage( + List installStickers, List removeStickers + ) { + var installStickerMessages = installStickers.stream().map(s -> getStickerPackOperationMessage(s, true)); + var removeStickerMessages = removeStickers.stream().map(s -> getStickerPackOperationMessage(s, false)); + var stickerMessages = Stream.concat(installStickerMessages, removeStickerMessages).toList(); + return context.getSendHelper() + .sendSyncMessage(SignalServiceSyncMessage.forStickerPackOperations(stickerMessages)); + } + + private static StickerPackOperationMessage getStickerPackOperationMessage( + final StickerPack s, final boolean installed + ) { + return new StickerPackOperationMessage(s.packId().serialize(), + s.packKey(), + installed ? StickerPackOperationMessage.Type.INSTALL : StickerPackOperationMessage.Type.REMOVE); + } + + public SendMessageResult sendConfigurationMessage() { final var config = account.getConfigurationStore(); var configurationMessage = new ConfigurationMessage(Optional.ofNullable(config.getReadReceipts()), Optional.ofNullable(config.getUnidentifiedDeliveryIndicators()), Optional.ofNullable(config.getTypingIndicators()), Optional.ofNullable(config.getLinkPreviews())); - context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forConfiguration(configurationMessage)); + return context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forConfiguration(configurationMessage)); } public void handleSyncDeviceGroups(final InputStream input) { @@ -326,10 +349,10 @@ public void handleSyncDeviceContacts(final InputStream input) throws IOException } } - private void requestSyncData(final SignalServiceProtos.SyncMessage.Request.Type type) { - var r = SignalServiceProtos.SyncMessage.Request.newBuilder().setType(type).build(); + private SendMessageResult requestSyncData(final SyncMessage.Request.Type type) { + var r = new SyncMessage.Request.Builder().type(type).build(); var message = SignalServiceSyncMessage.forRequest(new RequestMessage(r)); - context.getSendHelper().sendSyncMessage(message); + return context.getSendHelper().sendSyncMessage(message); } private Optional createContactAvatarAttachment(RecipientAddress address) throws IOException { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/AccountFileUpdaterImpl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/AccountFileUpdaterImpl.java index 5c99d0c1cab40..35564362e2fee 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/AccountFileUpdaterImpl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/AccountFileUpdaterImpl.java @@ -2,7 +2,7 @@ import org.asamk.signal.manager.helper.AccountFileUpdater; import org.asamk.signal.manager.storage.accounts.AccountsStore; -import org.whispersystems.signalservice.api.push.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; public class AccountFileUpdaterImpl implements AccountFileUpdater { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ManagerImpl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ManagerImpl.java index 9147eae192746..a2c90aa4d13d9 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -19,6 +19,7 @@ import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.AlreadyReceivingException; import org.asamk.signal.manager.api.AttachmentInvalidException; +import org.asamk.signal.manager.api.CaptchaRequiredException; import org.asamk.signal.manager.api.Configuration; import org.asamk.signal.manager.api.Device; import org.asamk.signal.manager.api.DeviceLinkUrl; @@ -28,18 +29,23 @@ import org.asamk.signal.manager.api.GroupNotFoundException; import org.asamk.signal.manager.api.GroupSendingNotAllowedException; import org.asamk.signal.manager.api.Identity; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; +import org.asamk.signal.manager.api.IncorrectPinException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidStickerException; import org.asamk.signal.manager.api.InvalidUsernameException; import org.asamk.signal.manager.api.LastGroupAdminException; import org.asamk.signal.manager.api.Message; import org.asamk.signal.manager.api.MessageEnvelope; +import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException; import org.asamk.signal.manager.api.NotAGroupMemberException; import org.asamk.signal.manager.api.NotPrimaryDeviceException; import org.asamk.signal.manager.api.Pair; import org.asamk.signal.manager.api.PendingAdminApprovalException; +import org.asamk.signal.manager.api.PinLockedException; import org.asamk.signal.manager.api.Profile; +import org.asamk.signal.manager.api.RateLimitException; import org.asamk.signal.manager.api.ReceiveConfig; import org.asamk.signal.manager.api.Recipient; import org.asamk.signal.manager.api.RecipientIdentifier; @@ -58,6 +64,7 @@ import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.asamk.signal.manager.helper.AccountFileUpdater; import org.asamk.signal.manager.helper.Context; +import org.asamk.signal.manager.helper.RecipientHelper.RegisteredUser; import org.asamk.signal.manager.storage.AttachmentStore; import org.asamk.signal.manager.storage.AvatarStore; import org.asamk.signal.manager.storage.SignalAccount; @@ -71,6 +78,7 @@ import org.asamk.signal.manager.util.KeyUtils; import org.asamk.signal.manager.util.MimeUtils; import org.asamk.signal.manager.util.StickerUtils; +import org.signal.libsignal.protocol.InvalidMessageException; import org.signal.libsignal.usernames.BaseUsernameException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,8 +87,10 @@ import org.whispersystems.signalservice.api.messages.SignalServicePreview; import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage; import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage; -import org.whispersystems.signalservice.api.push.ACI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceIdType; +import org.whispersystems.signalservice.api.push.exceptions.CdsiResourceExhaustedException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; import org.whispersystems.signalservice.api.util.InvalidNumberException; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; @@ -105,6 +115,7 @@ import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Function; @@ -182,8 +193,8 @@ public void removeAccount() { }); disposable.add(account.getIdentityKeyStore().getIdentityChanges().subscribe(serviceId -> { logger.trace("Archiving old sessions for {}", serviceId); - account.getAciSessionStore().archiveSessions(serviceId); - account.getPniSessionStore().archiveSessions(serviceId); + account.getAccountData(ServiceIdType.ACI).getSessionStore().archiveSessions(serviceId); + account.getAccountData(ServiceIdType.PNI).getSessionStore().archiveSessions(serviceId); account.getSenderKeyStore().deleteSharedWith(serviceId); final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId); final var profile = account.getProfileStore().getProfile(recipientId); @@ -205,10 +216,22 @@ public String getSelfNumber() { public void checkAccountState() throws IOException { context.getAccountHelper().checkAccountState(); + final var lastRecipientsRefresh = account.getLastRecipientsRefresh(); + if (lastRecipientsRefresh == null + || lastRecipientsRefresh < System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)) { + try { + context.getRecipientHelper().refreshUsers(); + } catch (Exception e) { + logger.warn("Full CDSI recipients refresh failed, ignoring: {} ({})", + e.getMessage(), + e.getClass().getSimpleName()); + logger.debug("Full CDSI refresh failed", e); + } + } } @Override - public Map getUserStatus(Set numbers) throws IOException { + public Map getUserStatus(Set numbers) throws IOException, RateLimitException { final var canonicalizedNumbers = numbers.stream().collect(Collectors.toMap(n -> n, n -> { try { final var canonicalizedNumber = PhoneNumberFormatter.formatNumber(n, account.getNumber()); @@ -226,7 +249,14 @@ public Map getUserStatus(Set numbers) throws IOExcep .stream() .filter(s -> !s.isEmpty()) .collect(Collectors.toSet()); - final var registeredUsers = context.getRecipientHelper().getRegisteredUsers(canonicalizedNumbersSet); + + final Map registeredUsers; + try { + registeredUsers = context.getRecipientHelper().getRegisteredUsers(canonicalizedNumbersSet); + } catch (CdsiResourceExhaustedException e) { + logger.debug("CDSI resource exhausted: {}", e.getMessage()); + throw new RateLimitException(System.currentTimeMillis() + e.getRetryAfterSeconds() * 1000L); + } return numbers.stream().collect(Collectors.toMap(n -> n, n -> { final var number = canonicalizedNumbers.get(n); @@ -237,7 +267,7 @@ public Map getUserStatus(Set numbers) throws IOExcep : context.getProfileHelper() .getRecipientProfile(account.getRecipientResolver().resolveRecipient(serviceId)); return new UserStatus(number.isEmpty() ? null : number, - serviceId == null ? null : serviceId.uuid(), + serviceId == null ? null : serviceId.getRawUuid(), profile != null && profile.getUnidentifiedAccessMode() == Profile.UnidentifiedAccessMode.UNRESTRICTED); })); @@ -314,6 +344,26 @@ public void deleteUsername() throws IOException { context.getAccountHelper().deleteUsername(); } + @Override + public void startChangeNumber( + String newNumber, boolean voiceVerification, String captcha + ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException { + if (!account.isPrimaryDevice()) { + throw new NotPrimaryDeviceException(); + } + context.getAccountHelper().startChangeNumber(newNumber, voiceVerification, captcha); + } + + @Override + public void finishChangeNumber( + String newNumber, String verificationCode, String pin + ) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException { + if (!account.isPrimaryDevice()) { + throw new NotPrimaryDeviceException(); + } + context.getAccountHelper().finishChangeNumber(newNumber, verificationCode, pin); + } + @Override public void unregister() throws IOException { context.getAccountHelper().unregister(); @@ -359,7 +409,10 @@ public void removeLinkedDevices(int deviceId) throws IOException { } @Override - public void addDeviceLink(DeviceLinkUrl linkUrl) throws IOException, InvalidDeviceLinkException { + public void addDeviceLink(DeviceLinkUrl linkUrl) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException { + if (!account.isPrimaryDevice()) { + throw new NotPrimaryDeviceException(); + } context.getAccountHelper().addDevice(linkUrl); } @@ -376,7 +429,7 @@ public void setRegistrationLockPin(Optional pin) throws IOException, Not } void refreshPreKeys() throws IOException { - context.getPreKeyHelper().refreshPreKeys(); + context.getPreKeyHelper().refreshPreKeysIfNecessary(); } @Override @@ -610,23 +663,30 @@ private void applyMessage( } else { messageBuilder.withBody(message.messageText()); } - if (message.attachments().size() > 0) { + if (!message.attachments().isEmpty()) { messageBuilder.withAttachments(context.getAttachmentHelper().uploadAttachments(message.attachments())); } - if (message.mentions().size() > 0) { + if (!message.mentions().isEmpty()) { messageBuilder.withMentions(resolveMentions(message.mentions())); } - if (message.textStyles().size() > 0) { + if (!message.textStyles().isEmpty()) { messageBuilder.withBodyRanges(message.textStyles().stream().map(TextStyle::toBodyRange).toList()); } if (message.quote().isPresent()) { final var quote = message.quote().get(); + final var quotedAttachments = new ArrayList(); + for (final var a : quote.attachments()) { + final var quotedAttachment = new SignalServiceDataMessage.Quote.QuotedAttachment(a.contentType(), + a.filename(), + a.preview() == null ? null : context.getAttachmentHelper().uploadAttachment(a.preview())); + quotedAttachments.add(quotedAttachment); + } messageBuilder.withQuote(new SignalServiceDataMessage.Quote(quote.timestamp(), context.getRecipientHelper() .resolveSignalServiceAddress(context.getRecipientHelper().resolveRecipient(quote.author())) .getServiceId(), quote.message(), - List.of(), + quotedAttachments, resolveMentions(quote.mentions()), SignalServiceDataMessage.Quote.Type.NORMAL, quote.textStyles().stream().map(TextStyle::toBodyRange).toList())); @@ -655,7 +715,7 @@ private void applyMessage( manifestSticker.emoji(), AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty()))); } - if (message.previews().size() > 0) { + if (!message.previews().isEmpty()) { final var previews = new ArrayList(message.previews().size()); for (final var p : message.previews()) { final var image = p.image().isPresent() ? context.getAttachmentHelper() @@ -698,7 +758,7 @@ public SendMessageResults sendRemoteDeleteMessage( for (final var recipient : recipients) { if (recipient instanceof RecipientIdentifier.Uuid u) { account.getMessageSendLogStore() - .deleteEntryForRecipientNonGroup(targetSentTimestamp, ServiceId.from(u.uuid())); + .deleteEntryForRecipientNonGroup(targetSentTimestamp, ACI.from(u.uuid())); } else if (recipient instanceof RecipientIdentifier.Single r) { try { final var recipientId = context.getRecipientHelper().resolveRecipient(r); @@ -774,7 +834,7 @@ public SendMessageResults sendEndSessionMessage(Set .resolveRecipientAddress(recipientId) .serviceId(); if (serviceId.isPresent()) { - account.getAciSessionStore().deleteAllSessions(serviceId.get()); + account.getAccountData(ServiceIdType.ACI).getSessionStore().deleteAllSessions(serviceId.get()); } } } @@ -814,7 +874,7 @@ public void setContactsBlocked( if (!account.isPrimaryDevice()) { throw new NotPrimaryDeviceException(); } - if (recipients.size() == 0) { + if (recipients.isEmpty()) { return; } final var recipientIds = context.getRecipientHelper().resolveRecipients(recipients); @@ -846,7 +906,7 @@ public void setGroupsBlocked( if (!account.isPrimaryDevice()) { throw new NotPrimaryDeviceException(); } - if (groupIds.size() == 0) { + if (groupIds.isEmpty()) { return; } boolean shouldRotateProfileKey = false; @@ -889,10 +949,25 @@ public StickerPackUrl uploadStickerPack(File path) throws IOException, StickerPa var sticker = new StickerPack(packId, packKey); account.getStickerStore().addStickerPack(sticker); + context.getSyncHelper().sendStickerOperationsMessage(List.of(sticker), List.of()); return new StickerPackUrl(packId, packKey); } + @Override + public void installStickerPack(StickerPackUrl url) throws IOException { + final var packId = url.packId(); + final var packKey = url.packKey(); + try { + context.getStickerHelper().retrieveStickerPack(packId, packKey); + } catch (InvalidMessageException e) { + throw new IOException(e); + } + + final var sticker = context.getStickerHelper().addOrUpdateStickerPack(packId, packKey, true); + context.getSyncHelper().sendStickerOperationsMessage(List.of(sticker), List.of()); + } + @Override public List getStickerPacks() { final var stickerPackStore = context.getStickerPackStore(); @@ -1008,7 +1083,7 @@ public boolean isReceiving() { return true; } synchronized (messageHandlers) { - return messageHandlers.size() > 0; + return !messageHandlers.isEmpty(); } } @@ -1038,7 +1113,7 @@ private void receiveMessages( synchronized (messageHandlers) { receiveThread = null; isReceivingSynchronous = false; - if (messageHandlers.size() > 0) { + if (!messageHandlers.isEmpty()) { startReceiveThreadIfRequired(); } } @@ -1126,7 +1201,12 @@ public Group getGroup(GroupId groupId) { @Override public List getIdentities() { - return account.getIdentityKeyStore().getIdentities().stream().map(this::toIdentity).toList(); + return account.getIdentityKeyStore() + .getIdentities() + .stream() + .map(this::toIdentity) + .filter(Objects::nonNull) + .toList(); } private Identity toIdentity(final IdentityInfo identityInfo) { @@ -1136,6 +1216,10 @@ private Identity toIdentity(final IdentityInfo identityInfo) { final var address = account.getRecipientAddressResolver() .resolveRecipientAddress(account.getRecipientResolver().resolveRecipient(identityInfo.getServiceId())); + if (address.serviceId().isPresent() && !Objects.equals(address.serviceId().get(), + identityInfo.getServiceId())) { + return null; + } final var scannableFingerprint = context.getIdentityHelper() .computeSafetyNumberForScanning(identityInfo.getServiceId(), identityInfo.getIdentityKey()); return new Identity(address.toApiRecipientAddress(), @@ -1166,25 +1250,20 @@ public List getIdentities(RecipientIdentifier.Single recipient) { @Override public boolean trustIdentityVerified( - RecipientIdentifier.Single recipient, byte[] fingerprint + RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode ) throws UnregisteredRecipientException { - return trustIdentity(recipient, r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint)); - } - - @Override - public boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, String safetyNumber - ) throws UnregisteredRecipientException { - return trustIdentity(recipient, - r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber)); - } - - @Override - public boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, byte[] safetyNumber - ) throws UnregisteredRecipientException { - return trustIdentity(recipient, - r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber)); + if (verificationCode instanceof IdentityVerificationCode.Fingerprint fingerprint) { + return trustIdentity(recipient, + r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint.fingerprint())); + } else if (verificationCode instanceof IdentityVerificationCode.SafetyNumber safetyNumber) { + return trustIdentity(recipient, + r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber())); + } else if (verificationCode instanceof IdentityVerificationCode.ScannableSafetyNumber safetyNumber) { + return trustIdentity(recipient, + r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber())); + } else { + throw new AssertionError("Invalid verification code type"); + } } @Override diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java index 0461254a4235b..4dc1ede289999 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java @@ -125,11 +125,7 @@ public RegistrationManager getNewRegistrationManager(String number) throws IOExc public void close() { synchronized (managers) { for (var m : new ArrayList<>(managers)) { - try { - m.close(); - } catch (IOException e) { - logger.warn("Cleanup failed", e); - } + m.close(); } managers.clear(); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java index 113c2856b2257..155756c9f7267 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java @@ -27,12 +27,12 @@ import org.asamk.signal.manager.storage.accounts.AccountsStore; import org.asamk.signal.manager.util.KeyUtils; import org.signal.libsignal.protocol.IdentityKeyPair; -import org.signal.libsignal.protocol.util.KeyHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations; import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; +import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; @@ -59,8 +59,6 @@ public class ProvisioningManagerImpl implements ProvisioningManager { private final SignalServiceAccountManager accountManager; private final IdentityKeyPair tempIdentityKey; - private final int registrationId; - private final int pniRegistrationId; private final String password; public ProvisioningManagerImpl( @@ -77,17 +75,15 @@ public ProvisioningManagerImpl( this.accountsStore = accountsStore; tempIdentityKey = KeyUtils.generateIdentityKeyPair(); - registrationId = KeyHelper.generateRegistrationId(false); - pniRegistrationId = KeyHelper.generateRegistrationId(false); password = KeyUtils.createPassword(); GroupsV2Operations groupsV2Operations; try { - groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration()), + groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()), ServiceConfig.GROUP_MAX_SIZE); } catch (Throwable ignored) { groupsV2Operations = null; } - accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), + accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(), new DynamicCredentialsProvider(null, null, null, password, SignalServiceAddress.DEFAULT_DEVICE_ID), userAgent, groupsV2Operations, @@ -114,9 +110,9 @@ public String finishDeviceLink(String deviceName) throws IOException, TimeoutExc if (accountPath == null) { accountPath = accountsStore.getPathByNumber(number); } - if (accountPath != null - && SignalAccount.accountFileExists(pathConfig.dataPath(), accountPath) - && !canRelinkExistingAccount(accountPath)) { + final var accountExists = accountPath != null && SignalAccount.accountFileExists(pathConfig.dataPath(), + accountPath); + if (accountExists && !canRelinkExistingAccount(accountPath)) { throw new UserAlreadyExistsException(number, SignalAccount.getFileName(pathConfig.dataPath(), accountPath)); } if (accountPath == null) { @@ -128,38 +124,42 @@ public String finishDeviceLink(String deviceName) throws IOException, TimeoutExc var encryptedDeviceName = deviceName == null ? null : DeviceNameUtil.encryptDeviceName(deviceName, ret.getAciIdentity().getPrivateKey()); - - logger.debug("Finishing new device registration"); - var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(), - new ConfirmCodeMessage(false, - true, - registrationId, - pniRegistrationId, - encryptedDeviceName, - getCapabilities(false))); - // Create new account with the synced identity var profileKey = ret.getProfileKey() == null ? KeyUtils.createProfileKey() : ret.getProfileKey(); SignalAccount account = null; try { - account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(), - accountPath, - number, - serviceEnvironmentConfig.getType(), + if (!accountExists) { + account = SignalAccount.createLinkedAccount(pathConfig.dataPath(), + accountPath, + serviceEnvironmentConfig.type(), + Settings.DEFAULT); + } else { + account = SignalAccount.load(pathConfig.dataPath(), accountPath, true, Settings.DEFAULT); + } + + account.setProvisioningData(number, aci, pni, password, encryptedDeviceName, - deviceId, ret.getAciIdentity(), ret.getPniIdentity(), - registrationId, - pniRegistrationId, - profileKey, - Settings.DEFAULT); + profileKey); + account.getConfigurationStore().setReadReceipts(ret.isReadReceipts()); + logger.debug("Finishing new device registration"); + var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(), + new ConfirmCodeMessage(false, + true, + account.getAccountData(ServiceIdType.ACI).getLocalRegistrationId(), + account.getAccountData(ServiceIdType.PNI).getLocalRegistrationId(), + encryptedDeviceName, + getCapabilities(false))); + + account.finishLinking(deviceId); + ManagerImpl m = null; try { m = new ManagerImpl(account, @@ -221,7 +221,7 @@ private boolean canRelinkExistingAccount(final String accountPath) throws IOExce } if (signalAccount.isRegistered() && signalAccount.getServiceEnvironment() != null - && signalAccount.getServiceEnvironment() != serviceEnvironmentConfig.getType()) { + && signalAccount.getServiceEnvironment() != serviceEnvironmentConfig.type()) { logger.debug("Account is registered in another environment: {}.", signalAccount.getServiceEnvironment()); return false; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java index eb51b715faf2b..679056dff3409 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java @@ -29,16 +29,19 @@ import org.asamk.signal.manager.helper.AccountFileUpdater; import org.asamk.signal.manager.helper.PinHelper; import org.asamk.signal.manager.storage.SignalAccount; +import org.asamk.signal.manager.util.KeyUtils; import org.asamk.signal.manager.util.NumberVerificationUtils; import org.asamk.signal.manager.util.Utils; import org.signal.libsignal.usernames.BaseUsernameException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalServiceAccountManager; +import org.whispersystems.signalservice.api.account.PreKeyCollection; import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations; import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; +import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; @@ -79,32 +82,20 @@ public RegistrationManagerImpl( GroupsV2Operations groupsV2Operations; try { - groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration()), + groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()), ServiceConfig.GROUP_MAX_SIZE); } catch (Throwable ignored) { groupsV2Operations = null; } - this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), + this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(), new DynamicCredentialsProvider( // Using empty UUID, because registering doesn't work otherwise null, null, account.getNumber(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID), userAgent, groupsV2Operations, ServiceConfig.AUTOMATIC_NETWORK_RETRY); - final var keyBackupService = accountManager.getKeyBackupService(ServiceConfig.getIasKeyStore(), - serviceEnvironmentConfig.getKeyBackupConfig().getEnclaveName(), - serviceEnvironmentConfig.getKeyBackupConfig().getServiceId(), - serviceEnvironmentConfig.getKeyBackupConfig().getMrenclave(), - 10); - final var fallbackKeyBackupServices = serviceEnvironmentConfig.getFallbackKeyBackupConfigs() - .stream() - .map(config -> accountManager.getKeyBackupService(ServiceConfig.getIasKeyStore(), - config.getEnclaveName(), - config.getServiceId(), - config.getMrenclave(), - 10)) - .toList(); - this.pinHelper = new PinHelper(keyBackupService, fallbackKeyBackupServices); + final var secureValueRecoveryV2 = accountManager.getSecureValueRecoveryV2(serviceEnvironmentConfig.svr2Mrenclave()); + this.pinHelper = new PinHelper(secureValueRecoveryV2); } @Override @@ -113,7 +104,7 @@ public void register( ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException { if (account.isRegistered() && account.getServiceEnvironment() != null - && account.getServiceEnvironment() != serviceEnvironmentConfig.getType()) { + && account.getServiceEnvironment() != serviceEnvironmentConfig.type()) { throw new IOException("Account is registered in another environment: " + account.getServiceEnvironment()); } @@ -138,12 +129,21 @@ public void register( public void verifyAccount( String verificationCode, String pin ) throws IOException, PinLockedException, IncorrectPinException { - var sessionId = account.getSessionId(account.getNumber()); - final var result = NumberVerificationUtils.verifyNumber(sessionId, + if (account.getPniIdentityKeyPair() == null) { + account.setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); + } + + final var aciPreKeys = generatePreKeysForType(ServiceIdType.ACI); + final var pniPreKeys = generatePreKeysForType(ServiceIdType.PNI); + final var result = NumberVerificationUtils.verifyNumber(account.getSessionId(account.getNumber()), verificationCode, pin, pinHelper, - this::verifyAccountWithCode); + (sessionId1, verificationCode1, registrationLock) -> verifyAccountWithCode(sessionId1, + verificationCode1, + registrationLock, + aciPreKeys, + pniPreKeys)); final var response = result.first(); final var masterKey = result.second(); if (masterKey == null) { @@ -151,9 +151,9 @@ public void verifyAccount( } //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID))); - final var aci = ACI.parseOrNull(response.getUuid()); - final var pni = PNI.parseOrNull(response.getPni()); - account.finishRegistration(aci, pni, masterKey, pin); + final var aci = ACI.parseOrThrow(response.getUuid()); + final var pni = PNI.parseOrThrow(response.getPni()); + account.finishRegistration(aci, pni, masterKey, pin, aciPreKeys, pniPreKeys); accountFileUpdater.updateAccountIdentifiers(account.getNumber(), aci); ManagerImpl m = null; @@ -203,7 +203,7 @@ public boolean isRegistered() { private boolean attemptReactivateAccount() { try { - final var accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), + final var accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(), account.getCredentialsProvider(), userAgent, null, @@ -228,7 +228,11 @@ private boolean attemptReactivateAccount() { } private VerifyAccountResponse verifyAccountWithCode( - final String sessionId, final String verificationCode, final String registrationLock + final String sessionId, + final String verificationCode, + final String registrationLock, + final PreKeyCollection aciPreKeys, + final PreKeyCollection pniPreKeys ) throws IOException { try { Utils.handleResponseException(accountManager.verifyAccount(verificationCode, sessionId)); @@ -238,9 +242,27 @@ private VerifyAccountResponse verifyAccountWithCode( return Utils.handleResponseException(accountManager.registerAccount(sessionId, null, account.getAccountAttributes(registrationLock), + aciPreKeys, + pniPreKeys, + null, true)); } + private PreKeyCollection generatePreKeysForType(ServiceIdType serviceIdType) { + final var accountData = account.getAccountData(serviceIdType); + final var keyPair = accountData.getIdentityKeyPair(); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + + final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId(); + final var signedPreKey = KeyUtils.generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair.getPrivateKey()); + + final var privateKey = keyPair.getPrivateKey(); + final var kyberPreKeyIdOffset = preKeyMetadata.getNextKyberPreKeyId(); + final var lastResortKyberPreKey = KeyUtils.generateKyberPreKeyRecord(kyberPreKeyIdOffset, privateKey); + + return new PreKeyCollection(keyPair.getPublicKey(), signedPreKey, lastResortKyberPreKey); + } + @Override public void close() { if (account != null) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalDependencies.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalDependencies.java index bf2f76dfd1030..2e2cb75f6ffaa 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalDependencies.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalDependencies.java @@ -4,7 +4,6 @@ import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.signal.libsignal.metadata.certificate.CertificateValidator; import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations; -import org.whispersystems.signalservice.api.KeyBackupService; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.SignalServiceDataStore; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; @@ -17,12 +16,12 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.services.ProfileService; +import org.whispersystems.signalservice.api.svr.SecureValueRecoveryV2; import org.whispersystems.signalservice.api.util.CredentialsProvider; import org.whispersystems.signalservice.api.util.UptimeSleepTimer; import org.whispersystems.signalservice.api.websocket.WebSocketFactory; import org.whispersystems.signalservice.internal.websocket.WebSocketConnection; -import java.util.Collection; import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.function.Supplier; @@ -49,7 +48,7 @@ public class SignalDependencies { private SignalServiceMessageReceiver messageReceiver; private SignalServiceMessageSender messageSender; - private KeyBackupService keyBackupService; + private SecureValueRecoveryV2 secureValueRecoveryV2; private ProfileService profileService; private SignalServiceCipher cipher; @@ -92,7 +91,7 @@ public SignalSessionLock getSessionLock() { public SignalServiceAccountManager getAccountManager() { return getOrCreate(() -> accountManager, - () -> accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), + () -> accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(), credentialsProvider, userAgent, getGroupsV2Operations(), @@ -100,7 +99,7 @@ public SignalServiceAccountManager getAccountManager() { } public SignalServiceAccountManager createUnauthenticatedAccountManager(String number, String password) { - return new SignalServiceAccountManager(getServiceEnvironmentConfig().getSignalServiceConfiguration(), + return new SignalServiceAccountManager(getServiceEnvironmentConfig().signalServiceConfiguration(), null, null, number, @@ -117,13 +116,13 @@ public GroupsV2Api getGroupsV2Api() { public GroupsV2Operations getGroupsV2Operations() { return getOrCreate(() -> groupsV2Operations, - () -> groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration()), + () -> groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()), ServiceConfig.GROUP_MAX_SIZE)); } private ClientZkOperations getClientZkOperations() { return getOrCreate(() -> clientZkOperations, - () -> clientZkOperations = ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration())); + () -> clientZkOperations = ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration())); } private ClientZkProfileOperations getClientZkProfileOperations() { @@ -139,7 +138,7 @@ public SignalWebSocket getSignalWebSocket() { @Override public WebSocketConnection createWebSocket() { return new WebSocketConnection("normal", - serviceEnvironmentConfig.getSignalServiceConfiguration(), + serviceEnvironmentConfig.signalServiceConfiguration(), Optional.of(credentialsProvider), userAgent, healthMonitor, @@ -149,7 +148,7 @@ public WebSocketConnection createWebSocket() { @Override public WebSocketConnection createUnidentifiedWebSocket() { return new WebSocketConnection("unidentified", - serviceEnvironmentConfig.getSignalServiceConfiguration(), + serviceEnvironmentConfig.signalServiceConfiguration(), Optional.empty(), userAgent, healthMonitor, @@ -163,7 +162,7 @@ public WebSocketConnection createUnidentifiedWebSocket() { public SignalServiceMessageReceiver getMessageReceiver() { return getOrCreate(() -> messageReceiver, - () -> messageReceiver = new SignalServiceMessageReceiver(serviceEnvironmentConfig.getSignalServiceConfiguration(), + () -> messageReceiver = new SignalServiceMessageReceiver(serviceEnvironmentConfig.signalServiceConfiguration(), credentialsProvider, userAgent, getClientZkProfileOperations(), @@ -172,7 +171,7 @@ public SignalServiceMessageReceiver getMessageReceiver() { public SignalServiceMessageSender getMessageSender() { return getOrCreate(() -> messageSender, - () -> messageSender = new SignalServiceMessageSender(serviceEnvironmentConfig.getSignalServiceConfiguration(), + () -> messageSender = new SignalServiceMessageSender(serviceEnvironmentConfig.signalServiceConfiguration(), credentialsProvider, dataStore, sessionLock, @@ -185,24 +184,9 @@ public SignalServiceMessageSender getMessageSender() { ServiceConfig.AUTOMATIC_NETWORK_RETRY)); } - public KeyBackupService getKeyBackupService() { - return getOrCreate(() -> keyBackupService, - () -> keyBackupService = getAccountManager().getKeyBackupService(ServiceConfig.getIasKeyStore(), - serviceEnvironmentConfig.getKeyBackupConfig().getEnclaveName(), - serviceEnvironmentConfig.getKeyBackupConfig().getServiceId(), - serviceEnvironmentConfig.getKeyBackupConfig().getMrenclave(), - 10)); - } - - public Collection getFallbackKeyBackupServices() { - return serviceEnvironmentConfig.getFallbackKeyBackupConfigs() - .stream() - .map(config -> getAccountManager().getKeyBackupService(ServiceConfig.getIasKeyStore(), - config.getEnclaveName(), - config.getServiceId(), - config.getMrenclave(), - 10)) - .toList(); + public SecureValueRecoveryV2 getSecureValueRecoveryV2() { + return getOrCreate(() -> secureValueRecoveryV2, + () -> secureValueRecoveryV2 = getAccountManager().getSecureValueRecoveryV2(serviceEnvironmentConfig.svr2Mrenclave())); } public ProfileService getProfileService() { @@ -214,7 +198,7 @@ public ProfileService getProfileService() { public SignalServiceCipher getCipher() { return getOrCreate(() -> cipher, () -> { - final var certificateValidator = new CertificateValidator(serviceEnvironmentConfig.getUnidentifiedSenderTrustRoot()); + final var certificateValidator = new CertificateValidator(serviceEnvironmentConfig.unidentifiedSenderTrustRoot()); final var address = new SignalServiceAddress(credentialsProvider.getAci(), credentialsProvider.getE164()); final var deviceId = credentialsProvider.getDeviceId(); cipher = new SignalServiceCipher(address, deviceId, dataStore.aci(), sessionLock, certificateValidator); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalWebSocketHealthMonitor.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalWebSocketHealthMonitor.java index f4ac35e2705d1..0986d62e5d8c7 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalWebSocketHealthMonitor.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/internal/SignalWebSocketHealthMonitor.java @@ -25,7 +25,7 @@ final class SignalWebSocketHealthMonitor implements HealthMonitor { private final static Logger logger = LoggerFactory.getLogger(SignalWebSocketHealthMonitor.class); - private static final long KEEP_ALIVE_SEND_CADENCE = TimeUnit.SECONDS.toMillis(WebSocketConnection.KEEPALIVE_TIMEOUT_SECONDS); + private static final long KEEP_ALIVE_SEND_CADENCE = TimeUnit.SECONDS.toMillis(WebSocketConnection.KEEPALIVE_FREQUENCY_SECONDS); private static final long MAX_TIME_SINCE_SUCCESSFUL_KEEP_ALIVE = KEEP_ALIVE_SEND_CADENCE * 3; private SignalWebSocket signalWebSocket; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/jobs/RetrieveStickerPackJob.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/jobs/RetrieveStickerPackJob.java index 54c0390b8ec5b..9d90a5463e018 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/jobs/RetrieveStickerPackJob.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/jobs/RetrieveStickerPackJob.java @@ -23,10 +23,6 @@ public RetrieveStickerPackJob(final StickerPackId packId, final byte[] packKey) @Override public void run(Context context) { - if (context.getStickerPackStore().existsStickerPack(packId)) { - logger.debug("Sticker pack {} already downloaded.", Hex.toStringCondensed(packId.serialize())); - return; - } try { context.getStickerHelper().retrieveStickerPack(packId, packKey); } catch (IOException e) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/AccountDatabase.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/AccountDatabase.java index a15b4aabc07e7..e09cd4c2b0c2c 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/AccountDatabase.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/AccountDatabase.java @@ -2,10 +2,14 @@ import com.zaxxer.hikari.HikariDataSource; +import org.asamk.signal.manager.api.Pair; import org.asamk.signal.manager.storage.groups.GroupStore; import org.asamk.signal.manager.storage.identities.IdentityKeyStore; +import org.asamk.signal.manager.storage.keyValue.KeyValueStore; +import org.asamk.signal.manager.storage.prekeys.KyberPreKeyStore; import org.asamk.signal.manager.storage.prekeys.PreKeyStore; import org.asamk.signal.manager.storage.prekeys.SignedPreKeyStore; +import org.asamk.signal.manager.storage.recipients.CdsiStore; import org.asamk.signal.manager.storage.recipients.RecipientStore; import org.asamk.signal.manager.storage.sendLog.MessageSendLogStore; import org.asamk.signal.manager.storage.senderKeys.SenderKeyRecordStore; @@ -15,15 +19,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.util.UuidUtil; import java.io.File; import java.sql.Connection; import java.sql.SQLException; +import java.util.HashMap; +import java.util.Optional; +import java.util.UUID; public class AccountDatabase extends Database { private final static Logger logger = LoggerFactory.getLogger(AccountDatabase.class); - private static final long DATABASE_VERSION = 13; + private static final long DATABASE_VERSION = 18; private AccountDatabase(final HikariDataSource dataSource) { super(logger, DATABASE_VERSION, dataSource); @@ -40,11 +49,14 @@ protected void createDatabase(final Connection connection) throws SQLException { StickerStore.createSql(connection); PreKeyStore.createSql(connection); SignedPreKeyStore.createSql(connection); + KyberPreKeyStore.createSql(connection); GroupStore.createSql(connection); SessionStore.createSql(connection); IdentityKeyStore.createSql(connection); SenderKeyRecordStore.createSql(connection); SenderKeySharedStore.createSql(connection); + KeyValueStore.createSql(connection); + CdsiStore.createSql(connection); } @Override @@ -313,7 +325,7 @@ INSERT INTO session2 (_id, account_id_type, uuid, device_id, record) WHERE i.uuid = ? """; try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, ServiceId.UNKNOWN.toByteArray()); + statement.setBytes(1, ACI.UNKNOWN.toByteArray()); statement.executeUpdate(); } } @@ -323,10 +335,201 @@ INSERT INTO session2 (_id, account_id_type, uuid, device_id, record) WHERE i.uuid = ? """; try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, ServiceId.UNKNOWN.toByteArray()); + statement.setBytes(1, ACI.UNKNOWN.toByteArray()); statement.executeUpdate(); } } } + if (oldVersion < 14) { + logger.debug("Updating database: Creating kyber_pre_key table"); + { + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE kyber_pre_key ( + _id INTEGER PRIMARY KEY, + account_id_type INTEGER NOT NULL, + key_id INTEGER NOT NULL, + serialized BLOB NOT NULL, + is_last_resort INTEGER NOT NULL, + UNIQUE(account_id_type, key_id) + ) STRICT; + """); + } + } + } + if (oldVersion < 15) { + logger.debug("Updating database: Store serviceId as TEXT"); + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE tmp_mapping_table ( + uuid BLOB NOT NULL, + address TEXT NOT NULL + ) STRICT; + """); + + final var sql = ( + """ + SELECT r.uuid, r.pni + FROM recipient r + """ + ); + final var uuidAddressMapping = new HashMap(); + try (final var preparedStatement = connection.prepareStatement(sql)) { + try (var result = Utils.executeQueryForStream(preparedStatement, (resultSet) -> { + final var pni = Optional.ofNullable(resultSet.getBytes("pni")) + .map(UuidUtil::parseOrNull) + .map(ServiceId.PNI::from); + final var serviceIdUuid = Optional.ofNullable(resultSet.getBytes("uuid")) + .map(UuidUtil::parseOrNull); + final var serviceId = serviceIdUuid.isPresent() && pni.isPresent() && serviceIdUuid.get() + .equals(pni.get().getRawUuid()) + ? pni.map(p -> p) + : serviceIdUuid.map(ACI::from); + + return new Pair<>(serviceId, pni); + })) { + result.forEach(p -> { + final var serviceId = p.first(); + final var pni = p.second(); + if (serviceId.isPresent()) { + uuidAddressMapping.put(serviceId.get().getRawUuid(), serviceId.get()); + } + if (pni.isPresent()) { + uuidAddressMapping.put(pni.get().getRawUuid(), pni.get()); + } + }); + } + } + + final var insertSql = """ + INSERT INTO tmp_mapping_table (uuid, address) + VALUES (?,?) + """; + try (final var insertStatement = connection.prepareStatement(insertSql)) { + for (final var entry : uuidAddressMapping.entrySet()) { + final var uuid = entry.getKey(); + final var serviceId = entry.getValue(); + insertStatement.setBytes(1, UuidUtil.toByteArray(uuid)); + insertStatement.setString(2, serviceId.toString()); + insertStatement.execute(); + } + } + + statement.executeUpdate(""" + CREATE TABLE identity2 ( + _id INTEGER PRIMARY KEY, + address TEXT UNIQUE NOT NULL, + identity_key BLOB NOT NULL, + added_timestamp INTEGER NOT NULL, + trust_level INTEGER NOT NULL + ) STRICT; + INSERT INTO identity2 (_id, address, identity_key, added_timestamp, trust_level) + SELECT i._id, (SELECT t.address FROM tmp_mapping_table t WHERE t.uuid = i.uuid) address, i.identity_key, i.added_timestamp, i.trust_level + FROM identity i + WHERE address IS NOT NULL; + DROP TABLE identity; + ALTER TABLE identity2 RENAME TO identity; + + CREATE TABLE message_send_log2 ( + _id INTEGER PRIMARY KEY, + content_id INTEGER NOT NULL REFERENCES message_send_log_content (_id) ON DELETE CASCADE, + address TEXT NOT NULL, + device_id INTEGER NOT NULL + ) STRICT; + INSERT INTO message_send_log2 (_id, content_id, address, device_id) + SELECT m._id, m.content_id, (SELECT t.address FROM tmp_mapping_table t WHERE t.uuid = m.uuid) address, m.device_id + FROM message_send_log m + WHERE address IS NOT NULL; + DROP INDEX msl_recipient_index; + DROP INDEX msl_content_index; + DROP TABLE message_send_log; + ALTER TABLE message_send_log2 RENAME TO message_send_log; + CREATE INDEX msl_recipient_index ON message_send_log (address, device_id, content_id); + CREATE INDEX msl_content_index ON message_send_log (content_id); + + CREATE TABLE sender_key2 ( + _id INTEGER PRIMARY KEY, + address TEXT NOT NULL, + device_id INTEGER NOT NULL, + distribution_id BLOB NOT NULL, + record BLOB NOT NULL, + created_timestamp INTEGER NOT NULL, + UNIQUE(address, device_id, distribution_id) + ) STRICT; + INSERT INTO sender_key2 (_id, address, device_id, distribution_id, record, created_timestamp) + SELECT s._id, (SELECT t.address FROM tmp_mapping_table t WHERE t.uuid = s.uuid) address, s.device_id, s.distribution_id, s.record, s.created_timestamp + FROM sender_key s + WHERE address IS NOT NULL; + DROP TABLE sender_key; + ALTER TABLE sender_key2 RENAME TO sender_key; + + CREATE TABLE sender_key_shared2 ( + _id INTEGER PRIMARY KEY, + address TEXT NOT NULL, + device_id INTEGER NOT NULL, + distribution_id BLOB NOT NULL, + timestamp INTEGER NOT NULL, + UNIQUE(address, device_id, distribution_id) + ) STRICT; + INSERT INTO sender_key_shared2 (_id, address, device_id, distribution_id, timestamp) + SELECT s._id, (SELECT t.address FROM tmp_mapping_table t WHERE t.uuid = s.uuid) address, s.device_id, s.distribution_id, s.timestamp + FROM sender_key_shared s + WHERE address IS NOT NULL; + DROP TABLE sender_key_shared; + ALTER TABLE sender_key_shared2 RENAME TO sender_key_shared; + + CREATE TABLE session2 ( + _id INTEGER PRIMARY KEY, + account_id_type INTEGER NOT NULL, + address TEXT NOT NULL, + device_id INTEGER NOT NULL, + record BLOB NOT NULL, + UNIQUE(account_id_type, address, device_id) + ) STRICT; + INSERT INTO session2 (_id, account_id_type, address, device_id, record) + SELECT s._id, s.account_id_type, (SELECT t.address FROM tmp_mapping_table t WHERE t.uuid = s.uuid) address, s.device_id, s.record + FROM session s + WHERE address IS NOT NULL; + DROP TABLE session; + ALTER TABLE session2 RENAME TO session; + + DROP TABLE tmp_mapping_table; + """); + } + } + if (oldVersion < 16) { + logger.debug("Updating database: Adding stale_timestamp prekey field"); + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + ALTER TABLE pre_key ADD COLUMN stale_timestamp INTEGER; + ALTER TABLE kyber_pre_key ADD COLUMN stale_timestamp INTEGER; + ALTER TABLE kyber_pre_key ADD COLUMN timestamp INTEGER DEFAULT 0; + """); + } + } + if (oldVersion < 17) { + logger.debug("Updating database: Adding key_value table"); + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE key_value ( + _id INTEGER PRIMARY KEY, + key TEXT UNIQUE NOT NULL, + value ANY + ) STRICT; + """); + } + } + if (oldVersion < 18) { + logger.debug("Updating database: Adding cdsi table"); + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE cdsi ( + _id INTEGER PRIMARY KEY, + number TEXT NOT NULL UNIQUE, + last_seen_at INTEGER NOT NULL + ) STRICT; + """); + } + } } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Database.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Database.java index 7512cbaac607a..95f9e1fa0a787 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Database.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Database.java @@ -48,7 +48,7 @@ public final Connection getConnection() throws SQLException { } @Override - public void close() throws SQLException { + public void close() { dataSource.close(); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/SignalAccount.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/SignalAccount.java index 850b264fb8428..2d33555d0913e 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -12,6 +12,7 @@ import org.asamk.signal.manager.api.TrustLevel; import org.asamk.signal.manager.helper.RecipientAddressResolver; import org.asamk.signal.manager.storage.configuration.ConfigurationStore; +import org.asamk.signal.manager.storage.configuration.LegacyConfigurationStore; import org.asamk.signal.manager.storage.contacts.ContactsStore; import org.asamk.signal.manager.storage.contacts.LegacyJsonContactsStore; import org.asamk.signal.manager.storage.groups.GroupInfoV1; @@ -20,7 +21,10 @@ import org.asamk.signal.manager.storage.identities.IdentityKeyStore; import org.asamk.signal.manager.storage.identities.LegacyIdentityKeyStore; import org.asamk.signal.manager.storage.identities.SignalIdentityKeyStore; +import org.asamk.signal.manager.storage.keyValue.KeyValueEntry; +import org.asamk.signal.manager.storage.keyValue.KeyValueStore; import org.asamk.signal.manager.storage.messageCache.MessageCache; +import org.asamk.signal.manager.storage.prekeys.KyberPreKeyStore; import org.asamk.signal.manager.storage.prekeys.LegacyPreKeyStore; import org.asamk.signal.manager.storage.prekeys.LegacySignedPreKeyStore; import org.asamk.signal.manager.storage.prekeys.PreKeyStore; @@ -29,6 +33,7 @@ import org.asamk.signal.manager.storage.profiles.ProfileStore; import org.asamk.signal.manager.storage.protocol.LegacyJsonSignalProtocolStore; import org.asamk.signal.manager.storage.protocol.SignalProtocolStore; +import org.asamk.signal.manager.storage.recipients.CdsiStore; import org.asamk.signal.manager.storage.recipients.LegacyRecipientStore; import org.asamk.signal.manager.storage.recipients.LegacyRecipientStore2; import org.asamk.signal.manager.storage.recipients.RecipientAddress; @@ -51,11 +56,11 @@ import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidMessageException; import org.signal.libsignal.protocol.SignalProtocolAddress; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SessionRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.protocol.util.KeyHelper; -import org.signal.libsignal.protocol.util.Medium; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; import org.slf4j.Logger; @@ -63,11 +68,12 @@ import org.whispersystems.signalservice.api.SignalServiceAccountDataStore; import org.whispersystems.signalservice.api.SignalServiceDataStore; import org.whispersystems.signalservice.api.account.AccountAttributes; +import org.whispersystems.signalservice.api.account.PreKeyCollection; import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess; import org.whispersystems.signalservice.api.kbs.MasterKey; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.storage.SignalStorageManifest; @@ -88,7 +94,6 @@ import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.file.Files; -import java.security.SecureRandom; import java.sql.Connection; import java.sql.SQLException; import java.util.Base64; @@ -96,8 +101,10 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.function.Supplier; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; import static org.asamk.signal.manager.config.ServiceConfig.getCapabilities; public class SignalAccount implements Closeable { @@ -105,7 +112,7 @@ public class SignalAccount implements Closeable { private final static Logger logger = LoggerFactory.getLogger(SignalAccount.class); private static final int MINIMUM_STORAGE_VERSION = 1; - private static final int CURRENT_STORAGE_VERSION = 6; + private static final int CURRENT_STORAGE_VERSION = 8; private final Object LOCK = new Object(); @@ -118,52 +125,46 @@ public class SignalAccount implements Closeable { private File dataPath; private String accountPath; + private ServiceEnvironment serviceEnvironment; private String number; private String username; - private ACI aci; - private PNI pni; - private String sessionId; - private String sessionNumber; private String encryptedDeviceName; - private int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID; - private boolean isMultiDevice = false; + private int deviceId = 0; private String password; private String registrationLockPin; private MasterKey pinMasterKey; private StorageKey storageKey; - private long storageManifestVersion = -1; private ProfileKey profileKey; - private int aciPreKeyIdOffset = 1; - private int aciNextSignedPreKeyId = 1; - private int pniPreKeyIdOffset = 1; - private int pniNextSignedPreKeyId = 1; - private IdentityKeyPair aciIdentityKeyPair; - private IdentityKeyPair pniIdentityKeyPair; - private int localRegistrationId; - private int localPniRegistrationId; + private Settings settings; - private long lastReceiveTimestamp = 0; + private final KeyValueEntry verificationSessionId = new KeyValueEntry<>("verification-session-id", + String.class); + private final KeyValueEntry verificationSessionNumber = new KeyValueEntry<>("verification-session-number", + String.class); + private final KeyValueEntry lastReceiveTimestamp = new KeyValueEntry<>("last-receive-timestamp", + long.class, + 0L); + private final KeyValueEntry cdsiToken = new KeyValueEntry<>("cdsi-token", byte[].class); + private final KeyValueEntry lastRecipientsRefresh = new KeyValueEntry<>("last-recipients-refresh", + long.class); + private final KeyValueEntry storageManifestVersion = new KeyValueEntry<>("storage-manifest-version", + long.class, + -1L); + private boolean isMultiDevice = false; private boolean registered = false; - private SignalProtocolStore aciSignalProtocolStore; - private SignalProtocolStore pniSignalProtocolStore; - private PreKeyStore aciPreKeyStore; - private SignedPreKeyStore aciSignedPreKeyStore; - private PreKeyStore pniPreKeyStore; - private SignedPreKeyStore pniSignedPreKeyStore; - private SessionStore aciSessionStore; - private SessionStore pniSessionStore; + private final AccountData aciAccountData = new AccountData<>(ServiceIdType.ACI); + private final AccountData pniAccountData = new AccountData<>(ServiceIdType.PNI); private IdentityKeyStore identityKeyStore; - private SignalIdentityKeyStore aciIdentityKeyStore; - private SignalIdentityKeyStore pniIdentityKeyStore; private SenderKeyStore senderKeyStore; private GroupStore groupStore; private RecipientStore recipientStore; private StickerStore stickerStore; private ConfigurationStore configurationStore; - private ConfigurationStore.Storage configurationStoreStorage; + private KeyValueStore keyValueStore; + private CdsiStore cdsiStore; private MessageCache messageCache; private MessageSendLogStore messageSendLogStore; @@ -203,8 +204,6 @@ public static SignalAccount create( ServiceEnvironment serviceEnvironment, IdentityKeyPair aciIdentityKey, IdentityKeyPair pniIdentityKey, - int registrationId, - int pniRegistrationId, ProfileKey profileKey, final Settings settings ) throws IOException { @@ -221,14 +220,15 @@ public static SignalAccount create( signalAccount.number = number; signalAccount.serviceEnvironment = serviceEnvironment; signalAccount.profileKey = profileKey; + signalAccount.password = KeyUtils.createPassword(); + signalAccount.deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID; signalAccount.dataPath = dataPath; - signalAccount.aciIdentityKeyPair = aciIdentityKey; - signalAccount.pniIdentityKeyPair = pniIdentityKey; - signalAccount.localRegistrationId = registrationId; - signalAccount.localPniRegistrationId = pniRegistrationId; + signalAccount.aciAccountData.setIdentityKeyPair(aciIdentityKey); + signalAccount.pniAccountData.setIdentityKeyPair(pniIdentityKey); + signalAccount.aciAccountData.setLocalRegistrationId(KeyHelper.generateRegistrationId(false)); + signalAccount.pniAccountData.setLocalRegistrationId(KeyHelper.generateRegistrationId(false)); signalAccount.settings = settings; - signalAccount.configurationStore = new ConfigurationStore(signalAccount::saveConfigurationStore); signalAccount.registered = false; @@ -239,176 +239,114 @@ public static SignalAccount create( return signalAccount; } - public static SignalAccount createOrUpdateLinkedAccount( - File dataPath, - String accountPath, - String number, - ServiceEnvironment serviceEnvironment, - ACI aci, - PNI pni, - String password, - String encryptedDeviceName, - int deviceId, - IdentityKeyPair aciIdentityKey, - IdentityKeyPair pniIdentityKey, - int registrationId, - int pniRegistrationId, - ProfileKey profileKey, + public static SignalAccount createLinkedAccount( + final File dataPath, + final String accountPath, + final ServiceEnvironment serviceEnvironment, final Settings settings ) throws IOException { IOUtils.createPrivateDirectories(dataPath); - var fileName = getFileName(dataPath, accountPath); - if (!fileName.exists()) { - return createLinkedAccount(dataPath, - accountPath, - number, - serviceEnvironment, - aci, - pni, - password, - encryptedDeviceName, - deviceId, - aciIdentityKey, - pniIdentityKey, - registrationId, - pniRegistrationId, - profileKey, - settings); - } - - final var signalAccount = load(dataPath, accountPath, true, settings); - signalAccount.setProvisioningData(number, - aci, - pni, - password, - encryptedDeviceName, - deviceId, - aciIdentityKey, - pniIdentityKey, - profileKey); - signalAccount.getRecipientTrustedResolver() - .resolveSelfRecipientTrusted(signalAccount.getSelfRecipientAddress()); - signalAccount.getAciSessionStore().archiveAllSessions(); - signalAccount.getPniSessionStore().archiveAllSessions(); - signalAccount.getSenderKeyStore().deleteAll(); - signalAccount.clearAllPreKeys(); - return signalAccount; - } - - public void initDatabase() { - getAccountDatabase(); - } - - private void clearAllPreKeys() { - resetPreKeyOffsets(ServiceIdType.ACI); - resetPreKeyOffsets(ServiceIdType.PNI); - this.getAciPreKeyStore().removeAllPreKeys(); - this.getAciSignedPreKeyStore().removeAllSignedPreKeys(); - this.getPniPreKeyStore().removeAllPreKeys(); - this.getPniSignedPreKeyStore().removeAllSignedPreKeys(); - save(); - } - - private static SignalAccount createLinkedAccount( - File dataPath, - String accountPath, - String number, - ServiceEnvironment serviceEnvironment, - ACI aci, - PNI pni, - String password, - String encryptedDeviceName, - int deviceId, - IdentityKeyPair aciIdentityKey, - IdentityKeyPair pniIdentityKey, - int registrationId, - int pniRegistrationId, - ProfileKey profileKey, - final Settings settings - ) throws IOException { var fileName = getFileName(dataPath, accountPath); IOUtils.createPrivateFile(fileName); final var pair = openFileChannel(fileName, true); - var signalAccount = new SignalAccount(pair.first(), pair.second()); + final var signalAccount = new SignalAccount(pair.first(), pair.second()); signalAccount.dataPath = dataPath; signalAccount.accountPath = accountPath; signalAccount.serviceEnvironment = serviceEnvironment; - signalAccount.localRegistrationId = registrationId; - signalAccount.localPniRegistrationId = pniRegistrationId; + signalAccount.aciAccountData.setLocalRegistrationId(KeyHelper.generateRegistrationId(false)); + signalAccount.pniAccountData.setLocalRegistrationId(KeyHelper.generateRegistrationId(false)); signalAccount.settings = settings; - signalAccount.setProvisioningData(number, - aci, - pni, - password, - encryptedDeviceName, - deviceId, - aciIdentityKey, - pniIdentityKey, - profileKey); - - signalAccount.configurationStore = new ConfigurationStore(signalAccount::saveConfigurationStore); - signalAccount.getRecipientTrustedResolver() - .resolveSelfRecipientTrusted(signalAccount.getSelfRecipientAddress()); signalAccount.previousStorageVersion = CURRENT_STORAGE_VERSION; - signalAccount.migrateLegacyConfigs(); - signalAccount.clearAllPreKeys(); - signalAccount.save(); return signalAccount; } - private void setProvisioningData( + public void setProvisioningData( final String number, final ACI aci, final PNI pni, final String password, final String encryptedDeviceName, - final int deviceId, final IdentityKeyPair aciIdentity, final IdentityKeyPair pniIdentity, final ProfileKey profileKey ) { + this.deviceId = 0; this.number = number; - this.aci = aci; - this.pni = pni; + this.aciAccountData.setServiceId(aci); + this.pniAccountData.setServiceId(pni); + getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); this.password = password; this.profileKey = profileKey; getProfileStore().storeSelfProfileKey(getSelfRecipientId(), getProfileKey()); this.encryptedDeviceName = encryptedDeviceName; - this.deviceId = deviceId; - this.aciIdentityKeyPair = aciIdentity; - this.pniIdentityKeyPair = pniIdentity; - this.registered = true; + this.aciAccountData.setIdentityKeyPair(aciIdentity); + this.pniAccountData.setIdentityKeyPair(pniIdentity); + this.registered = false; this.isMultiDevice = true; - this.lastReceiveTimestamp = 0; + getKeyValueStore().storeEntry(lastReceiveTimestamp, 0L); this.pinMasterKey = null; - this.storageManifestVersion = -1; + getKeyValueStore().storeEntry(storageManifestVersion, -1L); this.setStorageManifest(null); this.storageKey = null; - final var aciPublicKey = getAciIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getAci(), aciPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getAci(), aciPublicKey, TrustLevel.TRUSTED_VERIFIED); - if (getPniIdentityKeyPair() != null) { - final var pniPublicKey = getPniIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getPni(), pniPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getPni(), pniPublicKey, TrustLevel.TRUSTED_VERIFIED); - } + getSenderKeyStore().deleteAll(); + trustSelfIdentity(ServiceIdType.ACI); + trustSelfIdentity(ServiceIdType.PNI); + aciAccountData.getSessionStore().archiveAllSessions(); + pniAccountData.getSessionStore().archiveAllSessions(); + clearAllPreKeys(); + getKeyValueStore().storeEntry(lastRecipientsRefresh, null); + save(); } - private void migrateLegacyConfigs() { - if (getPassword() == null) { - setPassword(KeyUtils.createPassword()); - } + public void finishLinking(final int deviceId) { + this.registered = true; + this.deviceId = deviceId; + save(); + } - if (getProfileKey() == null) { - // Old config file, creating new profile key - setProfileKey(KeyUtils.createProfileKey()); - } - getProfileStore().storeProfileKey(getSelfRecipientId(), getProfileKey()); - if (isPrimaryDevice() && getPniIdentityKeyPair() == null && getPni() != null) { + public void finishRegistration( + final ACI aci, + final PNI pni, + final MasterKey masterKey, + final String pin, + final PreKeyCollection aciPreKeys, + final PreKeyCollection pniPreKeys + ) { + this.pinMasterKey = masterKey; + getKeyValueStore().storeEntry(storageManifestVersion, -1L); + this.setStorageManifest(null); + this.storageKey = null; + this.encryptedDeviceName = null; + this.deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID; + this.isMultiDevice = false; + this.registered = true; + this.aciAccountData.setServiceId(aci); + this.pniAccountData.setServiceId(pni); + this.registrationLockPin = pin; + getKeyValueStore().storeEntry(lastReceiveTimestamp, 0L); + save(); + + setPreKeys(ServiceIdType.ACI, aciPreKeys); + setPreKeys(ServiceIdType.PNI, pniPreKeys); + aciAccountData.getSessionStore().archiveAllSessions(); + pniAccountData.getSessionStore().archiveAllSessions(); + getSenderKeyStore().deleteAll(); + getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); + trustSelfIdentity(ServiceIdType.ACI); + trustSelfIdentity(ServiceIdType.PNI); + getKeyValueStore().storeEntry(lastRecipientsRefresh, null); + } + + public void initDatabase() { + getAccountDatabase(); + } + + private void migrateLegacyConfigs() { + if (isPrimaryDevice() && getPniIdentityKeyPair() == null) { setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); } } @@ -422,12 +360,15 @@ private void mergeRecipients( public void removeRecipient(final RecipientId recipientId) { final var recipientAddress = getRecipientStore().resolveRecipientAddress(recipientId); + if (recipientAddress.matches(getSelfRecipientAddress())) { + throw new RuntimeException("Can't delete self recipient"); + } getRecipientStore().deleteRecipientData(recipientId); getMessageCache().deleteMessages(recipientId); if (recipientAddress.serviceId().isPresent()) { final var serviceId = recipientAddress.serviceId().get(); - getAciSessionStore().deleteAllSessions(serviceId); - getPniSessionStore().deleteAllSessions(serviceId); + aciAccountData.getSessionStore().deleteAllSessions(serviceId); + pniAccountData.getSessionStore().deleteAllSessions(serviceId); getIdentityKeyStore().deleteIdentity(serviceId); getSenderKeyStore().deleteAll(serviceId); } @@ -451,46 +392,6 @@ private static File getMessageCachePath(File dataPath, String account) { return new File(getUserPath(dataPath, account), "msg-cache"); } - private static File getGroupCachePath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "group-cache"); - } - - private static File getAciPreKeysPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "pre-keys"); - } - - private static File getAciSignedPreKeysPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "signed-pre-keys"); - } - - private static File getPniPreKeysPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "pre-keys-pni"); - } - - private static File getPniSignedPreKeysPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "signed-pre-keys-pni"); - } - - private static File getIdentitiesPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "identities"); - } - - private static File getSessionsPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "sessions"); - } - - private static File getSenderKeysPath(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "sender-keys"); - } - - private static File getSharedSenderKeysFile(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "shared-sender-keys-store"); - } - - private static File getRecipientsStoreFile(File dataPath, String account) { - return new File(getUserPath(dataPath, account), "recipients-store"); - } - private static File getStorageManifestFile(File dataPath, String account) { return new File(getUserPath(dataPath, account), "storage-manifest"); } @@ -504,7 +405,7 @@ public static boolean accountFileExists(File dataPath, String account) { return false; } var f = getFileName(dataPath, account); - return !(!f.exists() || f.isDirectory()); + return f.exists() && !f.isDirectory() && f.length() > 0L; } private void load( @@ -535,36 +436,112 @@ private void load( } } + if (previousStorageVersion < 8) { + final var userPath = getUserPath(dataPath, accountPath); + loadLegacyFile(userPath, rootNode); + migratedLegacyConfig = true; + } else { + final var storage = jsonProcessor.convertValue(rootNode, Storage.class); + serviceEnvironment = ServiceEnvironment.valueOf(storage.serviceEnvironment); + registered = storage.registered; + number = storage.number; + username = storage.username; + encryptedDeviceName = storage.encryptedDeviceName; + deviceId = storage.deviceId; + isMultiDevice = storage.isMultiDevice; + password = storage.password; + setAccountData(aciAccountData, storage.aciAccountData, ACI::parseOrThrow); + setAccountData(pniAccountData, storage.pniAccountData, PNI::parseOrThrow); + registrationLockPin = storage.registrationLockPin; + final var base64 = Base64.getDecoder(); + if (storage.pinMasterKey != null) { + pinMasterKey = new MasterKey(base64.decode(storage.pinMasterKey)); + } + if (storage.storageKey != null) { + storageKey = new StorageKey(base64.decode(storage.storageKey)); + } + if (storage.profileKey != null) { + try { + profileKey = new ProfileKey(base64.decode(storage.profileKey)); + } catch (InvalidInputException e) { + throw new IOException( + "Config file contains an invalid profileKey, needs to be base64 encoded array of 32 bytes", + e); + } + } + + } + + if (migratedLegacyConfig) { + save(); + } + } + + private void setAccountData( + AccountData accountData, + Storage.AccountData storage, + Function serviceIdParser + ) throws IOException { + if (storage.serviceId != null) { + try { + accountData.setServiceId(serviceIdParser.apply(storage.serviceId)); + } catch (IllegalArgumentException e) { + throw new IOException("Config file contains an invalid serviceId, needs to be a valid UUID", e); + } + } + accountData.setLocalRegistrationId(storage.registrationId); + if (storage.identityPrivateKey != null && storage.identityPublicKey != null) { + final var base64 = Base64.getDecoder(); + final var publicKeyBytes = base64.decode(storage.identityPublicKey); + final var privateKeyBytes = base64.decode(storage.identityPrivateKey); + final var keyPair = KeyUtils.getIdentityKeyPair(publicKeyBytes, privateKeyBytes); + accountData.setIdentityKeyPair(keyPair); + } + accountData.preKeyMetadata.nextPreKeyId = storage.nextPreKeyId; + accountData.preKeyMetadata.nextSignedPreKeyId = storage.nextSignedPreKeyId; + accountData.preKeyMetadata.activeSignedPreKeyId = storage.activeSignedPreKeyId; + accountData.preKeyMetadata.nextKyberPreKeyId = storage.nextKyberPreKeyId; + accountData.preKeyMetadata.activeLastResortKyberPreKeyId = storage.activeLastResortKyberPreKeyId; + } + + private void loadLegacyFile(final File userPath, final JsonNode rootNode) throws IOException { number = Utils.getNotNullNode(rootNode, "username").asText(); if (rootNode.hasNonNull("password")) { password = rootNode.get("password").asText(); } + if (password == null) { + password = KeyUtils.createPassword(); + } + if (rootNode.hasNonNull("serviceEnvironment")) { serviceEnvironment = ServiceEnvironment.valueOf(rootNode.get("serviceEnvironment").asText()); } + if (serviceEnvironment == null) { + serviceEnvironment = ServiceEnvironment.LIVE; + } registered = Utils.getNotNullNode(rootNode, "registered").asBoolean(); if (rootNode.hasNonNull("usernameIdentifier")) { username = rootNode.get("usernameIdentifier").asText(); } if (rootNode.hasNonNull("uuid")) { try { - aci = ACI.parseOrThrow(rootNode.get("uuid").asText()); + aciAccountData.setServiceId(ACI.parseOrThrow(rootNode.get("uuid").asText())); } catch (IllegalArgumentException e) { throw new IOException("Config file contains an invalid aci/uuid, needs to be a valid UUID", e); } } if (rootNode.hasNonNull("pni")) { try { - pni = PNI.parseOrThrow(rootNode.get("pni").asText()); + pniAccountData.setServiceId(PNI.parseOrThrow(rootNode.get("pni").asText())); } catch (IllegalArgumentException e) { throw new IOException("Config file contains an invalid pni, needs to be a valid UUID", e); } } if (rootNode.hasNonNull("sessionId")) { - sessionId = rootNode.get("sessionId").asText(); + getKeyValueStore().storeEntry(verificationSessionId, rootNode.get("sessionId").asText()); } if (rootNode.hasNonNull("sessionNumber")) { - sessionNumber = rootNode.get("sessionNumber").asText(); + getKeyValueStore().storeEntry(verificationSessionNumber, rootNode.get("sessionNumber").asText()); } if (rootNode.hasNonNull("deviceName")) { encryptedDeviceName = rootNode.get("deviceName").asText(); @@ -576,16 +553,16 @@ private void load( isMultiDevice = rootNode.get("isMultiDevice").asBoolean(); } if (rootNode.hasNonNull("lastReceiveTimestamp")) { - lastReceiveTimestamp = rootNode.get("lastReceiveTimestamp").asLong(); + getKeyValueStore().storeEntry(lastReceiveTimestamp, rootNode.get("lastReceiveTimestamp").asLong()); } int registrationId = 0; if (rootNode.hasNonNull("registrationId")) { registrationId = rootNode.get("registrationId").asInt(); } if (rootNode.hasNonNull("pniRegistrationId")) { - localPniRegistrationId = rootNode.get("pniRegistrationId").asInt(); + pniAccountData.setLocalRegistrationId(rootNode.get("pniRegistrationId").asInt()); } else { - localPniRegistrationId = KeyHelper.generateRegistrationId(false); + pniAccountData.setLocalRegistrationId(KeyHelper.generateRegistrationId(false)); } IdentityKeyPair aciIdentityKeyPair = null; if (rootNode.hasNonNull("identityPrivateKey") && rootNode.hasNonNull("identityKey")) { @@ -596,7 +573,7 @@ private void load( if (rootNode.hasNonNull("pniIdentityPrivateKey") && rootNode.hasNonNull("pniIdentityKey")) { final var publicKeyBytes = Base64.getDecoder().decode(rootNode.get("pniIdentityKey").asText()); final var privateKeyBytes = Base64.getDecoder().decode(rootNode.get("pniIdentityPrivateKey").asText()); - pniIdentityKeyPair = KeyUtils.getIdentityKeyPair(publicKeyBytes, privateKeyBytes); + pniAccountData.setIdentityKeyPair(KeyUtils.getIdentityKeyPair(publicKeyBytes, privateKeyBytes)); } if (rootNode.hasNonNull("registrationLockPin")) { @@ -609,27 +586,59 @@ private void load( storageKey = new StorageKey(Base64.getDecoder().decode(rootNode.get("storageKey").asText())); } if (rootNode.hasNonNull("storageManifestVersion")) { - storageManifestVersion = rootNode.get("storageManifestVersion").asLong(); + getKeyValueStore().storeEntry(storageManifestVersion, rootNode.get("storageManifestVersion").asLong()); } if (rootNode.hasNonNull("preKeyIdOffset")) { - aciPreKeyIdOffset = rootNode.get("preKeyIdOffset").asInt(1); + aciAccountData.preKeyMetadata.nextPreKeyId = rootNode.get("preKeyIdOffset").asInt(1); } else { - aciPreKeyIdOffset = 1; + aciAccountData.preKeyMetadata.nextPreKeyId = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("nextSignedPreKeyId")) { - aciNextSignedPreKeyId = rootNode.get("nextSignedPreKeyId").asInt(1); + aciAccountData.preKeyMetadata.nextSignedPreKeyId = rootNode.get("nextSignedPreKeyId").asInt(1); } else { - aciNextSignedPreKeyId = 1; + aciAccountData.preKeyMetadata.nextSignedPreKeyId = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("activeSignedPreKeyId")) { + aciAccountData.preKeyMetadata.activeSignedPreKeyId = rootNode.get("activeSignedPreKeyId").asInt(-1); + } else { + aciAccountData.preKeyMetadata.activeSignedPreKeyId = -1; } if (rootNode.hasNonNull("pniPreKeyIdOffset")) { - pniPreKeyIdOffset = rootNode.get("pniPreKeyIdOffset").asInt(1); + pniAccountData.preKeyMetadata.nextPreKeyId = rootNode.get("pniPreKeyIdOffset").asInt(1); } else { - pniPreKeyIdOffset = 1; + pniAccountData.preKeyMetadata.nextPreKeyId = getRandomPreKeyIdOffset(); } if (rootNode.hasNonNull("pniNextSignedPreKeyId")) { - pniNextSignedPreKeyId = rootNode.get("pniNextSignedPreKeyId").asInt(1); + pniAccountData.preKeyMetadata.nextSignedPreKeyId = rootNode.get("pniNextSignedPreKeyId").asInt(1); + } else { + pniAccountData.preKeyMetadata.nextSignedPreKeyId = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("pniActiveSignedPreKeyId")) { + pniAccountData.preKeyMetadata.activeSignedPreKeyId = rootNode.get("pniActiveSignedPreKeyId").asInt(-1); + } else { + pniAccountData.preKeyMetadata.activeSignedPreKeyId = -1; + } + if (rootNode.hasNonNull("kyberPreKeyIdOffset")) { + aciAccountData.preKeyMetadata.nextKyberPreKeyId = rootNode.get("kyberPreKeyIdOffset").asInt(1); + } else { + aciAccountData.preKeyMetadata.nextKyberPreKeyId = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("activeLastResortKyberPreKeyId")) { + aciAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = rootNode.get("activeLastResortKyberPreKeyId") + .asInt(-1); } else { - pniNextSignedPreKeyId = 1; + aciAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = -1; + } + if (rootNode.hasNonNull("pniKyberPreKeyIdOffset")) { + pniAccountData.preKeyMetadata.nextKyberPreKeyId = rootNode.get("pniKyberPreKeyIdOffset").asInt(1); + } else { + pniAccountData.preKeyMetadata.nextKyberPreKeyId = getRandomPreKeyIdOffset(); + } + if (rootNode.hasNonNull("pniActiveLastResortKyberPreKeyId")) { + pniAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = rootNode.get( + "pniActiveLastResortKyberPreKeyId").asInt(-1); + } else { + pniAccountData.preKeyMetadata.activeLastResortKyberPreKeyId = -1; } if (rootNode.hasNonNull("profileKey")) { try { @@ -640,54 +649,52 @@ private void load( e); } } + if (profileKey == null) { + // Old config file, creating new profile key + setProfileKey(KeyUtils.createProfileKey()); + } + getProfileStore().storeProfileKey(getSelfRecipientId(), getProfileKey()); if (previousStorageVersion < 5) { - final var legacyRecipientsStoreFile = getRecipientsStoreFile(dataPath, accountPath); + final var legacyRecipientsStoreFile = new File(userPath, "recipients-store"); if (legacyRecipientsStoreFile.exists()) { LegacyRecipientStore2.migrate(legacyRecipientsStoreFile, getRecipientStore()); // Ensure our profile key is stored in profile store getProfileStore().storeSelfProfileKey(getSelfRecipientId(), getProfileKey()); - migratedLegacyConfig = true; } } if (previousStorageVersion < 6) { getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); } - final var legacyAciPreKeysPath = getAciPreKeysPath(dataPath, accountPath); + final var legacyAciPreKeysPath = new File(userPath, "pre-keys"); if (legacyAciPreKeysPath.exists()) { - LegacyPreKeyStore.migrate(legacyAciPreKeysPath, getAciPreKeyStore()); - migratedLegacyConfig = true; + LegacyPreKeyStore.migrate(legacyAciPreKeysPath, aciAccountData.getPreKeyStore()); } - final var legacyPniPreKeysPath = getPniPreKeysPath(dataPath, accountPath); + final var legacyPniPreKeysPath = new File(userPath, "pre-keys-pni"); if (legacyPniPreKeysPath.exists()) { - LegacyPreKeyStore.migrate(legacyPniPreKeysPath, getPniPreKeyStore()); - migratedLegacyConfig = true; + LegacyPreKeyStore.migrate(legacyPniPreKeysPath, pniAccountData.getPreKeyStore()); } - final var legacyAciSignedPreKeysPath = getAciSignedPreKeysPath(dataPath, accountPath); + final var legacyAciSignedPreKeysPath = new File(userPath, "signed-pre-keys"); if (legacyAciSignedPreKeysPath.exists()) { - LegacySignedPreKeyStore.migrate(legacyAciSignedPreKeysPath, getAciSignedPreKeyStore()); - migratedLegacyConfig = true; + LegacySignedPreKeyStore.migrate(legacyAciSignedPreKeysPath, aciAccountData.getSignedPreKeyStore()); } - final var legacyPniSignedPreKeysPath = getPniSignedPreKeysPath(dataPath, accountPath); + final var legacyPniSignedPreKeysPath = new File(userPath, "signed-pre-keys-pni"); if (legacyPniSignedPreKeysPath.exists()) { - LegacySignedPreKeyStore.migrate(legacyPniSignedPreKeysPath, getPniSignedPreKeyStore()); - migratedLegacyConfig = true; + LegacySignedPreKeyStore.migrate(legacyPniSignedPreKeysPath, pniAccountData.getSignedPreKeyStore()); } - final var legacySessionsPath = getSessionsPath(dataPath, accountPath); + final var legacySessionsPath = new File(userPath, "sessions"); if (legacySessionsPath.exists()) { LegacySessionStore.migrate(legacySessionsPath, getRecipientResolver(), getRecipientAddressResolver(), - getAciSessionStore()); - migratedLegacyConfig = true; + aciAccountData.getSessionStore()); } - final var legacyIdentitiesPath = getIdentitiesPath(dataPath, accountPath); + final var legacyIdentitiesPath = new File(userPath, "identities"); if (legacyIdentitiesPath.exists()) { LegacyIdentityKeyStore.migrate(legacyIdentitiesPath, getRecipientResolver(), getRecipientAddressResolver(), getIdentityKeyStore()); - migratedLegacyConfig = true; } final var legacySignalProtocolStore = rootNode.hasNonNull("axolotlStore") ? jsonProcessor.convertValue(Utils.getNotNullNode(rootNode, "axolotlStore"), @@ -696,67 +703,54 @@ private void load( if (legacySignalProtocolStore != null && legacySignalProtocolStore.getLegacyIdentityKeyStore() != null) { aciIdentityKeyPair = legacySignalProtocolStore.getLegacyIdentityKeyStore().getIdentityKeyPair(); registrationId = legacySignalProtocolStore.getLegacyIdentityKeyStore().getLocalRegistrationId(); - migratedLegacyConfig = true; } - this.aciIdentityKeyPair = aciIdentityKeyPair; - this.localRegistrationId = registrationId; + this.aciAccountData.setIdentityKeyPair(aciIdentityKeyPair); + this.aciAccountData.setLocalRegistrationId(registrationId); - migratedLegacyConfig = loadLegacyStores(rootNode, legacySignalProtocolStore) || migratedLegacyConfig; + loadLegacyStores(rootNode, legacySignalProtocolStore); - final var legacySenderKeysPath = getSenderKeysPath(dataPath, accountPath); + final var legacySenderKeysPath = new File(userPath, "sender-keys"); if (legacySenderKeysPath.exists()) { LegacySenderKeyRecordStore.migrate(legacySenderKeysPath, getRecipientResolver(), getRecipientAddressResolver(), getSenderKeyStore()); - migratedLegacyConfig = true; } - final var legacySenderKeysSharedPath = getSharedSenderKeysFile(dataPath, accountPath); + final var legacySenderKeysSharedPath = new File(userPath, "shared-sender-keys-store"); if (legacySenderKeysSharedPath.exists()) { LegacySenderKeySharedStore.migrate(legacySenderKeysSharedPath, getRecipientResolver(), getRecipientAddressResolver(), getSenderKeyStore()); - migratedLegacyConfig = true; } if (rootNode.hasNonNull("groupStore")) { final var groupStoreStorage = jsonProcessor.convertValue(rootNode.get("groupStore"), LegacyGroupStore.Storage.class); LegacyGroupStore.migrate(groupStoreStorage, - getGroupCachePath(dataPath, accountPath), + new File(userPath, "group-cache"), getRecipientResolver(), getGroupStore()); - migratedLegacyConfig = true; } if (rootNode.hasNonNull("stickerStore")) { final var storage = jsonProcessor.convertValue(rootNode.get("stickerStore"), LegacyStickerStore.Storage.class); LegacyStickerStore.migrate(storage, getStickerStore()); - migratedLegacyConfig = true; } if (rootNode.hasNonNull("configurationStore")) { - configurationStoreStorage = jsonProcessor.convertValue(rootNode.get("configurationStore"), - ConfigurationStore.Storage.class); - configurationStore = ConfigurationStore.fromStorage(configurationStoreStorage, - this::saveConfigurationStore); - } else { - configurationStore = new ConfigurationStore(this::saveConfigurationStore); + final var configurationStoreStorage = jsonProcessor.convertValue(rootNode.get("configurationStore"), + LegacyConfigurationStore.Storage.class); + LegacyConfigurationStore.migrate(configurationStoreStorage, getConfigurationStore()); } - migratedLegacyConfig = loadLegacyThreadStore(rootNode) || migratedLegacyConfig; - - if (migratedLegacyConfig) { - save(); - } + loadLegacyThreadStore(rootNode); } - private boolean loadLegacyStores( + private void loadLegacyStores( final JsonNode rootNode, final LegacyJsonSignalProtocolStore legacySignalProtocolStore ) { - var migrated = false; var legacyRecipientStoreNode = rootNode.get("recipientStore"); if (legacyRecipientStoreNode != null) { logger.debug("Migrating legacy recipient store."); @@ -766,45 +760,42 @@ private boolean loadLegacyStores( .forEach(recipient -> getRecipientStore().resolveRecipientTrusted(recipient)); } getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); - migrated = true; } if (legacySignalProtocolStore != null && legacySignalProtocolStore.getLegacyPreKeyStore() != null) { logger.debug("Migrating legacy pre key store."); for (var entry : legacySignalProtocolStore.getLegacyPreKeyStore().getPreKeys().entrySet()) { try { - getAciPreKeyStore().storePreKey(entry.getKey(), new PreKeyRecord(entry.getValue())); + aciAccountData.getPreKeyStore().storePreKey(entry.getKey(), new PreKeyRecord(entry.getValue())); } catch (InvalidMessageException e) { logger.warn("Failed to migrate pre key, ignoring", e); } } - migrated = true; } if (legacySignalProtocolStore != null && legacySignalProtocolStore.getLegacySignedPreKeyStore() != null) { logger.debug("Migrating legacy signed pre key store."); for (var entry : legacySignalProtocolStore.getLegacySignedPreKeyStore().getSignedPreKeys().entrySet()) { try { - getAciSignedPreKeyStore().storeSignedPreKey(entry.getKey(), - new SignedPreKeyRecord(entry.getValue())); + aciAccountData.getSignedPreKeyStore() + .storeSignedPreKey(entry.getKey(), new SignedPreKeyRecord(entry.getValue())); } catch (InvalidMessageException e) { logger.warn("Failed to migrate signed pre key, ignoring", e); } } - migrated = true; } if (legacySignalProtocolStore != null && legacySignalProtocolStore.getLegacySessionStore() != null) { logger.debug("Migrating legacy session store."); for (var session : legacySignalProtocolStore.getLegacySessionStore().getSessions()) { try { - getAciSessionStore().storeSession(new SignalProtocolAddress(session.address.getIdentifier(), - session.deviceId), new SessionRecord(session.sessionRecord)); + aciAccountData.getSessionStore() + .storeSession(new SignalProtocolAddress(session.address.getIdentifier(), session.deviceId), + new SessionRecord(session.sessionRecord)); } catch (Exception e) { logger.warn("Failed to migrate session, ignoring", e); } } - migrated = true; } if (legacySignalProtocolStore != null && legacySignalProtocolStore.getLegacyIdentityKeyStore() != null) { @@ -819,7 +810,6 @@ private boolean loadLegacyStores( identity.getIdentityKey(), identity.getTrustLevel()); } - migrated = true; } if (rootNode.hasNonNull("contactStore")) { @@ -849,7 +839,6 @@ private boolean loadLegacyStores( } } } - migrated = true; } if (rootNode.hasNonNull("profileStore")) { @@ -857,10 +846,10 @@ private boolean loadLegacyStores( var profileStoreNode = rootNode.get("profileStore"); final var legacyProfileStore = jsonProcessor.convertValue(profileStoreNode, LegacyProfileStore.class); for (var profileEntry : legacyProfileStore.getProfileEntries()) { - var recipientId = getRecipientResolver().resolveRecipient(profileEntry.getAddress()); + var recipientId = getRecipientResolver().resolveRecipient(profileEntry.address()); // Not migrating profile key credential here, it was changed to expiring profile key credentials - getProfileStore().storeProfileKey(recipientId, profileEntry.getProfileKey()); - final var profile = profileEntry.getProfile(); + getProfileStore().storeProfileKey(recipientId, profileEntry.profileKey()); + final var profile = profileEntry.profile(); if (profile != null) { final var capabilities = new HashSet(); if (profile.getCapabilities() != null) { @@ -871,7 +860,7 @@ private boolean loadLegacyStores( capabilities.add(Profile.Capability.storage); } } - final var newProfile = new Profile(profileEntry.getLastUpdateTimestamp(), + final var newProfile = new Profile(profileEntry.lastUpdateTimestamp(), profile.getGivenName(), profile.getFamilyName(), profile.getAbout(), @@ -888,11 +877,9 @@ private boolean loadLegacyStores( } } } - - return migrated; } - private boolean loadLegacyThreadStore(final JsonNode rootNode) { + private void loadLegacyThreadStore(final JsonNode rootNode) { var threadStoreNode = rootNode.get("threadStore"); if (threadStoreNode != null && !threadStoreNode.isNull()) { var threadStore = jsonProcessor.convertValue(threadStoreNode, LegacyJsonThreadStore.class); @@ -922,66 +909,31 @@ private boolean loadLegacyThreadStore(final JsonNode rootNode) { logger.warn("Failed to read legacy thread info: {}", e.getMessage()); } } - return true; } - - return false; - } - - private void saveConfigurationStore(ConfigurationStore.Storage storage) { - this.configurationStoreStorage = storage; - save(); } private void save() { synchronized (fileChannel) { - var rootNode = jsonProcessor.createObjectNode(); - rootNode.put("version", CURRENT_STORAGE_VERSION) - .put("username", number) - .put("serviceEnvironment", serviceEnvironment == null ? null : serviceEnvironment.name()) - .put("usernameIdentifier", username) - .put("uuid", aci == null ? null : aci.toString()) - .put("pni", pni == null ? null : pni.toString()) - .put("sessionId", sessionId) - .put("sessionNumber", sessionNumber) - .put("deviceName", encryptedDeviceName) - .put("deviceId", deviceId) - .put("isMultiDevice", isMultiDevice) - .put("lastReceiveTimestamp", lastReceiveTimestamp) - .put("password", password) - .put("registrationId", localRegistrationId) - .put("pniRegistrationId", localPniRegistrationId) - .put("identityPrivateKey", - Base64.getEncoder().encodeToString(aciIdentityKeyPair.getPrivateKey().serialize())) - .put("identityKey", - Base64.getEncoder().encodeToString(aciIdentityKeyPair.getPublicKey().serialize())) - .put("pniIdentityPrivateKey", - pniIdentityKeyPair == null - ? null - : Base64.getEncoder() - .encodeToString(pniIdentityKeyPair.getPrivateKey().serialize())) - .put("pniIdentityKey", - pniIdentityKeyPair == null - ? null - : Base64.getEncoder().encodeToString(pniIdentityKeyPair.getPublicKey().serialize())) - .put("registrationLockPin", registrationLockPin) - .put("pinMasterKey", - pinMasterKey == null ? null : Base64.getEncoder().encodeToString(pinMasterKey.serialize())) - .put("storageKey", - storageKey == null ? null : Base64.getEncoder().encodeToString(storageKey.serialize())) - .put("storageManifestVersion", storageManifestVersion == -1 ? null : storageManifestVersion) - .put("preKeyIdOffset", aciPreKeyIdOffset) - .put("nextSignedPreKeyId", aciNextSignedPreKeyId) - .put("pniPreKeyIdOffset", pniPreKeyIdOffset) - .put("pniNextSignedPreKeyId", pniNextSignedPreKeyId) - .put("profileKey", - profileKey == null ? null : Base64.getEncoder().encodeToString(profileKey.serialize())) - .put("registered", registered) - .putPOJO("configurationStore", configurationStoreStorage); + final var base64 = Base64.getEncoder(); + final var storage = new Storage(CURRENT_STORAGE_VERSION, + serviceEnvironment.name(), + registered, + number, + username, + encryptedDeviceName, + deviceId, + isMultiDevice, + password, + Storage.AccountData.from(aciAccountData), + Storage.AccountData.from(pniAccountData), + registrationLockPin, + pinMasterKey == null ? null : base64.encodeToString(pinMasterKey.serialize()), + storageKey == null ? null : base64.encodeToString(storageKey.serialize()), + profileKey == null ? null : base64.encodeToString(profileKey.serialize())); try { try (var output = new ByteArrayOutputStream()) { // Write to memory first to prevent corrupting the file in case of serialization errors - jsonProcessor.writeValue(output, rootNode); + jsonProcessor.writeValue(output, storage); var input = new ByteArrayInputStream(output.toByteArray()); fileChannel.position(0); input.transferTo(Channels.newOutputStream(fileChannel)); @@ -1017,74 +969,129 @@ private static Pair openFileChannel(File fileName, boolea } } - public void resetPreKeyOffsets(final ServiceIdType serviceIdType) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - this.aciPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE); - this.aciNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE); - } else { - this.pniPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE); - this.pniNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE); - } + private void clearAllPreKeys() { + clearAllPreKeys(ServiceIdType.ACI); + clearAllPreKeys(ServiceIdType.PNI); + } + + private void clearAllPreKeys(ServiceIdType serviceIdType) { + final var accountData = getAccountData(serviceIdType); + resetPreKeyOffsets(serviceIdType); + resetKyberPreKeyOffsets(serviceIdType); + accountData.getPreKeyStore().removeAllPreKeys(); + accountData.getSignedPreKeyStore().removeAllSignedPreKeys(); + accountData.getKyberPreKeyStore().removeAllKyberPreKeys(); save(); } - public void addPreKeys(ServiceIdType serviceIdType, List records) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - addAciPreKeys(records); - } else { - addPniPreKeys(records); - } + private void setPreKeys(ServiceIdType serviceIdType, PreKeyCollection preKeyCollection) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + preKeyMetadata.nextSignedPreKeyId = preKeyCollection.getSignedPreKey().getId(); + preKeyMetadata.nextKyberPreKeyId = preKeyCollection.getLastResortKyberPreKey().getId(); + + accountData.getPreKeyStore().removeAllPreKeys(); + accountData.getSignedPreKeyStore().removeAllSignedPreKeys(); + accountData.getKyberPreKeyStore().removeAllKyberPreKeys(); + + addSignedPreKey(serviceIdType, preKeyCollection.getSignedPreKey()); + addLastResortKyberPreKey(serviceIdType, preKeyCollection.getLastResortKyberPreKey()); + + save(); } - public void addAciPreKeys(List records) { - for (var record : records) { - if (aciPreKeyIdOffset != record.getId()) { - logger.error("Invalid pre key id {}, expected {}", record.getId(), aciPreKeyIdOffset); - throw new AssertionError("Invalid pre key id"); - } - getAciPreKeyStore().storePreKey(record.getId(), record); - aciPreKeyIdOffset = (aciPreKeyIdOffset + 1) % Medium.MAX_VALUE; - } + public void resetPreKeyOffsets(final ServiceIdType serviceIdType) { + final var preKeyMetadata = getAccountData(serviceIdType).getPreKeyMetadata(); + preKeyMetadata.nextPreKeyId = getRandomPreKeyIdOffset(); + preKeyMetadata.nextSignedPreKeyId = getRandomPreKeyIdOffset(); + preKeyMetadata.activeSignedPreKeyId = -1; save(); } - public void addPniPreKeys(List records) { + private static int getRandomPreKeyIdOffset() { + return KeyUtils.getRandomInt(PREKEY_MAXIMUM_ID); + } + + public void addPreKeys(ServiceIdType serviceIdType, List records) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} {} pre keys with offset {}", + records.size(), + serviceIdType, + preKeyMetadata.nextPreKeyId); + accountData.getSignalServiceAccountDataStore() + .markAllOneTimeEcPreKeysStaleIfNecessary(System.currentTimeMillis()); for (var record : records) { - if (pniPreKeyIdOffset != record.getId()) { - logger.error("Invalid pre key id {}, expected {}", record.getId(), pniPreKeyIdOffset); + if (preKeyMetadata.nextPreKeyId != record.getId()) { + logger.error("Invalid pre key id {}, expected {}", record.getId(), preKeyMetadata.nextPreKeyId); throw new AssertionError("Invalid pre key id"); } - getPniPreKeyStore().storePreKey(record.getId(), record); - pniPreKeyIdOffset = (pniPreKeyIdOffset + 1) % Medium.MAX_VALUE; + accountData.getPreKeyStore().storePreKey(record.getId(), record); + preKeyMetadata.nextPreKeyId = (preKeyMetadata.nextPreKeyId + 1) % PREKEY_MAXIMUM_ID; } save(); } public void addSignedPreKey(ServiceIdType serviceIdType, SignedPreKeyRecord record) { - if (serviceIdType.equals(ServiceIdType.ACI)) { - addAciSignedPreKey(record); - } else { - addPniSignedPreKey(record); + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} signed pre key with offset {}", serviceIdType, preKeyMetadata.nextSignedPreKeyId); + if (preKeyMetadata.nextSignedPreKeyId != record.getId()) { + logger.error("Invalid signed pre key id {}, expected {}", + record.getId(), + preKeyMetadata.nextSignedPreKeyId); + throw new AssertionError("Invalid signed pre key id"); } + accountData.getSignedPreKeyStore().storeSignedPreKey(record.getId(), record); + preKeyMetadata.nextSignedPreKeyId = (preKeyMetadata.nextSignedPreKeyId + 1) % PREKEY_MAXIMUM_ID; + preKeyMetadata.activeSignedPreKeyId = record.getId(); + save(); } - public void addAciSignedPreKey(SignedPreKeyRecord record) { - if (aciNextSignedPreKeyId != record.getId()) { - logger.error("Invalid signed pre key id {}, expected {}", record.getId(), aciNextSignedPreKeyId); - throw new AssertionError("Invalid signed pre key id"); - } - getAciSignedPreKeyStore().storeSignedPreKey(record.getId(), record); - aciNextSignedPreKeyId = (aciNextSignedPreKeyId + 1) % Medium.MAX_VALUE; + public void resetKyberPreKeyOffsets(final ServiceIdType serviceIdType) { + final var preKeyMetadata = getAccountData(serviceIdType).getPreKeyMetadata(); + preKeyMetadata.nextKyberPreKeyId = getRandomPreKeyIdOffset(); + preKeyMetadata.activeLastResortKyberPreKeyId = -1; save(); } - public void addPniSignedPreKey(SignedPreKeyRecord record) { - if (pniNextSignedPreKeyId != record.getId()) { - logger.error("Invalid signed pre key id {}, expected {}", record.getId(), pniNextSignedPreKeyId); - throw new AssertionError("Invalid signed pre key id"); + public void addKyberPreKeys(ServiceIdType serviceIdType, List records) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} {} kyber pre keys with offset {}", + records.size(), + serviceIdType, + preKeyMetadata.nextKyberPreKeyId); + accountData.getSignalServiceAccountDataStore() + .markAllOneTimeEcPreKeysStaleIfNecessary(System.currentTimeMillis()); + for (var record : records) { + if (preKeyMetadata.nextKyberPreKeyId != record.getId()) { + logger.error("Invalid kyber pre key id {}, expected {}", + record.getId(), + preKeyMetadata.nextKyberPreKeyId); + throw new AssertionError("Invalid kyber pre key id"); + } + accountData.getKyberPreKeyStore().storeKyberPreKey(record.getId(), record); + preKeyMetadata.nextKyberPreKeyId = (preKeyMetadata.nextKyberPreKeyId + 1) % PREKEY_MAXIMUM_ID; } - getPniSignedPreKeyStore().storeSignedPreKey(record.getId(), record); - pniNextSignedPreKeyId = (pniNextSignedPreKeyId + 1) % Medium.MAX_VALUE; + save(); + } + + public void addLastResortKyberPreKey(ServiceIdType serviceIdType, KyberPreKeyRecord record) { + final var accountData = getAccountData(serviceIdType); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + logger.debug("Adding {} last resort kyber pre key with offset {}", + serviceIdType, + preKeyMetadata.nextKyberPreKeyId); + if (preKeyMetadata.nextKyberPreKeyId != record.getId()) { + logger.error("Invalid last resort kyber pre key id {}, expected {}", + record.getId(), + preKeyMetadata.nextKyberPreKeyId); + throw new AssertionError("Invalid last resort kyber pre key id"); + } + accountData.getKyberPreKeyStore().storeLastResortKyberPreKey(record.getId(), record); + preKeyMetadata.activeLastResortKyberPreKeyId = record.getId(); + preKeyMetadata.nextKyberPreKeyId = (preKeyMetadata.nextKyberPreKeyId + 1) % PREKEY_MAXIMUM_ID; save(); } @@ -1092,27 +1099,38 @@ public int getPreviousStorageVersion() { return previousStorageVersion; } + public AccountData getAccountData(ServiceIdType serviceIdType) { + return switch (serviceIdType) { + case ACI -> aciAccountData; + case PNI -> pniAccountData; + }; + } + + public AccountData getAccountData(ServiceId accountIdentifier) { + if (accountIdentifier.equals(aciAccountData.getServiceId())) { + return aciAccountData; + } else if (accountIdentifier.equals(pniAccountData.getServiceId())) { + return pniAccountData; + } else { + throw new IllegalArgumentException("No matching account data found for " + accountIdentifier); + } + } + public SignalServiceDataStore getSignalServiceDataStore() { return new SignalServiceDataStore() { @Override public SignalServiceAccountDataStore get(final ServiceId accountIdentifier) { - if (accountIdentifier.equals(aci)) { - return aci(); - } else if (accountIdentifier.equals(pni)) { - return pni(); - } else { - throw new IllegalArgumentException("No matching store found for " + accountIdentifier); - } + return getAccountData(accountIdentifier).getSignalServiceAccountDataStore(); } @Override public SignalServiceAccountDataStore aci() { - return getAciSignalServiceAccountDataStore(); + return aciAccountData.getSignalServiceAccountDataStore(); } @Override public SignalServiceAccountDataStore pni() { - return getPniSignalServiceAccountDataStore(); + return pniAccountData.getSignalServiceAccountDataStore(); } @Override @@ -1122,77 +1140,11 @@ public boolean isMultiDevice() { }; } - private SignalServiceAccountDataStore getAciSignalServiceAccountDataStore() { - return getOrCreate(() -> aciSignalProtocolStore, - () -> aciSignalProtocolStore = new SignalProtocolStore(getAciPreKeyStore(), - getAciSignedPreKeyStore(), - getAciSessionStore(), - getAciIdentityKeyStore(), - getSenderKeyStore(), - this::isMultiDevice)); - } - - private SignalServiceAccountDataStore getPniSignalServiceAccountDataStore() { - return getOrCreate(() -> pniSignalProtocolStore, - () -> pniSignalProtocolStore = new SignalProtocolStore(getPniPreKeyStore(), - getPniSignedPreKeyStore(), - getPniSessionStore(), - getPniIdentityKeyStore(), - getSenderKeyStore(), - this::isMultiDevice)); - } - - private PreKeyStore getAciPreKeyStore() { - return getOrCreate(() -> aciPreKeyStore, - () -> aciPreKeyStore = new PreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - private SignedPreKeyStore getAciSignedPreKeyStore() { - return getOrCreate(() -> aciSignedPreKeyStore, - () -> aciSignedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - private PreKeyStore getPniPreKeyStore() { - return getOrCreate(() -> pniPreKeyStore, - () -> pniPreKeyStore = new PreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); - } - - private SignedPreKeyStore getPniSignedPreKeyStore() { - return getOrCreate(() -> pniSignedPreKeyStore, - () -> pniSignedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), ServiceIdType.PNI)); - } - - public SessionStore getAciSessionStore() { - return getOrCreate(() -> aciSessionStore, - () -> aciSessionStore = new SessionStore(getAccountDatabase(), ServiceIdType.ACI)); - } - - public SessionStore getPniSessionStore() { - return getOrCreate(() -> pniSessionStore, - () -> pniSessionStore = new SessionStore(getAccountDatabase(), ServiceIdType.PNI)); - } - public IdentityKeyStore getIdentityKeyStore() { return getOrCreate(() -> identityKeyStore, () -> identityKeyStore = new IdentityKeyStore(getAccountDatabase(), settings.trustNewIdentity())); } - public SignalIdentityKeyStore getAciIdentityKeyStore() { - return getOrCreate(() -> aciIdentityKeyStore, - () -> aciIdentityKeyStore = new SignalIdentityKeyStore(getRecipientResolver(), - () -> aciIdentityKeyPair, - localRegistrationId, - getIdentityKeyStore())); - } - - public SignalIdentityKeyStore getPniIdentityKeyStore() { - return getOrCreate(() -> pniIdentityKeyStore, - () -> pniIdentityKeyStore = new SignalIdentityKeyStore(getRecipientResolver(), - () -> pniIdentityKeyPair, - localRegistrationId, - getIdentityKeyStore())); - } - public GroupStore getGroupStore() { return getOrCreate(() -> groupStore, () -> groupStore = new GroupStore(getAccountDatabase(), @@ -1204,6 +1156,10 @@ public ContactsStore getContactStore() { return getRecipientStore(); } + public CdsiStore getCdsiStore() { + return getOrCreate(() -> cdsiStore, () -> cdsiStore = new CdsiStore(getAccountDatabase())); + } + private RecipientIdCreator getRecipientIdCreator() { return recipientId -> getRecipientStore().create(recipientId); } @@ -1239,8 +1195,13 @@ public SenderKeyStore getSenderKeyStore() { return getOrCreate(() -> senderKeyStore, () -> senderKeyStore = new SenderKeyStore(getAccountDatabase())); } + private KeyValueStore getKeyValueStore() { + return getOrCreate(() -> keyValueStore, () -> keyValueStore = new KeyValueStore(getAccountDatabase())); + } + public ConfigurationStore getConfigurationStore() { - return configurationStore; + return getOrCreate(() -> configurationStore, + () -> configurationStore = new ConfigurationStore(getKeyValueStore())); } public MessageCache getMessageCache() { @@ -1268,12 +1229,12 @@ public CredentialsProvider getCredentialsProvider() { return new CredentialsProvider() { @Override public ACI getAci() { - return aci; + return aciAccountData.getServiceId(); } @Override public PNI getPni() { - return pni; + return pniAccountData.getServiceId(); } @Override @@ -1322,16 +1283,17 @@ public void setServiceEnvironment(final ServiceEnvironment serviceEnvironment) { public AccountAttributes getAccountAttributes(String registrationLock) { return new AccountAttributes(null, - getLocalRegistrationId(), + aciAccountData.getLocalRegistrationId(), + false, + false, true, - null, registrationLock != null ? registrationLock : getRegistrationLock(), getSelfUnidentifiedAccessKey(), isUnrestrictedUnidentifiedAccess(), - getAccountCapabilities(), isDiscoverableByPhoneNumber(), + getAccountCapabilities(), encryptedDeviceName, - getLocalPniRegistrationId(), + pniAccountData.getLocalRegistrationId(), null); // TODO recoveryPassword? } @@ -1340,53 +1302,63 @@ public AccountAttributes.Capabilities getAccountCapabilities() { } public ServiceId getAccountId(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aci : pni; + return getAccountData(serviceIdType).getServiceId(); } public ACI getAci() { - return aci; + return aciAccountData.getServiceId(); } public void setAci(final ACI aci) { - this.aci = aci; + this.aciAccountData.setServiceId(aci); save(); } public PNI getPni() { - return pni; + return pniAccountData.getServiceId(); } public void setPni(final PNI updatedPni) { - if (this.pni != null && !this.pni.equals(updatedPni)) { + final var oldPni = pniAccountData.getServiceId(); + if (oldPni != null && !oldPni.equals(updatedPni)) { // Clear data for old PNI - identityKeyStore.deleteIdentity(this.pni); - getPniPreKeyStore().removeAllPreKeys(); - getPniSignedPreKeyStore().removeAllSignedPreKeys(); + identityKeyStore.deleteIdentity(oldPni); } - this.pni = updatedPni; + this.pniAccountData.setServiceId(updatedPni); + getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); + trustSelfIdentity(ServiceIdType.PNI); save(); } - public void setPni( - final PNI updatedPni, + public void setNewPniIdentity( final IdentityKeyPair pniIdentityKeyPair, final SignedPreKeyRecord pniSignedPreKey, + final KyberPreKeyRecord lastResortKyberPreKey, final int localPniRegistrationId ) { - setPni(updatedPni); - setPniIdentityKeyPair(pniIdentityKeyPair); - addPniSignedPreKey(pniSignedPreKey); - setLocalPniRegistrationId(localPniRegistrationId); + pniAccountData.setLocalRegistrationId(localPniRegistrationId); + + final AccountData accountData = getAccountData(ServiceIdType.PNI); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + preKeyMetadata.nextSignedPreKeyId = pniSignedPreKey.getId(); + accountData.getSignedPreKeyStore().removeSignedPreKey(pniSignedPreKey.getId()); + addSignedPreKey(ServiceIdType.PNI, pniSignedPreKey); + if (lastResortKyberPreKey != null) { + preKeyMetadata.nextKyberPreKeyId = lastResortKyberPreKey.getId(); + accountData.getKyberPreKeyStore().removeKyberPreKey(lastResortKyberPreKey.getId()); + addLastResortKyberPreKey(ServiceIdType.PNI, lastResortKyberPreKey); + } + save(); } public SignalServiceAddress getSelfAddress() { - return new SignalServiceAddress(aci, number); + return new SignalServiceAddress(getAci(), number); } public RecipientAddress getSelfRecipientAddress() { - return new RecipientAddress(aci, pni, number, username); + return new RecipientAddress(getAci(), getPni(), number, username); } public RecipientId getSelfRecipientId() { @@ -1394,20 +1366,18 @@ public RecipientId getSelfRecipientId() { } public String getSessionId(final String forNumber) { + final var keyValueStore = getKeyValueStore(); + final var sessionNumber = keyValueStore.getEntry(verificationSessionNumber); if (!forNumber.equals(sessionNumber)) { return null; } - return sessionId; + return keyValueStore.getEntry(verificationSessionId); } public void setSessionId(final String sessionNumber, final String sessionId) { - this.sessionNumber = sessionNumber; - this.sessionId = sessionId; - save(); - } - - public byte[] getEncryptedDeviceName() { - return encryptedDeviceName == null ? null : Base64.getDecoder().decode(encryptedDeviceName); + final var keyValueStore = getKeyValueStore(); + keyValueStore.storeEntry(verificationSessionNumber, sessionNumber); + keyValueStore.storeEntry(verificationSessionId, sessionId); } public void setEncryptedDeviceName(final String encryptedDeviceName) { @@ -1424,35 +1394,20 @@ public boolean isPrimaryDevice() { } public IdentityKeyPair getIdentityKeyPair(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciIdentityKeyPair : pniIdentityKeyPair; + return getAccountData(serviceIdType).getIdentityKeyPair(); } public IdentityKeyPair getAciIdentityKeyPair() { - return aciIdentityKeyPair; + return aciAccountData.getIdentityKeyPair(); } public IdentityKeyPair getPniIdentityKeyPair() { - return pniIdentityKeyPair; + return pniAccountData.getIdentityKeyPair(); } public void setPniIdentityKeyPair(final IdentityKeyPair identityKeyPair) { - pniIdentityKeyPair = identityKeyPair; - final var pniPublicKey = identityKeyPair.getPublicKey(); - getIdentityKeyStore().saveIdentity(getPni(), pniPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getPni(), pniPublicKey, TrustLevel.TRUSTED_VERIFIED); - save(); - } - - public int getLocalRegistrationId() { - return localRegistrationId; - } - - public int getLocalPniRegistrationId() { - return localPniRegistrationId; - } - - public void setLocalPniRegistrationId(final int localPniRegistrationId) { - this.localPniRegistrationId = localPniRegistrationId; + pniAccountData.setIdentityKeyPair(identityKeyPair); + trustSelfIdentity(ServiceIdType.PNI); save(); } @@ -1460,11 +1415,6 @@ public String getPassword() { return password; } - private void setPassword(final String password) { - this.password = password; - save(); - } - public void setRegistrationLockPin(final String registrationLockPin) { this.registrationLockPin = registrationLockPin; save(); @@ -1520,15 +1470,11 @@ public void setStorageKey(final StorageKey storageKey) { } public long getStorageManifestVersion() { - return this.storageManifestVersion; + return getKeyValueStore().getEntry(storageManifestVersion); } - public void setStorageManifestVersion(final long storageManifestVersion) { - if (storageManifestVersion == this.storageManifestVersion) { - return; - } - this.storageManifestVersion = storageManifestVersion; - save(); + public void setStorageManifestVersion(final long value) { + getKeyValueStore().storeEntry(storageManifestVersion, value); } public Optional getStorageManifest() { @@ -1565,6 +1511,22 @@ public void setStorageManifest(SignalStorageManifest manifest) { } } + public byte[] getCdsiToken() { + return getKeyValueStore().getEntry(cdsiToken); + } + + public void setCdsiToken(final byte[] value) { + getKeyValueStore().storeEntry(cdsiToken, value); + } + + public Long getLastRecipientsRefresh() { + return getKeyValueStore().getEntry(lastRecipientsRefresh); + } + + public void setLastRecipientsRefresh(final Long value) { + getKeyValueStore().storeEntry(lastRecipientsRefresh, value); + } + public ProfileKey getProfileKey() { return profileKey; } @@ -1582,14 +1544,6 @@ public byte[] getSelfUnidentifiedAccessKey() { return UnidentifiedAccess.deriveAccessKeyFrom(getProfileKey()); } - public int getPreKeyIdOffset(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciPreKeyIdOffset : pniPreKeyIdOffset; - } - - public int getNextSignedPreKeyId(ServiceIdType serviceIdType) { - return serviceIdType.equals(ServiceIdType.ACI) ? aciNextSignedPreKeyId : pniNextSignedPreKeyId; - } - public boolean isRegistered() { return registered; } @@ -1612,12 +1566,11 @@ public void setMultiDevice(final boolean multiDevice) { } public long getLastReceiveTimestamp() { - return lastReceiveTimestamp; + return getKeyValueStore().getEntry(lastReceiveTimestamp); } - public void setLastReceiveTimestamp(final long lastReceiveTimestamp) { - this.lastReceiveTimestamp = lastReceiveTimestamp; - save(); + public void setLastReceiveTimestamp(final long value) { + getKeyValueStore().storeEntry(lastReceiveTimestamp, value); } public boolean isUnrestrictedUnidentifiedAccess() { @@ -1626,40 +1579,20 @@ public boolean isUnrestrictedUnidentifiedAccess() { } public boolean isDiscoverableByPhoneNumber() { - final var phoneNumberUnlisted = configurationStore.getPhoneNumberUnlisted(); + final var phoneNumberUnlisted = getConfigurationStore().getPhoneNumberUnlisted(); return phoneNumberUnlisted == null || !phoneNumberUnlisted; } - public void finishRegistration(final ACI aci, final PNI pni, final MasterKey masterKey, final String pin) { - this.pinMasterKey = masterKey; - this.storageManifestVersion = -1; - this.setStorageManifest(null); - this.storageKey = null; - this.encryptedDeviceName = null; - this.deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID; - this.isMultiDevice = false; - this.registered = true; - this.aci = aci; - this.pni = pni; - this.registrationLockPin = pin; - this.lastReceiveTimestamp = 0; - save(); - - clearAllPreKeys(); - getAciSessionStore().archiveAllSessions(); - getPniSessionStore().archiveAllSessions(); - getSenderKeyStore().deleteAll(); - getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress()); - final var aciPublicKey = getAciIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getAci(), aciPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getAci(), aciPublicKey, TrustLevel.TRUSTED_VERIFIED); - if (getPniIdentityKeyPair() == null) { - setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); - } else { - final var pniPublicKey = getPniIdentityKeyPair().getPublicKey(); - getIdentityKeyStore().saveIdentity(getPni(), pniPublicKey); - getIdentityKeyStore().setIdentityTrustLevel(getPni(), pniPublicKey, TrustLevel.TRUSTED_VERIFIED); + private void trustSelfIdentity(ServiceIdType serviceIdType) { + final var accountData = getAccountData(serviceIdType); + final var serviceId = accountData.getServiceId(); + final var identityKeyPair = accountData.getIdentityKeyPair(); + if (serviceId == null || identityKeyPair == null) { + return; } + final var publicKey = identityKeyPair.getPublicKey(); + getIdentityKeyStore().saveIdentity(serviceId, publicKey); + getIdentityKeyStore().setIdentityTrustLevel(serviceId, publicKey, TrustLevel.TRUSTED_VERIFIED); } public void deleteAccountData() throws IOException { @@ -1677,11 +1610,7 @@ public void deleteAccountData() throws IOException { public void close() { synchronized (fileChannel) { if (accountDatabase != null) { - try { - accountDatabase.close(); - } catch (SQLException e) { - logger.warn("Failed to close account database: {}", e.getMessage(), e); - } + accountDatabase.close(); } if (messageSendLogStore != null) { messageSendLogStore.close(); @@ -1718,4 +1647,173 @@ private interface Callable { void call(); } + + public static class PreKeyMetadata { + + private int nextPreKeyId = 1; + private int nextSignedPreKeyId = 1; + private int activeSignedPreKeyId = -1; + private int nextKyberPreKeyId = 1; + private int activeLastResortKyberPreKeyId = -1; + + public int getNextPreKeyId() { + return nextPreKeyId; + } + + public int getNextSignedPreKeyId() { + return nextSignedPreKeyId; + } + + public int getActiveSignedPreKeyId() { + return activeSignedPreKeyId; + } + + public int getNextKyberPreKeyId() { + return nextKyberPreKeyId; + } + + public int getActiveLastResortKyberPreKeyId() { + return activeLastResortKyberPreKeyId; + } + } + + public class AccountData { + + private final ServiceIdType serviceIdType; + private SERVICE_ID serviceId; + private IdentityKeyPair identityKeyPair; + private int localRegistrationId; + private final PreKeyMetadata preKeyMetadata = new PreKeyMetadata(); + + private SignalProtocolStore signalProtocolStore; + private PreKeyStore preKeyStore; + private SignedPreKeyStore signedPreKeyStore; + private KyberPreKeyStore kyberPreKeyStore; + private SessionStore sessionStore; + private SignalIdentityKeyStore identityKeyStore; + + private AccountData(final ServiceIdType serviceIdType) { + this.serviceIdType = serviceIdType; + } + + public SERVICE_ID getServiceId() { + return serviceId; + } + + private void setServiceId(final SERVICE_ID serviceId) { + this.serviceId = serviceId; + } + + public IdentityKeyPair getIdentityKeyPair() { + return identityKeyPair; + } + + private void setIdentityKeyPair(final IdentityKeyPair identityKeyPair) { + this.identityKeyPair = identityKeyPair; + } + + public int getLocalRegistrationId() { + return localRegistrationId; + } + + private void setLocalRegistrationId(final int localRegistrationId) { + this.localRegistrationId = localRegistrationId; + this.identityKeyStore = null; + } + + public PreKeyMetadata getPreKeyMetadata() { + return preKeyMetadata; + } + + private SignalServiceAccountDataStore getSignalServiceAccountDataStore() { + return getOrCreate(() -> signalProtocolStore, + () -> signalProtocolStore = new SignalProtocolStore(getPreKeyStore(), + getSignedPreKeyStore(), + getKyberPreKeyStore(), + getSessionStore(), + getIdentityKeyStore(), + getSenderKeyStore(), + SignalAccount.this::isMultiDevice)); + } + + public PreKeyStore getPreKeyStore() { + return getOrCreate(() -> preKeyStore, + () -> preKeyStore = new PreKeyStore(getAccountDatabase(), serviceIdType)); + } + + public SignedPreKeyStore getSignedPreKeyStore() { + return getOrCreate(() -> signedPreKeyStore, + () -> signedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), serviceIdType)); + } + + public KyberPreKeyStore getKyberPreKeyStore() { + return getOrCreate(() -> kyberPreKeyStore, + () -> kyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), serviceIdType)); + } + + public SessionStore getSessionStore() { + return getOrCreate(() -> sessionStore, + () -> sessionStore = new SessionStore(getAccountDatabase(), serviceIdType)); + } + + public SignalIdentityKeyStore getIdentityKeyStore() { + return getOrCreate(() -> identityKeyStore, + () -> identityKeyStore = new SignalIdentityKeyStore(() -> identityKeyPair, + localRegistrationId, + SignalAccount.this.getIdentityKeyStore())); + } + } + + public record Storage( + int version, + String serviceEnvironment, + boolean registered, + String number, + String username, + String encryptedDeviceName, + int deviceId, + boolean isMultiDevice, + String password, + AccountData aciAccountData, + AccountData pniAccountData, + String registrationLockPin, + String pinMasterKey, + String storageKey, + String profileKey + ) { + + public record AccountData( + String serviceId, + int registrationId, + String identityPrivateKey, + String identityPublicKey, + + int nextPreKeyId, + int nextSignedPreKeyId, + int activeSignedPreKeyId, + int nextKyberPreKeyId, + int activeLastResortKyberPreKeyId + ) { + + private static AccountData from(final SignalAccount.AccountData accountData) { + final var base64 = Base64.getEncoder(); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + return new AccountData(accountData.getServiceId() == null + ? null + : accountData.getServiceId().toString(), + accountData.getLocalRegistrationId(), + accountData.getIdentityKeyPair() == null + ? null + : base64.encodeToString(accountData.getIdentityKeyPair().getPrivateKey().serialize()), + accountData.getIdentityKeyPair() == null + ? null + : base64.encodeToString(accountData.getIdentityKeyPair().getPublicKey().serialize()), + preKeyMetadata.getNextPreKeyId(), + preKeyMetadata.getNextSignedPreKeyId(), + preKeyMetadata.getActiveSignedPreKeyId(), + preKeyMetadata.getNextKyberPreKeyId(), + preKeyMetadata.getActiveLastResortKyberPreKeyId()); + } + } + } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Utils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Utils.java index 1c75d9cc8faf6..fa2e8916f1dec 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Utils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/Utils.java @@ -56,7 +56,7 @@ public static JsonNode getNotNullNode(JsonNode parent, String name) throws Inval return node; } - public static RecipientAddress getRecipientAddressFromIdentifier(final String identifier) { + public static RecipientAddress getRecipientAddressFromLegacyIdentifier(final String identifier) { if (UuidUtil.isUuid(identifier)) { return new RecipientAddress(ServiceId.parseOrThrow(identifier)); } else { @@ -113,6 +113,10 @@ public boolean tryAdvance(final Consumer consumer) { }, false); } + public static Long getIdMapper(ResultSet resultSet) throws SQLException { + return resultSet.getLong("_id"); + } + public interface ResultSetMapper { T apply(ResultSet resultSet) throws SQLException; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java index e7297c6b59538..55c5adf0935e1 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java @@ -9,7 +9,7 @@ import org.asamk.signal.manager.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.signalservice.api.push.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import java.io.ByteArrayInputStream; @@ -252,18 +252,14 @@ private AccountsStorage readAccountsLocked(FileChannel fileChannel) throws IOExc } private void saveAccountsLocked(FileChannel fileChannel, AccountsStorage accountsStorage) throws IOException { - try { - try (var output = new ByteArrayOutputStream()) { - // Write to memory first to prevent corrupting the file in case of serialization errors - objectMapper.writeValue(output, accountsStorage); - var input = new ByteArrayInputStream(output.toByteArray()); - fileChannel.position(0); - input.transferTo(Channels.newOutputStream(fileChannel)); - fileChannel.truncate(fileChannel.position()); - fileChannel.force(false); - } - } catch (Exception e) { - logger.error("Error saving accounts file: {}", e.getMessage(), e); + try (var output = new ByteArrayOutputStream()) { + // Write to memory first to prevent corrupting the file in case of serialization errors + objectMapper.writeValue(output, accountsStorage); + var input = new ByteArrayInputStream(output.toByteArray()); + fileChannel.position(0); + input.transferTo(Channels.newOutputStream(fileChannel)); + fileChannel.truncate(fileChannel.position()); + fileChannel.force(false); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java index b810ea23a5c1e..f85d3d8084f37 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/ConfigurationStore.java @@ -1,106 +1,75 @@ package org.asamk.signal.manager.storage.configuration; import org.asamk.signal.manager.api.PhoneNumberSharingMode; +import org.asamk.signal.manager.storage.keyValue.KeyValueEntry; +import org.asamk.signal.manager.storage.keyValue.KeyValueStore; public class ConfigurationStore { - private final Saver saver; + private final KeyValueStore keyValueStore; - private Boolean readReceipts; - private Boolean unidentifiedDeliveryIndicators; - private Boolean typingIndicators; - private Boolean linkPreviews; - private Boolean phoneNumberUnlisted; - private PhoneNumberSharingMode phoneNumberSharingMode; + private final KeyValueEntry readReceipts = new KeyValueEntry<>("config-read-receipts", Boolean.class); + private final KeyValueEntry unidentifiedDeliveryIndicators = new KeyValueEntry<>( + "config-unidentified-delivery-indicators", + Boolean.class); + private final KeyValueEntry typingIndicators = new KeyValueEntry<>("config-typing-indicators", + Boolean.class); + private final KeyValueEntry linkPreviews = new KeyValueEntry<>("config-link-previews", Boolean.class); + private final KeyValueEntry phoneNumberUnlisted = new KeyValueEntry<>("config-phone-number-unlisted", + Boolean.class); + private final KeyValueEntry phoneNumberSharingMode = new KeyValueEntry<>( + "config-phone-number-sharing-mode", + PhoneNumberSharingMode.class); - public ConfigurationStore(final Saver saver) { - this.saver = saver; - } - - public static ConfigurationStore fromStorage(Storage storage, Saver saver) { - final var store = new ConfigurationStore(saver); - store.readReceipts = storage.readReceipts; - store.unidentifiedDeliveryIndicators = storage.unidentifiedDeliveryIndicators; - store.typingIndicators = storage.typingIndicators; - store.linkPreviews = storage.linkPreviews; - store.phoneNumberSharingMode = storage.phoneNumberSharingMode; - return store; + public ConfigurationStore(final KeyValueStore keyValueStore) { + this.keyValueStore = keyValueStore; } public Boolean getReadReceipts() { - return readReceipts; + return keyValueStore.getEntry(readReceipts); } - public void setReadReceipts(final boolean readReceipts) { - this.readReceipts = readReceipts; - saver.save(toStorage()); + public void setReadReceipts(final boolean value) { + keyValueStore.storeEntry(readReceipts, value); } public Boolean getUnidentifiedDeliveryIndicators() { - return unidentifiedDeliveryIndicators; + return keyValueStore.getEntry(unidentifiedDeliveryIndicators); } - public void setUnidentifiedDeliveryIndicators(final boolean unidentifiedDeliveryIndicators) { - this.unidentifiedDeliveryIndicators = unidentifiedDeliveryIndicators; - saver.save(toStorage()); + public void setUnidentifiedDeliveryIndicators(final boolean value) { + keyValueStore.storeEntry(unidentifiedDeliveryIndicators, value); } public Boolean getTypingIndicators() { - return typingIndicators; + return keyValueStore.getEntry(typingIndicators); } - public void setTypingIndicators(final boolean typingIndicators) { - this.typingIndicators = typingIndicators; - saver.save(toStorage()); + public void setTypingIndicators(final boolean value) { + keyValueStore.storeEntry(typingIndicators, value); } public Boolean getLinkPreviews() { - return linkPreviews; + return keyValueStore.getEntry(linkPreviews); } - public void setLinkPreviews(final boolean linkPreviews) { - this.linkPreviews = linkPreviews; - saver.save(toStorage()); + public void setLinkPreviews(final boolean value) { + keyValueStore.storeEntry(linkPreviews, value); } public Boolean getPhoneNumberUnlisted() { - return phoneNumberUnlisted; + return keyValueStore.getEntry(phoneNumberUnlisted); } - public void setPhoneNumberUnlisted(final boolean phoneNumberUnlisted) { - this.phoneNumberUnlisted = phoneNumberUnlisted; - saver.save(toStorage()); + public void setPhoneNumberUnlisted(final boolean value) { + keyValueStore.storeEntry(phoneNumberUnlisted, value); } public PhoneNumberSharingMode getPhoneNumberSharingMode() { - return phoneNumberSharingMode; - } - - public void setPhoneNumberSharingMode(final PhoneNumberSharingMode phoneNumberSharingMode) { - this.phoneNumberSharingMode = phoneNumberSharingMode; - saver.save(toStorage()); + return keyValueStore.getEntry(phoneNumberSharingMode); } - private Storage toStorage() { - return new Storage(readReceipts, - unidentifiedDeliveryIndicators, - typingIndicators, - linkPreviews, - phoneNumberUnlisted, - phoneNumberSharingMode); - } - - public record Storage( - Boolean readReceipts, - Boolean unidentifiedDeliveryIndicators, - Boolean typingIndicators, - Boolean linkPreviews, - Boolean phoneNumberUnlisted, - PhoneNumberSharingMode phoneNumberSharingMode - ) {} - - public interface Saver { - - void save(Storage storage); + public void setPhoneNumberSharingMode(final PhoneNumberSharingMode value) { + keyValueStore.storeEntry(phoneNumberSharingMode, value); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/LegacyConfigurationStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/LegacyConfigurationStore.java new file mode 100644 index 0000000000000..7c799fe19096c --- /dev/null +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/configuration/LegacyConfigurationStore.java @@ -0,0 +1,33 @@ +package org.asamk.signal.manager.storage.configuration; + +import org.asamk.signal.manager.api.PhoneNumberSharingMode; + +public class LegacyConfigurationStore { + + public static void migrate(Storage storage, ConfigurationStore configurationStore) { + if (storage.readReceipts != null) { + configurationStore.setReadReceipts(storage.readReceipts); + } + if (storage.unidentifiedDeliveryIndicators != null) { + configurationStore.setUnidentifiedDeliveryIndicators(storage.unidentifiedDeliveryIndicators); + } + if (storage.typingIndicators != null) { + configurationStore.setTypingIndicators(storage.typingIndicators); + } + if (storage.linkPreviews != null) { + configurationStore.setLinkPreviews(storage.linkPreviews); + } + if (storage.phoneNumberSharingMode != null) { + configurationStore.setPhoneNumberSharingMode(storage.phoneNumberSharingMode); + } + } + + public record Storage( + Boolean readReceipts, + Boolean unidentifiedDeliveryIndicators, + Boolean typingIndicators, + Boolean linkPreviews, + Boolean phoneNumberUnlisted, + PhoneNumberSharingMode phoneNumberSharingMode + ) {} +} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/contacts/LegacyContactInfo.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/contacts/LegacyContactInfo.java index 0d297e7f625fd..50dcd91ef24a3 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/contacts/LegacyContactInfo.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/contacts/LegacyContactInfo.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.asamk.signal.manager.storage.recipients.RecipientAddress; -import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; import java.util.UUID; @@ -44,6 +44,6 @@ public LegacyContactInfo() { @JsonIgnore public RecipientAddress getAddress() { - return new RecipientAddress(uuid == null ? null : ServiceId.from(uuid), number); + return new RecipientAddress(uuid == null ? null : ACI.from(uuid), number); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java index 3e5eac7affe30..c263aa9bcfff7 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java @@ -3,6 +3,7 @@ import org.asamk.signal.manager.api.GroupIdV2; import org.asamk.signal.manager.api.GroupInviteLinkUrl; import org.asamk.signal.manager.api.GroupPermission; +import org.asamk.signal.manager.storage.recipients.RecipientAddress; import org.asamk.signal.manager.storage.recipients.RecipientId; import org.asamk.signal.manager.storage.recipients.RecipientResolver; import org.signal.libsignal.zkgroup.groups.GroupMasterKey; @@ -20,7 +21,7 @@ public final class GroupInfoV2 extends GroupInfo { private final GroupIdV2 groupId; private final GroupMasterKey masterKey; - private DistributionId distributionId; + private final DistributionId distributionId; private boolean blocked; private DecryptedGroup group; private boolean permissionDenied; @@ -83,7 +84,7 @@ public String getTitle() { if (this.group == null) { return null; } - return this.group.getTitle(); + return this.group.title; } @Override @@ -91,15 +92,15 @@ public String getDescription() { if (this.group == null) { return null; } - return this.group.getDescription(); + return this.group.description; } @Override public GroupInviteLinkUrl getGroupInviteLink() { - if (this.group == null || this.group.getInviteLinkPassword().isEmpty() || ( - this.group.getAccessControl().getAddFromInviteLink() != AccessControl.AccessRequired.ANY - && this.group.getAccessControl().getAddFromInviteLink() - != AccessControl.AccessRequired.ADMINISTRATOR + if (this.group == null || this.group.inviteLinkPassword.toByteArray().length == 0 || ( + this.group.accessControl != null + && this.group.accessControl.addFromInviteLink != AccessControl.AccessRequired.ANY + && this.group.accessControl.addFromInviteLink != AccessControl.AccessRequired.ADMINISTRATOR )) { return null; } @@ -112,9 +113,8 @@ public Set getMembers() { if (this.group == null) { return Set.of(); } - return group.getMembersList() - .stream() - .map(m -> ServiceId.fromByteString(m.getUuid())) + return group.members.stream() + .map(m -> ServiceId.parseOrThrow(m.aciBytes)) .map(recipientResolver::resolveRecipient) .collect(Collectors.toSet()); } @@ -124,9 +124,8 @@ public Set getBannedMembers() { if (this.group == null) { return Set.of(); } - return group.getBannedMembersList() - .stream() - .map(m -> ServiceId.fromByteString(m.getUuid())) + return group.bannedMembers.stream() + .map(m -> ServiceId.parseOrThrow(m.serviceIdBytes)) .map(recipientResolver::resolveRecipient) .collect(Collectors.toSet()); } @@ -136,9 +135,8 @@ public Set getPendingMembers() { if (this.group == null) { return Set.of(); } - return group.getPendingMembersList() - .stream() - .map(m -> ServiceId.fromByteString(m.getUuid())) + return group.pendingMembers.stream() + .map(m -> ServiceId.parseOrThrow(m.serviceIdBytes)) .map(recipientResolver::resolveRecipient) .collect(Collectors.toSet()); } @@ -148,9 +146,8 @@ public Set getRequestingMembers() { if (this.group == null) { return Set.of(); } - return group.getRequestingMembersList() - .stream() - .map(m -> ServiceId.fromByteString(m.getUuid())) + return group.requestingMembers.stream() + .map(m -> ServiceId.parseOrThrow(m.aciBytes)) .map(recipientResolver::resolveRecipient) .collect(Collectors.toSet()); } @@ -160,10 +157,11 @@ public Set getAdminMembers() { if (this.group == null) { return Set.of(); } - return group.getMembersList() - .stream() - .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR) - .map(m -> ServiceId.fromByteString(m.getUuid())) + return group.members.stream() + .filter(m -> m.role == Member.Role.ADMINISTRATOR) + .map(m -> new RecipientAddress(ServiceId.ACI.parseOrNull(m.aciBytes), + ServiceId.PNI.parseOrNull(m.pniBytes), + null)) .map(recipientResolver::resolveRecipient) .collect(Collectors.toSet()); } @@ -180,26 +178,26 @@ public void setBlocked(final boolean blocked) { @Override public int getMessageExpirationTimer() { - return this.group != null && this.group.hasDisappearingMessagesTimer() - ? this.group.getDisappearingMessagesTimer().getDuration() + return this.group != null && this.group.disappearingMessagesTimer != null + ? this.group.disappearingMessagesTimer.duration : 0; } @Override public boolean isAnnouncementGroup() { - return this.group != null && this.group.getIsAnnouncementGroup() == EnabledState.ENABLED; + return this.group != null && this.group.isAnnouncementGroup == EnabledState.ENABLED; } @Override public GroupPermission getPermissionAddMember() { final var accessControl = getAccessControl(); - return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getMembers()); + return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.members); } @Override public GroupPermission getPermissionEditDetails() { final var accessControl = getAccessControl(); - return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getAttributes()); + return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.attributes); } @Override @@ -216,11 +214,11 @@ public boolean isPermissionDenied() { } private AccessControl getAccessControl() { - if (this.group == null || !this.group.hasAccessControl()) { + if (this.group == null || this.group.accessControl == null) { return null; } - return this.group.getAccessControl(); + return this.group.accessControl; } private static GroupPermission toGroupPermission(final AccessControl.AccessRequired permission) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupStore.java index 0b1901055624c..71fa0f9d4461c 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/GroupStore.java @@ -1,7 +1,5 @@ package org.asamk.signal.manager.storage.groups; -import com.google.protobuf.InvalidProtocolBufferException; - import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.GroupIdV1; import org.asamk.signal.manager.api.GroupIdV2; @@ -19,6 +17,7 @@ import org.whispersystems.signalservice.api.push.DistributionId; import org.whispersystems.signalservice.api.util.UuidUtil; +import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; @@ -241,6 +240,7 @@ private void insertOrReplaceGroup( final var sql = """ INSERT OR REPLACE INTO %s (_id, group_id, group_id_v2, name, color, expiration_time, blocked, archived) VALUES (?, ?, ?, ?, ?, ?, ?, ?) + RETURNING _id """.formatted(TABLE_GROUP_V1); try (final var statement = connection.prepareStatement(sql)) { if (internalId == null) { @@ -255,14 +255,13 @@ private void insertOrReplaceGroup( statement.setLong(6, groupV1.getMessageExpirationTimer()); statement.setBoolean(7, groupV1.isBlocked()); statement.setBoolean(8, groupV1.archived); - statement.executeUpdate(); + final var generatedKey = Utils.executeQueryForOptional(statement, Utils::getIdMapper); if (internalId == null) { - final var generatedKeys = statement.getGeneratedKeys(); - if (generatedKeys.next()) { - internalId = generatedKeys.getLong(1); + if (generatedKey.isPresent()) { + internalId = generatedKey.get(); } else { - throw new RuntimeException("Failed to add new recipient to database"); + throw new RuntimeException("Failed to add new group to database"); } } } @@ -295,7 +294,7 @@ private void insertOrReplaceGroup( if (groupV2.getGroup() == null) { statement.setNull(4, Types.NUMERIC); } else { - statement.setBytes(4, groupV2.getGroup().toByteArray()); + statement.setBytes(4, groupV2.getGroup().encode()); } statement.setBytes(5, UuidUtil.toByteArray(groupV2.getDistributionId().asUuid())); statement.setBoolean(6, groupV2.isBlocked()); @@ -349,12 +348,12 @@ private GroupInfoV2 getGroupInfoV2FromResultSet(ResultSet resultSet) throws SQLE final var permissionDenied = resultSet.getBoolean("permission_denied"); return new GroupInfoV2(GroupId.v2(groupId), new GroupMasterKey(masterKey), - groupData == null ? null : DecryptedGroup.parseFrom(groupData), + groupData == null ? null : DecryptedGroup.ADAPTER.decode(groupData), DistributionId.from(UuidUtil.parseOrThrow(distributionId)), blocked, permissionDenied, recipientResolver); - } catch (InvalidInputException | InvalidProtocolBufferException e) { + } catch (InvalidInputException | IOException e) { return null; } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java index f004ae69883fa..b53b14c0ae167 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java @@ -113,7 +113,7 @@ private static DecryptedGroup loadDecryptedGroupLocked(final GroupIdV2 groupIdV2 return null; } try (var stream = new FileInputStream(groupFile)) { - return DecryptedGroup.parseFrom(stream); + return DecryptedGroup.ADAPTER.decode(stream); } catch (IOException ignored) { return null; } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityInfo.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityInfo.java index 84f7b06ff200e..d00d455c8aec3 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityInfo.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityInfo.java @@ -6,22 +6,26 @@ public class IdentityInfo { - private final ServiceId serviceId; + private final String address; private final IdentityKey identityKey; private final TrustLevel trustLevel; private final long addedTimestamp; IdentityInfo( - final ServiceId serviceId, IdentityKey identityKey, TrustLevel trustLevel, long addedTimestamp + final String address, IdentityKey identityKey, TrustLevel trustLevel, long addedTimestamp ) { - this.serviceId = serviceId; + this.address = address; this.identityKey = identityKey; this.trustLevel = trustLevel; this.addedTimestamp = addedTimestamp; } public ServiceId getServiceId() { - return serviceId; + return ServiceId.parseOrThrow(address); + } + + public String getAddress() { + return address; } public IdentityKey getIdentityKey() { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityKeyStore.java index 2f8b4dac7a813..3195df171a8ca 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityKeyStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/IdentityKeyStore.java @@ -37,7 +37,7 @@ public static void createSql(Connection connection) throws SQLException { statement.executeUpdate(""" CREATE TABLE identity ( _id INTEGER PRIMARY KEY, - uuid BLOB UNIQUE NOT NULL, + address TEXT UNIQUE NOT NULL, identity_key BLOB NOT NULL, added_timestamp INTEGER NOT NULL, trust_level INTEGER NOT NULL @@ -56,18 +56,22 @@ public Observable getIdentityChanges() { } public boolean saveIdentity(final ServiceId serviceId, final IdentityKey identityKey) { + return saveIdentity(serviceId.toString(), identityKey); + } + + boolean saveIdentity(final String address, final IdentityKey identityKey) { if (isRetryingDecryption) { return false; } try (final var connection = database.getConnection()) { - final var identityInfo = loadIdentity(connection, serviceId); + final var identityInfo = loadIdentity(connection, address); if (identityInfo != null && identityInfo.getIdentityKey().equals(identityKey)) { // Identity already exists, not updating the trust level - logger.trace("Not storing new identity for recipient {}, identity already stored", serviceId); + logger.trace("Not storing new identity for recipient {}, identity already stored", address); return false; } - saveNewIdentity(connection, serviceId, identityKey, identityInfo == null); + saveNewIdentity(connection, address, identityKey, identityInfo == null); return true; } catch (SQLException e) { throw new RuntimeException("Failed update identity store", e); @@ -80,7 +84,8 @@ public void setRetryingDecryption(final boolean retryingDecryption) { public boolean setIdentityTrustLevel(ServiceId serviceId, IdentityKey identityKey, TrustLevel trustLevel) { try (final var connection = database.getConnection()) { - final var identityInfo = loadIdentity(connection, serviceId); + final var address = serviceId.toString(); + final var identityInfo = loadIdentity(connection, address); if (identityInfo == null) { logger.debug("Not updating trust level for recipient {}, identity not found", serviceId); return false; @@ -95,7 +100,7 @@ public boolean setIdentityTrustLevel(ServiceId serviceId, IdentityKey identityKe } logger.debug("Updating trust level for recipient {} with trust {}", serviceId, trustLevel); - final var newIdentityInfo = new IdentityInfo(serviceId, + final var newIdentityInfo = new IdentityInfo(address, identityKey, trustLevel, identityInfo.getDateAddedTimestamp()); @@ -107,31 +112,35 @@ public boolean setIdentityTrustLevel(ServiceId serviceId, IdentityKey identityKe } public boolean isTrustedIdentity(ServiceId serviceId, IdentityKey identityKey, Direction direction) { + return isTrustedIdentity(serviceId.toString(), identityKey, direction); + } + + public boolean isTrustedIdentity(String address, IdentityKey identityKey, Direction direction) { if (trustNewIdentity == TrustNewIdentity.ALWAYS) { return true; } try (final var connection = database.getConnection()) { // TODO implement possibility for different handling of incoming/outgoing trust decisions - var identityInfo = loadIdentity(connection, serviceId); + var identityInfo = loadIdentity(connection, address); if (identityInfo == null) { - logger.debug("Initial identity found for {}, saving.", serviceId); - saveNewIdentity(connection, serviceId, identityKey, true); - identityInfo = loadIdentity(connection, serviceId); + logger.debug("Initial identity found for {}, saving.", address); + saveNewIdentity(connection, address, identityKey, true); + identityInfo = loadIdentity(connection, address); } else if (!identityInfo.getIdentityKey().equals(identityKey)) { // Identity found, but different if (direction == Direction.SENDING) { - logger.debug("Changed identity found for {}, saving.", serviceId); - saveNewIdentity(connection, serviceId, identityKey, false); - identityInfo = loadIdentity(connection, serviceId); + logger.debug("Changed identity found for {}, saving.", address); + saveNewIdentity(connection, address, identityKey, false); + identityInfo = loadIdentity(connection, address); } else { - logger.trace("Trusting identity for {} for {}: {}", serviceId, direction, false); + logger.trace("Trusting identity for {} for {}: {}", address, direction, false); return false; } } final var isTrusted = identityInfo != null && identityInfo.isTrusted(); - logger.trace("Trusting identity for {} for {}: {}", serviceId, direction, isTrusted); + logger.trace("Trusting identity for {} for {}: {}", address, direction, isTrusted); return isTrusted; } catch (SQLException e) { throw new RuntimeException("Failed read from identity store", e); @@ -139,8 +148,12 @@ public boolean isTrustedIdentity(ServiceId serviceId, IdentityKey identityKey, D } public IdentityInfo getIdentityInfo(ServiceId serviceId) { + return getIdentityInfo(serviceId.toString()); + } + + public IdentityInfo getIdentityInfo(String address) { try (final var connection = database.getConnection()) { - return loadIdentity(connection, serviceId); + return loadIdentity(connection, address); } catch (SQLException e) { throw new RuntimeException("Failed read from identity store", e); } @@ -150,7 +163,7 @@ public List getIdentities() { try (final var connection = database.getConnection()) { final var sql = ( """ - SELECT i.uuid, i.identity_key, i.added_timestamp, i.trust_level + SELECT i.address, i.identity_key, i.added_timestamp, i.trust_level FROM %s AS i """ ).formatted(TABLE_IDENTITY); @@ -166,7 +179,7 @@ public List getIdentities() { public void deleteIdentity(final ServiceId serviceId) { try (final var connection = database.getConnection()) { - deleteIdentity(connection, serviceId); + deleteIdentity(connection, serviceId.toString()); } catch (SQLException e) { throw new RuntimeException("Failed update identity store", e); } @@ -188,34 +201,37 @@ void addLegacyIdentities(final Collection identities) { } private IdentityInfo loadIdentity( - final Connection connection, final ServiceId serviceId + final Connection connection, final String address ) throws SQLException { final var sql = ( """ - SELECT i.uuid, i.identity_key, i.added_timestamp, i.trust_level + SELECT i.address, i.identity_key, i.added_timestamp, i.trust_level FROM %s AS i - WHERE i.uuid = ? + WHERE i.address = ? """ ).formatted(TABLE_IDENTITY); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, address); return Utils.executeQueryForOptional(statement, this::getIdentityInfoFromResultSet).orElse(null); } } private void saveNewIdentity( final Connection connection, - final ServiceId serviceId, + final String address, final IdentityKey identityKey, final boolean firstIdentity ) throws SQLException { final var trustLevel = trustNewIdentity == TrustNewIdentity.ALWAYS || ( trustNewIdentity == TrustNewIdentity.ON_FIRST_USE && firstIdentity ) ? TrustLevel.TRUSTED_UNVERIFIED : TrustLevel.UNTRUSTED; - logger.debug("Storing new identity for recipient {} with trust {}", serviceId, trustLevel); - final var newIdentityInfo = new IdentityInfo(serviceId, identityKey, trustLevel, System.currentTimeMillis()); + logger.debug("Storing new identity for recipient {} with trust {}", address, trustLevel); + final var newIdentityInfo = new IdentityInfo(address, identityKey, trustLevel, System.currentTimeMillis()); storeIdentity(connection, newIdentityInfo); - identityChanges.onNext(serviceId); + final var serviceId = ServiceId.parseOrNull(address); + if (serviceId != null) { + identityChanges.onNext(serviceId); + } } private void storeIdentity(final Connection connection, final IdentityInfo identityInfo) throws SQLException { @@ -225,12 +241,12 @@ private void storeIdentity(final Connection connection, final IdentityInfo ident identityInfo.getDateAddedTimestamp()); final var sql = ( """ - INSERT OR REPLACE INTO %s (uuid, identity_key, added_timestamp, trust_level) + INSERT OR REPLACE INTO %s (address, identity_key, added_timestamp, trust_level) VALUES (?, ?, ?, ?) """ ).formatted(TABLE_IDENTITY); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, identityInfo.getServiceId().toByteArray()); + statement.setString(1, identityInfo.getAddress()); statement.setBytes(2, identityInfo.getIdentityKey().serialize()); statement.setLong(3, identityInfo.getDateAddedTimestamp()); statement.setInt(4, identityInfo.getTrustLevel().ordinal()); @@ -238,27 +254,27 @@ private void storeIdentity(final Connection connection, final IdentityInfo ident } } - private void deleteIdentity(final Connection connection, final ServiceId serviceId) throws SQLException { + private void deleteIdentity(final Connection connection, final String address) throws SQLException { final var sql = ( """ DELETE FROM %s AS i - WHERE i.uuid = ? + WHERE i.address = ? """ ).formatted(TABLE_IDENTITY); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, address); statement.executeUpdate(); } } private IdentityInfo getIdentityInfoFromResultSet(ResultSet resultSet) throws SQLException { try { - final var serviceId = ServiceId.parseOrThrow(resultSet.getBytes("uuid")); + final var address = resultSet.getString("address"); final var id = new IdentityKey(resultSet.getBytes("identity_key")); final var trustLevel = TrustLevel.fromInt(resultSet.getInt("trust_level")); final var added = resultSet.getLong("added_timestamp"); - return new IdentityInfo(serviceId, id, trustLevel, added); + return new IdentityInfo(address, id, trustLevel, added); } catch (InvalidKeyException e) { logger.warn("Failed to load identity key, resetting: {}", e.getMessage()); return null; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/LegacyIdentityKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/LegacyIdentityKeyStore.java index 88e23e7560b93..27cb6f84005de 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/LegacyIdentityKeyStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/LegacyIdentityKeyStore.java @@ -84,7 +84,7 @@ private static IdentityInfo loadIdentityLocked( var added = storage.addedTimestamp(); final var serviceId = address.serviceId().get(); - return new IdentityInfo(serviceId, id, trustLevel, added); + return new IdentityInfo(serviceId.toString(), id, trustLevel, added); } catch (IOException | InvalidKeyException e) { logger.warn("Failed to load identity key: {}", e.getMessage()); return null; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/SignalIdentityKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/SignalIdentityKeyStore.java index 66dfec4e24f80..5a1a676eeb31b 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/SignalIdentityKeyStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/identities/SignalIdentityKeyStore.java @@ -1,10 +1,8 @@ package org.asamk.signal.manager.storage.identities; -import org.asamk.signal.manager.storage.recipients.RecipientResolver; import org.signal.libsignal.protocol.IdentityKey; import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.SignalProtocolAddress; -import org.whispersystems.signalservice.api.push.ServiceId; import java.util.function.Supplier; @@ -15,7 +13,6 @@ public class SignalIdentityKeyStore implements org.signal.libsignal.protocol.sta private final IdentityKeyStore identityKeyStore; public SignalIdentityKeyStore( - final RecipientResolver resolver, final Supplier identityKeyPairSupplier, final int localRegistrationId, final IdentityKeyStore identityKeyStore @@ -37,22 +34,17 @@ public int getLocalRegistrationId() { @Override public boolean saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) { - final var serviceId = ServiceId.parseOrThrow(address.getName()); - - return identityKeyStore.saveIdentity(serviceId, identityKey); + return identityKeyStore.saveIdentity(address.getName(), identityKey); } @Override public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey, Direction direction) { - final var serviceId = ServiceId.parseOrThrow(address.getName()); - - return identityKeyStore.isTrustedIdentity(serviceId, identityKey, direction); + return identityKeyStore.isTrustedIdentity(address.getName(), identityKey, direction); } @Override public IdentityKey getIdentity(SignalProtocolAddress address) { - final var serviceId = ServiceId.parseOrThrow(address.getName()); - final var identityInfo = identityKeyStore.getIdentityInfo(serviceId); + final var identityInfo = identityKeyStore.getIdentityInfo(address.getName()); return identityInfo == null ? null : identityInfo.getIdentityKey(); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueEntry.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueEntry.java new file mode 100644 index 0000000000000..3195bc81b41a7 --- /dev/null +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueEntry.java @@ -0,0 +1,8 @@ +package org.asamk.signal.manager.storage.keyValue; + +public record KeyValueEntry(String key, Class clazz, T defaultValue) { + + public KeyValueEntry(String key, Class clazz) { + this(key, clazz, null); + } +} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueStore.java new file mode 100644 index 0000000000000..9b239b727e103 --- /dev/null +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/keyValue/KeyValueStore.java @@ -0,0 +1,162 @@ +package org.asamk.signal.manager.storage.keyValue; + +import org.asamk.signal.manager.storage.Database; +import org.asamk.signal.manager.storage.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; + +public class KeyValueStore { + + private static final String TABLE_KEY_VALUE = "key_value"; + private final static Logger logger = LoggerFactory.getLogger(KeyValueStore.class); + + private final Database database; + + public static void createSql(Connection connection) throws SQLException { + // When modifying the CREATE statement here, also add a migration in AccountDatabase.java + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE key_value ( + _id INTEGER PRIMARY KEY, + key TEXT UNIQUE NOT NULL, + value ANY + ) STRICT; + """); + } + } + + public KeyValueStore(final Database database) { + this.database = database; + } + + public T getEntry(KeyValueEntry key) { + final var sql = ( + """ + SELECT key, value + FROM %s p + WHERE p.key = ? + """ + ).formatted(TABLE_KEY_VALUE); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setString(1, key.key()); + + final var result = Utils.executeQueryForOptional(statement, + resultSet -> readValueFromResultSet(key, resultSet)).orElse(null); + + if (result == null) { + return key.defaultValue(); + } + return result; + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from pre_key store", e); + } + } + + public void storeEntry(KeyValueEntry key, T value) { + final var sql = ( + """ + INSERT INTO %s (key, value) + VALUES (?1, ?2) + ON CONFLICT (key) DO UPDATE SET value=excluded.value + """ + ).formatted(TABLE_KEY_VALUE); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setString(1, key.key()); + setParameterValue(statement, 2, key.clazz(), value); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update key_value store", e); + } + } + + @SuppressWarnings("unchecked") + private static T readValueFromResultSet( + final KeyValueEntry key, final ResultSet resultSet + ) throws SQLException { + Object value; + final var clazz = key.clazz(); + if (clazz == int.class || clazz == Integer.class) { + value = resultSet.getInt("value"); + } else if (clazz == long.class || clazz == Long.class) { + value = resultSet.getLong("value"); + } else if (clazz == boolean.class || clazz == Boolean.class) { + value = resultSet.getBoolean("value"); + } else if (clazz == byte[].class || clazz == Byte[].class) { + value = resultSet.getBytes("value"); + } else if (clazz == String.class) { + value = resultSet.getString("value"); + } else if (Enum.class.isAssignableFrom(clazz)) { + final var name = resultSet.getString("value"); + if (name == null) { + value = null; + } else { + try { + value = Enum.valueOf((Class) key.clazz(), name); + } catch (IllegalArgumentException e) { + logger.debug("Read invalid enum value from store, ignoring: {} for {}", name, key.clazz()); + value = null; + } + } + } else { + throw new AssertionError("Invalid key type " + clazz.getSimpleName()); + } + if (resultSet.wasNull()) { + return null; + } + return (T) value; + } + + private static void setParameterValue( + final PreparedStatement statement, final int parameterIndex, final Class clazz, final T value + ) throws SQLException { + if (clazz == int.class || clazz == Integer.class) { + if (value == null) { + statement.setNull(parameterIndex, Types.INTEGER); + } else { + statement.setInt(parameterIndex, (int) value); + } + } else if (clazz == long.class || clazz == Long.class) { + if (value == null) { + statement.setNull(parameterIndex, Types.INTEGER); + } else { + statement.setLong(parameterIndex, (long) value); + } + } else if (clazz == boolean.class || clazz == Boolean.class) { + if (value == null) { + statement.setNull(parameterIndex, Types.BOOLEAN); + } else { + statement.setBoolean(parameterIndex, (boolean) value); + } + } else if (clazz == byte[].class || clazz == Byte[].class) { + if (value == null) { + statement.setNull(parameterIndex, Types.BLOB); + } else { + statement.setBytes(parameterIndex, (byte[]) value); + } + } else if (clazz == String.class) { + if (value == null) { + statement.setNull(parameterIndex, Types.VARCHAR); + } else { + statement.setString(parameterIndex, (String) value); + } + } else if (Enum.class.isAssignableFrom(clazz)) { + if (value == null) { + statement.setNull(parameterIndex, Types.VARCHAR); + } else { + statement.setString(parameterIndex, ((Enum) value).name()); + } + } else { + throw new AssertionError("Invalid key type " + clazz.getSimpleName()); + } + } +} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/messageCache/MessageCache.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/messageCache/MessageCache.java index 083dba06cea3c..30452fbb8cdbd 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/messageCache/MessageCache.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/messageCache/MessageCache.java @@ -51,13 +51,21 @@ public Iterable getCachedMessages() { public CachedMessage cacheMessage(SignalServiceEnvelope envelope, RecipientId recipientId) { final var now = System.currentTimeMillis(); + File cacheFile; + try { + cacheFile = getMessageCacheFile(recipientId, now, envelope.getTimestamp()); + } catch (IOException e) { + logger.warn("Failed to create recipient folder in disk cache: {}", e.getMessage()); + throw new RuntimeException(e); + } + + final var cachedMessage = new CachedMessage(cacheFile, envelope); try { - var cacheFile = getMessageCacheFile(recipientId, now, envelope.getTimestamp()); MessageCacheUtils.storeEnvelope(envelope, cacheFile); - return new CachedMessage(cacheFile, envelope); + return cachedMessage; } catch (IOException e) { logger.warn("Failed to store encrypted message in disk cache, ignoring: {}", e.getMessage()); - return null; + return cachedMessage; } } @@ -66,6 +74,7 @@ public CachedMessage replaceSender(CachedMessage cachedMessage, RecipientId send if (cacheFile.equals(cachedMessage.getFile())) { return cachedMessage; } + logger.debug("Moving cached message {} to {}", cachedMessage.getFile().toPath(), cacheFile.toPath()); Files.move(cachedMessage.getFile().toPath(), cacheFile.toPath()); return new CachedMessage(cacheFile); } @@ -125,7 +134,7 @@ public void mergeRecipients(final RecipientId recipientId, final RecipientId toB final var cacheFile = getMessageCacheFile(recipientId, file.getName()); Files.move(file.toPath(), cacheFile.toPath()); } catch (IOException e) { - logger.warn("Failed to move cache file “{}”, ignoring: {}", file, e.getMessage()); + logger.warn("Failed to move cache file “{}”, ignoring: {}", file, e.getMessage(), e); } } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java new file mode 100644 index 0000000000000..4067e2fe4e546 --- /dev/null +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/KyberPreKeyStore.java @@ -0,0 +1,299 @@ +package org.asamk.signal.manager.storage.prekeys; + +import org.asamk.signal.manager.storage.Database; +import org.asamk.signal.manager.storage.Utils; +import org.signal.libsignal.protocol.InvalidKeyIdException; +import org.signal.libsignal.protocol.InvalidMessageException; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.SignalServiceKyberPreKeyStore; +import org.whispersystems.signalservice.api.push.ServiceIdType; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_ARCHIVE_AGE; + +public class KyberPreKeyStore implements SignalServiceKyberPreKeyStore { + + private static final String TABLE_KYBER_PRE_KEY = "kyber_pre_key"; + private final static Logger logger = LoggerFactory.getLogger(KyberPreKeyStore.class); + + private final Database database; + private final int accountIdType; + + public static void createSql(Connection connection) throws SQLException { + // When modifying the CREATE statement here, also add a migration in AccountDatabase.java + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE kyber_pre_key ( + _id INTEGER PRIMARY KEY, + account_id_type INTEGER NOT NULL, + key_id INTEGER NOT NULL, + serialized BLOB NOT NULL, + is_last_resort INTEGER NOT NULL, + stale_timestamp INTEGER, + timestamp INTEGER DEFAULT 0, + UNIQUE(account_id_type, key_id) + ) STRICT; + """); + } + } + + public KyberPreKeyStore(final Database database, final ServiceIdType serviceIdType) { + this.database = database; + this.accountIdType = Utils.getAccountIdType(serviceIdType); + } + + @Override + public KyberPreKeyRecord loadKyberPreKey(final int keyId) throws InvalidKeyIdException { + final var kyberPreKey = getPreKey(keyId); + if (kyberPreKey == null) { + throw new InvalidKeyIdException("No such kyber pre key record: " + keyId); + } + return kyberPreKey; + } + + @Override + public List loadKyberPreKeys() { + final var sql = ( + """ + SELECT p.serialized + FROM %s p + WHERE p.account_id_type = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + return Utils.executeQueryForStream(statement, this::getKyberPreKeyRecordFromResultSet).toList(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from kyber_pre_key store", e); + } + } + + @Override + public List loadLastResortKyberPreKeys() { + final var sql = ( + """ + SELECT p.serialized + FROM %s p + WHERE p.account_id_type = ? AND p.is_last_resort = TRUE + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + return Utils.executeQueryForStream(statement, this::getKyberPreKeyRecordFromResultSet).toList(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from kyber_pre_key store", e); + } + } + + @Override + public void storeLastResortKyberPreKey(final int keyId, final KyberPreKeyRecord record) { + storeKyberPreKey(keyId, record, true); + } + + @Override + public void storeKyberPreKey(final int keyId, final KyberPreKeyRecord record) { + storeKyberPreKey(keyId, record, false); + } + + public void storeKyberPreKey(final int keyId, final KyberPreKeyRecord record, final boolean isLastResort) { + final var sql = ( + """ + INSERT INTO %s (account_id_type, key_id, serialized, is_last_resort, timestamp) + VALUES (?, ?, ?, ?, ?) + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + statement.setBytes(3, record.serialize()); + statement.setBoolean(4, isLastResort); + statement.setLong(5, record.getTimestamp()); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + @Override + public boolean containsKyberPreKey(final int keyId) { + return getPreKey(keyId) != null; + } + + @Override + public void markKyberPreKeyUsed(final int keyId) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ? AND p.key_id = ? AND p.is_last_resort = FALSE + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + @Override + public void removeKyberPreKey(final int keyId) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ? AND p.key_id = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + public void removeAllKyberPreKeys() { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + private KyberPreKeyRecord getPreKey(int keyId) { + final var sql = ( + """ + SELECT p.serialized + FROM %s p + WHERE p.account_id_type = ? AND p.key_id = ? + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, keyId); + return Utils.executeQueryForOptional(statement, this::getKyberPreKeyRecordFromResultSet).orElse(null); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from kyber_pre_key store", e); + } + } + + private KyberPreKeyRecord getKyberPreKeyRecordFromResultSet(ResultSet resultSet) throws SQLException { + try { + final var serialized = resultSet.getBytes("serialized"); + return new KyberPreKeyRecord(serialized); + } catch (InvalidMessageException e) { + return null; + } + } + + public void removeOldLastResortKyberPreKeys(int activeLastResortKyberPreKeyId) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p._id IN ( + SELECT p._id + FROM %s AS p + WHERE p.account_id_type = ? + AND p.is_last_resort = TRUE + AND p.key_id != ? + AND p.timestamp < ? + ORDER BY p.timestamp DESC + LIMIT -1 OFFSET 1 + ) + """ + ).formatted(TABLE_KYBER_PRE_KEY, TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, activeLastResortKyberPreKeyId); + statement.setLong(3, System.currentTimeMillis() - PREKEY_ARCHIVE_AGE); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + @Override + public void deleteAllStaleOneTimeKyberPreKeys(final long threshold, final int minCount) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ?1 + AND p.stale_timestamp < ?2 + AND p.is_last_resort = FALSE + AND p._id NOT IN ( + SELECT _id + FROM %s p2 + WHERE p2.account_id_type = ?1 + ORDER BY + CASE WHEN p2.stale_timestamp IS NULL THEN 1 ELSE 0 END DESC, + p2.stale_timestamp DESC, + p2._id DESC + LIMIT ?3 + ) + """ + ).formatted(TABLE_KYBER_PRE_KEY, TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setLong(2, threshold); + statement.setInt(3, minCount); + final var rowCount = statement.executeUpdate(); + if (rowCount > 0) { + logger.debug("Deleted {} stale one time kyber pre keys", rowCount); + } + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } + + @Override + public void markAllOneTimeKyberPreKeysStaleIfNecessary(final long staleTime) { + final var sql = ( + """ + UPDATE %s + SET stale_timestamp = ? + WHERE account_id_type = ? AND stale_timestamp IS NULL AND is_last_resort = FALSE + """ + ).formatted(TABLE_KYBER_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setLong(1, staleTime); + statement.setInt(2, accountIdType); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update kyber_pre_key store", e); + } + } +} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java index cc51a20aa4ae2..c3ac9632cfefc 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java @@ -9,6 +9,7 @@ import org.signal.libsignal.protocol.state.PreKeyRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.SignalServicePreKeyStore; import org.whispersystems.signalservice.api.push.ServiceIdType; import java.sql.Connection; @@ -16,7 +17,7 @@ import java.sql.SQLException; import java.util.Collection; -public class PreKeyStore implements org.signal.libsignal.protocol.state.PreKeyStore { +public class PreKeyStore implements SignalServicePreKeyStore { private static final String TABLE_PRE_KEY = "pre_key"; private final static Logger logger = LoggerFactory.getLogger(PreKeyStore.class); @@ -34,6 +35,7 @@ CREATE TABLE pre_key ( key_id INTEGER NOT NULL, public_key BLOB NOT NULL, private_key BLOB NOT NULL, + stale_timestamp INTEGER, UNIQUE(account_id_type, key_id) ) STRICT; """); @@ -49,7 +51,7 @@ public PreKeyStore(final Database database, final ServiceIdType serviceIdType) { public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException { final var preKey = getPreKey(preKeyId); if (preKey == null) { - throw new InvalidKeyIdException("No such signed pre key record: " + preKeyId); + throw new InvalidKeyIdException("No such pre key record: " + preKeyId); } return preKey; } @@ -181,4 +183,58 @@ private PreKeyRecord getPreKeyRecordFromResultSet(ResultSet resultSet) throws SQ return null; } } + + @Override + public void deleteAllStaleOneTimeEcPreKeys(final long threshold, final int minCount) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p.account_id_type = ?1 + AND p.stale_timestamp < ?2 + AND p._id NOT IN ( + SELECT _id + FROM %s AS p2 + WHERE p2.account_id_type = ?1 + ORDER BY + CASE WHEN p2.stale_timestamp IS NULL THEN 1 ELSE 0 END DESC, + p2.stale_timestamp DESC, + p2._id DESC + LIMIT ?3 + ) + """ + ).formatted(TABLE_PRE_KEY, TABLE_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setLong(2, threshold); + statement.setInt(3, minCount); + final var rowCount = statement.executeUpdate(); + if (rowCount > 0) { + logger.debug("Deleted {} stale one time pre keys", rowCount); + } + } + } catch (SQLException e) { + throw new RuntimeException("Failed update pre_key store", e); + } + } + + @Override + public void markAllOneTimeEcPreKeysStaleIfNecessary(final long staleTime) { + final var sql = ( + """ + UPDATE %s + SET stale_timestamp = ? + WHERE account_id_type = ? AND stale_timestamp IS NULL + """ + ).formatted(TABLE_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setLong(1, staleTime); + statement.setInt(2, accountIdType); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update pre_key store", e); + } + } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/SignedPreKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/SignedPreKeyStore.java index d618f6c372c6f..7c726f1693039 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/SignedPreKeyStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/prekeys/SignedPreKeyStore.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.Objects; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_ARCHIVE_AGE; + public class SignedPreKeyStore implements org.signal.libsignal.protocol.state.SignedPreKeyStore { private static final String TABLE_SIGNED_PRE_KEY = "signed_pre_key"; @@ -144,6 +146,33 @@ public void removeAllSignedPreKeys() { } } + public void removeOldSignedPreKeys(int activePreKeyId) { + final var sql = ( + """ + DELETE FROM %s AS p + WHERE p._id IN ( + SELECT p._id + FROM %s AS p + WHERE p.account_id_type = ? + AND p.key_id != ? + AND p.timestamp < ? + ORDER BY p.timestamp DESC + LIMIT -1 OFFSET 1 + ) + """ + ).formatted(TABLE_SIGNED_PRE_KEY, TABLE_SIGNED_PRE_KEY); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.setInt(1, accountIdType); + statement.setInt(2, activePreKeyId); + statement.setLong(3, System.currentTimeMillis() - PREKEY_ARCHIVE_AGE); + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update signed_pre_key store", e); + } + } + void addLegacySignedPreKeys(final Collection signedPreKeys) { logger.debug("Migrating legacy signedPreKeys to database"); long start = System.nanoTime(); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/profiles/LegacySignalProfileEntry.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/profiles/LegacySignalProfileEntry.java index 3acad2b13fcf8..d4a81183d63b4 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/profiles/LegacySignalProfileEntry.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/profiles/LegacySignalProfileEntry.java @@ -3,41 +3,6 @@ import org.asamk.signal.manager.storage.recipients.RecipientAddress; import org.signal.libsignal.zkgroup.profiles.ProfileKey; -public class LegacySignalProfileEntry { - - private final RecipientAddress address; - - private final ProfileKey profileKey; - - private final long lastUpdateTimestamp; - - private final LegacySignalProfile profile; - - public LegacySignalProfileEntry( - final RecipientAddress address, - final ProfileKey profileKey, - final long lastUpdateTimestamp, - final LegacySignalProfile profile - ) { - this.address = address; - this.profileKey = profileKey; - this.lastUpdateTimestamp = lastUpdateTimestamp; - this.profile = profile; - } - - public RecipientAddress getAddress() { - return address; - } - - public ProfileKey getProfileKey() { - return profileKey; - } - - public long getLastUpdateTimestamp() { - return lastUpdateTimestamp; - } - - public LegacySignalProfile getProfile() { - return profile; - } -} +public record LegacySignalProfileEntry( + RecipientAddress address, ProfileKey profileKey, long lastUpdateTimestamp, LegacySignalProfile profile +) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyIdentityInfo.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyIdentityInfo.java index 85ebcd2b3c1fe..0d55529104e2b 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyIdentityInfo.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyIdentityInfo.java @@ -9,9 +9,9 @@ public class LegacyIdentityInfo { RecipientAddress address; - IdentityKey identityKey; - TrustLevel trustLevel; - Date added; + final IdentityKey identityKey; + final TrustLevel trustLevel; + final Date added; LegacyIdentityInfo(RecipientAddress address, IdentityKey identityKey, TrustLevel trustLevel, Date added) { this.address = address; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonIdentityKeyStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonIdentityKeyStore.java index 4d94b455ed3f1..1e95eaff99620 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonIdentityKeyStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonIdentityKeyStore.java @@ -13,7 +13,7 @@ import org.signal.libsignal.protocol.InvalidKeyException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.util.UuidUtil; import java.io.IOException; @@ -100,8 +100,8 @@ public LegacyJsonIdentityKeyStore deserialize( ? UuidUtil.parseOrNull(trustedKey.get("uuid").asText()) : null; final var address = uuid == null - ? Utils.getRecipientAddressFromIdentifier(trustedKeyName) - : new RecipientAddress(ServiceId.from(uuid), trustedKeyName); + ? Utils.getRecipientAddressFromLegacyIdentifier(trustedKeyName) + : new RecipientAddress(ACI.from(uuid), trustedKeyName); try { var id = new IdentityKey(Base64.getDecoder().decode(trustedKey.get("identityKey").asText()), 0); var trustLevel = trustedKey.hasNonNull("trustLevel") ? TrustLevel.fromInt(trustedKey.get( diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java index df8f5cdada759..ee675d780c1f9 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java @@ -7,7 +7,7 @@ import org.asamk.signal.manager.storage.Utils; import org.asamk.signal.manager.storage.recipients.RecipientAddress; -import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.util.UuidUtil; import java.io.IOException; @@ -47,8 +47,8 @@ public LegacyJsonSessionStore deserialize( var uuid = session.hasNonNull("uuid") ? UuidUtil.parseOrNull(session.get("uuid").asText()) : null; final var address = uuid == null - ? Utils.getRecipientAddressFromIdentifier(sessionName) - : new RecipientAddress(ServiceId.from(uuid), sessionName); + ? Utils.getRecipientAddressFromLegacyIdentifier(sessionName) + : new RecipientAddress(ACI.from(uuid), sessionName); final var deviceId = session.get("deviceId").asInt(); final var record = Base64.getDecoder().decode(session.get("record").asText()); var sessionInfo = new LegacySessionInfo(address, deviceId, record); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacySessionInfo.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacySessionInfo.java index 2cb984fb643c9..c6097cd9cb438 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacySessionInfo.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/LegacySessionInfo.java @@ -4,11 +4,11 @@ public class LegacySessionInfo { - public RecipientAddress address; + public final RecipientAddress address; - public int deviceId; + public final int deviceId; - public byte[] sessionRecord; + public final byte[] sessionRecord; LegacySessionInfo(final RecipientAddress address, final int deviceId, final byte[] sessionRecord) { this.address = address; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java index 223f39fc7757f..ea1a5c6fc795b 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java @@ -9,11 +9,12 @@ import org.signal.libsignal.protocol.state.IdentityKeyStore; import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; -import org.signal.libsignal.protocol.state.PreKeyStore; import org.signal.libsignal.protocol.state.SessionRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyStore; import org.whispersystems.signalservice.api.SignalServiceAccountDataStore; +import org.whispersystems.signalservice.api.SignalServiceKyberPreKeyStore; +import org.whispersystems.signalservice.api.SignalServicePreKeyStore; import org.whispersystems.signalservice.api.SignalServiceSenderKeyStore; import org.whispersystems.signalservice.api.SignalServiceSessionStore; import org.whispersystems.signalservice.api.push.DistributionId; @@ -26,16 +27,18 @@ public class SignalProtocolStore implements SignalServiceAccountDataStore { - private final PreKeyStore preKeyStore; + private final SignalServicePreKeyStore preKeyStore; private final SignedPreKeyStore signedPreKeyStore; + private final SignalServiceKyberPreKeyStore kyberPreKeyStore; private final SignalServiceSessionStore sessionStore; private final IdentityKeyStore identityKeyStore; private final SignalServiceSenderKeyStore senderKeyStore; private final Supplier isMultiDevice; public SignalProtocolStore( - final PreKeyStore preKeyStore, + final SignalServicePreKeyStore preKeyStore, final SignedPreKeyStore signedPreKeyStore, + final SignalServiceKyberPreKeyStore kyberPreKeyStore, final SignalServiceSessionStore sessionStore, final IdentityKeyStore identityKeyStore, final SignalServiceSenderKeyStore senderKeyStore, @@ -43,6 +46,7 @@ public SignalProtocolStore( ) { this.preKeyStore = preKeyStore; this.signedPreKeyStore = signedPreKeyStore; + this.kyberPreKeyStore = kyberPreKeyStore; this.sessionStore = sessionStore; this.identityKeyStore = identityKeyStore; this.senderKeyStore = senderKeyStore; @@ -201,29 +205,61 @@ public boolean isMultiDevice() { @Override public KyberPreKeyRecord loadKyberPreKey(final int kyberPreKeyId) throws InvalidKeyIdException { - // TODO - throw new InvalidKeyIdException("Missing kyber prekey with ID: $kyberPreKeyId"); + return kyberPreKeyStore.loadKyberPreKey(kyberPreKeyId); } @Override public List loadKyberPreKeys() { - // TODO - return List.of(); + return kyberPreKeyStore.loadKyberPreKeys(); } @Override public void storeKyberPreKey(final int kyberPreKeyId, final KyberPreKeyRecord record) { - // TODO + kyberPreKeyStore.storeKyberPreKey(kyberPreKeyId, record); } @Override public boolean containsKyberPreKey(final int kyberPreKeyId) { - // TODO - return false; + return kyberPreKeyStore.containsKyberPreKey(kyberPreKeyId); } @Override public void markKyberPreKeyUsed(final int kyberPreKeyId) { - // TODO + kyberPreKeyStore.markKyberPreKeyUsed(kyberPreKeyId); + } + + @Override + public List loadLastResortKyberPreKeys() { + return kyberPreKeyStore.loadLastResortKyberPreKeys(); + } + + @Override + public void removeKyberPreKey(final int i) { + kyberPreKeyStore.removeKyberPreKey(i); + } + + @Override + public void storeLastResortKyberPreKey(final int i, final KyberPreKeyRecord kyberPreKeyRecord) { + kyberPreKeyStore.storeLastResortKyberPreKey(i, kyberPreKeyRecord); + } + + @Override + public void deleteAllStaleOneTimeKyberPreKeys(final long threshold, final int minCount) { + kyberPreKeyStore.deleteAllStaleOneTimeKyberPreKeys(threshold, minCount); + } + + @Override + public void markAllOneTimeKyberPreKeysStaleIfNecessary(final long staleTime) { + kyberPreKeyStore.markAllOneTimeKyberPreKeysStaleIfNecessary(staleTime); + } + + @Override + public void deleteAllStaleOneTimeEcPreKeys(final long threshold, final int minCount) { + preKeyStore.deleteAllStaleOneTimeEcPreKeys(threshold, minCount); + } + + @Override + public void markAllOneTimeEcPreKeysStaleIfNecessary(final long staleTime) { + preKeyStore.markAllOneTimeEcPreKeysStaleIfNecessary(staleTime); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/CdsiStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/CdsiStore.java new file mode 100644 index 0000000000000..fd0846e910a7f --- /dev/null +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/CdsiStore.java @@ -0,0 +1,170 @@ +package org.asamk.signal.manager.storage.recipients; + +import org.asamk.signal.manager.storage.Database; +import org.asamk.signal.manager.storage.Utils; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +public class CdsiStore { + + private static final String TABLE_CDSI = "cdsi"; + + private final Database database; + + public static void createSql(Connection connection) throws SQLException { + // When modifying the CREATE statement here, also add a migration in AccountDatabase.java + try (final var statement = connection.createStatement()) { + statement.executeUpdate(""" + CREATE TABLE cdsi ( + _id INTEGER PRIMARY KEY, + number TEXT NOT NULL UNIQUE, + last_seen_at INTEGER NOT NULL + ) STRICT; + """); + } + } + + public CdsiStore(final Database database) { + this.database = database; + } + + public Set getAllNumbers() { + try (final var connection = database.getConnection()) { + return getAllNumbers(connection); + } catch (SQLException e) { + throw new RuntimeException("Failed read from cdsi store", e); + } + } + + /** + * Saves the set of e164 numbers used after a full refresh. + * + * @param fullNumbers All the e164 numbers used in the last CDS query (previous and new). + * @param seenNumbers The E164 numbers that were seen in either the system contacts or recipients table. This is different from fullNumbers in that fullNumbers + * includes every number we've ever seen, even if it's not in our contacts anymore. + */ + public void updateAfterFullCdsQuery(Set fullNumbers, Set seenNumbers) { + final var lastSeen = System.currentTimeMillis(); + try (final var connection = database.getConnection()) { + final var existingNumbers = getAllNumbers(connection); + + final var removedNumbers = new HashSet<>(existingNumbers) {{ + removeAll(fullNumbers); + }}; + removeNumbers(connection, removedNumbers); + + final var addedNumbers = new HashSet<>(fullNumbers) {{ + removeAll(existingNumbers); + }}; + addNumbers(connection, addedNumbers, lastSeen); + + updateLastSeen(connection, seenNumbers, lastSeen); + } catch (SQLException e) { + throw new RuntimeException("Failed update cdsi store", e); + } + } + + /** + * Updates after a partial CDS query. Will not insert new entries. + * Instead, this will simply update the lastSeen timestamp of any entry we already have. + * + * @param seenNumbers The newly-added E164 numbers that we hadn't previously queried for. + */ + public void updateAfterPartialCdsQuery(Set seenNumbers) { + final var lastSeen = System.currentTimeMillis(); + + try (final var connection = database.getConnection()) { + updateLastSeen(connection, seenNumbers, lastSeen); + } catch (SQLException e) { + throw new RuntimeException("Failed update cdsi store", e); + } + } + + private static Set getAllNumbers(final Connection connection) throws SQLException { + final var sql = ( + """ + SELECT c.number + FROM %s c + """ + ).formatted(TABLE_CDSI); + try (final var statement = connection.prepareStatement(sql)) { + try (var result = Utils.executeQueryForStream(statement, r -> r.getString("number"))) { + return result.collect(Collectors.toSet()); + } + } + } + + private static void removeNumbers( + final Connection connection, final Set numbers + ) throws SQLException { + final var sql = ( + """ + DELETE FROM %s + WHERE number = ? + """ + ).formatted(TABLE_CDSI); + try (final var statement = connection.prepareStatement(sql)) { + for (final var number : numbers) { + statement.setString(1, number); + statement.executeUpdate(); + } + } + } + + private static void addNumbers( + final Connection connection, final Set numbers, final long lastSeen + ) throws SQLException { + final var sql = ( + """ + INSERT INTO %s (number, last_seen_at) + VALUES (?, ?) + ON CONFLICT (number) DO UPDATE SET last_seen_at = excluded.last_seen_at + """ + ).formatted(TABLE_CDSI); + try (final var statement = connection.prepareStatement(sql)) { + for (final var number : numbers) { + statement.setString(1, number); + statement.setLong(2, lastSeen); + statement.executeUpdate(); + } + } + } + + private static void updateLastSeen( + final Connection connection, final Set numbers, final long lastSeen + ) throws SQLException { + final var sql = ( + """ + UPDATE %s + SET last_seen_at = ? + WHERE number = ? + """ + ).formatted(TABLE_CDSI); + try (final var statement = connection.prepareStatement(sql)) { + for (final var number : numbers) { + statement.setLong(1, lastSeen); + statement.setString(2, number); + statement.executeUpdate(); + } + } + } + + public void clearAll() { + final var sql = ( + """ + TRUNCATE %s + """ + ).formatted(TABLE_CDSI); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + statement.executeUpdate(); + } + } catch (SQLException e) { + throw new RuntimeException("Failed update cdsi store", e); + } + } +} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java index f323a5cb2c008..86ada86ab38d6 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java @@ -1,7 +1,8 @@ package org.asamk.signal.manager.storage.recipients; -import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import java.util.Optional; @@ -63,7 +64,7 @@ public RecipientAddress(SignalServiceAddress address) { } public RecipientAddress(org.asamk.signal.manager.api.RecipientAddress address) { - this(address.uuid().map(ServiceId::from), Optional.empty(), address.number(), address.username()); + this(address.uuid().map(ACI::from), Optional.empty(), address.number(), address.username()); } public RecipientAddress(ServiceId serviceId) { @@ -169,11 +170,11 @@ public boolean isServiceIdPNI() { } public SignalServiceAddress toSignalServiceAddress() { - return new SignalServiceAddress(serviceId.orElse(ServiceId.UNKNOWN), number); + return new SignalServiceAddress(serviceId.orElse(ACI.UNKNOWN), number); } public org.asamk.signal.manager.api.RecipientAddress toApiRecipientAddress() { - return new org.asamk.signal.manager.api.RecipientAddress(serviceId().map(ServiceId::uuid), + return new org.asamk.signal.manager.api.RecipientAddress(serviceId().map(ServiceId::getRawUuid), number(), username()); } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java index 9c13459b8707d..87e5f3d2abe7e 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java @@ -13,9 +13,9 @@ import org.signal.libsignal.zkgroup.profiles.ProfileKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.util.UuidUtil; @@ -47,6 +47,8 @@ public class RecipientStore implements RecipientIdCreator, RecipientResolver, Re private final Object recipientsLock = new Object(); private final Map recipientsMerged = new HashMap<>(); + private final Map recipientAddressCache = new HashMap<>(); + public static void createSql(Connection connection) throws SQLException { // When modifying the CREATE statement here, also add a migration in AccountDatabase.java try (final var statement = connection.createStatement()) { @@ -151,8 +153,9 @@ public RecipientId resolveRecipient(final long rawRecipientId) { @Override public RecipientId resolveRecipient(final String identifier) { - if (UuidUtil.isUuid(identifier)) { - return resolveRecipient(ServiceId.parseOrThrow(identifier)); + final var serviceId = ServiceId.parseOrNull(identifier); + if (serviceId != null) { + return resolveRecipient(serviceId); } else { return resolveRecipientByNumber(identifier); } @@ -175,15 +178,18 @@ private RecipientId resolveRecipientByNumber(final String number) { @Override public RecipientId resolveRecipient(final ServiceId serviceId) { synchronized (recipientsLock) { - final RecipientId recipientId; + final var recipientWithAddress = recipientAddressCache.get(serviceId); + if (recipientWithAddress != null) { + return recipientWithAddress.id(); + } try (final var connection = database.getConnection()) { connection.setAutoCommit(false); - recipientId = resolveRecipientLocked(connection, serviceId); + final var recipientId = resolveRecipientLocked(connection, serviceId); connection.commit(); + return recipientId; } catch (SQLException e) { throw new RuntimeException("Failed read recipient store", e); } - return recipientId; } } @@ -228,7 +234,7 @@ public Optional resolveRecipientByNumberOptional(final String numbe } public RecipientId resolveRecipientByUsername( - final String username, Supplier serviceIdSupplier + final String username, Supplier aciSupplier ) throws UnregisteredRecipientException { final Optional byUsername; try (final var connection = database.getConnection()) { @@ -237,14 +243,14 @@ public RecipientId resolveRecipientByUsername( throw new RuntimeException("Failed read from recipient store", e); } if (byUsername.isEmpty() || byUsername.get().address().serviceId().isEmpty()) { - final var serviceId = serviceIdSupplier.get(); - if (serviceId == null) { + final var aci = aciSupplier.get(); + if (aci == null) { throw new UnregisteredRecipientException(new org.asamk.signal.manager.api.RecipientAddress(null, null, username)); } - return resolveRecipient(serviceId); + return resolveRecipientTrusted(aci, username); } return byUsername.get().id(); } @@ -286,17 +292,8 @@ public RecipientId resolveRecipientTrusted( } @Override - public RecipientId resolveRecipientTrusted(final ServiceId serviceId, final String username) { - return resolveRecipientTrusted(new RecipientAddress(serviceId, null, null, username), false); - } - - public RecipientId resolveRecipientTrusted( - final ACI aci, final String username - ) { - return resolveRecipientTrusted(new RecipientAddress(Optional.of(aci), - Optional.empty(), - Optional.empty(), - Optional.of(username)), false); + public RecipientId resolveRecipientTrusted(final ACI aci, final String username) { + return resolveRecipientTrusted(new RecipientAddress(aci, null, null, username), false); } @Override @@ -365,7 +362,7 @@ public List getRecipients( FROM %s r WHERE (r.number IS NOT NULL OR r.uuid IS NOT NULL) AND %s """ - ).formatted(TABLE_RECIPIENT, sqlWhere.size() == 0 ? "TRUE" : String.join(" AND ", sqlWhere)); + ).formatted(TABLE_RECIPIENT, sqlWhere.isEmpty() ? "TRUE" : String.join(" AND ", sqlWhere)); try (final var connection = database.getConnection()) { try (final var statement = connection.prepareStatement(sql)) { if (blocked.isPresent()) { @@ -382,6 +379,33 @@ public List getRecipients( } } + public Set getAllNumbers() { + final var sql = ( + """ + SELECT r.number + FROM %s r + WHERE r.number IS NOT NULL + """ + ).formatted(TABLE_RECIPIENT); + try (final var connection = database.getConnection()) { + try (final var statement = connection.prepareStatement(sql)) { + return Utils.executeQueryForStream(statement, resultSet -> resultSet.getString("number")) + .filter(Objects::nonNull) + .filter(n -> { + try { + Long.parseLong(n); + return true; + } catch (NumberFormatException e) { + return false; + } + }) + .collect(Collectors.toSet()); + } + } catch (SQLException e) { + throw new RuntimeException("Failed read from recipient store", e); + } + } + public Map getServiceIdToProfileKeyMap() { final var sql = ( """ @@ -410,16 +434,19 @@ public void deleteContact(RecipientId recipientId) { public void deleteRecipientData(RecipientId recipientId) { logger.debug("Deleting recipient data for {}", recipientId); - try (final var connection = database.getConnection()) { - connection.setAutoCommit(false); - storeContact(connection, recipientId, null); - storeProfile(connection, recipientId, null); - storeProfileKey(connection, recipientId, null, false); - storeExpiringProfileKeyCredential(connection, recipientId, null); - deleteRecipient(connection, recipientId); - connection.commit(); - } catch (SQLException e) { - throw new RuntimeException("Failed update recipient store", e); + synchronized (recipientsLock) { + recipientAddressCache.entrySet().removeIf(e -> e.getValue().id().equals(recipientId)); + try (final var connection = database.getConnection()) { + connection.setAutoCommit(false); + storeContact(connection, recipientId, null); + storeProfile(connection, recipientId, null); + storeProfileKey(connection, recipientId, null, false); + storeExpiringProfileKeyCredential(connection, recipientId, null); + deleteRecipient(connection, recipientId); + connection.commit(); + } catch (SQLException e) { + throw new RuntimeException("Failed update recipient store", e); + } } } @@ -509,7 +536,7 @@ void addLegacyRecipients(final Map recipients) { statement.setBytes(3, recipient.getAddress() .serviceId() - .map(ServiceId::uuid) + .map(ServiceId::getRawUuid) .map(UuidUtil::toByteArray) .orElse(null)); statement.executeUpdate(); @@ -672,11 +699,14 @@ private RecipientId resolveRecipientTrusted(RecipientAddress address, boolean is } } - if (pair.second().size() > 0) { + if (!pair.second().isEmpty()) { try (final var connection = database.getConnection()) { for (final var toBeMergedRecipientId : pair.second()) { recipientMergeHandler.mergeRecipients(connection, pair.first(), toBeMergedRecipientId); deleteRecipient(connection, toBeMergedRecipientId); + synchronized (recipientsLock) { + recipientAddressCache.entrySet().removeIf(e -> e.getValue().id().equals(toBeMergedRecipientId)); + } } } catch (SQLException e) { throw new RuntimeException("Failed update recipient store", e); @@ -750,16 +780,17 @@ private RecipientId addNewRecipient( """ INSERT INTO %s (number, uuid, pni) VALUES (?, ?, ?) + RETURNING _id """ ).formatted(TABLE_RECIPIENT); try (final var statement = connection.prepareStatement(sql)) { statement.setString(1, address.number().orElse(null)); - statement.setBytes(2, address.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null)); - statement.setBytes(3, address.pni().map(PNI::uuid).map(UuidUtil::toByteArray).orElse(null)); - statement.executeUpdate(); - final var generatedKeys = statement.getGeneratedKeys(); - if (generatedKeys.next()) { - final var recipientId = new RecipientId(generatedKeys.getLong(1), this); + statement.setBytes(2, + address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); + statement.setBytes(3, address.pni().map(PNI::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); + final var generatedKey = Utils.executeQueryForOptional(statement, Utils::getIdMapper); + if (generatedKey.isPresent()) { + final var recipientId = new RecipientId(generatedKey.get(), this); logger.debug("Added new recipient {} with address {}", recipientId, address); return recipientId; } else { @@ -769,36 +800,43 @@ private RecipientId addNewRecipient( } private void removeRecipientAddress(Connection connection, RecipientId recipientId) throws SQLException { - final var sql = ( - """ - UPDATE %s - SET number = NULL, uuid = NULL, pni = NULL - WHERE _id = ? - """ - ).formatted(TABLE_RECIPIENT); - try (final var statement = connection.prepareStatement(sql)) { - statement.setLong(1, recipientId.id()); - statement.executeUpdate(); + synchronized (recipientsLock) { + recipientAddressCache.entrySet().removeIf(e -> e.getValue().id().equals(recipientId)); + final var sql = ( + """ + UPDATE %s + SET number = NULL, uuid = NULL, pni = NULL + WHERE _id = ? + """ + ).formatted(TABLE_RECIPIENT); + try (final var statement = connection.prepareStatement(sql)) { + statement.setLong(1, recipientId.id()); + statement.executeUpdate(); + } } } private void updateRecipientAddress( Connection connection, RecipientId recipientId, final RecipientAddress address ) throws SQLException { - final var sql = ( - """ - UPDATE %s - SET number = ?, uuid = ?, pni = ?, username = ? - WHERE _id = ? - """ - ).formatted(TABLE_RECIPIENT); - try (final var statement = connection.prepareStatement(sql)) { - statement.setString(1, address.number().orElse(null)); - statement.setBytes(2, address.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null)); - statement.setBytes(3, address.pni().map(PNI::uuid).map(UuidUtil::toByteArray).orElse(null)); - statement.setString(4, address.username().orElse(null)); - statement.setLong(5, recipientId.id()); - statement.executeUpdate(); + synchronized (recipientsLock) { + recipientAddressCache.entrySet().removeIf(e -> e.getValue().id().equals(recipientId)); + final var sql = ( + """ + UPDATE %s + SET number = ?, uuid = ?, pni = ?, username = ? + WHERE _id = ? + """ + ).formatted(TABLE_RECIPIENT); + try (final var statement = connection.prepareStatement(sql)) { + statement.setString(1, address.number().orElse(null)); + statement.setBytes(2, + address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); + statement.setBytes(3, address.pni().map(PNI::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); + statement.setString(4, address.username().orElse(null)); + statement.setLong(5, recipientId.id()); + statement.executeUpdate(); + } } } @@ -879,15 +917,21 @@ private Optional findByUsername( private Optional findByServiceId( final Connection connection, final ServiceId serviceId ) throws SQLException { + var recipientWithAddress = Optional.ofNullable(recipientAddressCache.get(serviceId)); + if (recipientWithAddress.isPresent()) { + return recipientWithAddress; + } final var sql = """ SELECT r._id, r.number, r.uuid, r.pni, r.username FROM %s r - WHERE r.uuid = ? OR r.pni = ? + WHERE r.uuid = ?1 OR r.pni = ?1 LIMIT 1 """.formatted(TABLE_RECIPIENT); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, UuidUtil.toByteArray(serviceId.uuid())); - return Utils.executeQueryForOptional(statement, this::getRecipientWithAddressFromResultSet); + statement.setBytes(1, UuidUtil.toByteArray(serviceId.getRawUuid())); + recipientWithAddress = Utils.executeQueryForOptional(statement, this::getRecipientWithAddressFromResultSet); + recipientWithAddress.ifPresent(r -> recipientAddressCache.put(serviceId, r)); + return recipientWithAddress; } } @@ -903,8 +947,9 @@ private Set findAllByAddress( r.username = ?4 """.formatted(TABLE_RECIPIENT); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, address.serviceId().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null)); - statement.setBytes(2, address.pni().map(ServiceId::uuid).map(UuidUtil::toByteArray).orElse(null)); + statement.setBytes(1, + address.serviceId().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); + statement.setBytes(2, address.pni().map(ServiceId::getRawUuid).map(UuidUtil::toByteArray).orElse(null)); statement.setString(3, address.number().orElse(null)); statement.setString(4, address.username().orElse(null)); return Utils.executeQueryForStream(statement, this::getRecipientWithAddressFromResultSet) @@ -972,8 +1017,10 @@ private Profile getProfile(final Connection connection, final RecipientId recipi } private RecipientAddress getRecipientAddressFromResultSet(ResultSet resultSet) throws SQLException { - final var serviceId = Optional.ofNullable(resultSet.getBytes("uuid")).map(ServiceId::parseOrNull); - final var pni = Optional.ofNullable(resultSet.getBytes("pni")).map(PNI::parseOrNull); + final var pni = Optional.ofNullable(resultSet.getBytes("pni")).map(UuidUtil::parseOrNull).map(PNI::from); + final var serviceIdUuid = Optional.ofNullable(resultSet.getBytes("uuid")).map(UuidUtil::parseOrNull); + final var serviceId = serviceIdUuid.isPresent() && pni.isPresent() && serviceIdUuid.get() + .equals(pni.get().getRawUuid()) ? pni.map(p -> p) : serviceIdUuid.map(ACI::from); final var number = Optional.ofNullable(resultSet.getString("number")); final var username = Optional.ofNullable(resultSet.getString("username")); return new RecipientAddress(serviceId, pni, number, username); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientTrustedResolver.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientTrustedResolver.java index 9fc46d675f9e9..21708551ac784 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientTrustedResolver.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientTrustedResolver.java @@ -1,8 +1,7 @@ package org.asamk.signal.manager.storage.recipients; -import org.whispersystems.signalservice.api.push.ACI; -import org.whispersystems.signalservice.api.push.PNI; -import org.whispersystems.signalservice.api.push.ServiceId; +import org.whispersystems.signalservice.api.push.ServiceId.ACI; +import org.whispersystems.signalservice.api.push.ServiceId.PNI; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import java.util.Optional; @@ -16,7 +15,7 @@ public interface RecipientTrustedResolver { RecipientId resolveRecipientTrusted(Optional aci, Optional pni, Optional number); - RecipientId resolveRecipientTrusted(ServiceId serviceId, String username); + RecipientId resolveRecipientTrusted(ACI aci, String username); class RecipientTrustedResolverWrapper implements RecipientTrustedResolver { @@ -44,8 +43,8 @@ public RecipientId resolveRecipientTrusted( } @Override - public RecipientId resolveRecipientTrusted(final ServiceId serviceId, final String username) { - return recipientTrustedResolverSupplier.get().resolveRecipientTrusted(serviceId, username); + public RecipientId resolveRecipientTrusted(final ACI aci, final String username) { + return recipientTrustedResolverSupplier.get().resolveRecipientTrusted(aci, username); } } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientWithAddress.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientWithAddress.java index 6885a8af0645a..0fc00113f6bab 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientWithAddress.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/recipients/RecipientWithAddress.java @@ -1,3 +1,3 @@ package org.asamk.signal.manager.storage.recipients; -record RecipientWithAddress(RecipientId id, RecipientAddress address) {} +public record RecipientWithAddress(RecipientId id, RecipientAddress address) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogEntry.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogEntry.java index c7f3739649199..b8d951c1207fa 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogEntry.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogEntry.java @@ -2,10 +2,10 @@ import org.asamk.signal.manager.api.GroupId; import org.whispersystems.signalservice.api.crypto.ContentHint; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.Content; import java.util.Optional; public record MessageSendLogEntry( - Optional groupId, SignalServiceProtos.Content content, ContentHint contentHint, boolean urgent + Optional groupId, Content content, ContentHint contentHint, boolean urgent ) {} diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogStore.java index d8c8f5aac4f73..751f345bed1cb 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sendLog/MessageSendLogStore.java @@ -11,7 +11,7 @@ import org.whispersystems.signalservice.api.crypto.ContentHint; import org.whispersystems.signalservice.api.messages.SendMessageResult; import org.whispersystems.signalservice.api.push.ServiceId; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.Content; import java.io.IOException; import java.sql.Connection; @@ -67,7 +67,7 @@ public static void createSql(Connection connection) throws SQLException { CREATE TABLE message_send_log ( _id INTEGER PRIMARY KEY, content_id INTEGER NOT NULL REFERENCES message_send_log_content (_id) ON DELETE CASCADE, - uuid BLOB NOT NULL, + address TEXT NOT NULL, device_id INTEGER NOT NULL ) STRICT; CREATE TABLE message_send_log_content ( @@ -79,7 +79,7 @@ CREATE TABLE message_send_log_content ( urgent INTEGER NOT NULL ) STRICT; CREATE INDEX mslc_timestamp_index ON message_send_log_content (timestamp); - CREATE INDEX msl_recipient_index ON message_send_log (uuid, device_id, content_id); + CREATE INDEX msl_recipient_index ON message_send_log (address, device_id, content_id); CREATE INDEX msl_content_index ON message_send_log (content_id); """); } @@ -92,13 +92,13 @@ public List findMessages( SELECT group_id, content, content_hint, urgent FROM %s l INNER JOIN %s lc ON l.content_id = lc._id - WHERE l.uuid = ? AND l.device_id = ? AND lc.timestamp = ? + WHERE l.address = ? AND l.device_id = ? AND lc.timestamp = ? """.formatted(TABLE_MESSAGE_SEND_LOG, TABLE_MESSAGE_SEND_LOG_CONTENT); try (final var connection = database.getConnection()) { deleteOutdatedEntries(connection); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, serviceId.toString()); statement.setInt(2, deviceId); statement.setLong(3, timestamp); try (var result = Utils.executeQueryForStream(statement, this::getMessageSendLogEntryFromResultSet)) { @@ -202,13 +202,13 @@ public void deleteEntryForGroup(long sentTimestamp, GroupId groupId) { public void deleteEntryForRecipientNonGroup(long sentTimestamp, ServiceId serviceId) { final var sql = """ DELETE FROM %s AS lc - WHERE lc.timestamp = ? AND lc.group_id IS NULL AND lc._id IN (SELECT content_id FROM %s l WHERE l.uuid = ?) + WHERE lc.timestamp = ? AND lc.group_id IS NULL AND lc._id IN (SELECT content_id FROM %s l WHERE l.address = ?) """.formatted(TABLE_MESSAGE_SEND_LOG_CONTENT, TABLE_MESSAGE_SEND_LOG); try (final var connection = database.getConnection()) { connection.setAutoCommit(false); try (final var statement = connection.prepareStatement(sql)) { statement.setLong(1, sentTimestamp); - statement.setBytes(2, serviceId.toByteArray()); + statement.setString(2, serviceId.toString()); statement.executeUpdate(); } @@ -226,14 +226,14 @@ public void deleteEntryForRecipient(long sentTimestamp, ServiceId serviceId, int public void deleteEntriesForRecipient(List sentTimestamps, ServiceId serviceId, int deviceId) { final var sql = """ DELETE FROM %s AS l - WHERE l.content_id IN (SELECT _id FROM %s lc WHERE lc.timestamp = ?) AND l.uuid = ? AND l.device_id = ? + WHERE l.content_id IN (SELECT _id FROM %s lc WHERE lc.timestamp = ?) AND l.address = ? AND l.device_id = ? """.formatted(TABLE_MESSAGE_SEND_LOG, TABLE_MESSAGE_SEND_LOG_CONTENT); try (final var connection = database.getConnection()) { connection.setAutoCommit(false); try (final var statement = connection.prepareStatement(sql)) { for (final var sentTimestamp : sentTimestamps) { statement.setLong(1, sentTimestamp); - statement.setBytes(2, serviceId.toByteArray()); + statement.setString(2, serviceId.toString()); statement.setInt(3, deviceId); statement.executeUpdate(); } @@ -267,7 +267,7 @@ private RecipientDevices getRecipientDevices(final SendMessageResult sendMessage private long insert( final List recipientDevices, final long sentTimestamp, - final SignalServiceProtos.Content content, + final Content content, final ContentHint contentHint, final boolean urgent ) { @@ -276,6 +276,7 @@ private long insert( final var sql = """ INSERT INTO %s (timestamp, group_id, content, content_hint, urgent) VALUES (?,?,?,?,?) + RETURNING _id """.formatted(TABLE_MESSAGE_SEND_LOG_CONTENT); try (final var connection = database.getConnection()) { connection.setAutoCommit(false); @@ -283,13 +284,12 @@ private long insert( try (final var statement = connection.prepareStatement(sql)) { statement.setLong(1, sentTimestamp); statement.setBytes(2, groupId); - statement.setBytes(3, content.toByteArray()); + statement.setBytes(3, content.encode()); statement.setInt(4, contentHint.getType()); statement.setBoolean(5, urgent); - statement.executeUpdate(); - final var generatedKeys = statement.getGeneratedKeys(); - if (generatedKeys.next()) { - contentId = generatedKeys.getLong(1); + final var generatedKey = Utils.executeQueryForOptional(statement, Utils::getIdMapper); + if (generatedKey.isPresent()) { + contentId = generatedKey.get(); } else { contentId = -1; } @@ -308,17 +308,15 @@ private long insert( } } - private byte[] getGroupId(final SignalServiceProtos.Content content) { + private byte[] getGroupId(final Content content) { try { - return !content.hasDataMessage() + return content.dataMessage == null ? null - : content.getDataMessage().hasGroup() - ? content.getDataMessage().getGroup().getId().toByteArray() - : content.getDataMessage().hasGroupV2() - ? GroupUtils.getGroupIdV2(new GroupMasterKey(content.getDataMessage() - .getGroupV2() - .getMasterKey() - .toByteArray())).serialize() + : content.dataMessage.group != null && content.dataMessage.group.id != null + ? content.dataMessage.group.id.toByteArray() + : content.dataMessage.groupV2 != null && content.dataMessage.groupV2.masterKey != null + ? GroupUtils.getGroupIdV2(new GroupMasterKey(content.dataMessage.groupV2.masterKey.toByteArray())) + .serialize() : null; } catch (InvalidInputException e) { logger.warn("Failed to parse groupId id from content"); @@ -342,13 +340,13 @@ private void insertRecipientsForExistingContent( final long contentId, final List recipientDevices, final Connection connection ) throws SQLException { final var sql = """ - INSERT INTO %s (uuid, device_id, content_id) + INSERT INTO %s (address, device_id, content_id) VALUES (?,?,?) """.formatted(TABLE_MESSAGE_SEND_LOG); try (final var statement = connection.prepareStatement(sql)) { for (final var recipientDevice : recipientDevices) { for (final var deviceId : recipientDevice.deviceIds()) { - statement.setBytes(1, recipientDevice.serviceId().toByteArray()); + statement.setString(1, recipientDevice.serviceId().toString()); statement.setInt(2, deviceId); statement.setLong(3, contentId); statement.executeUpdate(); @@ -385,9 +383,9 @@ WHERE _id NOT IN (SELECT content_id FROM %s) private MessageSendLogEntry getMessageSendLogEntryFromResultSet(ResultSet resultSet) throws SQLException { final var groupId = Optional.ofNullable(resultSet.getBytes("group_id")).map(GroupId::unknownVersion); - final SignalServiceProtos.Content content; + final Content content; try { - content = SignalServiceProtos.Content.parseFrom(resultSet.getBinaryStream("content")); + content = Content.ADAPTER.decode(resultSet.getBinaryStream("content")); } catch (IOException e) { logger.warn("Failed to parse content from message send log", e); return null; diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeyRecordStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeyRecordStore.java index 8c439e58a892b..fe49d91bb6162 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeyRecordStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeyRecordStore.java @@ -38,7 +38,9 @@ final var record = loadSenderKeyLocked(key, senderKeysPath); if (record == null || serviceId.isEmpty()) { return null; } - return new Pair<>(new SenderKeyRecordStore.Key(serviceId.get(), key.deviceId, key.distributionId), record); + return new Pair<>(new SenderKeyRecordStore.Key(serviceId.get().toString(), + key.deviceId, + key.distributionId), record); }).filter(Objects::nonNull).toList(); senderKeyStore.addLegacySenderKeys(senderKeys); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeySharedStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeySharedStore.java index b46f850607499..bbd05dea9d6f9 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeySharedStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeySharedStore.java @@ -40,7 +40,7 @@ public static void migrate( if (serviceId.isEmpty()) { continue; } - final var entry = new SenderKeySharedEntry(serviceId.get(), senderKey.deviceId); + final var entry = new SenderKeySharedEntry(serviceId.get().toString(), senderKey.deviceId); final var distributionId = DistributionId.from(senderKey.distributionId); var entries = sharedSenderKeys.get(distributionId); if (entries == null) { diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java index 5e42a924ff36e..e321e9eafaefe 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java @@ -31,12 +31,12 @@ public static void createSql(Connection connection) throws SQLException { statement.executeUpdate(""" CREATE TABLE sender_key ( _id INTEGER PRIMARY KEY, - uuid BLOB NOT NULL, + address TEXT NOT NULL, device_id INTEGER NOT NULL, distribution_id BLOB NOT NULL, record BLOB NOT NULL, created_timestamp INTEGER NOT NULL, - UNIQUE(uuid, device_id, distribution_id) + UNIQUE(address, device_id, distribution_id) ) STRICT; """); } @@ -75,12 +75,12 @@ long getCreateTimeForKey(final ServiceId selfServiceId, final int selfDeviceId, """ SELECT s.created_timestamp FROM %s AS s - WHERE s.uuid = ? AND s.device_id = ? AND s.distribution_id = ? + WHERE s.address = ? AND s.device_id = ? AND s.distribution_id = ? """ ).formatted(TABLE_SENDER_KEY); try (final var connection = database.getConnection()) { try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, selfServiceId.toByteArray()); + statement.setString(1, selfServiceId.toString()); statement.setInt(2, selfDeviceId); statement.setBytes(3, UuidUtil.toByteArray(distributionId)); return Utils.executeQueryForOptional(statement, res -> res.getLong("created_timestamp")).orElse(-1L); @@ -94,12 +94,12 @@ void deleteSenderKey(final ServiceId serviceId, final UUID distributionId) { final var sql = ( """ DELETE FROM %s AS s - WHERE s.uuid = ? AND s.distribution_id = ? + WHERE s.address = ? AND s.distribution_id = ? """ ).formatted(TABLE_SENDER_KEY); try (final var connection = database.getConnection()) { try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, serviceId.toString()); statement.setBytes(2, UuidUtil.toByteArray(distributionId)); statement.executeUpdate(); } @@ -145,8 +145,7 @@ void addLegacySenderKeys(final Collection> senderKeys } private Key getKey(final SignalProtocolAddress address, final UUID distributionId) { - final var serviceId = ServiceId.parseOrThrow(address.getName()); - return new Key(serviceId, address.getDeviceId(), distributionId); + return new Key(address.getName(), address.getDeviceId(), distributionId); } private SenderKeyRecord loadSenderKey(final Connection connection, final Key key) throws SQLException { @@ -154,11 +153,11 @@ private SenderKeyRecord loadSenderKey(final Connection connection, final Key key """ SELECT s.record FROM %s AS s - WHERE s.uuid = ? AND s.device_id = ? AND s.distribution_id = ? + WHERE s.address = ? AND s.device_id = ? AND s.distribution_id = ? """ ).formatted(TABLE_SENDER_KEY); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, key.serviceId().toByteArray()); + statement.setString(1, key.address()); statement.setInt(2, key.deviceId()); statement.setBytes(3, UuidUtil.toByteArray(key.distributionId())); return Utils.executeQueryForOptional(statement, this::getSenderKeyRecordFromResultSet).orElse(null); @@ -171,11 +170,11 @@ private void storeSenderKey( final var sqlUpdate = """ UPDATE %s SET record = ? - WHERE uuid = ? AND device_id = ? and distribution_id = ? + WHERE address = ? AND device_id = ? and distribution_id = ? """.formatted(TABLE_SENDER_KEY); try (final var statement = connection.prepareStatement(sqlUpdate)) { statement.setBytes(1, senderKeyRecord.serialize()); - statement.setBytes(2, key.serviceId().toByteArray()); + statement.setString(2, key.address()); statement.setLong(3, key.deviceId()); statement.setBytes(4, UuidUtil.toByteArray(key.distributionId())); final var rows = statement.executeUpdate(); @@ -187,12 +186,12 @@ private void storeSenderKey( // Record doesn't exist yet, creating a new one final var sqlInsert = ( """ - INSERT OR REPLACE INTO %s (uuid, device_id, distribution_id, record, created_timestamp) + INSERT OR REPLACE INTO %s (address, device_id, distribution_id, record, created_timestamp) VALUES (?, ?, ?, ?, ?) """ ).formatted(TABLE_SENDER_KEY); try (final var statement = connection.prepareStatement(sqlInsert)) { - statement.setBytes(1, key.serviceId().toByteArray()); + statement.setString(1, key.address()); statement.setInt(2, key.deviceId()); statement.setBytes(3, UuidUtil.toByteArray(key.distributionId())); statement.setBytes(4, senderKeyRecord.serialize()); @@ -205,11 +204,11 @@ private void deleteAllFor(final Connection connection, final ServiceId serviceId final var sql = ( """ DELETE FROM %s AS s - WHERE s.uuid = ? + WHERE s.address = ? """ ).formatted(TABLE_SENDER_KEY); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, serviceId.toString()); statement.executeUpdate(); } } @@ -225,5 +224,5 @@ final var record = resultSet.getBytes("record"); } } - record Key(ServiceId serviceId, int deviceId, UUID distributionId) {} + record Key(String address, int deviceId, UUID distributionId) {} } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java index 112c358c8943d..0b17d479147d3 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java @@ -30,11 +30,11 @@ public static void createSql(Connection connection) throws SQLException { statement.executeUpdate(""" CREATE TABLE sender_key_shared ( _id INTEGER PRIMARY KEY, - uuid BLOB NOT NULL, + address TEXT NOT NULL, device_id INTEGER NOT NULL, distribution_id BLOB NOT NULL, timestamp INTEGER NOT NULL, - UNIQUE(uuid, device_id, distribution_id) + UNIQUE(address, device_id, distribution_id) ) STRICT; """); } @@ -48,7 +48,7 @@ public Set getSenderKeySharedWith(final DistributionId di try (final var connection = database.getConnection()) { final var sql = ( """ - SELECT s.uuid, s.device_id + SELECT s.address, s.device_id FROM %s AS s WHERE s.distribution_id = ? """ @@ -56,7 +56,7 @@ public Set getSenderKeySharedWith(final DistributionId di try (final var statement = connection.prepareStatement(sql)) { statement.setBytes(1, UuidUtil.toByteArray(distributionId.asUuid())); return Utils.executeQueryForStream(statement, this::getSenderKeySharedEntryFromResultSet) - .map(k -> k.serviceId.toProtocolAddress(k.deviceId())) + .map(k -> new SignalProtocolAddress(k.address, k.deviceId())) .collect(Collectors.toSet()); } } catch (SQLException e) { @@ -68,7 +68,7 @@ public void markSenderKeySharedWith( final DistributionId distributionId, final Collection addresses ) { final var newEntries = addresses.stream() - .map(a -> new SenderKeySharedEntry(ServiceId.parseOrThrow(a.getName()), a.getDeviceId())) + .map(a -> new SenderKeySharedEntry(a.getName(), a.getDeviceId())) .collect(Collectors.toSet()); try (final var connection = database.getConnection()) { @@ -82,8 +82,7 @@ public void markSenderKeySharedWith( public void clearSenderKeySharedWith(final Collection addresses) { final var entriesToDelete = addresses.stream() - .filter(a -> UuidUtil.isUuid(a.getName())) - .map(a -> new SenderKeySharedEntry(ServiceId.parseOrThrow(a.getName()), a.getDeviceId())) + .map(a -> new SenderKeySharedEntry(a.getName(), a.getDeviceId())) .collect(Collectors.toSet()); try (final var connection = database.getConnection()) { @@ -91,12 +90,12 @@ public void clearSenderKeySharedWith(final Collection add final var sql = ( """ DELETE FROM %s AS s - WHERE uuid = ? AND device_id = ? + WHERE address = ? AND device_id = ? """ ).formatted(TABLE_SENDER_KEY_SHARED); try (final var statement = connection.prepareStatement(sql)) { for (final var entry : entriesToDelete) { - statement.setBytes(1, entry.serviceId().toByteArray()); + statement.setString(1, entry.address()); statement.setInt(2, entry.deviceId()); statement.executeUpdate(); } @@ -127,11 +126,11 @@ public void deleteAllFor(final ServiceId serviceId) { final var sql = ( """ DELETE FROM %s AS s - WHERE uuid = ? + WHERE address = ? """ ).formatted(TABLE_SENDER_KEY_SHARED); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, serviceId.toString()); statement.executeUpdate(); } } catch (SQLException e) { @@ -146,11 +145,11 @@ public void deleteSharedWith( final var sql = ( """ DELETE FROM %s AS s - WHERE uuid = ? AND device_id = ? AND distribution_id = ? + WHERE address = ? AND device_id = ? AND distribution_id = ? """ ).formatted(TABLE_SENDER_KEY_SHARED); try (final var statement = connection.prepareStatement(sql)) { - statement.setBytes(1, serviceId.toByteArray()); + statement.setString(1, serviceId.toString()); statement.setInt(2, deviceId); statement.setBytes(3, UuidUtil.toByteArray(distributionId.asUuid())); statement.executeUpdate(); @@ -197,13 +196,13 @@ private void markSenderKeysSharedWith( ) throws SQLException { final var sql = ( """ - INSERT OR REPLACE INTO %s (uuid, device_id, distribution_id, timestamp) + INSERT OR REPLACE INTO %s (address, device_id, distribution_id, timestamp) VALUES (?, ?, ?, ?) """ ).formatted(TABLE_SENDER_KEY_SHARED); try (final var statement = connection.prepareStatement(sql)) { for (final var entry : newEntries) { - statement.setBytes(1, entry.serviceId().toByteArray()); + statement.setString(1, entry.toString()); statement.setInt(2, entry.deviceId()); statement.setBytes(3, UuidUtil.toByteArray(distributionId.asUuid())); statement.setLong(4, System.currentTimeMillis()); @@ -213,10 +212,10 @@ private void markSenderKeysSharedWith( } private SenderKeySharedEntry getSenderKeySharedEntryFromResultSet(ResultSet resultSet) throws SQLException { - final var serviceId = ServiceId.parseOrThrow(resultSet.getBytes("uuid")); + final var address = resultSet.getString("address"); final var deviceId = resultSet.getInt("device_id"); - return new SenderKeySharedEntry(serviceId, deviceId); + return new SenderKeySharedEntry(address, deviceId); } - record SenderKeySharedEntry(ServiceId serviceId, int deviceId) {} + record SenderKeySharedEntry(String address, int deviceId) {} } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/LegacySessionStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/LegacySessionStore.java index 18372cf9415e6..bce6a8e139d04 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/LegacySessionStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/LegacySessionStore.java @@ -34,7 +34,7 @@ final var record = loadSessionLocked(key, sessionsPath); if (record == null || serviceId.isEmpty()) { return null; } - return new Pair<>(new SessionStore.Key(serviceId.get(), key.deviceId()), record); + return new Pair<>(new SessionStore.Key(serviceId.get().toString(), key.deviceId()), record); }).filter(Objects::nonNull).toList(); sessionStore.addLegacySessions(sessions); deleteAllSessions(sessionsPath); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/SessionStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/SessionStore.java index 0f26758315b19..b8c0a32256e1a 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/SessionStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/sessions/SessionStore.java @@ -6,15 +6,12 @@ import org.signal.libsignal.protocol.NoSessionException; import org.signal.libsignal.protocol.SignalProtocolAddress; import org.signal.libsignal.protocol.ecc.ECPublicKey; -import org.signal.libsignal.protocol.message.CiphertextMessage; import org.signal.libsignal.protocol.state.SessionRecord; -import org.signal.libsignal.protocol.util.Hex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalServiceSessionStore; import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceIdType; -import org.whispersystems.signalservice.api.util.UuidUtil; import java.sql.Connection; import java.sql.ResultSet; @@ -45,10 +42,10 @@ public static void createSql(Connection connection) throws SQLException { CREATE TABLE session ( _id INTEGER PRIMARY KEY, account_id_type INTEGER NOT NULL, - uuid BLOB NOT NULL, + address TEXT NOT NULL, device_id INTEGER NOT NULL, record BLOB NOT NULL, - UNIQUE(account_id_type, uuid, device_id) + UNIQUE(account_id_type, address, device_id) ) STRICT; """); } @@ -107,13 +104,13 @@ public List getSubDeviceSessions(String name) { """ SELECT s.device_id FROM %s AS s - WHERE s.account_id_type = ? AND s.uuid = ? AND s.device_id != 1 + WHERE s.account_id_type = ? AND s.address = ? AND s.device_id != 1 """ ).formatted(TABLE_SESSION); try (final var connection = database.getConnection()) { try (final var statement = connection.prepareStatement(sql)) { statement.setInt(1, accountIdType); - statement.setBytes(2, serviceId.toByteArray()); + statement.setString(2, serviceId.toString()); return Utils.executeQueryForStream(statement, res -> res.getInt("device_id")).toList(); } } catch (SQLException e) { @@ -122,7 +119,7 @@ public List getSubDeviceSessions(String name) { } public boolean isCurrentRatchetKey(ServiceId serviceId, int deviceId, ECPublicKey ratchetKey) { - final var key = new Key(serviceId, deviceId); + final var key = new Key(serviceId.toString(), deviceId); try (final var connection = database.getConnection()) { final var session = loadSession(connection, key); @@ -177,7 +174,7 @@ public void deleteAllSessions(String name) { public void deleteAllSessions(ServiceId serviceId) { try (final var connection = database.getConnection()) { - deleteAllSessions(connection, serviceId); + deleteAllSessions(connection, serviceId.toString()); } catch (SQLException e) { throw new RuntimeException("Failed update session store", e); } @@ -185,10 +182,6 @@ public void deleteAllSessions(ServiceId serviceId) { @Override public void archiveSession(final SignalProtocolAddress address) { - if (!UuidUtil.isUuid(address.getName())) { - return; - } - final var key = getKey(address); try (final var connection = database.getConnection()) { @@ -207,15 +200,13 @@ public void archiveSession(final SignalProtocolAddress address) { @Override public Set getAllAddressesWithActiveSessions(final List addressNames) { final var serviceIdsCommaSeparated = addressNames.stream() - .map(ServiceId::parseOrThrow) - .map(ServiceId::toByteArray) - .map(uuid -> "x'" + Hex.toStringCondensed(uuid) + "'") + .map(address -> "'" + address.replaceAll("'", "''") + "'") .collect(Collectors.joining(",")); final var sql = ( """ - SELECT s.uuid, s.device_id, s.record + SELECT s.address, s.device_id, s.record FROM %s AS s - WHERE s.account_id_type = ? AND s.uuid IN (%s) + WHERE s.account_id_type = ? AND s.address IN (%s) """ ).formatted(TABLE_SESSION, serviceIdsCommaSeparated); try (final var connection = database.getConnection()) { @@ -225,7 +216,7 @@ public Set getAllAddressesWithActiveSessions(final List new Pair<>(getKeyFromResultSet(res), getSessionRecordFromResultSet(res))) .filter(pair -> isActive(pair.second())) .map(Pair::first) - .map(key -> key.serviceId().toProtocolAddress(key.deviceId())) + .map(key -> new SignalProtocolAddress(key.address(), key.deviceId())) .collect(Collectors.toSet()); } } catch (SQLException e) { @@ -236,7 +227,7 @@ public Set getAllAddressesWithActiveSessions(final List> records; try (final var statement = connection.prepareStatement(sql)) { statement.setInt(1, accountIdType); - statement.setBytes(2, serviceId.toByteArray()); + statement.setString(2, serviceId.toString()); records = Utils.executeQueryForStream(statement, res -> new Pair<>(getKeyFromResultSet(res), getSessionRecordFromResultSet(res))) .filter(Objects::nonNull) @@ -306,8 +297,7 @@ void addLegacySessions(final Collection> sessions) { } private Key getKey(final SignalProtocolAddress address) { - final var serviceId = ServiceId.parseOrThrow(address.getName()); - return new Key(serviceId, address.getDeviceId()); + return new Key(address.getName(), address.getDeviceId()); } private SessionRecord loadSession(Connection connection, final Key key) throws SQLException { @@ -321,24 +311,24 @@ private SessionRecord loadSession(Connection connection, final Key key) throws S """ SELECT s.record FROM %s AS s - WHERE s.account_id_type = ? AND s.uuid = ? AND s.device_id = ? + WHERE s.account_id_type = ? AND s.address = ? AND s.device_id = ? """ ).formatted(TABLE_SESSION); try (final var statement = connection.prepareStatement(sql)) { statement.setInt(1, accountIdType); - statement.setBytes(2, key.serviceId().toByteArray()); + statement.setString(2, key.address()); statement.setInt(3, key.deviceId()); return Utils.executeQueryForOptional(statement, this::getSessionRecordFromResultSet).orElse(null); } } private Key getKeyFromResultSet(ResultSet resultSet) throws SQLException { - final var serviceId = ServiceId.parseOrThrow(resultSet.getBytes("uuid")); + final var address = resultSet.getString("address"); final var deviceId = resultSet.getInt("device_id"); - return new Key(serviceId, deviceId); + return new Key(address, deviceId); } - private SessionRecord getSessionRecordFromResultSet(ResultSet resultSet) throws SQLException { + private SessionRecord getSessionRecordFromResultSet(ResultSet resultSet) { try { final var record = resultSet.getBytes("record"); return new SessionRecord(record); @@ -356,19 +346,19 @@ private void storeSession( } final var sql = """ - INSERT OR REPLACE INTO %s (account_id_type, uuid, device_id, record) + INSERT OR REPLACE INTO %s (account_id_type, address, device_id, record) VALUES (?, ?, ?, ?) """.formatted(TABLE_SESSION); try (final var statement = connection.prepareStatement(sql)) { statement.setInt(1, accountIdType); - statement.setBytes(2, key.serviceId().toByteArray()); + statement.setString(2, key.address()); statement.setInt(3, key.deviceId()); statement.setBytes(4, session.serialize()); statement.executeUpdate(); } } - private void deleteAllSessions(final Connection connection, final ServiceId serviceId) throws SQLException { + private void deleteAllSessions(final Connection connection, final String address) throws SQLException { synchronized (cachedSessions) { cachedSessions.clear(); } @@ -376,12 +366,12 @@ private void deleteAllSessions(final Connection connection, final ServiceId serv final var sql = ( """ DELETE FROM %s AS s - WHERE s.account_id_type = ? AND s.uuid = ? + WHERE s.account_id_type = ? AND s.address = ? """ ).formatted(TABLE_SESSION); try (final var statement = connection.prepareStatement(sql)) { statement.setInt(1, accountIdType); - statement.setBytes(2, serviceId.toByteArray()); + statement.setString(2, address); statement.executeUpdate(); } } @@ -394,22 +384,20 @@ private void deleteSession(Connection connection, final Key key) throws SQLExcep final var sql = ( """ DELETE FROM %s AS s - WHERE s.account_id_type = ? AND s.uuid = ? AND s.device_id = ? + WHERE s.account_id_type = ? AND s.address = ? AND s.device_id = ? """ ).formatted(TABLE_SESSION); try (final var statement = connection.prepareStatement(sql)) { statement.setInt(1, accountIdType); - statement.setBytes(2, key.serviceId().toByteArray()); + statement.setString(2, key.address()); statement.setInt(3, key.deviceId()); statement.executeUpdate(); } } private static boolean isActive(SessionRecord record) { - return record != null - && record.hasSenderChain() - && record.getSessionVersion() == CiphertextMessage.CURRENT_VERSION; + return record != null && record.hasSenderChain(); } - record Key(ServiceId serviceId, int deviceId) {} + record Key(String address, int deviceId) {} } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/stickers/StickerStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/stickers/StickerStore.java index 6667d9789c9f3..aacd18bd57ba9 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/stickers/StickerStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/stickers/StickerStore.java @@ -10,6 +10,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; +import java.util.List; public class StickerStore { @@ -36,7 +37,7 @@ public StickerStore(final Database database) { this.database = database; } - public Collection getStickerPacks() { + public List getStickerPacks() { final var sql = ( """ SELECT s._id, s.pack_id, s.pack_key, s.installed diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/threads/LegacyJsonThreadStore.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/threads/LegacyJsonThreadStore.java index 7e5fd2423b284..428e9e9505951 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/threads/LegacyJsonThreadStore.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/storage/threads/LegacyJsonThreadStore.java @@ -25,7 +25,7 @@ public class LegacyJsonThreadStore { @JsonProperty("threads") @JsonSerialize(using = MapToListSerializer.class) @JsonDeserialize(using = ThreadsDeserializer.class) - private Map threads = new HashMap<>(); + private final Map threads = new HashMap<>(); public List getThreads() { return new ArrayList<>(threads.values()); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/KeyUtils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/KeyUtils.java index d87868eedf754..758831fc73e90 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/KeyUtils.java @@ -5,9 +5,11 @@ import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.ECPrivateKey; +import org.signal.libsignal.protocol.kem.KEMKeyPair; +import org.signal.libsignal.protocol.kem.KEMKeyType; +import org.signal.libsignal.protocol.state.KyberPreKeyRecord; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; -import org.signal.libsignal.protocol.util.Medium; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; import org.whispersystems.signalservice.api.kbs.MasterKey; @@ -17,6 +19,9 @@ import java.util.Base64; import java.util.List; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_BATCH_SIZE; +import static org.asamk.signal.manager.config.ServiceConfig.PREKEY_MAXIMUM_ID; + public class KeyUtils { private static final SecureRandom secureRandom = new SecureRandom(); @@ -43,10 +48,10 @@ public static IdentityKeyPair generateIdentityKeyPair() { return new IdentityKeyPair(djbIdentityKey, djbPrivateKey); } - public static List generatePreKeyRecords(final int offset, final int batchSize) { - var records = new ArrayList(batchSize); - for (var i = 0; i < batchSize; i++) { - var preKeyId = (offset + i) % Medium.MAX_VALUE; + public static List generatePreKeyRecords(final int offset) { + var records = new ArrayList(PREKEY_BATCH_SIZE); + for (var i = 0; i < PREKEY_BATCH_SIZE; i++) { + var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID; var keyPair = Curve.generateKeyPair(); var record = new PreKeyRecord(preKeyId, keyPair); @@ -56,18 +61,36 @@ var record = new PreKeyRecord(preKeyId, keyPair); } public static SignedPreKeyRecord generateSignedPreKeyRecord( - final IdentityKeyPair identityKeyPair, final int signedPreKeyId + final int signedPreKeyId, final ECPrivateKey privateKey ) { var keyPair = Curve.generateKeyPair(); byte[] signature; try { - signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize()); + signature = Curve.calculateSignature(privateKey, keyPair.getPublicKey().serialize()); } catch (InvalidKeyException e) { throw new AssertionError(e); } return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature); } + public static List generateKyberPreKeyRecords( + final int offset, final ECPrivateKey privateKey + ) { + var records = new ArrayList(PREKEY_BATCH_SIZE); + for (var i = 0; i < PREKEY_BATCH_SIZE; i++) { + var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID; + records.add(generateKyberPreKeyRecord(preKeyId, privateKey)); + } + return records; + } + + public static KyberPreKeyRecord generateKyberPreKeyRecord(final int preKeyId, final ECPrivateKey privateKey) { + KEMKeyPair keyPair = KEMKeyPair.generate(KEMKeyType.KYBER_1024); + byte[] signature = privateKey.calculateSignature(keyPair.getPublicKey().serialize()); + + return new KyberPreKeyRecord(preKeyId, System.currentTimeMillis(), keyPair, signature); + } + public static ProfileKey createProfileKey() { try { return new ProfileKey(getSecretBytes(32)); @@ -98,4 +121,8 @@ public static byte[] getSecretBytes(int size) { secureRandom.nextBytes(secret); return secret; } + + public static int getRandomInt(int bound) { + return secureRandom.nextInt(bound); + } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/MessageCacheUtils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/MessageCacheUtils.java index a7682682bce33..b3c9457baed7e 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/MessageCacheUtils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/MessageCacheUtils.java @@ -6,7 +6,7 @@ import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.util.UuidUtil; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.Envelope; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -34,7 +34,7 @@ public static SignalServiceEnvelope loadEnvelope(File file) throws IOException { } if (version >= 9) { final var serverReceivedTimestamp = in.readLong(); - final var envelope = SignalServiceProtos.Envelope.parseFrom(in.readAllBytes()); + final var envelope = Envelope.ADAPTER.decode(in.readAllBytes()); return new SignalServiceEnvelope(envelope, serverReceivedTimestamp); } else { var type = in.readInt(); @@ -69,7 +69,7 @@ public static SignalServiceEnvelope loadEnvelope(File file) throws IOException { if (version >= 2) { serverReceivedTimestamp = in.readLong(); uuid = in.readUTF(); - if ("".equals(uuid)) { + if (uuid.isEmpty()) { uuid = null; } } @@ -114,7 +114,7 @@ public static void storeEnvelope(SignalServiceEnvelope envelope, File file) thro try (var out = new DataOutputStream(f)) { out.writeInt(CURRENT_VERSION); // version out.writeLong(envelope.getServerDeliveredTimestamp()); - envelope.getProto().writeTo(out); + envelope.getProto().encode(out); } } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/NumberVerificationUtils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/NumberVerificationUtils.java index 3d733c163e3e0..62474e665460d 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/NumberVerificationUtils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/NumberVerificationUtils.java @@ -7,7 +7,8 @@ import org.asamk.signal.manager.api.PinLockedException; import org.asamk.signal.manager.api.RateLimitException; import org.asamk.signal.manager.helper.PinHelper; -import org.whispersystems.signalservice.api.KbsPinData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.kbs.MasterKey; import org.whispersystems.signalservice.api.push.exceptions.NoSuchSessionException; @@ -25,6 +26,8 @@ public class NumberVerificationUtils { + private final static Logger logger = LoggerFactory.getLogger(NumberVerificationUtils.class); + public static String handleVerificationSession( SignalServiceAccountManager accountManager, String sessionId, @@ -116,8 +119,7 @@ public static Pair verifyNumber( throw new PinLockedException(e.getTimeRemaining()); } - KbsPinData registrationLockData; - registrationLockData = pinHelper.getRegistrationLockData(pin, e); + final var registrationLockData = pinHelper.getRegistrationLockData(pin, e); if (registrationLockData == null) { throw e; } @@ -145,7 +147,7 @@ private static RegistrationSessionMetadataResponse validateSession( private static RegistrationSessionMetadataResponse requestValidSession( final SignalServiceAccountManager accountManager - ) throws NoSuchSessionException, IOException { + ) throws IOException { return Utils.handleResponseException(accountManager.createRegistrationSession(null, "", "")); } @@ -155,6 +157,7 @@ private static RegistrationSessionMetadataResponse getValidSession( try { return validateSession(accountManager, sessionId); } catch (NoSuchSessionException e) { + logger.debug("No registration session, creating new one."); return requestValidSession(accountManager); } } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/PaymentUtils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/PaymentUtils.java index 1471d8fed0bd1..ca55008c93ee5 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/PaymentUtils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/PaymentUtils.java @@ -1,14 +1,14 @@ package org.asamk.signal.manager.util; -import com.google.protobuf.ByteString; - import org.signal.libsignal.protocol.IdentityKey; import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.ecc.ECPrivateKey; import org.signal.libsignal.protocol.ecc.ECPublicKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.PaymentAddress; + +import okio.ByteString; public class PaymentUtils { @@ -20,16 +20,13 @@ private PaymentUtils() { /** * Signs the supplied address bytes with the {@link IdentityKeyPair}'s private key and returns a proto that includes it, and it's signature. */ - public static SignalServiceProtos.PaymentAddress signPaymentsAddress( + public static PaymentAddress signPaymentsAddress( byte[] publicAddressBytes, ECPrivateKey privateKey ) { byte[] signature = privateKey.calculateSignature(publicAddressBytes); - return SignalServiceProtos.PaymentAddress.newBuilder() - .setMobileCoinAddress(SignalServiceProtos.PaymentAddress.MobileCoinAddress.newBuilder() - .setAddress(ByteString.copyFrom(publicAddressBytes)) - .setSignature(ByteString.copyFrom(signature))) - .build(); + return new PaymentAddress.Builder().mobileCoinAddress(new PaymentAddress.MobileCoinAddress.Builder().address( + ByteString.of(publicAddressBytes)).signature(ByteString.of(signature)).build()).build(); } /** @@ -38,15 +35,16 @@ public static SignalServiceProtos.PaymentAddress signPaymentsAddress( * Returns the validated bytes if so, otherwise returns null. */ public static byte[] verifyPaymentsAddress( - SignalServiceProtos.PaymentAddress paymentAddress, ECPublicKey publicKey + PaymentAddress paymentAddress, ECPublicKey publicKey ) { - if (!paymentAddress.hasMobileCoinAddress()) { + final var mobileCoinAddress = paymentAddress.mobileCoinAddress; + if (mobileCoinAddress == null || mobileCoinAddress.address == null || mobileCoinAddress.signature == null) { logger.debug("Got payment address without mobile coin address, ignoring."); return null; } - byte[] bytes = paymentAddress.getMobileCoinAddress().getAddress().toByteArray(); - byte[] signature = paymentAddress.getMobileCoinAddress().getSignature().toByteArray(); + byte[] bytes = mobileCoinAddress.address.toByteArray(); + byte[] signature = mobileCoinAddress.signature.toByteArray(); if (signature.length != 64 || !publicKey.verifySignature(bytes, signature)) { logger.debug("Got mobile coin address with invalid signature, ignoring."); diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/ProfileUtils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/ProfileUtils.java index cfbfc3ccdcaf5..40fc8f7b2c287 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/ProfileUtils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/ProfileUtils.java @@ -1,7 +1,5 @@ package org.asamk.signal.manager.util; -import com.google.protobuf.InvalidProtocolBufferException; - import org.asamk.signal.manager.api.Pair; import org.asamk.signal.manager.api.Profile; import org.signal.libsignal.protocol.IdentityKey; @@ -13,7 +11,7 @@ import org.whispersystems.signalservice.api.crypto.InvalidCiphertextException; import org.whispersystems.signalservice.api.crypto.ProfileCipher; import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; -import org.whispersystems.signalservice.internal.push.SignalServiceProtos; +import org.whispersystems.signalservice.internal.push.PaymentAddress; import java.io.IOException; import java.util.Base64; @@ -117,10 +115,10 @@ private static byte[] decryptAndVerifyMobileCoinAddress( return null; } - SignalServiceProtos.PaymentAddress paymentAddress; + PaymentAddress paymentAddress; try { - paymentAddress = SignalServiceProtos.PaymentAddress.parseFrom(decrypted); - } catch (InvalidProtocolBufferException e) { + paymentAddress = PaymentAddress.ADAPTER.decode(decrypted); + } catch (IOException e) { logger.debug("Failed to parse payment address", e); return null; } diff --git a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/Utils.java b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/Utils.java index 16e80e453f663..6e9c701e13cdd 100644 --- a/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/Utils.java +++ b/bundles/org.openhab.binding.signal/src/3rdparty/java/org/asamk/signal/manager/util/Utils.java @@ -25,6 +25,8 @@ import java.util.Spliterators; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -122,6 +124,10 @@ public boolean tryAdvance(Consumer action) { }, leftStream.isParallel() || rightStream.isParallel()); } + public static Map mapKeys(Map map, Function keyMapper) { + return map.entrySet().stream().collect(Collectors.toMap(e -> keyMapper.apply(e.getKey()), Map.Entry::getValue)); + } + public static Map getQueryMap(String query) { var params = query.split("&"); var map = new HashMap(); diff --git a/bundles/org.openhab.binding.signal/src/main/java/org/openhab/binding/signal/internal/protocol/SignalService.java b/bundles/org.openhab.binding.signal/src/main/java/org/openhab/binding/signal/internal/protocol/SignalService.java index 18c5b5b6db5bc..bad8bf6c114d7 100644 --- a/bundles/org.openhab.binding.signal/src/main/java/org/openhab/binding/signal/internal/protocol/SignalService.java +++ b/bundles/org.openhab.binding.signal/src/main/java/org/openhab/binding/signal/internal/protocol/SignalService.java @@ -265,13 +265,9 @@ public void stop() { if (finalMessageReceiverThread != null) { finalMessageReceiverThread.stopReceiving(); } - try { - Manager managerFinal = manager; - if (managerFinal != null) { - managerFinal.close(); - } - } catch (IOException e) { - logger.info("Error closing signal manager for {}. Reason : {}", phoneNumber, e.getMessage()); + Manager managerFinal = manager; + if (managerFinal != null) { + managerFinal.close(); } } diff --git a/bundles/org.openhab.binding.signal/src/main/resources/lib/apple/aarch64/libsignal_jni.dylib b/bundles/org.openhab.binding.signal/src/main/resources/lib/apple/aarch64/libsignal_jni.dylib index 0de3edc3d4b198d6c47bc07f57de58765c968c1a..30a78ab0908768b3693dc3773058042a18f857b3 100644 GIT binary patch literal 3976080 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∓3>Lb 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

+voa*ax!yBPj@ov2r zUfu?;Hf6BsH>ym4wFI9U{4u?3R~mYmTV8tEYX{oay6sALs-jLedf6^lFWV3PDfiKS z@Ne(LV7M6^RGTioxq8_jxc|^?dl9}(W<2O+(s!*u@M+i0S(~l}<{|9egjK?~dh}XJ&Q5we`WLtoq8(hIgIokb=jZ*f6QSN_il*RlX&i_hdM?;Rl?!IBZ z-^dJY(BoC;fNEEMkfuH7?8f}&>_+YB?8f}(>_)gNJC*s**-bhBWs5R-?{t1cTju=c zi9UwL6KNmX4;3y=Z~dC^M*Et<8+%`y-4Sn`e1Z{te+u9lQrPF68g>UN}9{yFAw}W%T9UguI&%Q+Ywr#!0sWy=PV-WkuVD=N@DOL>Oyg_l* zaogIa05TV!+wPW4*5=`*;)h?!4NG@3Je>F9;eFVrpQcP3bFNaEvTIt6%@bJ+ALH7} zgzQ>uS#@4pmh_;jm}g{&BguH2&a z-#a$ZmRkbIEi+hO>b@ChFSlHa4&%0ApJ6aY)-|%v3ca=2jg|0)_VU~C=*0e^rTrzl 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

00Dqi1^Y&E18Sv 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

l3tvpcjKAjO~Jh0 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�O|r(1-3?B0Jl8q$77)$Tv^ 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

    k9h&W%-@L4zGpp=}wM?+#Lj+nHgZ*_W{>I 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

q)=yAn;!= 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