libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 9d4859c76ca787678f7f2388aba1e51cd47d94a0
parent 7ce7b83e2dbbaff530e74b4b5006b742471d59f8
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date:   Wed, 29 Jan 2020 10:14:54 +0100

Fetch files as streams, and fix HEV response..

.. rendering from the Nexus.

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt | 8+++++++-
Mnexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 37++++++++++++++++++-------------------
Msandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt | 1+
Msandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt | 10----------
Mutil/src/main/kotlin/XMLUtil.kt | 4++--
Mutil/src/test/kotlin/EbicsMessagesTest.kt | 20+++++++++++---------
6 files changed, 39 insertions(+), 41 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/JSON.kt @@ -55,6 +55,12 @@ data class EbicsSubscribersResponse( val ebicsSubscribers: MutableList<EbicsSubscriberInfoResponse> = mutableListOf() ) +data class ProtocolAndVersion( + val protocol: String, + val version: String, + val host: String +) + data class EbicsHevResponse( - val versions: List<String> + val versions: List<ProtocolAndVersion> ) \ 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 @@ -39,6 +39,7 @@ import io.ktor.routing.* import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty import org.jetbrains.exposed.dao.EntityID +import org.jetbrains.exposed.exceptions.ExposedSQLException import org.jetbrains.exposed.sql.StdOutSqlLogger import org.jetbrains.exposed.sql.addLogger import org.jetbrains.exposed.sql.transactions.transaction @@ -63,22 +64,24 @@ import java.util.zip.DeflaterInputStream import javax.crypto.EncryptedPrivateKeyInfo fun testData() { - val pairA = CryptoUtil.generateRsaKeyPair(2048) val pairB = CryptoUtil.generateRsaKeyPair(2048) val pairC = CryptoUtil.generateRsaKeyPair(2048) - - transaction { - addLogger(StdOutSqlLogger) - EbicsSubscriberEntity.new(id = "default-customer") { - ebicsURL = "http://localhost:5000/ebicsweb" - userID = "USER1" - partnerID = "PARTNER1" - hostID = "host01" - signaturePrivateKey = SerialBlob(pairA.private.encoded) - encryptionPrivateKey = SerialBlob(pairB.private.encoded) - authenticationPrivateKey = SerialBlob(pairC.private.encoded) + try { + transaction { + addLogger(StdOutSqlLogger) + EbicsSubscriberEntity.new(id = "default-customer") { + ebicsURL = "http://localhost:5000/ebicsweb" + userID = "USER1" + partnerID = "PARTNER1" + hostID = "host01" + signaturePrivateKey = SerialBlob(pairA.private.encoded) + encryptionPrivateKey = SerialBlob(pairB.private.encoded) + authenticationPrivateKey = SerialBlob(pairC.private.encoded) + } } + } catch (e: ExposedSQLException) { + LOGGER.info("Likely primary key collision for sample data: accepted") } } @@ -100,17 +103,13 @@ fun main() { val client = HttpClient(){ expectSuccess = false // this way, it does not throw exceptions on != 200 responses. } - val logger = LoggerFactory.getLogger("tech.libeufin.nexus") - val server = embeddedServer(Netty, port = 5001) { - install(CallLogging) { this.level = Level.DEBUG this.logger = LOGGER } - install(ContentNegotiation) { moshi { } @@ -119,7 +118,6 @@ fun main() { setPrettyPrinting() } } - install(StatusPages) { exception<Throwable> { cause -> logger.error("Exception while handling '${call.request.uri}'", cause) @@ -182,7 +180,6 @@ fun main() { ) } } - intercept(ApplicationCallPipeline.Fallback) { if (this.call.response.status() == null) { call.respondText("Not found (no route matched).\n", ContentType.Text.Plain, HttpStatusCode.NotFound) @@ -505,9 +502,11 @@ fun main() { hostId = hostID } val response = client.postToBankUnsigned<HEVRequest, HEVResponse>(ebicsUrl, request) + // here, response is gueranteed to be successful, no need to check the status code. call.respond( HttpStatusCode.OK, - EbicsHevResponse(response.value.versionNumber as List<String>) + EbicsHevResponse(response.value.versionNumber!!.map { + ProtocolAndVersion(it.value, it.protocolVersion, hostID) }) ) return@get } diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt @@ -659,6 +659,7 @@ suspend fun ApplicationCall.ebicsweb() { } val strResp = XMLUtil.convertJaxbToString(hevResponse) + LOGGER.debug("HEV response: $strResp") respondText(strResp, ContentType.Application.Xml, HttpStatusCode.OK) } "ebicsNoPubKeyDigestsRequest" -> { diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt @@ -62,9 +62,7 @@ class BadAmount(badValue: Any?) : Exception("Value '${badValue}' is not a valid class UnacceptableFractional(badNumber: BigDecimal) : Exception( "Unacceptable fractional part ${badNumber}" ) - val LOGGER: Logger = LoggerFactory.getLogger("tech.libeufin.sandbox") - fun findCustomer(id: String?): BankCustomerEntity { val idN = try { @@ -94,7 +92,6 @@ fun findEbicsSubscriber(partnerID: String, userID: String, systemID: String?): E }.firstOrNull() } - data class Subscriber( val partnerID: String, val userID: String, @@ -108,14 +105,12 @@ data class SubscriberKeys( val signaturePublicKey: RSAPublicKey ) - data class EbicsHostPublicInfo( val hostID: String, val encryptionPublicKey: RSAPublicKey, val authenticationPublicKey: RSAPublicKey ) - inline fun <reified T> Document.toObject(): T { val jc = JAXBContext.newInstance(T::class.java) val m = jc.createUnmarshaller() @@ -129,7 +124,6 @@ fun BigDecimal.signToString(): String { } fun sampleData() { - transaction { val pairA = CryptoUtil.generateRsaKeyPair(2048) val pairB = CryptoUtil.generateRsaKeyPair(2048) @@ -141,14 +135,11 @@ fun sampleData() { encryptionPrivateKey = SerialBlob(pairB.private.encoded) signaturePrivateKey = SerialBlob(pairC.private.encoded) } - val customerEntity = BankCustomerEntity.new { addLogger(StdOutSqlLogger) customerName = "Mina" } - LOGGER.debug("Creating customer number: ${customerEntity.id}") - EbicsSubscriberEntity.new { partnerId = "PARTNER1" userId = "USER1" @@ -158,7 +149,6 @@ fun sampleData() { nextOrderID = 1 bankCustomer = customerEntity } - for (i in listOf<Amount>(Amount("-0.44"), Amount("6.02"))) { BankTransactionEntity.new { counterpart = "IBAN" diff --git a/util/src/main/kotlin/XMLUtil.kt b/util/src/main/kotlin/XMLUtil.kt @@ -152,8 +152,8 @@ class XMLUtil private constructor() { } } val schemaInputs: Array<Source> = listOf("xsd/ebics_H004.xsd", "xsd/ebics_hev.xsd").map { - val resUrl = classLoader.getResource(it) ?: throw FileNotFoundException("Schema file $it not found.") - StreamSource(File(resUrl.toURI())) + val stream = classLoader.getResourceAsStream(it) ?: throw FileNotFoundException("Schema file $it not found.") + StreamSource(stream) }.toTypedArray() val bundle = sf.newSchema(schemaInputs) val newValidator = bundle.newValidator() diff --git a/util/src/test/kotlin/EbicsMessagesTest.kt b/util/src/test/kotlin/EbicsMessagesTest.kt @@ -1,3 +1,5 @@ +package tech.libeufin.sandbox + import junit.framework.TestCase.assertEquals import org.apache.xml.security.binding.xmldsig.SignatureType import org.junit.Test @@ -8,6 +10,7 @@ import tech.libeufin.util.ebics_hev.SystemReturnCodeType import tech.libeufin.util.ebics_s001.SignatureTypes import tech.libeufin.util.CryptoUtil import tech.libeufin.util.XMLUtil +import tech.libeufin.util.ebics_h004.* import javax.xml.datatype.DatatypeFactory import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -21,8 +24,7 @@ class EbicsMessagesTest { @Test fun testImportNonRoot() { val classLoader = ClassLoader.getSystemClassLoader() - val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SignaturePubKeyOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"http://www.ebics.org/S001\">\n <SignaturePubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>s5ktpg3xGjbZZgVTYtW+0e6xsWg142UwvoM3mfuM+qrkIa5bPUGQLH6BRL9IejYosPhoA6jwMBSxO8LfaageyZJt2M5wHklJYz3fADtQrV1bk5R92OaY/9ZZdHxw3xY93tm5JfVrMDW9DEK5B1hUzYFdjuN/qu2/sdE9mwhx2YjYwwdSQzv6MhbtSK9OAJjPGo3fkxsht6maSmRCdgxplIOSO2mmP1wjUzbVUMcrRk9KDMvnb3kCxiTm+evvxX6J4wpY1bAWukolJbaALHlFtgTo1LnulUe/BxiKx9HpmuEAaPsk8kgduXsz5OqH2g/Vyw75x51aKVPxOTBPyP+4kQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <SignatureVersion>A006</SignatureVersion>\n </SignaturePubKeyInfo>\n <PartnerID>flo-kid</PartnerID>\n <UserID>flo-uid</UserID>\n</SignaturePubKeyOrderData>") - assert(ini != null) + val ini = classLoader.getResource("ebics_ini_inner_key.xml") val jaxb = XMLUtil.convertStringToJaxb<SignatureTypes.SignaturePubKeyOrderData>(ini.readText()) assertEquals("A006", jaxb.value.signaturePubKeyInfo.signatureVersion) } @@ -33,7 +35,7 @@ class EbicsMessagesTest { @Test fun testStringToJaxb() { val classLoader = ClassLoader.getSystemClassLoader() - val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>") + val ini = classLoader.getResource("ebics_ini_request_sample.xml") val jaxb = XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(ini.readText()) println("jaxb loaded") assertEquals( @@ -63,7 +65,7 @@ class EbicsMessagesTest { @Test fun testDomToJaxb() { val classLoader = ClassLoader.getSystemClassLoader() - val ini = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>")!! + val ini = classLoader.getResource("ebics_ini_request_sample.xml")!! val iniDom = XMLUtil.parseStringIntoDom(ini.readText()) XMLUtil.convertDomToJaxb<EbicsUnsecuredRequest>( EbicsUnsecuredRequest::class.java, @@ -96,14 +98,14 @@ class EbicsMessagesTest { @Test fun testParseHiaRequestOrderData() { val classLoader = ClassLoader.getSystemClassLoader() - val hia = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HIARequestOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:org:ebics:H004 ebics_orders_H004.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"urn:org:ebics:H004\">\n <AuthenticationPubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>0Ekicvrcj2+8tsF+DZsWihl9W7AyVwtMLxq3qefSWagpfnV7BVsKYIJ/OhiWpvr3dz6K5lHSatzhG1x//jrZt6VHn5Wkkb0M0vayPUiZbe5s2aLabqfOTrt8TPnHwjZMChDHRmGoKI0OzLyQJ6MIfQrHZ5t61ccWubYO/bgbSnP9H39k8QEp0kmW4Tf4u+28GTLgueNAaaPTdCozZjrST4fH9nyhBUZ3nl+vZ+AiUNdl5UfV109CXhCm3safLboUus6ZcYLm6gTaiwJEdRX7HYbnAQZ5gcoXVz/oyxJqTkicVOLPrTAfi3UmFrnIVF8XBtOPdIXHzSpxZ3yT8gH4zQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <AuthenticationVersion>X002</AuthenticationVersion>\n </AuthenticationPubKeyInfo>\n <EncryptionPubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>0Ekicvrcj2+8tsF+DZsWihl9W7AyVwtMLxq3qefSWagpfnV7BVsKYIJ/OhiWpvr3dz6K5lHSatzhG1x//jrZt6VHn5Wkkb0M0vayPUiZbe5s2aLabqfOTrt8TPnHwjZMChDHRmGoKI0OzLyQJ6MIfQrHZ5t61ccWubYO/bgbSnP9H39k8QEp0kmW4Tf4u+28GTLgueNAaaPTdCozZjrST4fH9nyhBUZ3nl+vZ+AiUNdl5UfV109CXhCm3safLboUus6ZcYLm6gTaiwJEdRX7HYbnAQZ5gcoXVz/oyxJqTkicVOLPrTAfi3UmFrnIVF8XBtOPdIXHzSpxZ3yT8gH4zQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <EncryptionVersion>E002</EncryptionVersion>\n </EncryptionPubKeyInfo>\n <PartnerID>PARTNER1</PartnerID>\n <UserID>USER1</UserID>\n</HIARequestOrderData>")!!.readText() + val hia = classLoader.getResource("hia_request_order_data.xml")!!.readText() XMLUtil.convertStringToJaxb<HIARequestOrderData>(hia) } @Test fun testHiaLoad() { val classLoader = ClassLoader.getSystemClassLoader() - val hia = classLoader.getResource("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ebicsUnsecuredRequest xmlns=\"urn:org:ebics:H004\"\n xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\"\n Version=\"H004\"\n Revision=\"1\">\n <header authenticate=\"true\">\n <static>\n <HostID>LIBEUFIN-SANDBOX</HostID>\n <PartnerID>CUSTM001</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>HIA</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>eJzNlsmyo0YWhvf1FBW3l0SZZBY3VHIwCwESM0g7ZpCYxAxPb/mWh7ZdrlUvmhX8Z/gzyPNl5P7npSo/T0nXF0399Q35Cbz9fPi0P8qMmTzHpB8uXZx0fDAEn1+Jdf8e91/f8mFo32F4nuefZuynpstgFAAAAxp+5cR9kf3n7dPn7z0fLb6+jV39/qp6T8Ii6t+PAOA/yn9PXh3/YvpR9+FrAYD8sHbpi39ZLwL7mmpFeVIFX4q6H4I6St4Or157ZhzypB6KKBheP0UfQyVZ5TptDh9G+2+CG5RjcvjNeh/376bF/F3+FtCaeCzH/sCccjF6CEpIHO9qNg7sk6vEJqcu5+zCjy3Te4YaE00r3WCcLidQGGEqJ4uoRMrcaQFlAnAK2xDVb1T2KGFMbW87hbMe9m5XzjCb6kuIareAuStQx66uzs+PUlk5oQim7B6eoNW2qo4Ljxu4jbFWLM4M7n4geL2ZNSiMnxum8+d+YTntqIqVV3eS06KTHYeBuOmqaXA1Ar/csDRAAFFNmr8cGc07u8ZC9TidnjhurtHURIQpvLBIf6Uj/5xQT2pGj62hFy2jbldl1wQtTkKbBKm0d2pWZIxX6Q6brViRT8Hl5UeW6FnsgIC1YQslccVX8AhjALHjgHF/ENYD8+3O7ZLOjPhJWvOeMniZ3ayU8F9rAxgdA9xMO1mN0ITDKKWuzZ23hRWH6P3ZKRn3FBhahVPVUOgmF1Br6mWEGkoWQ9h1eXcWlHsA5sGwVg6PurNwXCdWaw70kceyi3Gye6IjoQTPmksNZ5SAyYFlYQD2HLzenvaur+j7YOw20fN9ZEQK+yYyl0AYctO+tL7HmmVR6lw3hpVuLQpfJxvUcjJfsQ+pQCzmVCuiBpbg+DR1uktRiLu3+LHTSiTqQrWN+QF3a4lGdo/NMirzSlakYYUsCgekexluTTKjt4LKV65gMNMX5fIM3xBPu3PUGepNk19iM6yPa4K3z9m8X4KU3gVayt7E+jGR7DWwoZlcyj38X4P7l2kWlrapX3QcGINhP9L+UH6HAf4+DXu7qBJrCKr2gAJk9wVBvgDERpB3BLxjxG0P/xn/Bhr8D9L+hqb77dg6+ACge/j7sV+Bhn9E9F6oo25t/7eoqyBWNpkKhBnWdoKGuhmCBRJ82aiLXKO+c69WObdyykqpGrcg2A+PPp8it7LPdjNhK5BiMEIn6h6QgJHjEWsmk3Jz+9arzzIBzYNz3qj0mNT8xVTYUR8xVxXWklfOR9nz6FQ6z/gI7Gwkg6kTjx2OnisyF3DN823VzoSr4g5ryJwbHMquYT4NDSEM0PbsLwYsRRPq9lvpA5nnoqlXi9vTCYT4FkyoE7QDt5aBImu2fMdO5d0bBJftAd5cSFpop0IvJKXEH4KxYVdK8B7lsp0JfSmIiwiriH9a+plTZiGxZc8hezlARdah8KgLdshknHN6xLyi0SWHjCm6cYu2J4n6VkCYMjfdzMMxRs1sRCsAt9LXlrr01YT4jeM2RE95x8qg+zShwUrm7MyWCdonrmK+SL8U8gsGwbCZbECR3PP5ihjNrA6ryssn9bR6BnTlRnBkNYmdG6aEuzBLGnrk1WxY2VwBGH5S6tCp/VFGBobwT2FY2JSrPquMjHjlFnGFWDCutPVlcNIwljSFU34Ws5h4bdgq2eKUHV+jcHVQx5v74z2uToGp3xmRjGxpTkTEnnnaf7zQb+rdLpo0DlJL7ZwxCJ8OJIRM6iQvetZRo4sQoCTSbQp1HVovaZ95jUK/zljDup8ehRVrEBGCRGZmzukmaSZn61EXF/pRszUNjc8sVSdM9+Wuq1WA6f+vqP+J5e8oCx+Y/1P/QPzfKN7rQTfUSSfzB8HnjsxZEl5uf2i/Zjj9x6vNqIK5h3/7+rSHv3MJOnz6BXLJ7gw=</OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>\n")!! + val hia = classLoader.getResource("hia_request.xml")!! val hiaDom = XMLUtil.parseStringIntoDom(hia.readText()) val x: Element = hiaDom.getElementsByTagNameNS( "urn:org:ebics:H004", @@ -127,7 +129,7 @@ class EbicsMessagesTest { val jaxbKey = run { val classLoader = ClassLoader.getSystemClassLoader() val file = classLoader.getResource( - "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<SignaturePubKeyOrderData xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ebics.org/S001 http://www.ebics.org/S001/ebics_signature.xsd\" xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"http://www.ebics.org/S001\">\n <SignaturePubKeyInfo>\n <PubKeyValue>\n <ds:RSAKeyValue>\n <ds:Modulus>s5ktpg3xGjbZZgVTYtW+0e6xsWg142UwvoM3mfuM+qrkIa5bPUGQLH6BRL9IejYosPhoA6jwMBSxO8LfaageyZJt2M5wHklJYz3fADtQrV1bk5R92OaY/9ZZdHxw3xY93tm5JfVrMDW9DEK5B1hUzYFdjuN/qu2/sdE9mwhx2YjYwwdSQzv6MhbtSK9OAJjPGo3fkxsht6maSmRCdgxplIOSO2mmP1wjUzbVUMcrRk9KDMvnb3kCxiTm+evvxX6J4wpY1bAWukolJbaALHlFtgTo1LnulUe/BxiKx9HpmuEAaPsk8kgduXsz5OqH2g/Vyw75x51aKVPxOTBPyP+4kQ==</ds:Modulus>\n <ds:Exponent>AQAB</ds:Exponent>\n </ds:RSAKeyValue>\n </PubKeyValue>\n <SignatureVersion>A006</SignatureVersion>\n </SignaturePubKeyInfo>\n <PartnerID>flo-kid</PartnerID>\n <UserID>flo-uid</UserID>\n</SignaturePubKeyOrderData>" + "ebics_ini_inner_key.xml" ) assertNotNull(file) XMLUtil.convertStringToJaxb<SignatureTypes.SignaturePubKeyOrderData>(file.readText()) @@ -141,7 +143,7 @@ class EbicsMessagesTest { @Test fun testLoadIniMessage() { val classLoader = ClassLoader.getSystemClassLoader() - val text = classLoader.getResource("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ebicsUnsecuredRequest Revision=\"1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"urn:org:ebics:H004 ebics_keymgmt_request_H004.xsd\" Version=\"H004\"\n xmlns=\"urn:org:ebics:H004\">\n <header authenticate=\"true\">\n <static>\n <HostID>myhost</HostID>\n <PartnerID>k1</PartnerID>\n <UserID>u1</UserID>\n <OrderDetails>\n <OrderType>INI</OrderType>\n <OrderAttribute>DZNNN</OrderAttribute>\n </OrderDetails>\n <SecurityMedium>0000</SecurityMedium>\n </static>\n <mutable/>\n </header>\n <body>\n <DataTransfer>\n <OrderData>\n eJx9U1tzmkAUfu9M/wNDH524XIINjprBaOIFCopg8CWzyHK/GHaR1V9fhtg0bWrf9nzfdy57LoN7mqXMEZU4KvIhy3c5lkH5vvCiPBiyFfFv7tj70dcvAzMKckiqEhmVu0QnvfRQOYEEMo1/jvsUR0M2JOTQB6Cu624tdosyAALH8eBZU819iDJ4E+WYwHyPWKbR93ELqsUekjb5B3fkRnvcRjCbCMxVBrTmC/5VXJdij72U5OErFXGAk0Gj8Rq3bxf1f7KzzfcZ5u8GzHO/aImGekNsmFboAjWgh/trU/mEvzFa4VVphUdYSsghEOlT7O52gb1xyLbDoR7F24C/Faz6WGhi5lda57VM5lByDetppc5647Uqz1HsFNgIC6UX19rYpPqd6kMYoNNuQQRNqmdJunDOoq9MyKq0eTeR1rKgQwfIu503o7VIHVkkmbTw7VKbbOXJdCmN+dA6O49eXP0Ar5UAsDeVszqkghM7de2Zq/Oxp4UuMZeyrixi46kQ/YTikPQyaGbrBy+gh3Sum7qQZQZfx9bZtS1tX64TeTnRjrkrJg802mQddDzS597itj44vKtsq6RIFy5U1Fn6SIJNwat5lVoIjGm0pPLskFVTBRo4uUsCr3rGZ0l/nQkBsE/1d4lKPFzaBtU3Y+NkdG6T1XA4AB+a/Gfrp/RQ5CgnI2WljFvdO/I+O/DP4Q3A50H/Xgv77YZGCsf1BuAT3O4QuLZEAwOWJEflfDJK+CbPu9WSFm7fVcNcns1BgmsXOfoJ1l5CIg==\n </OrderData>\n </DataTransfer>\n </body>\n</ebicsUnsecuredRequest>")!!.readText() + val text = classLoader.getResource("ebics_ini_request_sample.xml")!!.readText() XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(text) } @@ -171,7 +173,7 @@ class EbicsMessagesTest { @Test fun testLoadHpb() { val classLoader = ClassLoader.getSystemClassLoader() - val text = classLoader.getResource("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ebics:ebicsNoPubKeyDigestsRequest xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:ebics=\"urn:org:ebics:H004\" xmlns=\"http://www.w3.org/2001/XMLSchema\" Version=\"H004\" Revision=\"1\">\n <ebics:header authenticate=\"true\">\n <ebics:static>\n <ebics:HostID>EBIXQUAL</ebics:HostID>\n <ebics:Nonce>0749134D19E160DA4ACA366180113D44</ebics:Nonce>\n <ebics:Timestamp>2018-11-01T11:10:35Z</ebics:Timestamp>\n <ebics:PartnerID>EXCHANGE</ebics:PartnerID>\n <ebics:UserID>TALER</ebics:UserID>\n <ebics:OrderDetails>\n <ebics:OrderType>HPB</ebics:OrderType>\n <ebics:OrderAttribute>DZHNN</ebics:OrderAttribute>\n </ebics:OrderDetails>\n <ebics:SecurityMedium>0000</ebics:SecurityMedium>\n </ebics:static>\n <ebics:mutable/>\n </ebics:header>\n <ebics:AuthSignature>\n <ds:SignedInfo>\n <ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n <ds:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"/>\n <ds:Reference URI=\"#xpointer(//*[@authenticate='true'])\">\n <ds:Transforms>\n <ds:Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n </ds:Transforms>\n <ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n <ds:DigestValue>yuwpcvmVrNrc1t58aulF6TiqKO+CNe7Dhwaa6V/cKws=</ds:DigestValue>\n </ds:Reference>\n </ds:SignedInfo>\n <ds:SignatureValue>chhF4/yxSz2WltTR0/DPf01WyncNx3P1XJDr0SylVMVWWSY9S1dYyJKgGOW+g7C/\nHYzrGcFwKrejf79DH3F2Ek8NJLsAFzf/0oxff2eYEe0SlxjXmgsubeMOy5PKB9Ag\nZiQYMiNy9gaatqcW79E3n/r1nD/lwLsped/4jzWdY+Gfj3z6d18vymmGymbHqIaR\nhawk/Iu/tpMQ3dbvIFbzn9LLMmzfQzG2ZPy3BiQNVWr3aSLl9qG4U9zeK6OyH2/Z\ng1EEnjfJa/+pTCeJmyoDBwgaJWcuCRQmWjvxvbM4ckYnrFkhvLf24on2ydmUeipp\nsMl8q1khyWUC0P0h6otZhD1SUdf1rt14r16bdy1r0ieTVm6m3qXhcX5MXagvFci0\n0OE2mOgf/GXE2WiJLAbRh06s9OvAzHUq4QGQwbkprMBMFw4uxONyNzYl+F9aA5Ic\nAwebf7/dfDJIHZc8XkwY1jNJrmCTzRyTP5eDN4bDPoHqTotDo1CMFaHtnkygg/Lg\nqoirV8mHfqnO4XQBOCUiHZ6mzz81l+O7dYg65cYx9Z76q2cv1PxsMb7Eo4nvux5S\nQPuuid0G5lomHXM/uM3mu4vXcDluCoffgTDimxs0I9X+PB7a2vgSMezwYkj8dA69\nvszH1hwek7DRbRfKUo6HUxl49Gsk0XYG/K30M5fS5JE=</ds:SignatureValue>\n </ebics:AuthSignature>\n <ebics:body/>\n</ebics:ebicsNoPubKeyDigestsRequest>\n")!!.readText() + val text = classLoader.getResource("hpb_request.xml")!!.readText() XMLUtil.convertStringToJaxb<EbicsNpkdRequest>(text) }