From e2ad23482d1c684aab17f063b4836f77a95c2e3b Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Tue, 27 Apr 2021 14:36:03 +1000 Subject: [PATCH] Resolve various loose ends --- .../securesms/ApplicationContext.java | 17 +++++----- .../loki/api/BackgroundPollWorker.kt | 8 ++--- .../loki/api/PushNotificationService.kt | 2 +- .../pollers/ClosedGroupPoller.kt | 2 +- .../sending_receiving/pollers/Poller.kt | 2 +- .../messaging/utilities/MessageWrapper.kt | 5 +-- .../org/session/libsession/snode/SnodeAPI.kt | 31 ++++++++++++++++--- 7 files changed, 46 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index c3fe5895a7..e5b8b7fd5a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -32,6 +32,7 @@ import androidx.multidex.MultiDexApplication; import org.conscrypt.Conscrypt; import org.session.libsession.messaging.MessagingModuleConfiguration; import org.session.libsession.messaging.avatars.AvatarHelper; +import org.session.libsession.messaging.file_server.FileServerAPI; import org.session.libsession.messaging.jobs.JobQueue; import org.session.libsession.messaging.mentions.MentionsManager; import org.session.libsession.messaging.open_groups.OpenGroupAPI; @@ -93,6 +94,7 @@ import org.webrtc.voiceengine.WebRtcAudioUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.security.SecureRandom; import java.security.Security; import java.util.Date; import java.util.HashSet; @@ -420,7 +422,7 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc } byte[] userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(this).getPrivateKey().serialize(); LokiAPIDatabaseProtocol apiDB = DatabaseFactory.getLokiAPIDatabase(this); - org.session.libsession.messaging.file_server.FileServerAPI.Companion.configure(userPublicKey, userPrivateKey, apiDB); + FileServerAPI.Companion.configure(userPublicKey, userPrivateKey, apiDB); return true; } @@ -492,13 +494,12 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc try { File profilePicture = AvatarHelper.getAvatarFile(this, Address.fromSerialized(userPublicKey)); StreamDetails stream = new StreamDetails(new FileInputStream(profilePicture), "image/jpeg", profilePicture.length()); - throw new IOException(); -// FileServerAPI.uploadProfilePicture(FileServerAPI.shared.getServer(), profileKey, stream, () -> { -// TextSecurePreferences.setLastProfilePictureUpload(this, new Date().getTime()); -// TextSecurePreferences.setProfileAvatarId(this, new SecureRandom().nextInt()); -// ProfileKeyUtil.setEncodedProfileKey(this, encodedProfileKey); -// return Unit.INSTANCE; -// }); + FileServerAPI.shared.uploadProfilePicture(FileServerAPI.shared.getServer(), profileKey, stream, () -> { + TextSecurePreferences.setLastProfilePictureUpload(this, new Date().getTime()); + TextSecurePreferences.setProfileAvatarId(this, new SecureRandom().nextInt()); + ProfileKeyUtil.setEncodedProfileKey(this, encodedProfileKey); + return Unit.INSTANCE; + }); } catch (Exception exception) { // Do nothing } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt index 9622750503..0501b0be36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt @@ -7,6 +7,7 @@ import androidx.work.* import nl.komponents.kovenant.Promise import nl.komponents.kovenant.all import nl.komponents.kovenant.functional.map +import org.session.libsession.messaging.jobs.MessageReceiveJob import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPoller import org.session.libsession.snode.SnodeAPI @@ -71,10 +72,9 @@ class BackgroundPollWorker(val context: Context, params: WorkerParameters) : Wor // Private chats val userPublicKey = TextSecurePreferences.getLocalNumber(context)!! val privateChatsPromise = SnodeAPI.getMessages(userPublicKey).map { envelopes -> - throw IOException() -// envelopes.map { envelope -> -// MessageReceiveJob(envelope.toByteArray(), false).executeAsync() -// } + envelopes.map { envelope -> + MessageReceiveJob(envelope.toByteArray(), false).executeAsync() + } } promises.addAll(privateChatsPromise.get()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt index 5e5305103a..ebe9baf29c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt @@ -27,7 +27,7 @@ class PushNotificationService : FirebaseMessagingService() { val data = base64EncodedData?.let { Base64.decode(it) } if (data != null) { try { - JobQueue.shared.add(MessageReceiveJob(MessageWrapper.unwrap(data),true)) + JobQueue.shared.add(MessageReceiveJob(MessageWrapper.unwrap(data).toByteArray(),true)) } catch (e: Exception) { Log.d("Loki", "Failed to unwrap data for message due to error: $e.") } diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPoller.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPoller.kt index e6d68911d3..3c1b6de032 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPoller.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/ClosedGroupPoller.kt @@ -78,7 +78,7 @@ class ClosedGroupPoller { val rawMessageAsJSON = message as? Map<*, *> val base64EncodedData = rawMessageAsJSON?.get("data") as? String val data = base64EncodedData?.let { Base64.decode(it) } ?: return@forEach - val job = MessageReceiveJob(MessageWrapper.unwrap(data), false) + val job = MessageReceiveJob(MessageWrapper.unwrap(data).toByteArray(), false) 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 cbbb1b831c..5a862d89af 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 @@ -97,7 +97,7 @@ class Poller { val rawMessageAsJSON = message as? Map<*, *> val base64EncodedData = rawMessageAsJSON?.get("data") as? String val data = base64EncodedData?.let { Base64.decode(it) } ?: return@forEach - val job = MessageReceiveJob(MessageWrapper.unwrap(data), false) + val job = MessageReceiveJob(MessageWrapper.unwrap(data).toByteArray(), false) JobQueue.shared.add(job) } poll(snode, deferred) diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt index b11cbe1774..767e4beffe 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/MessageWrapper.kt @@ -1,6 +1,7 @@ package org.session.libsession.messaging.utilities import com.google.protobuf.ByteString +import org.session.libsignal.metadata.SignalProtos import org.session.libsignal.utilities.logging.Log import org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope import org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage @@ -69,11 +70,11 @@ object MessageWrapper { /** * `data` shouldn't be base 64 encoded. */ - fun unwrap(data: ByteArray): ByteArray { + fun unwrap(data: ByteArray): Envelope { try { val webSocketMessage = WebSocketMessage.parseFrom(data) val envelopeAsData = webSocketMessage.request.body - return envelopeAsData.toByteArray() + return Envelope.parseFrom(envelopeAsData); } catch (e: Exception) { Log.d("Loki", "Failed to unwrap data: ${e.message}.") throw Error.FailedToUnwrapData 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 5a0baa90b5..afb3050d99 100644 --- a/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt +++ b/libsession/src/main/java/org/session/libsession/snode/SnodeAPI.kt @@ -6,7 +6,9 @@ import android.os.Build import nl.komponents.kovenant.* import nl.komponents.kovenant.functional.bind import nl.komponents.kovenant.functional.map +import org.session.libsession.messaging.utilities.MessageWrapper import org.session.libsession.snode.utilities.getRandomElement +import org.session.libsignal.service.internal.push.SignalServiceProtos import org.session.libsignal.service.loki.Snode import org.session.libsignal.service.loki.api.utilities.HTTP import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol @@ -226,13 +228,14 @@ 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) - removeDuplicates(publicKey, messages) + val newRawMessages = removeDuplicates(publicKey, messages) + return parseEnvelopes(newRawMessages); } else { - listOf>() + listOf() } } @@ -263,6 +266,26 @@ object SnodeAPI { } } + 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) + } catch (e: Exception) { + Log.d("Loki", "Failed to unwrap data for message: ${rawMessage.prettifiedDescription()}.") + null + } + } else { + Log.d("Loki", "Failed to decode data for message: ${rawMessage?.prettifiedDescription()}.") + null + } + } + } + // endregion + // Error Handling internal fun handleSnodeError(statusCode: Int, json: Map<*, *>?, snode: Snode, publicKey: String? = null): Exception? { fun handleBadSnode() { @@ -310,5 +333,5 @@ object SnodeAPI { // Type Aliases typealias RawResponse = Map<*, *> -typealias MessageListPromise = Promise, Exception> +typealias MessageListPromise = Promise, Exception> typealias RawResponsePromise = Promise