mirror of
https://github.com/oxen-io/session-android.git
synced 2025-08-14 08:07:35 +00:00
feat: re-add bencode utility and fix tests to use bytearray instead of assuming utf-8 encoding for strings
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
}
|
@@ -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")
|
||||
|
Reference in New Issue
Block a user