[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated: nexus fetch: implementing HAC.
From: |
gnunet |
Subject: |
[libeufin] branch master updated: nexus fetch: implementing HAC. |
Date: |
Tue, 14 Nov 2023 09:25:58 +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 de7e5a97 nexus fetch: implementing HAC.
de7e5a97 is described below
commit de7e5a9726a29a39b801cf0a2b1e708c36f7f2aa
Author: MS <ms@taler.net>
AuthorDate: Tue Nov 14 09:25:26 2023 +0100
nexus fetch: implementing HAC.
---
.../main/kotlin/tech/libeufin/nexus/EbicsFetch.kt | 42 +++++++++++++++++-----
.../kotlin/tech/libeufin/nexus/ebics/Ebics2.kt | 23 ++++++++++++
.../kotlin/tech/libeufin/nexus/ebics/Ebics3.kt | 9 ++---
.../tech/libeufin/nexus/ebics/EbicsCommon.kt | 18 ++++++++++
4 files changed, 79 insertions(+), 13 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
index 46a23045..c26ea937 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
@@ -47,9 +47,9 @@ data class FetchContext(
*/
val whichDocument: SupportedDocument,
/**
- * EBICS version.
+ * EBICS version. For the HAC message type, version gets switched to
EBICS 2.
*/
- val ebicsVersion: EbicsVersion = EbicsVersion.three,
+ var ebicsVersion: EbicsVersion = EbicsVersion.three,
/**
* Start date of the returned documents. Only
* used in --transient mode.
@@ -118,8 +118,13 @@ private suspend inline fun downloadHelper(
*
* @param cfg config handle.
* @param content ZIP bytes from the server.
+ * @param nonZip only true when downloading via HAC (EBICS 2)
*/
-fun maybeLogFile(cfg: EbicsSetupConfig, content: ByteArray) {
+fun maybeLogFile(
+ cfg: EbicsSetupConfig,
+ content: ByteArray,
+ nonZip: Boolean = false
+) {
// Main dir.
val maybeLogDir = cfg.config.lookupString(
"nexus-fetch",
@@ -133,15 +138,23 @@ fun maybeLogFile(cfg: EbicsSetupConfig, content:
ByteArray) {
// Creating the combined dir.
val dirs = Path.of(maybeLogDir, subDir)
doOrFail { dirs.createDirectories() }
- // Write each ZIP entry in the combined dir.
- content.unzipForEach { fileName, xmlContent ->
- val f = File(dirs.toString(), "${now.toDbMicros()}_$fileName")
- // Rare: cannot download the same file twice in the same microsecond.
+ fun maybeWrite(f: File, xml: String) {
if (f.exists()) {
logger.error("Log file exists already at: ${f.path}")
exitProcess(1)
}
- doOrFail { f.writeText(xmlContent) }
+ doOrFail { f.writeText(xml) }
+ }
+ if (nonZip) {
+ val f = File(dirs.toString(),
"${now.toDbMicros()}_HAC_response.pain.002.xml")
+ maybeWrite(f, content.toString(Charsets.UTF_8))
+ return
+ }
+ // Write each ZIP entry in the combined dir.
+ content.unzipForEach { fileName, xmlContent ->
+ val f = File(dirs.toString(), "${now.toDbMicros()}_$fileName")
+ // Rare: cannot download the same file twice in the same microsecond.
+ maybeWrite(f, xmlContent)
}
}
@@ -174,7 +187,11 @@ private suspend fun fetchDocuments(
logger.debug("Fetching documents from timestamp: $lastExecutionTime")
val maybeContent = downloadHelper(ctx, lastExecutionTime) ?:
exitProcess(1) // client is wrong, failing.
if (maybeContent.isEmpty()) return
- maybeLogFile(ctx.cfg, maybeContent)
+ maybeLogFile(
+ ctx.cfg,
+ maybeContent,
+ nonZip = ctx.whichDocument == SupportedDocument.PAIN_002_LOGS
+ )
}
class EbicsFetch: CliktCommand("Fetches bank records. Defaults to camt.054
notifications") {
@@ -200,6 +217,10 @@ class EbicsFetch: CliktCommand("Fetches bank records.
Defaults to camt.054 noti
help = "Downloads only camt.052 intraday reports"
).flag(default = false)
+ private val onlyLogs by option(
+ help = "Downloads only EBICS activity logs via pain.002, only
available to --transient mode. Config needs log directory"
+ ).flag(default = false)
+
private val pinnedStart by option(
help = "constant YYYY-MM-DD date for the earliest document to download
" +
"(only consumed in --transient mode). The latest document is
always" +
@@ -236,6 +257,7 @@ class EbicsFetch: CliktCommand("Fetches bank records.
Defaults to camt.054 noti
if (onlyAck) whichDoc = SupportedDocument.PAIN_002
if (onlyReports) whichDoc = SupportedDocument.CAMT_052
if (onlyStatements) whichDoc = SupportedDocument.CAMT_053
+ if (onlyLogs) whichDoc = SupportedDocument.PAIN_002_LOGS
val ctx = FetchContext(
cfg,
@@ -256,6 +278,8 @@ class EbicsFetch: CliktCommand("Fetches bank records.
Defaults to camt.054 noti
}
} else null
ctx.pinnedStart = pinnedStartArg
+ if (whichDoc == SupportedDocument.PAIN_002_LOGS)
+ ctx.ebicsVersion = EbicsVersion.two
runBlocking {
fetchDocuments(db, ctx)
}
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics2.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics2.kt
index 91ec9287..496ee8cd 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics2.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics2.kt
@@ -383,6 +383,28 @@ private fun prepNotificationRequest2(
)
}
+/**
+ * Prepares an EBICS 2 request to get logs from the bank about any
+ * uploaded or downloaded document.
+ *
+ * @param startDate earliest timestamp of the returned document(s). If
+ * null, it defaults to download the unseen documents.
+ * @param endDate latest timestamp of the returned document(s). If
+ * null, it defaults to the current time.
+ * @return [Ebics2Request] object to be first converted in XML and
+ * then be passed to the EBICS downloader.
+ */
+private fun prepLogsRequest2(
+ startDate: Instant? = null,
+ endDate: Instant? = null
+): Ebics2Request {
+ val maybeDateRange = if (startDate != null) EbicsDateRange(startDate,
endDate ?: Instant.now()) else null
+ return Ebics2Request(
+ messageType = "HAC",
+ orderParams = EbicsStandardOrderParams(dateRange = maybeDateRange)
+ )
+}
+
/**
* Abstracts EBICS 2 request creation of a download init phase.
*
@@ -402,4 +424,5 @@ fun prepEbics2Document(
SupportedDocument.CAMT_052 -> prepReportRequest2(startDate)
SupportedDocument.CAMT_053 -> prepStatementRequest2(startDate)
SupportedDocument.CAMT_054 -> prepNotificationRequest2(startDate)
+ SupportedDocument.PAIN_002_LOGS -> prepLogsRequest2(startDate)
}
\ No newline at end of file
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics3.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics3.kt
index 8d56a5ed..578884c9 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics3.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/Ebics3.kt
@@ -272,7 +272,7 @@ private fun getEbics3DateRange(
*
* @return [Ebics3Request.OrderDetails.BTOrderParams]
*/
-private fun prepNotificationRequest3(
+fun prepNotificationRequest3(
startDate: Instant? = null,
endDate: Instant? = null,
isAppendix: Boolean
@@ -309,7 +309,7 @@ private fun prepNotificationRequest3(
*
* @return [Ebics3Request.OrderDetails.BTOrderParams]
*/
-private fun prepAckRequest3(
+fun prepAckRequest3(
startDate: Instant? = null,
endDate: Instant? = null
): Ebics3Request.OrderDetails.BTOrderParams {
@@ -342,7 +342,7 @@ private fun prepAckRequest3(
*
* @return [Ebics3Request.OrderDetails.BTOrderParams]
*/
-private fun prepStatementRequest3(
+fun prepStatementRequest3(
startDate: Instant? = null,
endDate: Instant? = null
): Ebics3Request.OrderDetails.BTOrderParams {
@@ -375,7 +375,7 @@ private fun prepStatementRequest3(
*
* @return [Ebics3Request.OrderDetails.BTOrderParams]
*/
-private fun prepReportRequest3(
+fun prepReportRequest3(
startDate: Instant? = null,
endDate: Instant? = null
): Ebics3Request.OrderDetails.BTOrderParams {
@@ -417,4 +417,5 @@ fun prepEbics3Document(
SupportedDocument.CAMT_052 -> prepReportRequest3(startDate)
SupportedDocument.CAMT_053 -> prepStatementRequest3(startDate)
SupportedDocument.CAMT_054 -> prepReportRequest3(startDate)
+ SupportedDocument.PAIN_002_LOGS -> throw Exception("HAC (--only-logs)
not available in EBICS 3")
}
\ No newline at end of file
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsCommon.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsCommon.kt
index c40d0099..d58ce8cc 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsCommon.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsCommon.kt
@@ -65,9 +65,27 @@ enum class EbicsVersion { two, three }
* Which documents can be downloaded via EBICS.
*/
enum class SupportedDocument {
+ /**
+ * Payment acknowledgement.
+ */
PAIN_002,
+ /**
+ * From an HAC request. Informs about any
+ * download/upload activity, including wrong
+ * documents.
+ */
+ PAIN_002_LOGS,
+ /**
+ * Account statements.
+ */
CAMT_053,
+ /**
+ * Account intraday reports.
+ */
CAMT_052,
+ /**
+ * Account notifications.
+ */
CAMT_054
}
--
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 fetch: implementing HAC.,
gnunet <=