libeufin

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

commit b1cf569f0e3953a016b98dab2e231b2657d616d1
parent 01173796d57df5db15dc12ea24238602b7a24006
Author: MS <ms@taler.net>
Date:   Mon,  3 May 2021 09:51:50 +0200

Polymorphism.

Moving the Ebics 'connect()' function inside the
Ebics connection plugin.

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/BankConnectionProtocol.kt | 23++++++++++++++++++++---
Mnexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt | 104++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mnexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt | 7++-----
3 files changed, 75 insertions(+), 59 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/BankConnectionProtocol.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/BankConnectionProtocol.kt @@ -19,5 +19,22 @@ package tech.libeufin.nexus -// TODO: define common interface for all bank connection protocols here! -interface BankConnectionProtocol -\ No newline at end of file +import io.ktor.client.HttpClient +import io.ktor.http.HttpStatusCode +import tech.libeufin.nexus.ebics.* + +// 'const' allows only primitive types. +val bankConnectionRegistry: Map<String, BankConnectionProtocol> = mapOf( + "ebics" to EbicsBankConnectionProtocol() +) + +interface BankConnectionProtocol { + suspend fun connect(client: HttpClient, connId: String) +} + +fun getConnectionPlugin(connId: String): BankConnectionProtocol { + return bankConnectionRegistry.get(connId) ?: throw NexusError( + HttpStatusCode.NotFound, + "Connection type '${connId}' not available" + ) +} +\ No newline at end of file diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt @@ -627,57 +627,6 @@ private suspend fun tentativeHpb(client: HttpClient, connId: String): Boolean { return true } -suspend fun connectEbics(client: HttpClient, connId: String) { - val subscriber = transaction { getEbicsSubscriberDetails(connId) } - if (subscriber.bankAuthPub != null && subscriber.bankEncPub != null) { - return - } - if (subscriber.ebicsIniState == EbicsInitState.UNKNOWN || subscriber.ebicsHiaState == EbicsInitState.UNKNOWN) { - if (tentativeHpb(client, connId)) { - return - } - } - val iniDone = when (subscriber.ebicsIniState) { - EbicsInitState.NOT_SENT, EbicsInitState.UNKNOWN -> { - val iniResp = doEbicsIniRequest(client, subscriber) - iniResp.bankReturnCode == EbicsReturnCode.EBICS_OK && iniResp.technicalReturnCode == EbicsReturnCode.EBICS_OK - } - EbicsInitState.SENT -> true - } - val hiaDone = when (subscriber.ebicsHiaState) { - EbicsInitState.NOT_SENT, EbicsInitState.UNKNOWN -> { - val hiaResp = doEbicsHiaRequest(client, subscriber) - hiaResp.bankReturnCode == EbicsReturnCode.EBICS_OK && hiaResp.technicalReturnCode == EbicsReturnCode.EBICS_OK - } - EbicsInitState.SENT -> true - } - val hpbData = try { - doEbicsHpbRequest(client, subscriber) - } catch (e: EbicsProtocolError) { - logger.warn("failed hpb request", e) - null - } - transaction { - val conn = NexusBankConnectionEntity.findByName(connId) - if (conn == null) { - throw NexusError(HttpStatusCode.NotFound, "bank connection '$connId' not found") - } - val subscriberEntity = - EbicsSubscriberEntity.find { NexusEbicsSubscribersTable.nexusBankConnection eq conn.id }.first() - if (iniDone) { - subscriberEntity.ebicsIniState = EbicsInitState.SENT - } - if (hiaDone) { - subscriberEntity.ebicsHiaState = EbicsInitState.SENT - } - if (hpbData != null) { - subscriberEntity.bankAuthenticationPublicKey = - ExposedBlob((hpbData.authenticationPubKey.encoded)) - subscriberEntity.bankEncryptionPublicKey = ExposedBlob((hpbData.encryptionPubKey.encoded)) - } - } -} - fun formatHex(ba: ByteArray): String { var out = "" for (i in ba.indices) { @@ -833,3 +782,56 @@ fun createEbicsBankConnection(bankConnectionName: String, user: NexusUserEntity, ebicsHiaState = EbicsInitState.NOT_SENT } } + +class EbicsBankConnectionProtocol: BankConnectionProtocol { + override suspend fun connect(client: HttpClient, connId: String) { + val subscriber = transaction { getEbicsSubscriberDetails(connId) } + if (subscriber.bankAuthPub != null && subscriber.bankEncPub != null) { + return + } + if (subscriber.ebicsIniState == EbicsInitState.UNKNOWN || subscriber.ebicsHiaState == EbicsInitState.UNKNOWN) { + if (tentativeHpb(client, connId)) { + return + } + } + val iniDone = when (subscriber.ebicsIniState) { + EbicsInitState.NOT_SENT, EbicsInitState.UNKNOWN -> { + val iniResp = doEbicsIniRequest(client, subscriber) + iniResp.bankReturnCode == EbicsReturnCode.EBICS_OK && iniResp.technicalReturnCode == EbicsReturnCode.EBICS_OK + } + EbicsInitState.SENT -> true + } + val hiaDone = when (subscriber.ebicsHiaState) { + EbicsInitState.NOT_SENT, EbicsInitState.UNKNOWN -> { + val hiaResp = doEbicsHiaRequest(client, subscriber) + hiaResp.bankReturnCode == EbicsReturnCode.EBICS_OK && hiaResp.technicalReturnCode == EbicsReturnCode.EBICS_OK + } + EbicsInitState.SENT -> true + } + val hpbData = try { + doEbicsHpbRequest(client, subscriber) + } catch (e: EbicsProtocolError) { + logger.warn("failed hpb request", e) + null + } + transaction { + val conn = NexusBankConnectionEntity.findByName(connId) + if (conn == null) { + throw NexusError(HttpStatusCode.NotFound, "bank connection '$connId' not found") + } + val subscriberEntity = + EbicsSubscriberEntity.find { NexusEbicsSubscribersTable.nexusBankConnection eq conn.id }.first() + if (iniDone) { + subscriberEntity.ebicsIniState = EbicsInitState.SENT + } + if (hiaDone) { + subscriberEntity.ebicsHiaState = EbicsInitState.SENT + } + if (hpbData != null) { + subscriberEntity.bankAuthenticationPublicKey = + ExposedBlob((hpbData.authenticationPubKey.encoded)) + subscriberEntity.bankEncryptionPublicKey = ExposedBlob((hpbData.encryptionPubKey.encoded)) + } + } + } +} diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt @@ -848,11 +848,8 @@ fun serverMain(dbName: String, host: String, port: Int) { authenticateRequest(call.request) requireBankConnection(call, "connectionName") } - when (conn.type) { - "ebics" -> { - connectEbics(client, conn.connectionId) - } - } + val plugin = getConnectionPlugin(conn.type) + plugin.connect(client, conn.connectionId) call.respond(NexusMessage(message = "Connection successful")) }