From 7b4e249c6a43124fd6cda41b972092cbf48d5645 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Fri, 31 Oct 2025 06:11:13 -0300 Subject: [PATCH] read the content of a rumor event --- .../nostrsigner/models/EncryptedDataKind.kt | 2 +- .../nostrsigner/service/IntentUtils.kt | 76 +++++++++++++++++-- .../nostrsigner/ui/SeeDetailsScreen.kt | 16 +++- .../ui/components/EncryptDecryptData.kt | 43 ++++++++--- 4 files changed, 117 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/models/EncryptedDataKind.kt b/app/src/main/java/com/greenart7c3/nostrsigner/models/EncryptedDataKind.kt index 052befba..1ff84116 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/models/EncryptedDataKind.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/models/EncryptedDataKind.kt @@ -10,6 +10,6 @@ class ClearTextEncryptedDataKind(val text: String, override val result: String) class TagArrayEncryptedDataKind(val tagArray: Array>, override val result: String) : EncryptedDataKind -class EventEncryptedDataKind(val event: AmberEvent, override val result: String) : EncryptedDataKind +class EventEncryptedDataKind(val event: AmberEvent, val sealEncryptedDataKind: EncryptedDataKind?, override val result: String) : EncryptedDataKind class PrivateZapEncryptedDataKind(override val result: String) : EncryptedDataKind diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt index c0444ed8..c4e6cc22 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/IntentUtils.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.provider.Browser +import android.util.Log import android.widget.Toast import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.platform.ClipEntry @@ -42,6 +43,7 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.crypto.EventHasher import com.vitorpamplona.quartz.nip01Core.jackson.JacksonMapper import com.vitorpamplona.quartz.nip19Bech32.toNpub +import com.vitorpamplona.quartz.nip59Giftwrap.seals.SealedRumorEvent import com.vitorpamplona.quartz.utils.Hex import com.vitorpamplona.quartz.utils.TimeUtils import java.io.ByteArrayOutputStream @@ -199,8 +201,26 @@ object IntentUtils { else -> { if (type.name.contains("ENCRYPT")) { if (localData.startsWith("{")) { - val event = AmberEvent.fromJson(localData) - EventEncryptedDataKind(event, result) + try { + val event = AmberEvent.fromJson(localData) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = account.signer.signerSync.decrypt(event.content, account.hexKey) + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } else { + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { + EventEncryptedDataKind(event, null, result) + } + } catch (e: Exception) { + Log.e("IntentUtils", "Error parsing JSON: ${e.message}") + ClearTextEncryptedDataKind(localData, result) + } } else if (localData.startsWith("[")) { val tagArray = JacksonMapper.fromJsonToTagArray(localData) TagArrayEncryptedDataKind(tagArray, result) @@ -210,7 +230,20 @@ object IntentUtils { } else { if (result.startsWith("{")) { val event = AmberEvent.fromJson(result) - EventEncryptedDataKind(event, result) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = account.signer.signerSync.decrypt(event.content, account.hexKey) + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } else { + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { + EventEncryptedDataKind(event, null, result) + } } else if (result.startsWith("[")) { val tagArray = JacksonMapper.fromJsonToTagArray(result) TagArrayEncryptedDataKind(tagArray, result) @@ -416,8 +449,26 @@ object IntentUtils { else -> { if (type.name.contains("ENCRYPT")) { if (data.startsWith("{")) { - val event = AmberEvent.fromJson(data) - EventEncryptedDataKind(event, result) + try { + val event = AmberEvent.fromJson(data) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = account.signer.signerSync.decrypt(event.content, account.hexKey) + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } else { + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { + EventEncryptedDataKind(event, null, result) + } + } catch (e: Exception) { + Log.e("IntentUtils", "Error parsing JSON: ${e.message}") + ClearTextEncryptedDataKind(data, result) + } } else if (data.startsWith("[")) { val tagArray = JacksonMapper.fromJsonToTagArray(data) TagArrayEncryptedDataKind(tagArray, result) @@ -427,7 +478,20 @@ object IntentUtils { } else { if (result.startsWith("{")) { val event = AmberEvent.fromJson(result) - EventEncryptedDataKind(event, result) + if (event.kind == SealedRumorEvent.KIND) { + val decryptedSealData = account.signer.signerSync.decrypt(event.content, account.hexKey) + if (decryptedSealData.startsWith("{")) { + val sealEvent = AmberEvent.fromJson(decryptedSealData) + EventEncryptedDataKind(event, EventEncryptedDataKind(sealEvent, null, decryptedSealData), result) + } else if (decryptedSealData.startsWith("[")) { + val tagArray = JacksonMapper.fromJsonToTagArray(decryptedSealData) + EventEncryptedDataKind(event, TagArrayEncryptedDataKind(tagArray, decryptedSealData), decryptedSealData) + } else { + EventEncryptedDataKind(event, ClearTextEncryptedDataKind(event.content, decryptedSealData), result) + } + } else { + EventEncryptedDataKind(event, null, result) + } } else if (result.startsWith("[")) { val tagArray = JacksonMapper.fromJsonToTagArray(result) TagArrayEncryptedDataKind(tagArray, result) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt index d916fde5..708cdd4f 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt @@ -124,7 +124,21 @@ fun SeeDetailsScreen( val event = intent.event!! if (event.kind == 22242) AmberEvent.relay(event) else event.content } else { - if (type.name.contains("ENCRYPT") && intent.encryptedData is ClearTextEncryptedDataKind) intent.encryptedData.text else if (intent.encryptedData is EventEncryptedDataKind) intent.encryptedData.event.content else intent.encryptedData?.result ?: "" + if (type.name.contains("ENCRYPT") && intent.encryptedData is ClearTextEncryptedDataKind) { + intent.encryptedData.text + } else if (intent.encryptedData is EventEncryptedDataKind) { + if (intent.encryptedData.sealEncryptedDataKind != null) { + if (intent.encryptedData.sealEncryptedDataKind is EventEncryptedDataKind) { + intent.encryptedData.sealEncryptedDataKind.event.content + } else { + intent.encryptedData.sealEncryptedDataKind.result + } + } else { + intent.encryptedData.event.content + } + } else { + intent.encryptedData?.result ?: "" + } } Text( diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/EncryptDecryptData.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/EncryptDecryptData.kt index 5d9eaec6..fd00148f 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/EncryptDecryptData.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/EncryptDecryptData.kt @@ -127,19 +127,38 @@ fun EncryptDecryptData( ) if (encryptedData is EventEncryptedDataKind) { - val content = if (encryptedData.event.kind == 22242) encryptedData.event.relay() else encryptedData.event.content - if (encryptedData.event.kind == ContactListEvent.KIND) { - ContactListDetail( - title = stringResource(R.string.following), - text = "${encryptedData.event.verifiedFollowKeySet().size}", - ) + if (encryptedData.sealEncryptedDataKind != null) { + if (encryptedData.sealEncryptedDataKind is EventEncryptedDataKind) { + val content = if (encryptedData.sealEncryptedDataKind.event.kind == 22242) encryptedData.sealEncryptedDataKind.event.relay() else encryptedData.sealEncryptedDataKind.event.content + if (encryptedData.event.kind == ContactListEvent.KIND) { + ContactListDetail( + title = stringResource(R.string.following), + text = "${encryptedData.event.verifiedFollowKeySet().size}", + ) + } else { + Text( + content, + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + ) + } + } } else { - Text( - content, - modifier = Modifier - .fillMaxWidth() - .padding(top = 8.dp), - ) + val content = if (encryptedData.event.kind == 22242) encryptedData.event.relay() else encryptedData.event.content + if (encryptedData.event.kind == ContactListEvent.KIND) { + ContactListDetail( + title = stringResource(R.string.following), + text = "${encryptedData.event.verifiedFollowKeySet().size}", + ) + } else { + Text( + content, + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + ) + } } } else { val content = if (type.name.contains("ENCRYPT") && encryptedData is ClearTextEncryptedDataKind) encryptedData.text else encryptedData?.result ?: ""