From d0f6bfea82a349bd5294d05b844773b93fe4ad11 Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Fri, 5 Dec 2025 10:28:56 +1100 Subject: [PATCH 1/6] Fixed incorrect usage of lazy (#1760) --- .../sending_receiving/ReceivedMessageProcessor.kt | 6 +++--- .../session/libsession/snode/model/MessageResponses.kt | 2 +- .../java/org/session/libsession/utilities/Address.kt | 9 ++++----- .../org/thoughtcrime/securesms/auth/LoggedInState.kt | 10 +++++----- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt index c4137655d1..935ec2d2d7 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt @@ -39,9 +39,9 @@ import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.recipients.MessageType import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.getType -import org.session.libsignal.protos.SignalServiceProtos import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log +import org.session.protos.SessionProtos import org.thoughtcrime.securesms.database.BlindMappingRepository import org.thoughtcrime.securesms.database.RecipientRepository import org.thoughtcrime.securesms.database.Storage @@ -515,7 +515,7 @@ class ReceivedMessageProcessor @Inject constructor( var maxOutgoingMessageTimestamp: Long = 0L - val currentUserEd25519KeyPair: KeyPair by lazy(LazyThreadSafetyMode.NONE) { + val currentUserEd25519KeyPair: KeyPair by lazy { requireNotNull(storage.getUserED25519KeyPair()) { "No current user ED25519 key pair available" } @@ -524,7 +524,7 @@ class ReceivedMessageProcessor @Inject constructor( val currentUserPublicKey: String get() = currentUserId.hexString - val contactConfigTimestamp: Long by lazy(LazyThreadSafetyMode.NONE) { + val contactConfigTimestamp: Long by lazy { configFactory.getConfigTimestamp(UserConfigType.CONTACTS, currentUserPublicKey) } diff --git a/app/src/main/java/org/session/libsession/snode/model/MessageResponses.kt b/app/src/main/java/org/session/libsession/snode/model/MessageResponses.kt index 2c7b6f6d7e..35ec0f25cf 100644 --- a/app/src/main/java/org/session/libsession/snode/model/MessageResponses.kt +++ b/app/src/main/java/org/session/libsession/snode/model/MessageResponses.kt @@ -34,7 +34,7 @@ data class RetrieveMessageResponse( @SerialName("data") val dataB64: String? = null, ) { - val data: ByteArray by lazy(LazyThreadSafetyMode.NONE) { + val data: ByteArray by lazy { Base64.decode(dataB64, Base64.DEFAULT) } diff --git a/app/src/main/java/org/session/libsession/utilities/Address.kt b/app/src/main/java/org/session/libsession/utilities/Address.kt index f94c823de4..0b72327c7d 100644 --- a/app/src/main/java/org/session/libsession/utilities/Address.kt +++ b/app/src/main/java/org/session/libsession/utilities/Address.kt @@ -8,10 +8,9 @@ import kotlinx.serialization.Serializable import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.IdPrefix +import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.Util import java.util.LinkedList -import org.session.libsignal.utilities.Log -import kotlin.text.startsWith @Serializable(with = AddressSerializer::class) sealed interface Address : Parcelable, Comparable
{ @@ -81,7 +80,7 @@ sealed interface Address : Parcelable, Comparable { } data class LegacyGroup(val groupPublicKeyHex: String) : Conversable, GroupLike { - override val address: String by lazy(LazyThreadSafetyMode.NONE) { + override val address: String by lazy { GroupUtil.doubleEncodeGroupID(groupPublicKeyHex) } @@ -101,7 +100,7 @@ sealed interface Address : Parcelable, Comparable { override val accountId: AccountId get() = blindedId.blindedId - override val address: String by lazy(LazyThreadSafetyMode.NONE) { + override val address: String by lazy { "${URI_PREFIX}${blindedId.blindedId.hexString}" .toUri() .buildUpon() @@ -136,7 +135,7 @@ sealed interface Address : Parcelable, Comparable { } } - override val address: String by lazy(LazyThreadSafetyMode.NONE) { + override val address: String by lazy { "${URI_PREFIX}${Uri.encode(serverUrl)}" .toUri() .buildUpon() diff --git a/app/src/main/java/org/thoughtcrime/securesms/auth/LoggedInState.kt b/app/src/main/java/org/thoughtcrime/securesms/auth/LoggedInState.kt index 539ac1113b..79c332d4cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/auth/LoggedInState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/auth/LoggedInState.kt @@ -42,23 +42,23 @@ data class LoggedInState( } } - private val paddedSeed: ByteArray by lazy(LazyThreadSafetyMode.NONE) { + private val paddedSeed: ByteArray by lazy { seed.data + ByteArray(16) } - val accountEd25519KeyPair: KeyPair by lazy(LazyThreadSafetyMode.NONE) { + val accountEd25519KeyPair: KeyPair by lazy { ED25519.generate(paddedSeed) } - val accountX25519KeyPair: KeyPair by lazy(LazyThreadSafetyMode.NONE) { + val accountX25519KeyPair: KeyPair by lazy { Curve25519.fromED25519(accountEd25519KeyPair) } - val accountId: AccountId by lazy(LazyThreadSafetyMode.NONE) { + val accountId: AccountId by lazy { AccountId(IdPrefix.STANDARD, accountX25519KeyPair.pubKey.data) } - val proMasterPrivateKey: ByteArray by lazy(LazyThreadSafetyMode.NONE) { + val proMasterPrivateKey: ByteArray by lazy { ED25519.generateProMasterKey(paddedSeed) } From 0ee1253c6a354c3bc2f9c14f226ae072f3a8b35b Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:34:27 +1100 Subject: [PATCH 2/6] Fixed compile errors after cherry picking --- .../messaging/sending_receiving/ReceivedMessageProcessor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt index 935ec2d2d7..cdb269e165 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt @@ -39,9 +39,9 @@ import org.session.libsession.utilities.UserConfigType import org.session.libsession.utilities.recipients.MessageType import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.getType +import org.session.libsignal.protos.SignalServiceProtos import org.session.libsignal.utilities.AccountId import org.session.libsignal.utilities.Log -import org.session.protos.SessionProtos import org.thoughtcrime.securesms.database.BlindMappingRepository import org.thoughtcrime.securesms.database.RecipientRepository import org.thoughtcrime.securesms.database.Storage From cb1bd3c38a8cdf982dea6d406fad80d54283a790 Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:44:10 +1100 Subject: [PATCH 3/6] Update to latest libsession-util to fix crashes --- .../libsession/messaging/sending_receiving/MessageParser.kt | 6 ++---- gradle/libs.versions.toml | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt index 9caf81ae8b..73eed4bb7b 100644 --- a/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt +++ b/app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageParser.kt @@ -177,7 +177,6 @@ class MessageParser @Inject constructor( val envelop = SessionProtocol.decodeFor1o1( myEd25519PrivKey = currentUserEd25519PrivKey, payload = data, - nowEpochMs = snodeClock.currentTimeMills(), proBackendPubKey = proBackendKey, ) @@ -208,7 +207,6 @@ class MessageParser @Inject constructor( val decoded = SessionProtocol.decodeForGroup( payload = data, myEd25519PrivKey = currentUserEd25519PrivKey, - nowEpochMs = snodeClock.currentTimeMills(), groupEd25519PublicKey = groupId.pubKeyBytes, groupEd25519PrivateKeys = keys.toTypedArray(), proBackendPubKey = proBackendKey @@ -238,7 +236,7 @@ class MessageParser @Inject constructor( val decoded = SessionProtocol.decodeForCommunity( payload = Base64.decode(msg.data), - nowEpochMs = snodeClock.currentTimeMills(), + timestampMs = snodeClock.currentTimeMills(), proBackendPubKey = proBackendKey, ) @@ -276,7 +274,7 @@ class MessageParser @Inject constructor( val decoded = SessionProtocol.decodeForCommunity( payload = plaintext.data, - nowEpochMs = snodeClock.currentTimeMills(), + timestampMs = snodeClock.currentTimeMills(), proBackendPubKey = proBackendKey, ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 61cad22b2d..f11a63dbd7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ kotlinVersion = "2.2.21" kryoVersion = "5.6.2" kspVersion = "2.3.3" legacySupportV13Version = "1.0.0" -libsessionUtilAndroidVersion = "1.0.9-7-g7866645" +libsessionUtilAndroidVersion = "1.1.0-2-g39d4ac8" media3ExoplayerVersion = "1.8.0" mockitoCoreVersion = "5.20.0" navVersion = "2.9.5" From db34f93160f37eef575e3561e3947d9cf55bbada Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:45:37 +1100 Subject: [PATCH 4/6] Disable pro details fetching --- .../thoughtcrime/securesms/pro/FetchProDetailsWorker.kt | 7 +++++++ .../org/thoughtcrime/securesms/pro/ProDetailsRepository.kt | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt index 3df0e146d3..2140886556 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/FetchProDetailsWorker.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.mapNotNull import org.session.libsession.snode.SnodeClock import org.session.libsession.utilities.ConfigFactoryProtocol +import org.session.libsession.utilities.TextSecurePreferences import org.session.libsignal.exceptions.NonRetryableException import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository @@ -48,8 +49,14 @@ class FetchProDetailsWorker @AssistedInject constructor( private val loginStateRepository: LoginStateRepository, private val snodeClock: SnodeClock, private val configFactory: ConfigFactoryProtocol, + private val prefs: TextSecurePreferences, ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { + if (!prefs.forcePostPro()) { + Log.d(TAG, "Pro details fetch skipped because pro is not enabled") + return Result.success() + } + val proMasterKey = requireNotNull(loginStateRepository.peekLoginState()?.seeded?.proMasterPrivateKey) { "User must be logged in to fetch pro details" diff --git a/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt index c674d04cbc..97a52d7844 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pro/ProDetailsRepository.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import org.session.libsession.snode.SnodeClock +import org.session.libsession.utilities.TextSecurePreferences import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.debugmenu.DebugLogGroup @@ -29,6 +30,7 @@ class ProDetailsRepository @Inject constructor( private val snodeClock: SnodeClock, @ManagerScope scope: CoroutineScope, loginStateRepository: LoginStateRepository, + private val prefs: TextSecurePreferences, ) { sealed interface LoadState { val lastUpdated: Pair