feat: re-add bencode utility and fix tests to use bytearray instead of assuming utf-8 encoding for strings

This commit is contained in:
0x330a
2022-10-28 15:17:18 +11:00
parent 7762d534bb
commit d2e80c3157
5 changed files with 323 additions and 3 deletions

View File

@@ -19,11 +19,16 @@ import okhttp3.RequestBody
import org.session.libsession.messaging.sending_receiving.notifications.PushNotificationAPI
import org.session.libsession.messaging.sending_receiving.notifications.SubscriptionRequest
import org.session.libsession.messaging.sending_receiving.notifications.SubscriptionResponse
import org.session.libsession.messaging.utilities.SodiumUtilities
import org.session.libsession.snode.OnionRequestAPI
import org.session.libsession.snode.SnodeAPI
import org.session.libsession.snode.Version
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.TextSecurePreferences.Companion.getLocalNumber
import org.session.libsession.utilities.bencode.Bencode
import org.session.libsession.utilities.bencode.BencodeDict
import org.session.libsession.utilities.bencode.BencodeList
import org.session.libsession.utilities.bencode.BencodeString
import org.session.libsignal.utilities.Base64
import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.Namespace
@@ -55,6 +60,37 @@ class FirebasePushManager(private val context: Context, private val prefs: TextS
)
}
fun decrypt(encPayload: ByteArray) {
val encKey = getOrCreateNotificationKey()
val nonce = encPayload.take(AEAD.XCHACHA20POLY1305_IETF_NPUBBYTES).toByteArray()
val payload = encPayload.drop(AEAD.XCHACHA20POLY1305_IETF_NPUBBYTES).toByteArray()
val decrypted = SodiumUtilities.decrypt(payload, encKey.asBytes, nonce)
?: return Log.e("Loki", "Failed to decrypt push notification")
val bencoded = Bencode.Decoder(decrypted)
val expectedList = (bencoded.decode() as? BencodeList)
?: return Log.e("Loki", "Failed to decode bencoded list from payload")
val (metadata, content) = expectedList.values
val metadataDict = (metadata as? BencodeDict)?.values
?: return Log.e("Loki", "Failed to decode metadata dict")
val push = """
Push metadata received was:
@: ${metadataDict["@"]}
#: ${metadataDict["#"]}
n: ${metadataDict["n"]}
l: ${metadataDict["l"]}
B: ${metadataDict["B"]}
""".trimIndent()
Log.d("Loki", "push")
val contentBytes = (content as? BencodeString)?.value
?: return Log.e("Loki", "Failed to decode content string")
// TODO: something with contentBytes
}
override fun register(force: Boolean) {
val currentInstanceIdJob = firebaseInstanceIdJob
if (currentInstanceIdJob != null && currentInstanceIdJob.isActive && !force) return

View File

@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.notifications
import android.content.Context
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@@ -17,5 +18,12 @@ object FirebasePushModule {
fun provideFirebasePushManager(
@ApplicationContext context: Context,
prefs: TextSecurePreferences,
): PushManager = FirebasePushManager(context, prefs)
) = FirebasePushManager(context, prefs)
}
@Module
@InstallIn(SingletonComponent::class)
abstract class FirebaseBindingModule {
@Binds
abstract fun bindPushManager(firebasePushManager: FirebasePushManager): PushManager
}

View File

@@ -17,7 +17,7 @@ import javax.inject.Inject
@AndroidEntryPoint
class PushNotificationService : FirebaseMessagingService() {
@Inject lateinit var pushManager: PushManager
@Inject lateinit var pushManager: FirebasePushManager
override fun onNewToken(token: String) {
super.onNewToken(token)
@@ -32,7 +32,7 @@ class PushNotificationService : FirebaseMessagingService() {
// assume this is the new push notification content
// deal with the enc payload (probably decrypting through the PushManager?
Log.d("Loki", "TODO: deal with the enc_payload\n${message.data["enc_payload"]}")
pushManager.decrypt(message.data)
pushManager.decrypt(Base64.decode(message.data["enc_payload"]))
return
}
val base64EncodedData = message.data?.get("ENCRYPTED_DATA")