gnunet-svn
[Top][All Lists]
Advanced

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

[libeufin] branch master updated: send HPB to bank, response to be parse


From: gnunet
Subject: [libeufin] branch master updated: send HPB to bank, response to be parsed.
Date: Thu, 07 Nov 2019 20:10:23 +0100

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

marcello pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new b7a3a02  send HPB to bank, response to be parsed.
b7a3a02 is described below

commit b7a3a024d388d4cc7b368f9d15a0289097a815a1
Author: Marcello Stanisci <address@hidden>
AuthorDate: Thu Nov 7 20:09:58 2019 +0100

    send HPB to bank, response to be parsed.
---
 nexus/src/main/kotlin/Main.kt                      | 101 ++++++++++++++++++---
 .../main/kotlin/tech/libeufin/sandbox/XMLUtil.kt   |   2 +-
 2 files changed, 87 insertions(+), 16 deletions(-)

diff --git a/nexus/src/main/kotlin/Main.kt b/nexus/src/main/kotlin/Main.kt
index f175035..03016ec 100644
--- a/nexus/src/main/kotlin/Main.kt
+++ b/nexus/src/main/kotlin/Main.kt
@@ -23,16 +23,12 @@ import io.ktor.application.ApplicationCallPipeline
 import io.ktor.application.call
 import io.ktor.application.install
 import io.ktor.client.*
-import io.ktor.client.features.ServerResponseException
-import io.ktor.client.request.get
 import io.ktor.client.request.post
 import io.ktor.features.ContentNegotiation
 import io.ktor.features.StatusPages
 import io.ktor.gson.gson
 import io.ktor.http.ContentType
 import io.ktor.http.HttpStatusCode
-import io.ktor.http.URLBuilder
-import io.ktor.http.takeFrom
 import io.ktor.request.receive
 import io.ktor.request.uri
 import io.ktor.response.respond
@@ -43,19 +39,23 @@ import io.ktor.routing.routing
 import io.ktor.server.engine.embeddedServer
 import io.ktor.server.netty.Netty
 import org.apache.xml.security.binding.xmldsig.RSAKeyValueType
+import org.apache.xml.security.binding.xmldsig.SignatureType
 import org.jetbrains.exposed.sql.transactions.transaction
 import org.slf4j.LoggerFactory
 import tech.libeufin.sandbox.*
-import tech.libeufin.schema.ebics_h004.EbicsKeyManagementResponse
-import tech.libeufin.schema.ebics_h004.EbicsTypes
-import tech.libeufin.schema.ebics_h004.EbicsUnsecuredRequest
-import tech.libeufin.schema.ebics_h004.HIARequestOrderData
+import tech.libeufin.schema.ebics_h004.*
 import tech.libeufin.schema.ebics_s001.PubKeyValueType
 import tech.libeufin.schema.ebics_s001.SignaturePubKeyInfoType
 import tech.libeufin.schema.ebics_s001.SignaturePubKeyOrderData
 import java.text.DateFormat
 import javax.sql.rowset.serial.SerialBlob
 import javax.xml.bind.JAXBElement
+import org.w3c.dom.Document
+import java.security.SecureRandom
+import java.util.*
+import javax.xml.datatype.DatatypeFactory
+import javax.xml.datatype.XMLGregorianCalendar
+
 
 fun testData() {
 
@@ -90,13 +90,14 @@ fun expectId(param: String?) : Int {
  * @return null when the bank could not be reached, otherwise returns the
  * response already converted in JAXB.
  */
-suspend inline fun <reified S, reified T>HttpClient.postToBank(url: String, 
body: T) : JAXBElement<S>? {
+// suspend inline fun <reified S, reified T>HttpClient.postToBank(url: String, 
body: JAXBElement<T>) : JAXBElement<S>? {
+suspend inline fun <reified S>HttpClient.postToBank(url: String, body: 
String): JAXBElement<S>? {
 
     val response = try {
         this.post<String>(
             urlString = url,
             block = {
-                this.body = XMLUtil.convertJaxbToString(body)
+                this.body = body
             }
         )
     } catch (e: Exception) {
@@ -108,11 +109,37 @@ suspend inline fun <reified S, reified 
T>HttpClient.postToBank(url: String, body
     return XMLUtil.convertStringToJaxb(response)
 }
 
+// takes JAXB
+suspend inline fun <reified T, reified S>HttpClient.postToBank(url: String, 
body: T): JAXBElement<S>? {
+    return this.postToBank<S>(url, XMLUtil.convertJaxbToString(body))
+}
+
+// takes DOM
+suspend inline fun <reified S>HttpClient.postToBank(url: String, body: 
Document): JAXBElement<S>? {
+    return this.postToBank<S>(url, XMLUtil.convertDomToString(body))
+}
+
+/**
+ * @param size in bits
+ */
+fun getNonce(size: Int): ByteArray {
+    val sr = SecureRandom()
+    val ret = ByteArray(size / 8)
+    sr.nextBytes(ret)
+    return ret
+}
+
+fun getGregorianDate(): XMLGregorianCalendar {
+    val gregorianCalendar = GregorianCalendar()
+    val datatypeFactory = DatatypeFactory.newInstance()
+    return datatypeFactory.newXMLGregorianCalendar(gregorianCalendar)
+}
+
 data class NotAnIdError(val statusCode: HttpStatusCode) : Exception("String ID 
not convertible in number")
 data class SubscriberNotFoundError(val statusCode: HttpStatusCode) : 
Exception("Subscriber not found in database")
 data class UnreachableBankError(val statusCode: HttpStatusCode) : 
Exception("Could not reach the bank")
-data class EbicsError(val codeError: String) : Exception("Bank did not 
accepted EBICS request, error is: " +
-        "${codeError}")
+data class EbicsError(val codeError: String) : Exception("Bank did not 
accepted EBICS request, error is: " + codeError
+)
 
 
 fun main() {
@@ -272,7 +299,7 @@ fun main() {
                     subscriber.ebicsURL
                 }
 
-                val responseJaxb = 
client.postToBank<EbicsKeyManagementResponse, EbicsUnsecuredRequest>(
+                val responseJaxb = client.postToBank<EbicsUnsecuredRequest, 
EbicsKeyManagementResponse>(
                     url,
                     iniRequest
                 ) ?: throw 
UnreachableBankError(HttpStatusCode.InternalServerError)
@@ -288,6 +315,51 @@ fun main() {
                 return@post
             }
 
+            post("/ebics/subscribers/{id}/sync") {
+                // fetch sub's EBICS URL, done
+                // prepare message, done
+                // send it out, done
+                // _parse_ response!
+                // respond to client
+                val id = expectId(call.parameters["id"])
+                val (url, body) = transaction {
+                    val subscriber = EbicsSubscriberEntity.findById(id) ?: 
throw SubscriberNotFoundError(HttpStatusCode.NotFound)
+                    val hpbRequest = EbicsNpkdRequest().apply {
+                        version = "H004"
+                        revision = 1
+                        header = EbicsNpkdRequest.Header().apply {
+                            authenticate = true
+                            mutable = EbicsNpkdRequest.EmptyMutableHeader()
+                            static = EbicsNpkdRequest.StaticHeaderType().apply 
{
+                                hostID = subscriber.hostID
+                                partnerID = subscriber.partnerID
+                                userID = subscriber.userID
+                                securityMedium = "0000"
+                                orderDetails = EbicsNpkdRequest.OrderDetails()
+                                orderDetails.orderType = "HPB"
+                                orderDetails.orderAttribute = "DZHNN"
+                                nonce = getNonce(128)
+                                timestamp = getGregorianDate()
+                            }
+                        }
+                        body = EbicsNpkdRequest.EmptyBody()
+                        authSignature = SignatureType()
+                    }
+                    val hpbText = XMLUtil.convertJaxbToString(hpbRequest)
+                    val hpbDoc = XMLUtil.parseStringIntoDom(hpbText)
+                    XMLUtil.signEbicsDocument(
+                        hpbDoc,
+                        
CryptoUtil.loadRsaPrivateKey(subscriber.signaturePrivateKey.toByteArray())
+                    )
+                    Pair(subscriber.ebicsURL, hpbDoc)
+                }
+
+                val response = 
client.postToBank<EbicsKeyManagementResponse>(url, body)
+
+                call.respond(HttpStatusCode.NotImplemented, NexusError("work 
in progress"))
+                return@post
+            }
+
             post("/ebics/subscribers/{id}/sendHia") {
 
                 val id = expectId(call.parameters["id"]) // caught above
@@ -348,11 +420,10 @@ fun main() {
                             }
                         }
                     }
-
                     subscriber.ebicsURL
                 }
 
-                val responseJaxb = 
client.postToBank<EbicsKeyManagementResponse, EbicsUnsecuredRequest>(
+                val responseJaxb = client.postToBank<EbicsUnsecuredRequest, 
EbicsKeyManagementResponse>(
                     url,
                     hiaRequest
                 ) ?: throw 
UnreachableBankError(HttpStatusCode.InternalServerError)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt
index 436375c..5195478 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt
@@ -259,7 +259,7 @@ class XMLUtil private constructor() {
         }
 
         /**
-         * Convert a DOM document - of a XML document - to the JAXB 
representation.
+         * Convert a DOM document to the JAXB representation.
          *
          * @param finalType class type of the output
          * @param document the document to convert into JAXB.

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



reply via email to

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