diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 9279654c3..06ec6d96f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import nostr.postr.Persona +import nostr.postr.Utils import java.math.BigDecimal import java.util.Locale @@ -171,6 +172,12 @@ class Account( return zapPaymentRequest != null } + fun isNIP47Author(pubkeyHex: String?): Boolean { + val privKey = zapPaymentRequest?.secret?.toByteArray() ?: loggedIn.privKey!! + val pubKey = Utils.pubkeyCreate(privKey).toHexKey() + return (pubKey == pubkeyHex) + } + fun decryptZapPaymentResponseEvent(zapResponseEvent: LnZapPaymentResponseEvent): Response? { val myNip47 = zapPaymentRequest ?: return null return zapResponseEvent.response( @@ -203,7 +210,7 @@ class Account( // After the response is received. val privKey = nip47.secret?.toByteArray() if (privKey != null) { - onResponse(it.response(privKey, event.pubKey.toByteArray())) + onResponse(it.response(privKey, nip47.pubKeyHex.toByteArray())) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt index c1afee79b..c74ed7997 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt @@ -236,7 +236,7 @@ open class Note(val idHex: String) { } else { null } - response is PayInvoiceSuccessResponse && zapResponseEvent?.requestAuthor() == user.pubkeyHex + response is PayInvoiceSuccessResponse && account.isNIP47Author(zapResponseEvent?.requestAuthor()) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 508f36487..e25753d0b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -207,6 +207,7 @@ open class Event( .registerTypeAdapter(Event::class.java, EventDeserializer()) .registerTypeAdapter(ByteArray::class.java, ByteArraySerializer()) .registerTypeAdapter(ByteArray::class.java, ByteArrayDeserializer()) + .registerTypeAdapter(Response::class.java, ResponseDeserializer()) .create() fun fromJson(json: String, lenient: Boolean = false): Event = gson.fromJson(json, Event::class.java).getRefinedEvent(lenient) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt index 9f6304336..fee398c69 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/LnZapPaymentResponseEvent.kt @@ -1,9 +1,14 @@ package com.vitorpamplona.amethyst.service.model import android.util.Log +import com.google.gson.JsonDeserializationContext +import com.google.gson.JsonDeserializer +import com.google.gson.JsonElement +import com.google.gson.JsonParseException import com.google.gson.annotations.SerializedName import com.vitorpamplona.amethyst.model.HexKey import nostr.postr.Utils +import java.lang.reflect.Type class LnZapPaymentResponseEvent( id: HexKey, @@ -35,8 +40,13 @@ class LnZapPaymentResponseEvent( } fun response(privKey: ByteArray, pubKey: ByteArray): Response? = try { + println("Response Arrived: Decrypting") if (content.isNotEmpty()) { - gson.fromJson(decrypt(privKey, pubKey), Response::class.java) + val decrypted = decrypt(privKey, pubKey) + println("Response Arrived: Parsing $decrypted") + val response = gson.fromJson(decrypted, Response::class.java) + println("Response Arrived: Decrypted ${response?.resultType}") + response } else { null } @@ -58,7 +68,7 @@ abstract class Response( // PayInvoice Call -class PayInvoiceSuccessResponse(val result: PayInvoiceResultParams) : +class PayInvoiceSuccessResponse(val result: PayInvoiceResultParams? = null) : Response("pay_invoice") { class PayInvoiceResultParams(val preimage: String) } @@ -86,3 +96,39 @@ class PayInvoiceErrorResponse(val error: PayInvoiceErrorParams? = null) : OTHER // Other error. } } + +class ResponseDeserializer : + JsonDeserializer { + @Throws(JsonParseException::class) + override fun deserialize( + json: JsonElement, + typeOfT: Type, + context: JsonDeserializationContext + ): Response? { + val jsonObject = json.asJsonObject + val resultType = jsonObject.get("result_type")?.asString + + if (resultType == "pay_invoice") { + val result = jsonObject.get("result")?.asJsonObject + val error = jsonObject.get("error")?.asJsonObject + if (result != null) { + return context.deserialize(jsonObject, PayInvoiceSuccessResponse::class.java) + } + if (error != null) { + return context.deserialize(jsonObject, PayInvoiceErrorResponse::class.java) + } + } else { + // tries to guess + if (jsonObject.get("result")?.asJsonObject?.get("preimage") != null) { + return context.deserialize(jsonObject, PayInvoiceSuccessResponse::class.java) + } + if (jsonObject.get("error")?.asJsonObject?.get("code") != null) { + return context.deserialize(jsonObject, PayInvoiceErrorResponse::class.java) + } + } + return null + } + + companion object { + } +}