diff options
author | Antoine A <> | 2024-01-16 13:16:40 +0000 |
---|---|---|
committer | Antoine A <> | 2024-01-16 13:16:40 +0000 |
commit | e63cb0902c7077f37bce1ef96d645f6df160b3b4 (patch) | |
tree | 7005ce28ab30f2906e5fda8ba0c011a571c1ae78 | |
parent | e862fac1ccbd8a025c344d3f3379d921517ca931 (diff) | |
download | libeufin-e63cb0902c7077f37bce1ef96d645f6df160b3b4.tar.gz libeufin-e63cb0902c7077f37bce1ef96d645f6df160b3b4.tar.bz2 libeufin-e63cb0902c7077f37bce1ef96d645f6df160b3b4.zip |
Fix sql bug and prepare for receiver-name in cashout payto
-rw-r--r-- | Makefile | 11 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/TalerCommon.kt | 12 | ||||
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt | 8 | ||||
-rw-r--r-- | bank/src/test/kotlin/DatabaseTest.kt | 27 | ||||
-rw-r--r-- | database-versioning/libeufin-nexus-procedures.sql | 4 | ||||
-rw-r--r-- | integration/src/main/kotlin/Main.kt | 2 |
6 files changed, 46 insertions, 18 deletions
@@ -98,18 +98,13 @@ install: assemble: ./gradlew assemble -.PHONY: doc -doc: - ./gradlew dokkaHtmlMultiModule - open build/dokka/htmlMultiModule/index.html - .PHONY: check check: install-nobuild-bank-files ./gradlew check -.PHONY: test -test: install-nobuild-bank-files - ./gradlew test --tests $(test) -i +.PHONY: bank-test +bank-test: install-nobuild-bank-files + ./gradlew :bank:test --tests $(test) -i .PHONY: nexus-test nexus-test: install-nobuild-nexus-files diff --git a/bank/src/main/kotlin/tech/libeufin/bank/TalerCommon.kt b/bank/src/main/kotlin/tech/libeufin/bank/TalerCommon.kt index 6f42f5cb..e37a1661 100644 --- a/bank/src/main/kotlin/tech/libeufin/bank/TalerCommon.kt +++ b/bank/src/main/kotlin/tech/libeufin/bank/TalerCommon.kt @@ -454,6 +454,18 @@ class IbanPayTo: PaytoUri { receiverName = params["receiver-name"] } + fun maybeFull(): String { + return canonical + if (receiverName != null) ("?receiver-name=" + receiverName.encodeURLParameter()) else "" + } + + fun expectFull(): String { + return canonical + "?receiver-name=" + receiverName!!.encodeURLParameter() + } + + fun fullOptName(defaultName: String): String { + return canonical + "?receiver-name=" + (receiverName ?: defaultName).encodeURLParameter() + } + override fun toString(): String = canonical internal object Serializer : KSerializer<IbanPayTo> { diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt index 70b9bd1f..ac9b6a96 100644 --- a/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt +++ b/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt @@ -71,7 +71,7 @@ class AccountDAO(private val db: Database) { setString(1, name) setString(2, email) setString(3, phone) - setString(4, cashoutPayto?.canonical) + setString(4, cashoutPayto?.fullOptName(name)) setBoolean(5, checkPaytoIdempotent) setString(6, internalPaytoUri.canonical) setBoolean(7, isPublic) @@ -122,7 +122,7 @@ class AccountDAO(private val db: Database) { setString(3, name) setString(4, email) setString(5, phone) - setString(6, cashoutPayto?.canonical) + setString(6, cashoutPayto?.fullOptName(name)) setString(7, tanChannel?.name) oneOrNull { it.getLong("customer_id") }!! } @@ -240,7 +240,7 @@ class AccountDAO(private val db: Database) { val checkCashout = !isAdmin && !allowEditCashout && cashoutPayto.isSome() val checkDebtLimit = !isAdmin && debtLimit != null - // Get user ID and check reconfig rights + // Get user ID and check reconfig rights TODO checkout with name val (customerId, currChannel, currInfo) = conn.prepareStatement(""" SELECT customer_id @@ -263,7 +263,7 @@ class AccountDAO(private val db: Database) { setString(idx, name); idx++ } if (checkCashout) { - setString(idx, cashoutPayto.get()?.canonical); idx++ + setString(idx, cashoutPayto.get()?.maybeFull()); idx++ // TODO cashout with name } if (checkDebtLimit) { setLong(idx, debtLimit!!.value); idx++ diff --git a/bank/src/test/kotlin/DatabaseTest.kt b/bank/src/test/kotlin/DatabaseTest.kt index fc19d5a8..de1e608f 100644 --- a/bank/src/test/kotlin/DatabaseTest.kt +++ b/bank/src/test/kotlin/DatabaseTest.kt @@ -172,14 +172,35 @@ class DatabaseTest { // Testing iban payto uri normalization @Test fun ibanPayto() = setup { _, _ -> - val expected = "payto://iban/CH9300762011623852957" + val canonical = "payto://iban/CH9300762011623852957" val inputs = listOf( "payto://iban/BIC/CH9300762011623852957?receiver-name=NotGiven", + "payto://iban/CH9300762011623852957?receiver-name=Grothoff%20Hans", "payto://iban/ch%209300-7620-1162-3852-957", ) - for (input in inputs) { - assertEquals(expected, IbanPayTo(input).canonical) + val names = listOf( + "NotGiven", "Grothoff Hans", null + ) + val full = listOf( + "payto://iban/CH9300762011623852957?receiver-name=NotGiven", + "payto://iban/CH9300762011623852957?receiver-name=Grothoff%20Hans", + canonical + ) + for ((i, input) in inputs.withIndex()) { + val payto = IbanPayTo(input) + assertEquals(canonical, payto.canonical) + assertEquals(full[i], payto.maybeFull()) + assertEquals(names[i], payto.receiverName) } + + assertEquals( + "payto://iban/CH9300762011623852957?receiver-name=Grothoff%20Hans", + IbanPayTo("payto://iban/CH9300762011623852957?receiver-name=Grothoff%20Hans").fullOptName("Santa Claus") + ) + assertEquals( + "payto://iban/CH9300762011623852957?receiver-name=Santa%20Claus", + IbanPayTo("payto://iban/CH9300762011623852957").fullOptName("Santa Claus") + ) } } diff --git a/database-versioning/libeufin-nexus-procedures.sql b/database-versioning/libeufin-nexus-procedures.sql index 8e469055..4902265f 100644 --- a/database-versioning/libeufin-nexus-procedures.sql +++ b/database-versioning/libeufin-nexus-procedures.sql @@ -142,7 +142,7 @@ SELECT bank_id, debit_payto_uri -- As bank id can be at most 35 characters long we truncate the encoded hash -- We are not sure whether this field is case-insensitive in all banks as the standard -- does not clearly specify this, so we have chosen to capitalise it -SELECT upper(substr(encode(public.digest(bank_id, 'sha256'), 'base64'), 0, 35)) INTO out_bounce_id; +SELECT upper(substr(encode(public.digest(local_bank_id, 'sha256'), 'base64'), 0, 35)) INTO out_bounce_id; -- Initiate the bounce transaction INSERT INTO initiated_outgoing_transactions ( @@ -153,7 +153,7 @@ INSERT INTO initiated_outgoing_transactions ( ,request_uid ) VALUES ( in_bounce_amount - ,'bounce: ' || bank_id + ,'bounce: ' || local_bank_id ,payto_uri ,in_now_date ,out_bounce_id diff --git a/integration/src/main/kotlin/Main.kt b/integration/src/main/kotlin/Main.kt index bf946cab..0dcd4259 100644 --- a/integration/src/main/kotlin/Main.kt +++ b/integration/src/main/kotlin/Main.kt @@ -195,7 +195,7 @@ class Cli : CliktCommand("Run integration tests on banks provider") { // TODO interactive payment editor nexusDb.initiatedPaymentCreate(InitiatedPayment( amount = getTalerAmount("1.1", "CFH"), - creditPaytoUri = "payto://iban/CH6208704048981247126?receiver-name=Grothoff+Hans", + creditPaytoUri = "payto://iban/CH6208704048981247126?receiver-name=Grothoff%20Hans", wireTransferSubject = "single transaction test", initiationTime = Instant.now(), requestUid = Base32Crockford.encode(randBytes(16)) |