From ecc881bc7cb758a38e34b2f2ca6db6e220847fdf Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Tue, 17 Aug 2021 14:34:49 +1000 Subject: [PATCH] store server hash value for incoming messages --- .../securesms/conversation/v2/ConversationActivityV2.kt | 2 +- .../java/org/thoughtcrime/securesms/database/Storage.kt | 5 +++++ .../securesms/notifications/BackgroundPollWorker.kt | 4 ++-- .../libsession/messaging/jobs/MessageReceiveJob.kt | 6 +++++- .../sending_receiving/pollers/ClosedGroupPollerV2.kt | 4 ++-- .../messaging/sending_receiving/pollers/Poller.kt | 4 ++-- .../main/java/org/session/libsession/snode/SnodeAPI.kt | 8 ++++---- 7 files changed, 21 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 0d37e0ac54..fec9dcc558 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -1138,7 +1138,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe private fun deleteLocally(message: MessageRecord) { buildUsendRequest(message)?.let { unsendRequest -> - TextSecurePreferences.getLocalNumber(this)?.let { + TextSecurePreferences.getLocalNumber(this@ConversationActivityV2)?.let { MessageSender.send(unsendRequest, Address.fromSerialized(it)) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 66332bed60..950b6d8238 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -148,6 +148,11 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, if (openGroupID.isNullOrEmpty() && threadID != null && threadID >= 0) { JobQueue.shared.add(TrimThreadJob(threadID)) } + message.serverHash?.let { serverHash -> + messageID?.let { id -> + DatabaseFactory.getLokiMessageDatabase(context).setMessageServerHash(id, serverHash) + } + } return messageID } diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/BackgroundPollWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/BackgroundPollWorker.kt index afd4ad74a8..d6b1267528 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/BackgroundPollWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/BackgroundPollWorker.kt @@ -49,9 +49,9 @@ class BackgroundPollWorker(val context: Context, params: WorkerParameters) : Wor // DMs val userPublicKey = TextSecurePreferences.getLocalNumber(context)!! val dmsPromise = SnodeAPI.getMessages(userPublicKey).map { envelopes -> - envelopes.map { envelope -> + envelopes.map { (envelope, serverHash) -> // FIXME: Using a job here seems like a bad idea... - MessageReceiveJob(envelope.toByteArray()).executeAsync() + MessageReceiveJob(envelope.toByteArray(), serverHash).executeAsync() } } promises.addAll(dmsPromise.get()) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt index 923e48a83f..0601c670af 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt @@ -7,7 +7,7 @@ import org.session.libsession.messaging.sending_receiving.handle import org.session.libsession.messaging.utilities.Data import org.session.libsignal.utilities.Log -class MessageReceiveJob(val data: ByteArray, val openGroupMessageServerID: Long? = null, val openGroupID: String? = null) : Job { +class MessageReceiveJob(val data: ByteArray, val serverHash: String? = null, val openGroupMessageServerID: Long? = null, val openGroupID: String? = null) : Job { override var delegate: JobDelegate? = null override var id: String? = null override var failureCount: Int = 0 @@ -21,6 +21,7 @@ class MessageReceiveJob(val data: ByteArray, val openGroupMessageServerID: Long? // Keys used for database storage private val DATA_KEY = "data" + private val SERVER_HASH_KEY = "serverHash" private val OPEN_GROUP_MESSAGE_SERVER_ID_KEY = "openGroupMessageServerID" private val OPEN_GROUP_ID_KEY = "open_group_id" } @@ -34,6 +35,7 @@ class MessageReceiveJob(val data: ByteArray, val openGroupMessageServerID: Long? try { val isRetry: Boolean = failureCount != 0 val (message, proto) = MessageReceiver.parse(this.data, this.openGroupMessageServerID) + message.serverHash = serverHash synchronized(RECEIVE_LOCK) { // FIXME: Do we need this? MessageReceiver.handle(message, proto, this.openGroupID) } @@ -67,6 +69,7 @@ class MessageReceiveJob(val data: ByteArray, val openGroupMessageServerID: Long? override fun serialize(): Data { val builder = Data.Builder().putByteArray(DATA_KEY, data) + serverHash?.let { builder.putString(SERVER_HASH_KEY, it) } openGroupMessageServerID?.let { builder.putLong(OPEN_GROUP_MESSAGE_SERVER_ID_KEY, it) } openGroupID?.let { builder.putString(OPEN_GROUP_ID_KEY, it) } return builder.build(); @@ -81,6 +84,7 @@ class MessageReceiveJob(val data: ByteArray, val openGroupMessageServerID: Long? override fun create(data: Data): MessageReceiveJob { return MessageReceiveJob( data.getByteArray(DATA_KEY), + data.getString(SERVER_HASH_KEY), data.getLong(OPEN_GROUP_MESSAGE_SERVER_ID_KEY), data.getString(OPEN_GROUP_ID_KEY) ) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPollerV2.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPollerV2.kt index 62e39b40f1..f165c97540 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPollerV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPollerV2.kt @@ -102,8 +102,8 @@ class ClosedGroupPollerV2 { } promise.success { envelopes -> if (!isPolling(groupPublicKey)) { return@success } - envelopes.forEach { envelope -> - val job = MessageReceiveJob(envelope.toByteArray()) + envelopes.forEach { (envelope, serverHash) -> + val job = MessageReceiveJob(envelope.toByteArray(), serverHash) JobQueue.shared.add(job) } } diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt index bbf2620f97..be472874d0 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt @@ -91,8 +91,8 @@ class Poller { task { Unit } // The long polling connection has been canceled; don't recurse } else { val messages = SnodeAPI.parseRawMessagesResponse(rawResponse, snode, userPublicKey) - messages.forEach { envelope -> - val job = MessageReceiveJob(envelope.toByteArray()) + messages.forEach { (envelope, serverHash) -> + val job = MessageReceiveJob(envelope.toByteArray(), serverHash) JobQueue.shared.add(job) } poll(snode, deferred) diff --git a/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt b/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt index 3bc826970e..dfbc6c34da 100644 --- a/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt +++ b/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt @@ -426,7 +426,7 @@ object SnodeAPI { } } - fun parseRawMessagesResponse(rawResponse: RawResponse, snode: Snode, publicKey: String): List { + fun parseRawMessagesResponse(rawResponse: RawResponse, snode: Snode, publicKey: String): List> { val messages = rawResponse["messages"] as? List<*> return if (messages != null) { updateLastMessageHashValueIfPossible(snode, publicKey, messages) @@ -465,14 +465,14 @@ object SnodeAPI { return result } - private fun parseEnvelopes(rawMessages: List<*>): List { + private fun parseEnvelopes(rawMessages: List<*>): List> { return rawMessages.mapNotNull { rawMessage -> val rawMessageAsJSON = rawMessage as? Map<*, *> val base64EncodedData = rawMessageAsJSON?.get("data") as? String val data = base64EncodedData?.let { Base64.decode(it) } if (data != null) { try { - MessageWrapper.unwrap(data) + Pair(MessageWrapper.unwrap(data), rawMessageAsJSON.get("hash") as? String) } catch (e: Exception) { Log.d("Loki", "Failed to unwrap data for message: ${rawMessage.prettifiedDescription()}.") null @@ -568,5 +568,5 @@ object SnodeAPI { // Type Aliases typealias RawResponse = Map<*, *> -typealias MessageListPromise = Promise, Exception> +typealias MessageListPromise = Promise>, Exception> typealias RawResponsePromise = Promise