mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2024-09-29 16:30:49 +00:00
improve giftwrap decryption
This commit is contained in:
parent
90c6d6c8f8
commit
95514b66ea
@ -6,6 +6,7 @@ import androidx.activity.result.ActivityResultLauncher
|
|||||||
import com.vitorpamplona.amethyst.ServiceManager
|
import com.vitorpamplona.amethyst.ServiceManager
|
||||||
import com.vitorpamplona.amethyst.ui.actions.SignerType
|
import com.vitorpamplona.amethyst.ui.actions.SignerType
|
||||||
import com.vitorpamplona.quartz.encoders.HexKey
|
import com.vitorpamplona.quartz.encoders.HexKey
|
||||||
|
import com.vitorpamplona.quartz.events.Event
|
||||||
import com.vitorpamplona.quartz.events.EventInterface
|
import com.vitorpamplona.quartz.events.EventInterface
|
||||||
import com.vitorpamplona.quartz.events.LnZapRequestEvent
|
import com.vitorpamplona.quartz.events.LnZapRequestEvent
|
||||||
|
|
||||||
@ -82,6 +83,20 @@ object AmberUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun decryptGossip(event: Event) {
|
||||||
|
if (IntentUtils.eventCache.get(event.id) == null) {
|
||||||
|
IntentUtils.eventCache.put(event.id, event)
|
||||||
|
}
|
||||||
|
isActivityRunning = true
|
||||||
|
openAmber(
|
||||||
|
event.content,
|
||||||
|
SignerType.NIP44_DECRYPT,
|
||||||
|
IntentUtils.decryptGossipResultLauncher,
|
||||||
|
event.pubKey,
|
||||||
|
event.id
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun encrypt(decryptedContent: String, pubKey: HexKey, signerType: SignerType = SignerType.NIP04_ENCRYPT) {
|
fun encrypt(decryptedContent: String, pubKey: HexKey, signerType: SignerType = SignerType.NIP04_ENCRYPT) {
|
||||||
isActivityRunning = true
|
isActivityRunning = true
|
||||||
openAmber(
|
openAmber(
|
||||||
|
@ -2,12 +2,17 @@ package com.vitorpamplona.amethyst.service
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.util.LruCache
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import com.vitorpamplona.amethyst.Amethyst
|
import com.vitorpamplona.amethyst.Amethyst
|
||||||
import com.vitorpamplona.amethyst.ServiceManager
|
import com.vitorpamplona.amethyst.ServiceManager
|
||||||
|
import com.vitorpamplona.amethyst.model.LocalCache
|
||||||
import com.vitorpamplona.amethyst.ui.MainActivity
|
import com.vitorpamplona.amethyst.ui.MainActivity
|
||||||
|
import com.vitorpamplona.quartz.events.Event
|
||||||
|
import com.vitorpamplona.quartz.events.GiftWrapEvent
|
||||||
|
import com.vitorpamplona.quartz.events.SealedGossipEvent
|
||||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
@ -15,6 +20,45 @@ import kotlinx.coroutines.launch
|
|||||||
|
|
||||||
object IntentUtils {
|
object IntentUtils {
|
||||||
lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
|
lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
|
||||||
|
lateinit var decryptGossipResultLauncher: ActivityResultLauncher<Intent>
|
||||||
|
val eventCache = LruCache<String, Event>(100)
|
||||||
|
|
||||||
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
|
fun consume(event: Event) {
|
||||||
|
if (LocalCache.justVerify(event)) {
|
||||||
|
if (event is GiftWrapEvent) {
|
||||||
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
val decryptedContent = AmberUtils.cachedDecryptedContent[event.id] ?: ""
|
||||||
|
if (decryptedContent.isNotBlank()) {
|
||||||
|
event.cachedGift(
|
||||||
|
NostrAccountDataSource.account.keyPair.pubKey,
|
||||||
|
decryptedContent
|
||||||
|
)?.let {
|
||||||
|
consume(it)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AmberUtils.decryptGossip(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event is SealedGossipEvent) {
|
||||||
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
val decryptedContent = AmberUtils.cachedDecryptedContent[event.id] ?: ""
|
||||||
|
if (decryptedContent.isNotBlank()) {
|
||||||
|
event.cachedGossip(NostrAccountDataSource.account.keyPair.pubKey, decryptedContent)?.let {
|
||||||
|
LocalCache.justConsume(it, null)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AmberUtils.decryptGossip(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Don't store sealed gossips to avoid rebroadcasting by mistake.
|
||||||
|
} else {
|
||||||
|
LocalCache.justConsume(event, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
fun start(activity: MainActivity) {
|
fun start(activity: MainActivity) {
|
||||||
@ -29,15 +73,41 @@ object IntentUtils {
|
|||||||
Toast.LENGTH_SHORT
|
Toast.LENGTH_SHORT
|
||||||
).show()
|
).show()
|
||||||
}
|
}
|
||||||
AmberUtils.isActivityRunning = false
|
} else {
|
||||||
return@registerForActivityResult
|
val event = it.data?.getStringExtra("signature") ?: ""
|
||||||
|
AmberUtils.content = event
|
||||||
|
val id = it.data?.getStringExtra("id") ?: ""
|
||||||
|
if (id.isNotBlank()) {
|
||||||
|
AmberUtils.cachedDecryptedContent[id] = event
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
AmberUtils.isActivityRunning = false
|
||||||
|
ServiceManager.shouldPauseService = true
|
||||||
|
}
|
||||||
|
|
||||||
val event = it.data?.getStringExtra("signature") ?: ""
|
decryptGossipResultLauncher = activity.registerForActivityResult(
|
||||||
AmberUtils.content = event
|
ActivityResultContracts.StartActivityForResult()
|
||||||
val id = it.data?.getStringExtra("id") ?: ""
|
) {
|
||||||
if (id.isNotBlank()) {
|
if (it.resultCode != Activity.RESULT_OK) {
|
||||||
AmberUtils.cachedDecryptedContent[id] = event
|
GlobalScope.launch(Dispatchers.Main) {
|
||||||
|
Toast.makeText(
|
||||||
|
Amethyst.instance,
|
||||||
|
"Sign request rejected",
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val decryptedContent = it.data?.getStringExtra("signature") ?: ""
|
||||||
|
val id = it.data?.getStringExtra("id") ?: ""
|
||||||
|
if (id.isNotBlank()) {
|
||||||
|
val event = eventCache.get(id)
|
||||||
|
if (event != null) {
|
||||||
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
|
AmberUtils.cachedDecryptedContent[event.id] = decryptedContent
|
||||||
|
consume(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
AmberUtils.isActivityRunning = false
|
AmberUtils.isActivityRunning = false
|
||||||
ServiceManager.shouldPauseService = true
|
ServiceManager.shouldPauseService = true
|
||||||
|
@ -160,13 +160,13 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
|||||||
}
|
}
|
||||||
} else if (account.loginWithAmber) {
|
} else if (account.loginWithAmber) {
|
||||||
GlobalScope.launch(Dispatchers.IO) {
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
AmberUtils.content = ""
|
|
||||||
AmberUtils.decrypt(event.content, event.pubKey, event.id, SignerType.NIP44_DECRYPT)
|
|
||||||
val decryptedContent = AmberUtils.cachedDecryptedContent[event.id] ?: ""
|
val decryptedContent = AmberUtils.cachedDecryptedContent[event.id] ?: ""
|
||||||
if (decryptedContent.isNotBlank()) {
|
if (decryptedContent.isNotBlank()) {
|
||||||
event.cachedGift(account.keyPair.pubKey, decryptedContent)?.let {
|
event.cachedGift(account.keyPair.pubKey, decryptedContent)?.let {
|
||||||
consume(it, relay)
|
consume(it, relay)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
AmberUtils.decryptGossip(event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,18 +180,13 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
|||||||
}
|
}
|
||||||
} else if (account.loginWithAmber) {
|
} else if (account.loginWithAmber) {
|
||||||
GlobalScope.launch(Dispatchers.IO) {
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
AmberUtils.content = ""
|
|
||||||
AmberUtils.decrypt(
|
|
||||||
event.content,
|
|
||||||
event.pubKey,
|
|
||||||
event.id,
|
|
||||||
SignerType.NIP44_DECRYPT
|
|
||||||
)
|
|
||||||
val decryptedContent = AmberUtils.cachedDecryptedContent[event.id] ?: ""
|
val decryptedContent = AmberUtils.cachedDecryptedContent[event.id] ?: ""
|
||||||
if (decryptedContent.isNotBlank()) {
|
if (decryptedContent.isNotBlank()) {
|
||||||
event.cachedGossip(account.keyPair.pubKey, decryptedContent)?.let {
|
event.cachedGossip(account.keyPair.pubKey, decryptedContent)?.let {
|
||||||
LocalCache.justConsume(it, relay)
|
LocalCache.justConsume(it, relay)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
AmberUtils.decryptGossip(event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user