gnunet-svn
[Top][All Lists]
Advanced

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

[libeufin] 03/03: implement /sync{MSG}


From: gnunet
Subject: [libeufin] 03/03: implement /sync{MSG}
Date: Tue, 12 May 2020 16:16:07 +0200

This is an automated email from the git hooks/post-receive script.

ms pushed a commit to branch master
in repository libeufin.

commit 2d656c1d85ac443519b7f07c11b6b52744146838
Author: Marcello Stanisci <address@hidden>
AuthorDate: Tue May 12 16:15:55 2020 +0200

    implement /sync{MSG}
---
 .../src/main/kotlin/tech/libeufin/nexus/Helpers.kt | 26 +++++----
 nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt  | 67 ++++++++++++++++++----
 .../kotlin/tech/libeufin/nexus/MainDeprecated.kt   | 26 ++++-----
 nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt |  2 +-
 4 files changed, 85 insertions(+), 36 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
index 1826ae3..4258b84 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Helpers.kt
@@ -1,6 +1,5 @@
 package tech.libeufin.nexus
 
-import io.ktor.application.ApplicationCall
 import io.ktor.client.HttpClient
 import io.ktor.http.HttpStatusCode
 import org.jetbrains.exposed.sql.and
@@ -101,7 +100,7 @@ fun getBankAccountsFromNexusUserId(id: String): 
MutableList<BankAccountEntity> {
     return ret
 }
 
-fun getSubscriberDetails(subscriber: EbicsSubscriberEntity): 
EbicsClientSubscriberDetails {
+fun getEbicsSubscriberDetailsInternal(subscriber: EbicsSubscriberEntity): 
EbicsClientSubscriberDetails {
     var bankAuthPubValue: RSAPublicKey? = null
     if (subscriber.bankAuthenticationPublicKey != null) {
         bankAuthPubValue = CryptoUtil.loadRsaPublicKey(
@@ -129,11 +128,7 @@ fun getSubscriberDetails(subscriber: 
EbicsSubscriberEntity): EbicsClientSubscrib
     )
 }
 
-/**
- * Retrieve Ebics subscriber details given a Transport
- * object and handling the default case.
- */
-fun getEbicsSubscriberDetails(userId: String, transportId: String?): 
EbicsClientSubscriberDetails {
+fun getEbicsTransport(userId: String, transportId: String?): 
EbicsSubscriberEntity {
     val transport = transaction {
         if (transportId == null) {
             return@transaction EbicsSubscriberEntity.all().first()
@@ -150,8 +145,17 @@ fun getEbicsSubscriberDetails(userId: String, transportId: 
String?): EbicsClient
             "No rights over transport $transportId"
         )
     }
+    return transport
+}
+
+/**
+ * Retrieve Ebics subscriber details given a Transport
+ * object and handling the default case.
+ */
+fun getEbicsSubscriberDetails(userId: String, transportId: String?): 
EbicsClientSubscriberDetails {
+    val transport = getEbicsTransport(userId, transportId)
     // transport exists and belongs to caller.
-    return getSubscriberDetails(transport)
+    return getEbicsSubscriberDetailsInternal(transport)
 }
 
 suspend fun downloadAndPersistC5xEbics(
@@ -394,8 +398,10 @@ fun addPreparedPayment(paymentData: Pain001Data, 
nexusUser: NexusUserEntity): Pr
     }
 }
 
-fun expectId(param: String?): String {
-    return param ?: throw NexusError(HttpStatusCode.BadRequest, "Bad ID given")
+fun ensureNonNull(param: String?): String {
+    return param ?: throw NexusError(
+        HttpStatusCode.BadRequest, "Bad ID given"
+    )
 }
 
 /* Needs a transaction{} block to be called */
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
index 234d239..793ba53 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
@@ -50,7 +50,6 @@ import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 import org.slf4j.event.Level
 import tech.libeufin.util.*
-import tech.libeufin.util.ebics_h004.EbicsResponse
 import java.text.DateFormat
 import java.util.zip.InflaterInputStream
 import javax.crypto.EncryptedPrivateKeyInfo
@@ -59,18 +58,25 @@ import javax.sql.rowset.serial.SerialBlob
 data class NexusError(val statusCode: HttpStatusCode, val reason: String) : 
Exception()
 val logger: Logger = LoggerFactory.getLogger("tech.libeufin.nexus")
 
-suspend fun handleEbicsSendMSG(client: HttpClient, subscriber: 
EbicsClientSubscriberDetails, msg: String): String {
-    when (msg.toUpperCase()) {
+suspend fun handleEbicsSendMSG(
+    httpClient: HttpClient,
+    userId: String,
+    transportId: String?,
+    msg: String,
+    sync: Boolean
+): String {
+    val subscriber = getEbicsSubscriberDetails(userId, transportId)
+    val response = when (msg.toUpperCase()) {
         "HIA" -> {
             val request = makeEbicsHiaRequest(subscriber)
-            return client.postToBank(
+            httpClient.postToBank(
                 subscriber.ebicsUrl,
                 request
             )
         }
         "INI" -> {
             val request = makeEbicsIniRequest(subscriber)
-            return client.postToBank(
+            httpClient.postToBank(
                 subscriber.ebicsUrl,
                 request
             )
@@ -78,20 +84,35 @@ suspend fun handleEbicsSendMSG(client: HttpClient, 
subscriber: EbicsClientSubscr
         "HPB" -> {
             /** should NOT put bank's keys into any table.  */
             val request = makeEbicsHpbRequest(subscriber)
-            return client.postToBank(
+            val response = httpClient.postToBank(
                 subscriber.ebicsUrl,
                 request
             )
+            if (sync) {
+                val parsedResponse = 
parseAndDecryptEbicsKeyManagementResponse(subscriber, response)
+                val orderData = parsedResponse.orderData ?: throw NexusError(
+                    HttpStatusCode.InternalServerError,
+                    "Cannot find data in a HPB response"
+                )
+                val hpbData = parseEbicsHpbOrder(orderData)
+                transaction {
+                    val transport = getEbicsTransport(userId, transportId)
+                    transport.bankAuthenticationPublicKey = 
SerialBlob(hpbData.authenticationPubKey.encoded)
+                    transport.bankEncryptionPublicKey = 
SerialBlob(hpbData.encryptionPubKey.encoded)
+                }
+            }
+            return response
         }
         "HEV" -> {
             val request = makeEbicsHEVRequest(subscriber)
-            return client.postToBank(subscriber.ebicsUrl, request)
+            httpClient.postToBank(subscriber.ebicsUrl, request)
         }
         else -> throw NexusError(
             HttpStatusCode.NotFound,
             "Message $msg not found"
         )
     }
+    return response
 }
 
 @ExperimentalIoApi
@@ -260,7 +281,7 @@ fun main() {
              */
             get("/bank-accounts/{accountid}/prepared-payments/{uuid}") {
                 val userId = 
authenticateRequest(call.request.headers["Authorization"])
-                val preparedPayment = 
getPreparedPayment(expectId(call.parameters["uuid"]))
+                val preparedPayment = 
getPreparedPayment(ensureNonNull(call.parameters["uuid"]))
                 if (preparedPayment.nexusUser.id.value != userId) throw 
NexusError(
                     HttpStatusCode.Forbidden,
                     "No rights over such payment"
@@ -285,7 +306,7 @@ fun main() {
              */
             post("/bank-accounts/{accountid}/prepared-payments") {
                 val userId = 
authenticateRequest(call.request.headers["Authorization"])
-                val bankAccount = getBankAccount(userId, 
expectId(call.parameters["accountid"]))
+                val bankAccount = getBankAccount(userId, 
ensureNonNull(call.parameters["accountid"]))
                 val body = call.receive<PreparedPaymentRequest>()
                 val amount = parseAmount(body.amount)
                 val paymentEntity = addPreparedPayment(
@@ -474,9 +495,12 @@ fun main() {
                 when (body.type) {
                     "ebics" -> {
                         val response = handleEbicsSendMSG(
-                            client,
-                            getEbicsSubscriberDetails(userId, body.name),
-                            expectId(call.parameters["MSG"]))
+                            httpClient = client,
+                            userId = userId,
+                            transportId = body.name,
+                            msg = ensureNonNull(call.parameters["MSG"]),
+                            sync = true
+                        )
                         call.respondText(response)
                     }
                     else -> throw NexusError(
@@ -491,6 +515,25 @@ fun main() {
              * "transportName".  DOES alterate DB tables.
              */
             post("/bank-transports/{transportName}/sync{MSG}") {
+                val userId = 
authenticateRequest(call.request.headers["Authorization"])
+                val body = call.receive<Transport>()
+                when (body.type) {
+                    "ebics" -> {
+                        val response = handleEbicsSendMSG(
+                            httpClient = client,
+                            userId = userId,
+                            transportId = body.name,
+                            msg = ensureNonNull(call.parameters["MSG"]),
+                            sync = true
+                            )
+                        call.respondText(response)
+                    }
+                    else -> throw NexusError(
+                        HttpStatusCode.NotImplemented,
+                        "Transport '${body.type}' not implemented.  Use 
'ebics'"
+                    )
+                }
+
                 return@post
             }
 
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
index df00d65..d730001 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/MainDeprecated.kt
@@ -202,7 +202,7 @@ fun main() {
             }
             /** Make a new NEXUS user in the system */
             post("/users/{id}") {
-                val newUserId = expectId(call.parameters["id"])
+                val newUserId = ensureNonNull(call.parameters["id"])
                 val body = call.receive<NexusUserRequest>()
                 transaction {
                     NexusUserEntity.new(id = newUserId) {
@@ -224,7 +224,7 @@ fun main() {
             /** Show bank accounts associated with a given NEXUS user */
             get("/users/{id}/accounts") {
                 // this information is only avaiable *after* HTD or HKD has 
been called
-                val id = expectId(call.parameters["id"])
+                val id = ensureNonNull(call.parameters["id"])
                 val ret = BankAccountsInfoResponse()
                 transaction {
                     BankAccountMapEntity.find {
@@ -248,7 +248,7 @@ fun main() {
             }
             /** Show PREPARED payments */
             get("/users/{id}/payments") {
-                val nexusUserId = expectId(call.parameters["id"])
+                val nexusUserId = ensureNonNull(call.parameters["id"])
                 val ret = RawPayments()
                 transaction {
                     val nexusUser = extractNexusUser(nexusUserId)
@@ -345,7 +345,7 @@ fun main() {
             }
             post("/ebics/subscribers/{id}/restoreBackup") {
                 val body = call.receive<EbicsKeysBackupJson>()
-                val nexusId = expectId(call.parameters["id"])
+                val nexusId = ensureNonNull(call.parameters["id"])
                 val subscriber = transaction {
                     NexusUserEntity.findById(nexusId)
                 }
@@ -425,7 +425,7 @@ fun main() {
                 )
             }
             get("/ebics/subscribers/{id}/keyletter") {
-                val nexusUserId = expectId(call.parameters["id"])
+                val nexusUserId = ensureNonNull(call.parameters["id"])
                 var usernameLine = "TODO"
                 var recipientLine = "TODO"
                 val customerIdLine = "TODO"
@@ -572,7 +572,7 @@ fun main() {
                 logger.debug("Uploading PAIN.001: ${painDoc}")
                 doEbicsUploadTransaction(
                     client,
-                    getSubscriberDetails(subscriber),
+                    getEbicsSubscriberDetailsInternal(subscriber),
                     "CCT",
                     painDoc.toByteArray(Charsets.UTF_8),
                     EbicsStandardOrderParams()
@@ -651,7 +651,7 @@ fun main() {
                 return@post
             }
             post("/ebics/subscribers/{id}/fetch-payment-status") {
-                val id = expectId(call.parameters["id"])
+                val id = ensureNonNull(call.parameters["id"])
                 val paramsJson = call.receive<EbicsStandardOrderParamsJson>()
                 val orderParams = paramsJson.toOrderParams()
                 val subscriberData = getSubscriberDetailsFromNexusUserId(id)
@@ -677,7 +677,7 @@ fun main() {
                 return@post
             }
             post("/ebics/subscribers/{id}/collect-transactions-c53") {
-                val id = expectId(call.parameters["id"])
+                val id = ensureNonNull(call.parameters["id"])
                 val paramsJson = call.receive<EbicsStandardOrderParamsJson>()
                 val orderParams = paramsJson.toOrderParams()
                 val subscriberData = getSubscriberDetailsFromNexusUserId(id)
@@ -778,8 +778,8 @@ fun main() {
 
             // FIXME: some messages include a ZIPped payload.
             post("/ebics/subscribers/{id}/send{MSG}") {
-                val id = expectId(call.parameters["id"])
-                val MSG = expectId(call.parameters["MSG"])
+                val id = ensureNonNull(call.parameters["id"])
+                val MSG = ensureNonNull(call.parameters["MSG"])
                 val paramsJson = call.receive<EbicsStandardOrderParamsJson>()
                 val orderParams = paramsJson.toOrderParams()
                 println("$MSG order params: $orderParams")
@@ -808,7 +808,7 @@ fun main() {
                 return@post
             }
             get("/ebics/{id}/sendHEV") {
-                val id = expectId(call.parameters["id"])
+                val id = ensureNonNull(call.parameters["id"])
                 val subscriberData = getSubscriberDetailsFromNexusUserId(id)
                 val request = makeEbicsHEVRequest(subscriberData)
                 val response = client.postToBank(subscriberData.ebicsUrl, 
request)
@@ -825,7 +825,7 @@ fun main() {
                 return@get
             }
             post("/ebics/subscribers/{id}/sendINI") {
-                val id = expectId(call.parameters["id"])
+                val id = ensureNonNull(call.parameters["id"])
                 val subscriberData = getSubscriberDetailsFromNexusUserId(id)
                 val iniRequest = makeEbicsIniRequest(subscriberData)
                 val responseStr = client.postToBank(
@@ -844,7 +844,7 @@ fun main() {
             }
 
             post("/ebics/subscribers/{id}/sendHIA") {
-                val id = expectId(call.parameters["id"])
+                val id = ensureNonNull(call.parameters["id"])
                 val subscriberData = getSubscriberDetailsFromNexusUserId(id)
                 val hiaRequest = makeEbicsHiaRequest(subscriberData)
                 val responseStr = client.postToBank(
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt 
b/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
index 8a97107..b259bb5 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/taler.kt
@@ -395,7 +395,7 @@ class Taler(app: Route) {
          * payment was added as well.
          */
         app.post("/ebics/taler/{id}/crunch-raw-transactions") {
-            val id = expectId(call.parameters["id"])
+            val id = ensureNonNull(call.parameters["id"])
             // first find highest ID value of already processed rows.
             transaction {
                 val subscriberAccount = getBankAccountFromNexusUserId(id)

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

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