[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated: Create Ebics subscriber within /demoba
From: |
gnunet |
Subject: |
[libeufin] branch master updated: Create Ebics subscriber within /demobanks trunk. |
Date: |
Thu, 04 Nov 2021 13:54:21 +0100 |
This is an automated email from the git hooks/post-receive script.
ms pushed a commit to branch master
in repository libeufin.
The following commit(s) were added to refs/heads/master by this push:
new ed271284 Create Ebics subscriber within /demobanks trunk.
ed271284 is described below
commit ed271284bd86be1e96bf3e3a9ced302e59e65ec4
Author: ms <ms@taler.net>
AuthorDate: Thu Nov 4 13:52:44 2021 +0100
Create Ebics subscriber within /demobanks trunk.
---
.../main/kotlin/tech/libeufin/nexus/Anastasis.kt | 1 +
nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt | 9 ----
.../main/kotlin/tech/libeufin/sandbox/Helpers.kt | 8 +++
.../src/main/kotlin/tech/libeufin/sandbox/JSON.kt | 35 +++++++++----
.../src/main/kotlin/tech/libeufin/sandbox/Main.kt | 59 ++++++++++++++++++----
util/src/main/kotlin/Payto.kt | 10 ++++
6 files changed, 93 insertions(+), 29 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Anastasis.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Anastasis.kt
index 3842dc81..4697567e 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Anastasis.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Anastasis.kt
@@ -14,6 +14,7 @@ import kotlin.math.abs
import kotlin.math.min
import io.ktor.content.TextContent
import io.ktor.routing.*
+import tech.libeufin.util.buildIbanPaytoUri
data class AnastasisIncomingBankTransaction(
val row_id: Long,
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt
index 6239befe..db226e68 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Taler.kt
@@ -107,15 +107,6 @@ fun <T : Entity<Long>> SizedIterable<T>.orderTaler(delta:
Int): List<T> {
}
}
-fun buildIbanPaytoUri(
- iban: String,
- bic: String,
- receiverName: String,
-): String {
- val nameUrlEnc = URLEncoder.encode(receiverName, "utf-8")
- return "payto://iban/$bic/$iban?receiver-name=$nameUrlEnc"
-}
-
/** Builds the comparison operator for history entries based on the sign of
'delta' */
fun getComparisonOperator(delta: Int, start: Long, table: IdTable<Long>):
Op<Boolean> {
return if (delta < 0) {
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
index c43934d3..9005fd0f 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Helpers.kt
@@ -247,6 +247,14 @@ fun getBankAccountFromIban(iban: String):
BankAccountEntity {
)
}
+fun getBankAccountFromLabel(label: String, demobankName: String):
BankAccountEntity {
+ return transaction {
+ val demobank: DemobankConfigEntity = DemobankConfigEntity.find {
+ DemobankConfigsTable.name eq demobankName
+ }.firstOrNull() ?: throw notFound("Demobank ${demobankName} not found")
+ getBankAccountFromLabel(label, demobank)
+ }
+}
fun getBankAccountFromLabel(label: String, demobank: DemobankConfigEntity):
BankAccountEntity {
return transaction {
BankAccountEntity.find(
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
index ca0f1a34..b25741e6 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/JSON.kt
@@ -20,7 +20,6 @@
package tech.libeufin.sandbox
import tech.libeufin.util.PaymentInfo
-import tech.libeufin.util.RawPayment
data class WithdrawalRequest(
/**
@@ -60,26 +59,40 @@ data class AccountTransactions(
/**
* Used to create AND show one Ebics subscriber in the system.
*/
-data class EbicsSubscriberElement(
+data class EbicsSubscriberInfo(
val hostID: String,
val partnerID: String,
val userID: String,
- val systemID: String? = null
+ val systemID: String? = null,
+ val demobankAccountLabel: String
)
data class AdminGetSubscribers(
- var subscribers: MutableList<EbicsSubscriberElement> = mutableListOf()
+ var subscribers: MutableList<EbicsSubscriberInfo> = mutableListOf()
)
-data class BankAccountRequest(
- val subscriber: EbicsSubscriberElement,
+/**
+ * Some obsolete code creates a bank account and after the
+ * Ebics subscriber. This doesn't allow to have bank accounts
+ * without a subscriber associated to it. Demobank should allow
+ * this instead, because only one user - the exchange - will
+ * ever need a Ebics subscription at the Sandbox.
+ *
+ * The code is obsoleted by a new endpoint that's defined within
+ * the /demobanks/${demobankId} trunk. This one allows to first create
+ * a bank account, and only optionally later give a Ebics account to
+ * it.
+ */
+data class EbicsSubscriberObsoleteApi(
+ val hostID: String,
+ val partnerID: String,
+ val userID: String,
+ val systemID: String? = null
+)
+data class EbicsBankAccountRequest(
+ val subscriber: EbicsSubscriberObsoleteApi,
val iban: String,
val bic: String,
- /**
- * Obsolete: kept around to allow progressive porting of tests.
- * This value used to represent a _person_ name, but the new
DemobankCustomer
- * type is now responsible for that.
- */
val name: String,
val label: String,
)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
index c67dad4d..35c2f6ba 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -102,7 +102,7 @@ class DefaultExchange : CliktCommand("Set default Taler
exchange for a demobank.
}
}
private val exchange by argument("EXCHANGE", "Payto URI of the default
exchange")
- private val demobank by argument("DEMOBANK", "Which demobank defaults to
EXCHANGE")
+ private val demobank by option("--demobank", help = "Which demobank
defaults to EXCHANGE").default("default")
override fun run() {
val dbConnString = getDbConnFromEnv(SANDBOX_DB_ENV_VAR_NAME)
@@ -654,7 +654,7 @@ val sandboxApp: Application.() -> Unit = {
// Associates a new bank account with an existing Ebics subscriber.
post("/admin/ebics/bank-accounts") {
val username = call.request.basicAuth()
- val body = call.receiveJson<BankAccountRequest>()
+ val body = call.receiveJson<EbicsBankAccountRequest>()
if (!validateBic(body.bic)) {
throw SandboxError(HttpStatusCode.BadRequest, "invalid BIC
(${body.bic})")
}
@@ -813,10 +813,10 @@ val sandboxApp: Application.() -> Unit = {
call.respond(object {})
}
- // Creates a new Ebics subscriber.
+
post("/admin/ebics/subscribers") {
call.request.basicAuth()
- val body = call.receiveJson<EbicsSubscriberElement>()
+ val body = call.receiveJson<EbicsSubscriberObsoleteApi>()
transaction {
EbicsSubscriberEntity.new {
partnerId = body.partnerID
@@ -839,12 +839,13 @@ val sandboxApp: Application.() -> Unit = {
call.request.basicAuth()
val ret = AdminGetSubscribers()
transaction {
- tech.libeufin.sandbox.EbicsSubscriberEntity.all().forEach {
+ EbicsSubscriberEntity.all().forEach {
ret.subscribers.add(
- EbicsSubscriberElement(
+ EbicsSubscriberInfo(
userID = it.userId,
partnerID = it.partnerId,
- hostID = it.hostId
+ hostID = it.hostId,
+ demobankAccountLabel = it.bankAccount?.label ?:
"not associated yet"
)
)
}
@@ -1169,9 +1170,12 @@ val sandboxApp: Application.() -> Unit = {
get("/accounts/{account_name}") {
val username = call.request.basicAuth()
val accountAccessed = call.getUriComponent("account_name")
+ val demobank = ensureDemobank(call)
val bankAccount = transaction {
val res = BankAccountEntity.find {
- BankAccountsTable.label eq accountAccessed
+ (BankAccountsTable.label eq accountAccessed).and(
+ BankAccountsTable.demoBank eq demobank.id
+ )
}.firstOrNull()
res
} ?: throw notFound("Account '$accountAccessed' not found")
@@ -1185,12 +1189,16 @@ val sandboxApp: Application.() -> Unit = {
"credit"
}
val balance = balanceForAccount(bankAccount)
- val demobank = ensureDemobank(call)
call.respond(object {
val balance = {
val amount = "${demobank.currency}:${balance}"
val credit_debit_indicator = creditDebitIndicator
}
+ val paytoUri = buildIbanPaytoUri(
+ iban = bankAccount.iban,
+ bic = bankAccount.bic,
+ receiverName = getPersonNameFromCustomer(username
?: "admin")
+ )
})
return@get
}
@@ -1273,6 +1281,39 @@ val sandboxApp: Application.() -> Unit = {
return@post
}
}
+ route("/ebics") {
+ post("/subscribers") {
+ val user = call.request.basicAuth()
+ val body = call.receiveJson<EbicsSubscriberInfo>()
+ /**
+ * Create or get the Ebics subscriber that is found.
+ */
+ transaction {
+ val subscriber: EbicsSubscriberEntity =
EbicsSubscriberEntity.find {
+ (EbicsSubscribersTable.partnerId eq
body.partnerID).and(
+ EbicsSubscribersTable.userId eq body.userID
+ ).and(EbicsSubscribersTable.hostId eq body.hostID)
+ }.firstOrNull() ?: EbicsSubscriberEntity.new {
+ partnerId = body.partnerID
+ userId = body.userID
+ systemId = null
+ hostId = body.hostID
+ state = SubscriberState.NEW
+ nextOrderID = 1
+ }
+ val bankAccount = getBankAccountFromLabel(
+ body.demobankAccountLabel,
+ ensureDemobank(call)
+ )
+ if (bankAccount.owner != user) throw forbidden(
+ "User cannot access bank account
'${bankAccount.label}'"
+ )
+ subscriber.bankAccount = bankAccount
+ }
+ call.respond(object {})
+ return@post
+ }
+ }
}
}
}
diff --git a/util/src/main/kotlin/Payto.kt b/util/src/main/kotlin/Payto.kt
index 597b4f6d..2308a25e 100644
--- a/util/src/main/kotlin/Payto.kt
+++ b/util/src/main/kotlin/Payto.kt
@@ -2,6 +2,7 @@ package tech.libeufin.util
import java.net.URI
import java.net.URLDecoder
+import java.net.URLEncoder
/**
* Payto information.
@@ -69,4 +70,13 @@ fun parsePayto(paytoLine: String): Payto {
message = getQueryParamOrNull("message", params),
receiverName = getQueryParamOrNull("receiver-name", params)
)
+}
+
+fun buildIbanPaytoUri(
+ iban: String,
+ bic: String,
+ receiverName: String,
+): String {
+ val nameUrlEnc = URLEncoder.encode(receiverName, "utf-8")
+ return "payto://iban/$bic/$iban?receiver-name=$nameUrlEnc"
}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [libeufin] branch master updated: Create Ebics subscriber within /demobanks trunk.,
gnunet <=