gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] branch master updated: nexus fetch


From: gnunet
Subject: [libeufin] branch master updated: nexus fetch
Date: Wed, 15 Nov 2023 13:46:49 +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 0c4ea7b8 nexus fetch
0c4ea7b8 is described below

commit 0c4ea7b8afc1e3ff4d2f2e3348049a98b80f71cc
Author: MS <ms@taler.net>
AuthorDate: Wed Nov 15 13:45:40 2023 +0100

    nexus fetch
    
    - accepting camt.054 from STDIN for debugging
    - enforcing that amounts coming from / going to
      the bank have at most 2 fractional digits.
---
 .../main/kotlin/tech/libeufin/nexus/EbicsFetch.kt  | 30 +++++++++++++++++-----
 .../main/kotlin/tech/libeufin/nexus/Iso20022.kt    |  2 ++
 nexus/src/test/kotlin/Parsing.kt                   | 26 +++++++++++++++++++
 util/src/test/kotlin/CryptoUtilTest.kt             |  8 +++---
 4 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
index 6596e8f4..6fdfdc1e 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
@@ -159,16 +159,14 @@ fun maybeLogFile(
 }
 
 /**
- * Converts the given fractional value to the sub-cent 8 digits
- * fraction used in Taler.  Note: this value has very likely a <2
- * length, but the function is general, for each fraction with at
- * most 8 digits.
+ * Converts the 2-digits fraction value as given by the bank
+ * (postfinance dialect), to the Taler 8-digit value (db representation).
  *
  * @param bankFrac fractional value
  * @return the Taler fractional value with at most 8 digits.
  */
 fun makeTalerFrac(bankFrac: String): Int {
-    if (bankFrac.length > 8) throw Exception("Fractional value has more than 8 
digits")
+    if (bankFrac.length > 2) throw Exception("Fractional value has more than 2 
digits")
     var buf = bankFrac.toIntOrNull() ?: throw Exception("Fractional value not 
an Int: $bankFrac")
     repeat(8 - bankFrac.length) {
         buf *= 10
@@ -355,10 +353,10 @@ fun ingestNotification(
     content: ByteArray
 ): Boolean {
     val incomingPayments = mutableListOf<IncomingPayment>()
+    val filenamePrefix = "camt.054_P_" // Only these files have all the 
details.
     try {
         content.unzipForEach { fileName, xmlContent ->
-            // discarding plain "avisierung", since they don't bring any 
payment subject.
-            if (!fileName.startsWith("camt.054_P_")) return@unzipForEach
+            if (!fileName.startsWith(filenamePrefix)) return@unzipForEach
             val found = findIncomingTxInNotification(xmlContent, 
ctx.cfg.currency)
             incomingPayments += found
         }
@@ -510,6 +508,24 @@ class EbicsFetch: CliktCommand("Fetches bank records.  
Defaults to camt.054 noti
         if (onlyStatements) whichDoc = SupportedDocument.CAMT_053
         if (onlyLogs) whichDoc = SupportedDocument.PAIN_002_LOGS
 
+        // If STDIN has data, we run in debug mode: parse, print, and return.
+        val maybeStdin = generateSequence(::readLine).joinToString("\n")
+        if (maybeStdin.isNotEmpty()) {
+            logger.debug("Reading from STDIN, running in debug mode.  Not 
involving the database.")
+            when(whichDoc) {
+                SupportedDocument.CAMT_054 -> {
+                    val incoming = findIncomingTxInNotification(maybeStdin, 
cfg.currency)
+                    incoming.forEach {
+                        println(it)
+                    }
+                }
+                else -> {
+                    logger.error("Parsing $whichDoc not supported")
+                    exitProcess(1)
+                }
+            }
+            return
+        }
         val ctx = FetchContext(
             cfg,
             HttpClient(),
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt
index bc3199e6..3c291b99 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt
@@ -22,6 +22,8 @@ data class Pain001Namespaces(
  * @return [String] of the amount number without the currency.
  */
 fun getAmountNoCurrency(amount: TalerAmount): String {
+    if (amount.fraction.toString().length > 8)
+        throw Exception("Taler amount must have at most 8 fractional digits")
     if (amount.fraction == 0) {
         return amount.value.toString()
     } else {
diff --git a/nexus/src/test/kotlin/Parsing.kt b/nexus/src/test/kotlin/Parsing.kt
index 441b05aa..71e4d985 100644
--- a/nexus/src/test/kotlin/Parsing.kt
+++ b/nexus/src/test/kotlin/Parsing.kt
@@ -1,5 +1,8 @@
+import net.taler.wallet.crypto.Base32Crockford
 import org.junit.Test
 import org.junit.jupiter.api.assertThrows
+import tech.libeufin.nexus.TalerAmount
+import tech.libeufin.nexus.getAmountNoCurrency
 import tech.libeufin.nexus.getTalerAmount
 import tech.libeufin.nexus.isReservePub
 import java.lang.StringBuilder
@@ -9,6 +12,29 @@ import kotlin.test.assertNull
 import kotlin.test.assertTrue
 
 class Parsing {
+    @Test // Could be moved in a dedicated Amounts.kt test module.
+    fun generateCurrencyAgnosticAmount() {
+        assertThrows<Exception> {
+            // Too many fractional digits.
+            getAmountNoCurrency(TalerAmount(1, 123456789, "KUDOS"))
+        }
+        assertThrows<Exception> {
+            // Nexus doesn't support sub-cents.
+            getAmountNoCurrency(TalerAmount(1, 12345678, "KUDOS"))
+        }
+        assertThrows<Exception> {
+            // Nexus doesn't support sub-cents.
+            getAmountNoCurrency(TalerAmount(0, 1, "KUDOS"))
+        }
+        assertEquals(
+            "0.01",
+            getAmountNoCurrency(TalerAmount(0, 1000000, "KUDOS"))
+        )
+        assertEquals(
+            "0.1",
+            getAmountNoCurrency(TalerAmount(0, 10000000, "KUDOS"))
+        )
+    }
     @Test // parses amounts as found in the camt.05x documents.
     fun parseCurrencyAgnosticAmount() {
         assertTrue {
diff --git a/util/src/test/kotlin/CryptoUtilTest.kt 
b/util/src/test/kotlin/CryptoUtilTest.kt
index d469a9a4..866866a2 100644
--- a/util/src/test/kotlin/CryptoUtilTest.kt
+++ b/util/src/test/kotlin/CryptoUtilTest.kt
@@ -156,11 +156,13 @@ class CryptoUtilTest {
     }
 
     @Test(expected = EncodingException::class)
-    // from Crockford32 encoding to binary.
     fun base32ToBytesTest() {
-        val expectedEncoding = "C9P6YRG"
+        val expectedEncoding = "C9P6YRG" // decodes to 'blob'
         
assert(Base32Crockford.decode(expectedEncoding).toString(Charsets.UTF_8) == 
"blob")
-        Base32Crockford.decode("-".repeat(52)) // fulfills the "expected = .." 
above.
+        val validKey = "4MZT6RS3RVB3B0E2RDMYW0YRA3Y0VPHYV0CYDE6XBB0YMPFXCEG0"
+        val obj = Base32Crockford.decode(validKey)
+        val roundTrip = Base32Crockford.encode(obj)
+        assertEquals(validKey, roundTrip)
     }
 
     @Test

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]