add support for get_public_key

This commit is contained in:
greenart7c3
2023-08-23 13:42:43 -03:00
parent 35d39b0077
commit d329f53e25
3 changed files with 154 additions and 83 deletions
@@ -12,5 +12,6 @@ enum class SignerType {
NIP04_ENCRYPT,
NIP04_DECRYPT,
NIP44_ENCRYPT,
NIP44_DECRYPT
NIP44_DECRYPT,
GET_PUBLIC_KEY
}
@@ -14,6 +14,7 @@ object IntentUtils {
"sign_event" -> SignerType.SIGN_EVENT
"nip04_encrypt" -> SignerType.NIP04_ENCRYPT
"nip04_decrypt" -> SignerType.NIP04_DECRYPT
"get_public_key" -> SignerType.GET_PUBLIC_KEY
else -> SignerType.SIGN_EVENT
}
val split = data.split(";")
@@ -60,6 +60,7 @@ import com.greenart7c3.nostrsigner.service.CryptoUtils
import com.greenart7c3.nostrsigner.service.IntentUtils
import com.greenart7c3.nostrsigner.service.getAppCompatActivity
import com.greenart7c3.nostrsigner.service.model.Event
import com.greenart7c3.nostrsigner.service.toNpub
import com.greenart7c3.nostrsigner.service.toShortenHex
import com.greenart7c3.nostrsigner.ui.components.Drawer
import com.greenart7c3.nostrsigner.ui.components.MainAppBar
@@ -104,95 +105,126 @@ fun MainScreen(account: Account, accountStateViewModel: AccountStateViewModel, j
} else {
json.let {
val appName = packageName ?: it.name
if (it.type == SignerType.NIP04_DECRYPT || it.type == SignerType.NIP04_ENCRYPT) {
EncryptDecryptData(
appName,
it.data,
{
val sig = if (it.type == SignerType.NIP04_DECRYPT) {
CryptoUtils.decrypt(
it.data,
account.keyPair.privKey,
Hex.decode(it.pubKey)
)
} else {
CryptoUtils.encrypt(
it.data,
account.keyPair.privKey,
Hex.decode(it.pubKey)
)
}
clipboardManager.setText(AnnotatedString(sig))
when (it.type) {
SignerType.GET_PUBLIC_KEY -> {
LoginWithPubKey(
appName,
{
val sig = account.keyPair.pubKey.toNpub()
coroutineScope.launch {
val activity = context.getAppCompatActivity()
if (packageName != null) {
val intent = Intent()
intent.putExtra("signature", sig)
activity?.setResult(RESULT_OK, intent)
} else {
Toast.makeText(
context,
context.getString(R.string.signature_copied_to_the_clipboard),
Toast.LENGTH_SHORT
).show()
}
activity?.finish()
}
return@EncryptDecryptData
},
{
context.getAppCompatActivity()?.finish()
}
)
} else {
val event = IntentUtils.getIntent(it.data, account.keyPair)
EventData(
it.type,
appName,
event,
event.toJson(),
{
if (event.pubKey != account.keyPair.pubKey.toHexKey()) {
coroutineScope.launch {
Toast.makeText(
context,
context.getString(R.string.event_pubkey_is_not_equal_to_current_logged_in_user),
Toast.LENGTH_SHORT
).show()
val activity = context.getAppCompatActivity()
if (packageName != null) {
val intent = Intent()
intent.putExtra("signature", sig)
activity?.setResult(RESULT_OK, intent)
} else {
clipboardManager.setText(AnnotatedString(sig))
Toast.makeText(
context,
context.getString(R.string.signature_copied_to_the_clipboard),
Toast.LENGTH_SHORT
).show()
}
activity?.finish()
}
return@EventData
return@LoginWithPubKey
},
{
context.getAppCompatActivity()?.finish()
}
val id = event.id.hexToByteArray()
val sig = CryptoUtils.sign(id, account.keyPair.privKey).toHexKey()
clipboardManager.setText(AnnotatedString(sig))
coroutineScope.launch {
val activity = context.getAppCompatActivity()
if (packageName != null) {
val intent = Intent()
val signedEvent = Event(event.id, event.pubKey, event.createdAt, event.kind, event.tags, event.content, sig)
intent.putExtra("event", signedEvent.toJson())
intent.putExtra("signature", sig)
activity?.setResult(RESULT_OK, intent)
)
}
SignerType.NIP04_DECRYPT, SignerType.NIP04_ENCRYPT -> {
EncryptDecryptData(
appName,
it.data,
{
val sig = if (it.type == SignerType.NIP04_DECRYPT) {
CryptoUtils.decrypt(
it.data,
account.keyPair.privKey,
Hex.decode(it.pubKey)
)
} else {
Toast.makeText(
context,
context.getString(R.string.signature_copied_to_the_clipboard),
Toast.LENGTH_SHORT
).show()
CryptoUtils.encrypt(
it.data,
account.keyPair.privKey,
Hex.decode(it.pubKey)
)
}
activity?.finish()
coroutineScope.launch {
val activity = context.getAppCompatActivity()
if (packageName != null) {
val intent = Intent()
intent.putExtra("signature", sig)
activity?.setResult(RESULT_OK, intent)
} else {
clipboardManager.setText(AnnotatedString(sig))
Toast.makeText(
context,
context.getString(R.string.signature_copied_to_the_clipboard),
Toast.LENGTH_SHORT
).show()
}
activity?.finish()
}
return@EncryptDecryptData
},
{
context.getAppCompatActivity()?.finish()
}
},
{
context.getAppCompatActivity()?.finish()
}
)
)
}
else -> {
val event = IntentUtils.getIntent(it.data, account.keyPair)
EventData(
it.type,
appName,
event,
event.toJson(),
{
if (event.pubKey != account.keyPair.pubKey.toHexKey()) {
coroutineScope.launch {
Toast.makeText(
context,
context.getString(R.string.event_pubkey_is_not_equal_to_current_logged_in_user),
Toast.LENGTH_SHORT
).show()
}
return@EventData
}
val id = event.id.hexToByteArray()
val sig = CryptoUtils.sign(id, account.keyPair.privKey).toHexKey()
coroutineScope.launch {
val activity = context.getAppCompatActivity()
if (packageName != null) {
val intent = Intent()
val signedEvent = Event(event.id, event.pubKey, event.createdAt, event.kind, event.tags, event.content, sig)
intent.putExtra("event", signedEvent.toJson())
intent.putExtra("signature", sig)
activity?.setResult(RESULT_OK, intent)
} else {
clipboardManager.setText(AnnotatedString(sig))
Toast.makeText(
context,
context.getString(R.string.signature_copied_to_the_clipboard),
Toast.LENGTH_SHORT
).show()
}
activity?.finish()
}
},
{
context.getAppCompatActivity()?.finish()
}
)
}
}
}
}
@@ -282,6 +314,43 @@ fun EncryptDecryptData(
}
}
@Composable
fun LoginWithPubKey(
appName: String,
onAccept: () -> Unit,
onReject: () -> Unit
) {
Column(
Modifier
.fillMaxSize()
.padding(8.dp)
) {
AppTitle(appName)
Spacer(Modifier.size(4.dp))
Card(
modifier = Modifier
.fillMaxWidth()
) {
Column(
Modifier
.padding(6.dp)
) {
Text(
"wants to read your public key",
fontWeight = FontWeight.Bold
)
}
}
Spacer(modifier = Modifier.weight(1f))
AcceptRejectButtons(
onAccept,
onReject
)
}
}
@Composable
fun EventData(
type: SignerType,