Finishes the payment database
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
+48
-2
@@ -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 {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user