decrypt dms using amber

This commit is contained in:
greenart7c3
2023-08-16 16:39:42 -03:00
parent b8e97525eb
commit 8053119d42
2 changed files with 63 additions and 14 deletions

View File

@@ -41,17 +41,22 @@ import androidx.compose.ui.window.DialogProperties
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.TimeUtils import com.vitorpamplona.amethyst.model.TimeUtils
import com.vitorpamplona.amethyst.service.model.Event import com.vitorpamplona.amethyst.service.model.Event
import com.vitorpamplona.amethyst.service.model.EventInterface
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent
import com.vitorpamplona.amethyst.service.model.TextNoteEvent import com.vitorpamplona.amethyst.service.model.TextNoteEvent
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
import com.vitorpamplona.amethyst.ui.theme.DoubleVertSpacer import com.vitorpamplona.amethyst.ui.theme.DoubleVertSpacer
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
fun openAmber( fun openAmber(
event: Event, event: EventInterface,
intentResult: ManagedActivityResultLauncher<Intent, ActivityResult> intentResult: ManagedActivityResultLauncher<Intent, ActivityResult>
) { ) {
val json = event.toJson() val json = event.toJson()
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$json")) val intent = Intent(Intent.ACTION_VIEW, Uri.parse("nostrsigner:$json"))
if (event is PrivateDmEvent) {
intent.putExtra("type", "nip04_decrypt")
}
intent.`package` = "com.greenart7c3.nostrsigner.debug" intent.`package` = "com.greenart7c3.nostrsigner.debug"
intentResult.launch(intent) intentResult.launch(intent)
} }
@@ -60,7 +65,7 @@ fun openAmber(
fun SignerDialog( fun SignerDialog(
onClose: () -> Unit, onClose: () -> Unit,
onPost: (signedEvent: Event) -> Unit, onPost: (signedEvent: Event) -> Unit,
event: Event event: EventInterface
) { ) {
var signature by remember { mutableStateOf("") } var signature by remember { mutableStateOf("") }
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
@@ -80,6 +85,19 @@ fun SignerDialog(
} }
signature = it.data?.getStringExtra("signature") ?: "" signature = it.data?.getStringExtra("signature") ?: ""
if (event is PrivateDmEvent) {
onPost(
Event(
event.id(),
event.pubKey(),
event.createdAt(),
event.kind(),
event.tags(),
signature,
event.sig()
)
)
}
} }
) )
@@ -120,16 +138,28 @@ fun SignerDialog(
PostButton( PostButton(
onPost = { onPost = {
val signedEvent = Event( val signedEvent = if (event is PrivateDmEvent) {
event.id, Event(
event.pubKey, event.id(),
event.createdAt, event.pubKey(),
event.kind, event.createdAt(),
event.tags, event.kind(),
event.content, event.tags(),
signature,
event.sig()
)
} else {
Event(
event.id(),
event.pubKey(),
event.createdAt(),
event.kind(),
event.tags(),
event.content(),
signature signature
) )
if (!signedEvent.hasValidSignature()) { }
if (!signedEvent.hasValidSignature() && event !is PrivateDmEvent) {
scope.launch { scope.launch {
Toast.makeText( Toast.makeText(
context, context,

View File

@@ -35,6 +35,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -44,11 +45,13 @@ import androidx.lifecycle.map
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.PackageUtils
import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent
import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent import com.vitorpamplona.amethyst.service.model.ChannelMetadataEvent
import com.vitorpamplona.amethyst.service.model.ChatMessageEvent import com.vitorpamplona.amethyst.service.model.ChatMessageEvent
import com.vitorpamplona.amethyst.service.model.PrivateDmEvent import com.vitorpamplona.amethyst.service.model.PrivateDmEvent
import com.vitorpamplona.amethyst.ui.actions.ImmutableListOfLists import com.vitorpamplona.amethyst.ui.actions.ImmutableListOfLists
import com.vitorpamplona.amethyst.ui.actions.SignerDialog
import com.vitorpamplona.amethyst.ui.actions.toImmutableListOfLists import com.vitorpamplona.amethyst.ui.actions.toImmutableListOfLists
import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji import com.vitorpamplona.amethyst.ui.components.CreateClickableTextWithEmoji
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
@@ -634,8 +637,24 @@ private fun RenderRegularTextNote(
nav: (String) -> Unit nav: (String) -> Unit
) { ) {
val tags = remember(note.event) { note.event?.tags()?.toImmutableListOfLists() ?: ImmutableListOfLists() } val tags = remember(note.event) { note.event?.tags()?.toImmutableListOfLists() ?: ImmutableListOfLists() }
val eventContent = remember { accountViewModel.decrypt(note) } var eventContent by remember { mutableStateOf(accountViewModel.decrypt(note)) }
val modifier = remember { Modifier.padding(top = 5.dp) } val modifier = remember { Modifier.padding(top = 5.dp) }
val context = LocalContext.current
val isAmberInstalled = PackageUtils.isAmberInstalled(context)
var triedToDecrypt by remember { mutableStateOf(false) }
if (isAmberInstalled && !triedToDecrypt && note.event is PrivateDmEvent) {
SignerDialog(
onClose = {
triedToDecrypt = true
eventContent = accountViewModel.decrypt(note)
},
onPost = {
eventContent = it.content
triedToDecrypt = true
},
event = note.event!!
)
}
if (eventContent != null) { if (eventContent != null) {
SensitivityWarning( SensitivityWarning(
@@ -643,7 +662,7 @@ private fun RenderRegularTextNote(
accountViewModel = accountViewModel accountViewModel = accountViewModel
) { ) {
TranslatableRichTextViewer( TranslatableRichTextViewer(
content = eventContent, content = eventContent!!,
canPreview = canPreview, canPreview = canPreview,
modifier = modifier, modifier = modifier,
tags = tags, tags = tags,