Finishes the payment database

This commit is contained in:
Vitor Pamplona
2023-05-01 11:12:46 -04:00
parent 66dcc03351
commit 2b2028853e
4 changed files with 58 additions and 4 deletions
@@ -20,6 +20,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import nostr.postr.Persona import nostr.postr.Persona
import nostr.postr.Utils
import java.math.BigDecimal import java.math.BigDecimal
import java.util.Locale import java.util.Locale
@@ -171,6 +172,12 @@ class Account(
return zapPaymentRequest != null 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? { fun decryptZapPaymentResponseEvent(zapResponseEvent: LnZapPaymentResponseEvent): Response? {
val myNip47 = zapPaymentRequest ?: return null val myNip47 = zapPaymentRequest ?: return null
return zapResponseEvent.response( return zapResponseEvent.response(
@@ -203,7 +210,7 @@ class Account(
// After the response is received. // After the response is received.
val privKey = nip47.secret?.toByteArray() val privKey = nip47.secret?.toByteArray()
if (privKey != null) { if (privKey != null) {
onResponse(it.response(privKey, event.pubKey.toByteArray())) onResponse(it.response(privKey, nip47.pubKeyHex.toByteArray()))
} }
} }
@@ -236,7 +236,7 @@ open class Note(val idHex: String) {
} else { } else {
null null
} }
response is PayInvoiceSuccessResponse && zapResponseEvent?.requestAuthor() == user.pubkeyHex response is PayInvoiceSuccessResponse && account.isNIP47Author(zapResponseEvent?.requestAuthor())
} }
} }
@@ -207,6 +207,7 @@ open class Event(
.registerTypeAdapter(Event::class.java, EventDeserializer()) .registerTypeAdapter(Event::class.java, EventDeserializer())
.registerTypeAdapter(ByteArray::class.java, ByteArraySerializer()) .registerTypeAdapter(ByteArray::class.java, ByteArraySerializer())
.registerTypeAdapter(ByteArray::class.java, ByteArrayDeserializer()) .registerTypeAdapter(ByteArray::class.java, ByteArrayDeserializer())
.registerTypeAdapter(Response::class.java, ResponseDeserializer())
.create() .create()
fun fromJson(json: String, lenient: Boolean = false): Event = gson.fromJson(json, Event::class.java).getRefinedEvent(lenient) fun fromJson(json: String, lenient: Boolean = false): Event = gson.fromJson(json, Event::class.java).getRefinedEvent(lenient)
@@ -1,9 +1,14 @@
package com.vitorpamplona.amethyst.service.model package com.vitorpamplona.amethyst.service.model
import android.util.Log 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.google.gson.annotations.SerializedName
import com.vitorpamplona.amethyst.model.HexKey import com.vitorpamplona.amethyst.model.HexKey
import nostr.postr.Utils import nostr.postr.Utils
import java.lang.reflect.Type
class LnZapPaymentResponseEvent( class LnZapPaymentResponseEvent(
id: HexKey, id: HexKey,
@@ -35,8 +40,13 @@ class LnZapPaymentResponseEvent(
} }
fun response(privKey: ByteArray, pubKey: ByteArray): Response? = try { fun response(privKey: ByteArray, pubKey: ByteArray): Response? = try {
println("Response Arrived: Decrypting")
if (content.isNotEmpty()) { 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 { } else {
null null
} }
@@ -58,7 +68,7 @@ abstract class Response(
// PayInvoice Call // PayInvoice Call
class PayInvoiceSuccessResponse(val result: PayInvoiceResultParams) : class PayInvoiceSuccessResponse(val result: PayInvoiceResultParams? = null) :
Response("pay_invoice") { Response("pay_invoice") {
class PayInvoiceResultParams(val preimage: String) class PayInvoiceResultParams(val preimage: String)
} }
@@ -86,3 +96,39 @@ class PayInvoiceErrorResponse(val error: PayInvoiceErrorParams? = null) :
OTHER // Other error. OTHER // Other error.
} }
} }
class ResponseDeserializer :
JsonDeserializer<Response?> {
@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<PayInvoiceSuccessResponse>(jsonObject, PayInvoiceSuccessResponse::class.java)
}
if (error != null) {
return context.deserialize<PayInvoiceErrorResponse>(jsonObject, PayInvoiceErrorResponse::class.java)
}
} else {
// tries to guess
if (jsonObject.get("result")?.asJsonObject?.get("preimage") != null) {
return context.deserialize<PayInvoiceSuccessResponse>(jsonObject, PayInvoiceSuccessResponse::class.java)
}
if (jsonObject.get("error")?.asJsonObject?.get("code") != null) {
return context.deserialize<PayInvoiceErrorResponse>(jsonObject, PayInvoiceErrorResponse::class.java)
}
}
return null
}
companion object {
}
}