[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] branch master updated (30984f7 -> f332caf)
From: |
gnunet |
Subject: |
[libeufin] branch master updated (30984f7 -> f332caf) |
Date: |
Tue, 16 Jun 2020 11:09:41 +0200 |
This is an automated email from the git hooks/post-receive script.
dold pushed a change to branch master
in repository libeufin.
from 30984f7 Update script file to add more bank connections/accounts
new d0a6a2f wait for termination
new f332caf PDF key letter generation
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
integration-tests/util.py | 1 +
nexus/build.gradle | 3 +
nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt | 19 +++++
.../kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt | 84 ++++++++++++++++++++++
4 files changed, 107 insertions(+)
diff --git a/integration-tests/util.py b/integration-tests/util.py
index cbae221..0be4183 100644
--- a/integration-tests/util.py
+++ b/integration-tests/util.py
@@ -20,6 +20,7 @@ def checkPort(port):
def kill(name, s):
print(f"terminating {name} ...")
s.terminate()
+ s.wait()
print("terminated!")
diff --git a/nexus/build.gradle b/nexus/build.gradle
index 7fcfaa7..f015e7e 100644
--- a/nexus/build.gradle
+++ b/nexus/build.gradle
@@ -82,6 +82,9 @@ dependencies {
implementation "io.ktor:ktor-auth:$ktor_version"
implementation "io.ktor:ktor-jackson:$ktor_version"
+ // PDF generation
+ implementation 'com.itextpdf:itext7-core:7.1.11'
+
testImplementation group: 'junit', name: 'junit', version: '4.12'
}
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
index 8ca4b9f..2fd6b9f 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Main.kt
@@ -35,6 +35,10 @@ import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.options.prompt
+import com.itextpdf.kernel.pdf.PdfDocument
+import com.itextpdf.kernel.pdf.PdfWriter
+import com.itextpdf.layout.Document
+import com.itextpdf.layout.element.Paragraph
import io.ktor.application.ApplicationCall
import io.ktor.application.ApplicationCallPipeline
import io.ktor.application.call
@@ -70,6 +74,7 @@ import org.slf4j.event.Level
import tech.libeufin.nexus.ebics.*
import tech.libeufin.util.*
import tech.libeufin.util.CryptoUtil.hashpw
+import java.io.ByteArrayOutputStream
import java.io.PrintWriter
import java.io.StringWriter
import java.net.URLEncoder
@@ -778,6 +783,20 @@ fun serverMain(dbName: String) {
call.respond(object {})
}
+ get("/bank-connections/{connid}/keyletter") {
+ val conn = transaction {
+ authenticateRequest(call.request)
+ requireBankConnection(call, "connid")
+ }
+ when (conn.type) {
+ "ebics" -> {
+ val pdfBytes = getEbicsKeyLetterPdf(conn)
+ call.respondBytes(pdfBytes, ContentType("application",
"pdf"))
+ }
+ else -> throw NexusError(HttpStatusCode.NotImplemented,
"keyletter not supporte dfor ${conn.type}")
+ }
+ }
+
get("/bank-connections/{connid}/messages") {
val ret = transaction {
val list = BankMessageList()
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
index 9cb61f7..1170aa3 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/ebics/EbicsNexus.kt
@@ -26,6 +26,11 @@ package tech.libeufin.nexus.ebics
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
+import com.itextpdf.kernel.pdf.PdfDocument
+import com.itextpdf.kernel.pdf.PdfWriter
+import com.itextpdf.layout.Document
+import com.itextpdf.layout.element.AreaBreak
+import com.itextpdf.layout.element.Paragraph
import io.ktor.application.Application
import io.ktor.application.ApplicationCall
import io.ktor.application.call
@@ -47,6 +52,10 @@ import tech.libeufin.nexus.*
import tech.libeufin.nexus.logger
import tech.libeufin.util.*
import tech.libeufin.util.ebics_h004.HTDResponseOrderData
+import java.io.ByteArrayOutputStream
+import java.security.interfaces.RSAPrivateCrtKey
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
import java.util.*
import javax.crypto.EncryptedPrivateKeyInfo
@@ -479,4 +488,79 @@ suspend fun connectEbics(client: HttpClient, connId:
String) {
subscriberEntity.bankEncryptionPublicKey =
ExposedBlob((hpbData.encryptionPubKey.encoded))
}
}
+}
+
+fun formatHex(ba: ByteArray): String {
+ var out = ""
+ for (i in ba.indices) {
+ val b = ba[i]
+ if (i > 0 && i % 16 == 0) {
+ out += "\n"
+ }
+ out += java.lang.String.format("%02X", b)
+ out += " "
+ }
+ return out
+}
+
+fun getEbicsKeyLetterPdf(conn: NexusBankConnectionEntity): ByteArray {
+ val ebicsSubscriber = transaction {
getEbicsSubscriberDetails(conn.id.value) }
+
+ val po = ByteArrayOutputStream()
+ val pdfWriter = PdfWriter(po)
+ val pdfDoc = PdfDocument(pdfWriter)
+ val date = LocalDateTime.now()
+ val dateStr = date.format(DateTimeFormatter.ISO_LOCAL_DATE)
+
+ fun writeCommon(doc: Document) {
+ doc.add(Paragraph("""
+ Datum: $dateStr
+ Teilnehmer: ${conn.id.value}
+ Host-ID: ${ebicsSubscriber.hostId}
+ User-ID: ${ebicsSubscriber.userId}
+ Partner-ID: ${ebicsSubscriber.partnerId}
+ ES version: A006
+ """.trimIndent()))
+ }
+
+ fun writeKey(doc: Document, priv: RSAPrivateCrtKey) {
+ val pub = CryptoUtil.getRsaPublicFromPrivate(priv)
+ val hash = CryptoUtil.getEbicsPublicKeyHash(pub)
+
doc.add(Paragraph("Exponent:\n${formatHex(pub.publicExponent.toByteArray())}"))
+ doc.add(Paragraph("Modulus:\n${formatHex(pub.modulus.toByteArray())}"))
+ doc.add(Paragraph("SHA-256 hash:\n${formatHex(hash)}"))
+ }
+
+ fun writeSigLine(doc: Document) {
+ doc.add(Paragraph("Ort / Datum: ________________"))
+ doc.add(Paragraph("Firma / Name: ________________"))
+ doc.add(Paragraph("Unterschrift: ________________"))
+ }
+
+ Document(pdfDoc).use {
+ it.add(Paragraph("Signaturschlüssel").setFontSize(24f))
+ writeCommon(it)
+ it.add(Paragraph("Öffentlicher Schlüssel (Public key for the
electronic signature)"))
+ writeKey(it, ebicsSubscriber.customerSignPriv)
+ it.add(Paragraph("\n"))
+ writeSigLine(it)
+ it.add(AreaBreak())
+
+ it.add(Paragraph("Authentifikationsschlüssel").setFontSize(24f))
+ writeCommon(it)
+ it.add(Paragraph("Öffentlicher Schlüssel (Public key for the
identification and authentication signature)"))
+ writeKey(it, ebicsSubscriber.customerAuthPriv)
+ it.add(Paragraph("\n"))
+ writeSigLine(it)
+ it.add(AreaBreak())
+
+ it.add(Paragraph("Verschlüsselungsschlüssel").setFontSize(24f))
+ writeCommon(it)
+ it.add(Paragraph("Öffentlicher Schlüssel (Public encryption key)"))
+ it.add(Paragraph("\n"))
+ writeKey(it, ebicsSubscriber.customerSignPriv)
+ writeSigLine(it)
+ }
+ pdfWriter.flush()
+ return po.toByteArray()
}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [libeufin] branch master updated (30984f7 -> f332caf),
gnunet <=