[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated: nexus: drafting the ebics-submit subco
From: |
gnunet |
Subject: |
[libeufin] branch master updated: nexus: drafting the ebics-submit subcommand. |
Date: |
Thu, 26 Oct 2023 19:43:33 +0200 |
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 d1dcd5d2 nexus: drafting the ebics-submit subcommand.
d1dcd5d2 is described below
commit d1dcd5d2fccefc7ccffae3a86918c52517bff654
Author: MS <ms@taler.net>
AuthorDate: Thu Oct 26 19:43:00 2023 +0200
nexus: drafting the ebics-submit subcommand.
---
.../main/kotlin/tech/libeufin/nexus/Database.kt | 2 +-
.../src/main/kotlin/tech/libeufin/nexus/DbInit.kt | 5 +-
.../main/kotlin/tech/libeufin/nexus/EbicsSetup.kt | 16 ++--
.../main/kotlin/tech/libeufin/nexus/EbicsSubmit.kt | 105 +++++++++++++++++++++
nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 2 +-
nexus/src/test/kotlin/PostFinance.kt | 7 +-
6 files changed, 124 insertions(+), 13 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Database.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Database.kt
index 9b18d2b7..60a4bf0b 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Database.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Database.kt
@@ -340,7 +340,7 @@ class Database(dbConfig: String): java.io.Closeable {
* bank yet.
*
* @param currency in which currency should the payment be submitted to
the bank.
- * @return potentially empty list of initiated payments.
+ * @return [Map] of the initiated payment row ID and [InitiatedPayment]
*/
suspend fun initiatedPaymentsUnsubmittedGet(currency: String): Map<Long,
InitiatedPayment> = runConn { conn ->
val stmt = conn.prepareStatement("""
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/DbInit.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/DbInit.kt
index 4cc03f88..b973cdf2 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/DbInit.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/DbInit.kt
@@ -7,14 +7,13 @@ import tech.libeufin.util.initializeDatabaseTables
import tech.libeufin.util.resetDatabaseTables
import kotlin.system.exitProcess
-fun doOrFail(doLambda: () -> Unit) {
+fun <T>doOrFail(getLambda: () -> T): T =
try {
- doLambda()
+ getLambda()
} catch (e: Exception) {
logger.error(e.message)
exitProcess(1)
}
-}
/**
* This subcommand tries to load the SQL files that define
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSetup.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSetup.kt
index f50d9aec..f14ee558 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSetup.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSetup.kt
@@ -27,7 +27,6 @@ import kotlinx.coroutines.runBlocking
import tech.libeufin.util.ebics_h004.EbicsTypes
import java.io.File
import kotlin.system.exitProcess
-import TalerConfig
import TalerConfigError
import kotlinx.serialization.encodeToString
import tech.libeufin.nexus.ebics.*
@@ -429,11 +428,15 @@ class EbicsSetup: CliktCommand("Set up the EBICS
subscriber") {
val cfg = extractEbicsConfig(this.configFile)
if (checkFullConfig) {
doOrFail {
- cfg.config.requireString("nexus-ebics-submit", "frequency")
- cfg.config.requireString("nexus-ebics-fetch", "frequency")
- cfg.config.requireString("nexus-ebics-fetch",
"statement-log-directory")
- cfg.config.requireString("nexus-httpd", "port")
- cfg.config.requireString("nexus-httpd", "unixpath")
+ cfg.config.requireNumber("nexus-ebics-submit",
"frequency").apply {
+ if (this < 0) throw Exception("section
'nexus-ebics-submit' has negative frequency")
+ }
+ cfg.config.requireNumber("nexus-ebics-fetch",
"frequency").apply {
+ if (this < 0) throw Exception("section 'nexus-ebics-fetch'
has negative frequency")
+ }
+ cfg.config.requirePath("nexus-ebics-fetch",
"statement-log-directory")
+ cfg.config.requireNumber("nexus-httpd", "port")
+ cfg.config.requirePath("nexus-httpd", "unixpath")
cfg.config.requireString("nexus-httpd", "serve")
cfg.config.requireString("nexus-httpd-wire-gateway-facade",
"enabled")
cfg.config.requireString("nexus-httpd-wire-gateway-facade",
"auth_method")
@@ -442,6 +445,7 @@ class EbicsSetup: CliktCommand("Set up the EBICS
subscriber") {
cfg.config.requireString("nexus-httpd-revenue-facade",
"auth_method")
cfg.config.requireString("nexus-httpd-revenue-facade",
"auth_token")
}
+ return
}
// Config is sane. Go (maybe) making the private keys.
val privsMaybe = preparePrivateKeys(cfg.clientPrivateKeysFilename)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSubmit.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSubmit.kt
new file mode 100644
index 00000000..3eb1e6a4
--- /dev/null
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsSubmit.kt
@@ -0,0 +1,105 @@
+/*
+ * This file is part of LibEuFin.
+ * Copyright (C) 2023 Stanisci and Dold.
+
+ * LibEuFin is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3, or
+ * (at your option) any later version.
+
+ * LibEuFin is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
+ * Public License for more details.
+
+ * You should have received a copy of the GNU Affero General Public
+ * License along with LibEuFin; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>
+ */
+
+package tech.libeufin.nexus
+
+import com.github.ajalt.clikt.core.CliktCommand
+import com.github.ajalt.clikt.parameters.options.option
+import io.ktor.client.*
+import tech.libeufin.nexus.ebics.submitPayment
+import tech.libeufin.util.IbanPayto
+import tech.libeufin.util.parsePayto
+import kotlin.system.exitProcess
+
+/**
+ * Takes the initiated payment data, as it was returned from the
+ * database, sanity-checks it, makes the pain.001 document and finally
+ * submits it via EBICS to the bank.
+ *
+ * @param httpClient HTTP client to connect to the bank.
+ * @param cfg configuration handle. Contains the bank URL and EBICS IDs.
+ * @param clientPrivateKeysFile client's private EBICS keys.
+ * @param bankPublicKeysFile bank's public EBICS keys.
+ * @param initiatedPayment payment initiation from the database.
+ * @param debtor bank account information of the debited party.
+ * This values needs the BIC and the name.
+ * @return true on success, false otherwise.
+ */
+private suspend fun submitInitiatedPayment(
+ httpClient: HttpClient,
+ cfg: EbicsSetupConfig,
+ clientPrivateKeysFile: ClientPrivateKeysFile,
+ bankPublicKeysFile: BankPublicKeysFile,
+ initiatedPayment: InitiatedPayment,
+ debtor: IbanPayto
+): Boolean {
+ val creditor = parsePayto(initiatedPayment.creditPaytoUri)
+ if (creditor?.receiverName == null) {
+ logger.error("Won't create pain.001 without the receiver name")
+ return false
+ }
+ if (debtor.bic == null || debtor.receiverName == null) {
+ logger.error("Won't create pain.001 without the debtor BIC and name")
+ return false
+ }
+ if (initiatedPayment.wireTransferSubject == null) {
+ logger.error("Won't create pain.001 without the wire transfer subject")
+ return false
+ }
+ val xml = createPain001(
+ requestUid = initiatedPayment.requestUid,
+ initiationTimestamp = initiatedPayment.initiationTime,
+ amount = initiatedPayment.amount,
+ creditAccount = creditor,
+ debitAccount = debtor,
+ wireTransferSubject = initiatedPayment.wireTransferSubject
+ )
+ submitPayment(xml, cfg, clientPrivateKeysFile, bankPublicKeysFile,
httpClient)
+ return true
+}
+
+class EbicsSubmit : CliktCommand("Submits any initiated payment found in the
database") {
+ private val configFile by option(
+ "--config", "-c",
+ help = "set the configuration file"
+ )
+
+ /**
+ * Submits any initiated payment that was not submitted
+ * so far and -- according to the configuration -- returns
+ * or long-polls for new payments.
+ */
+ override fun run() {
+ val cfg = loadConfigOrFail(configFile)
+ val frequency: Int = doOrFail {
+ cfg.requireNumber("nexus-ebics-submit", "frequency")
+ }
+ if (frequency < 0) {
+ logger.error("Configuration error: cannot operate with a negative
submit frequency ($frequency)")
+ exitProcess(1)
+ }
+ if (frequency == 0) {
+ logger.error("Long-polling not implemented, set frequency > 0")
+ exitProcess(1)
+ }
+ val dbCfg = cfg.extractDbConfigOrFail()
+ val db = Database(dbCfg.dbConnStr)
+ throw NotImplementedError("to be done")
+ }
+}
\ No newline at end of file
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
index 537a9b29..c00c13b3 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
@@ -312,7 +312,7 @@ fun TalerConfig.extractDbConfigOrFail(): DatabaseConfig =
class LibeufinNexusCommand : CliktCommand() {
init {
versionOption(getVersion())
- subcommands(EbicsSetup(), DbInit())
+ subcommands(EbicsSetup(), DbInit(), EbicsSubmit())
}
override fun run() = Unit
}
diff --git a/nexus/src/test/kotlin/PostFinance.kt
b/nexus/src/test/kotlin/PostFinance.kt
index 0a04711c..b1b5469d 100644
--- a/nexus/src/test/kotlin/PostFinance.kt
+++ b/nexus/src/test/kotlin/PostFinance.kt
@@ -15,6 +15,8 @@ import java.time.format.DateTimeFormatter
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
+// Tests only manual, that's why they are @Ignore
+
private fun prep(): EbicsSetupConfig {
val handle = TalerConfig(NEXUS_CONFIG_SOURCE)
val ebicsUserId = File("/tmp/pofi-ebics-user-id.txt").readText()
@@ -23,6 +25,7 @@ private fun prep(): EbicsSetupConfig {
return EbicsSetupConfig(handle)
}
+@Ignore
class Iso20022 {
@Test
fun sendPayment() {
@@ -36,13 +39,13 @@ class Iso20022 {
parsePayto("payto://iban/CH9300762011623852957?receiver-name=NotGiven")!!
)
runBlocking {
- submitPayment(
+ assertTrue(submitPayment(
xml,
cfg,
loadPrivateKeysFromDisk(cfg.clientPrivateKeysFilename)!!,
loadBankKeys(cfg.bankPublicKeysFilename)!!,
HttpClient()
- )
+ ))
}
}
}
--
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: nexus: drafting the ebics-submit subcommand.,
gnunet <=