libeufin

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

commit 8f42737140df0f8bc57b7de3774ffe5fdcc09ced
parent 284324a03b49ad69ce01792364ea1d9edc76d096
Author: Florian Dold <florian.dold@gmail.com>
Date:   Sun, 24 May 2020 17:30:43 +0530

fix HEV

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 42+++++++++++++++++++++++++++++++++++++++++-
Mutil/src/main/kotlin/Ebics.kt | 23+++++++++++++++++------
2 files changed, 58 insertions(+), 7 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt @@ -22,6 +22,7 @@ package tech.libeufin.nexus import com.fasterxml.jackson.core.util.DefaultIndenter import com.fasterxml.jackson.core.util.DefaultPrettyPrinter import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.databind.exc.MismatchedInputException import com.fasterxml.jackson.module.kotlin.KotlinModule @@ -627,7 +628,33 @@ fun serverMain() { call.respond(BankConnectionsList(connList)) } - post("/bank-connections/{connid}/backup") { + get("/bank-connections/{connid}") { + val resp = transaction { + val user = authenticateRequest(call.request) + val conn = requireBankConnection(call, "connid") + if (conn.type != "ebics") { + throw NexusError( + HttpStatusCode.BadRequest, + "bank connection is not of type 'ebics' (but '${conn.type}')" + ) + } + val ebicsSubscriber = getEbicsSubscriberDetails(user.id.value, conn.id.value) + val mapper = ObjectMapper() + val details = mapper.createObjectNode() + details.put("ebicsUrl", ebicsSubscriber.ebicsUrl) + details.put("ebicsHostId", ebicsSubscriber.hostId) + details.put("partnerId", ebicsSubscriber.partnerId) + details.put("userId", ebicsSubscriber.userId) + val node = mapper.createObjectNode() + node.put("type", conn.type) + node.put("owner", conn.owner.id.value) + node.set<JsonNode>("details", details) + node + } + call.respond(resp) + } + + post("/bank-connections/{connid}/export-backup") { throw NotImplementedError() } @@ -664,6 +691,19 @@ fun serverMain() { call.respond(resp) } + post("/bank-connections/{connid}/ebics/send-hev") { + val subscriber = transaction { + val user = authenticateRequest(call.request) + val conn = requireBankConnection(call, "connid") + if (conn.type != "ebics") { + throw NexusError(HttpStatusCode.BadRequest, "bank connection is not of type 'ebics'") + } + getEbicsSubscriberDetails(user.id.value, conn.id.value) + } + val resp = doEbicsHostVersionQuery(client, subscriber.ebicsUrl, subscriber.hostId) + call.respond(resp) + } + post("/bank-connections/{connid}/ebics/send-hpb") { val subscriberDetails = transaction { val user = authenticateRequest(call.request) diff --git a/util/src/main/kotlin/Ebics.kt b/util/src/main/kotlin/Ebics.kt @@ -237,8 +237,14 @@ fun createEbicsRequestForDownloadInitialization( subscriberDetails.hostId, getNonce(128), DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar()), - subscriberDetails.bankEncPub ?: throw UtilError(HttpStatusCode.BadRequest, "Invalid subscriber state 'bankEncPub' missing, please send HPB first"), - subscriberDetails.bankAuthPub ?: throw UtilError(HttpStatusCode.BadRequest, "Invalid subscriber state 'bankAuthPub' missing, please send HPB first"), + subscriberDetails.bankEncPub ?: throw UtilError( + HttpStatusCode.BadRequest, + "Invalid subscriber state 'bankEncPub' missing, please send HPB first" + ), + subscriberDetails.bankAuthPub ?: throw UtilError( + HttpStatusCode.BadRequest, + "Invalid subscriber state 'bankAuthPub' missing, please send HPB first" + ), orderType, makeOrderParams(orderParams) ) @@ -296,13 +302,14 @@ enum class EbicsReturnCode(val errorCode: String) { EBICS_DOWNLOAD_POSTPROCESS_DONE("011000"), EBICS_DOWNLOAD_POSTPROCESS_SKIPPED("011001"), EBICS_TX_SEGMENT_NUMBER_UNDERRUN("011101"), + EBICS_INVALID_USER_OR_USER_STATE("091002"), EBICS_NO_DOWNLOAD_DATA_AVAILABLE("090005"); companion object { fun lookup(errorCode: String): EbicsReturnCode { for (x in values()) { if (x.errorCode == errorCode) { - return x; + return x } } throw UtilError(HttpStatusCode.InternalServerError, "Unknown EBICS status code: $errorCode") @@ -395,7 +402,10 @@ fun parseAndValidateEbicsResponse( if (!XMLUtil.verifyEbicsDocument( responseDocument, - subscriberDetails.bankAuthPub ?: throw UtilError(HttpStatusCode.BadRequest, "Invalid subscriber state: bankAuthPub missing, please send HPB first") + subscriberDetails.bankAuthPub ?: throw UtilError( + HttpStatusCode.BadRequest, + "Invalid subscriber state: bankAuthPub missing, please send HPB first" + ) ) ) { throw UtilError(HttpStatusCode.InternalServerError, "Bank's signature validation failed") @@ -442,7 +452,7 @@ fun getDecryptionKey(subscriberDetails: EbicsClientSubscriberDetails, pubDigest: if (pubDigest.contentEquals(encPubDigest)) { return subscriberDetails.customerEncPriv } - throw UtilError(HttpStatusCode.NotFound,"Could not find customer's public key") + throw UtilError(HttpStatusCode.NotFound, "Could not find customer's public key") } /** @@ -489,8 +499,9 @@ fun makeEbicsHEVRequest(subscriberDetails: EbicsClientSubscriberDetails): String } fun makeEbicsHEVRequestRaw(hostID: String): String { + val h = hostID val req = HEVRequest().apply { - hostId = hostId + hostId = h } val doc = XMLUtil.convertJaxbToDocument(req) return XMLUtil.convertDomToString(doc)