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:
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"))
}