summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine A <>2024-01-16 13:16:40 +0000
committerAntoine A <>2024-01-16 13:16:40 +0000
commite63cb0902c7077f37bce1ef96d645f6df160b3b4 (patch)
tree7005ce28ab30f2906e5fda8ba0c011a571c1ae78
parente862fac1ccbd8a025c344d3f3379d921517ca931 (diff)
downloadlibeufin-e63cb0902c7077f37bce1ef96d645f6df160b3b4.tar.gz
libeufin-e63cb0902c7077f37bce1ef96d645f6df160b3b4.tar.bz2
libeufin-e63cb0902c7077f37bce1ef96d645f6df160b3b4.zip
Fix sql bug and prepare for receiver-name in cashout payto
-rw-r--r--Makefile11
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/TalerCommon.kt12
-rw-r--r--bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt8
-rw-r--r--bank/src/test/kotlin/DatabaseTest.kt27
-rw-r--r--database-versioning/libeufin-nexus-procedures.sql4
-rw-r--r--integration/src/main/kotlin/Main.kt2
6 files changed, 46 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index 40c935a0..e4c393f6 100644
--- a/Makefile
+++ b/Makefile
@@ -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))