libeufin

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

commit 0c0401461d642c74331d5b76fe4e79d5e327ec86
parent 91181c510b43f3b316c618c42be219fa4a3a2eaa
Author: Marcello Stanisci <stanisci.m@gmail.com>
Date:   Mon,  9 Dec 2019 22:13:39 +0100

Getting HTTP requests logged.

Diffstat:
Msandbox/src/main/kotlin/tech/libeufin/sandbox/CryptoUtil.kt | 2+-
Msandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt | 2+-
Msandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt | 20++++++++++----------
Msandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt | 34+++++++++++++++++++++++-----------
Msandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt | 2+-
5 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/CryptoUtil.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/CryptoUtil.kt @@ -173,7 +173,7 @@ object CryptoUtil { val symmetricCipher = Cipher.getInstance("AES/CBC/X9.23Padding", bouncyCastleProvider) val ivParameterSpec = IvParameterSpec(ByteArray(16)) symmetricCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec) - logger.debug("decrypting: ${encryptedData.toHexString()}") + LOGGER.debug("decrypting: ${encryptedData.toHexString()}") val data = symmetricCipher.doFinal(encryptedData) return data } diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt @@ -140,7 +140,7 @@ open class IntIdTableWithAmount : IntIdTable() { } if ((value as BigDecimal).compareTo(BigDecimal.ZERO) == 0) { - logger.error("Cannot have transactions of ZERO amount") + LOGGER.error("Cannot have transactions of ZERO amount") throw BadAmount(value) } return super.valueToDB(value) diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/EbicsProtocolBackend.kt @@ -104,7 +104,7 @@ private suspend fun ApplicationCall.respondEbicsKeyManagement( } } val text = XMLUtil.convertJaxbToString(responseXml) - logger.info("responding with:\n${text}") + LOGGER.info("responding with:\n${text}") respondText(text, ContentType.Application.Xml, HttpStatusCode.OK) } @@ -124,7 +124,7 @@ private suspend fun ApplicationCall.handleEbicsHia(header: EbicsUnsecuredRequest transaction { val ebicsSubscriber = findEbicsSubscriber(header.static.partnerID, header.static.userID, header.static.systemID) if (ebicsSubscriber == null) { - logger.warn("ebics subscriber not found") + LOGGER.warn("ebics subscriber not found") throw EbicsInvalidRequestError() } ebicsSubscriber.authenticationKey = EbicsSubscriberPublicKeyEntity.new { @@ -159,7 +159,7 @@ private suspend fun ApplicationCall.handleEbicsIni(header: EbicsUnsecuredRequest val ebicsSubscriber = findEbicsSubscriber(header.static.partnerID, header.static.userID, header.static.systemID) if (ebicsSubscriber == null) { - logger.warn("ebics subscriber ('${header.static.partnerID}' / '${header.static.userID}' / '${header.static.systemID}') not found") + LOGGER.warn("ebics subscriber ('${header.static.partnerID}' / '${header.static.userID}' / '${header.static.systemID}') not found") throw EbicsInvalidRequestError() } ebicsSubscriber.signatureKey = EbicsSubscriberPublicKeyEntity.new { @@ -172,7 +172,7 @@ private suspend fun ApplicationCall.handleEbicsIni(header: EbicsUnsecuredRequest else -> ebicsSubscriber.state } } - logger.info("Signature key inserted in database _and_ subscriber state changed accordingly") + LOGGER.info("Signature key inserted in database _and_ subscriber state changed accordingly") respondEbicsKeyManagement("[EBICS_OK]", "000000", bankReturnCode = "000000", orderId = "OR01") } @@ -201,7 +201,7 @@ private suspend fun ApplicationCall.handleEbicsHpb( } val validationResult = XMLUtil.verifyEbicsDocument(requestDocument, subscriberKeys.authenticationPublicKey) - logger.info("validationResult: $validationResult") + LOGGER.info("validationResult: $validationResult") if (!validationResult) { throw EbicsKeyManagementError("invalid signature", "90000"); } @@ -242,7 +242,7 @@ private fun ApplicationCall.ensureEbicsHost(requestHostID: String): EbicsHostPub val ebicsHost = EbicsHostEntity.find { EbicsHostsTable.hostID.upperCase() eq requestHostID.toUpperCase() }.firstOrNull() if (ebicsHost == null) { - logger.warn("client requested unknown HostID") + LOGGER.warn("client requested unknown HostID") throw EbicsKeyManagementError("[EBICS_INVALID_HOST_ID]", "091011") } val encryptionPrivateKey = CryptoUtil.loadRsaPrivateKey(ebicsHost.encryptionPrivateKey.toByteArray()) @@ -258,7 +258,7 @@ private fun ApplicationCall.ensureEbicsHost(requestHostID: String): EbicsHostPub private suspend fun ApplicationCall.receiveEbicsXml(): Document { val body: String = receiveText() - logger.debug("Data received: $body") + LOGGER.debug("Data received: $body") val requestDocument: Document? = XMLUtil.parseStringIntoDom(body) if (requestDocument == null || (!XMLUtil.validateFromDom(requestDocument))) { throw EbicsInvalidXmlError() @@ -458,12 +458,12 @@ fun queryEbicsTransactionDetails(ebicsRequest: EbicsRequest): EbicsTransactionDe suspend fun ApplicationCall.ebicsweb() { val requestDocument = receiveEbicsXml() - logger.info("Processing ${requestDocument.documentElement.localName}") + LOGGER.info("Processing ${requestDocument.documentElement.localName}") when (requestDocument.documentElement.localName) { "ebicsUnsecuredRequest" -> { val requestObject = requestDocument.toObject<EbicsUnsecuredRequest>() - logger.info("Serving a ${requestObject.header.static.orderDetails.orderType} request") + LOGGER.info("Serving a ${requestObject.header.static.orderDetails.orderType} request") val orderData = requestObject.body.dataTransfer.orderData.value val header = requestObject.header @@ -719,7 +719,7 @@ suspend fun ApplicationCall.ebicsweb() { } else -> { /* Log to console and return "unknown type" */ - logger.info("Unknown message, just logging it!") + LOGGER.info("Unknown message, just logging it!") respond( HttpStatusCode.NotImplemented, SandboxError("Not Implemented") diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt @@ -46,6 +46,7 @@ import org.jetbrains.exposed.sql.transactions.transaction import org.joda.time.DateTime import org.slf4j.Logger import org.slf4j.LoggerFactory +import org.slf4j.event.Level import org.w3c.dom.Document import java.lang.ArithmeticException import java.math.BigDecimal @@ -55,8 +56,6 @@ import javax.sql.rowset.serial.SerialBlob import javax.xml.bind.JAXBContext -val logger: Logger = LoggerFactory.getLogger("tech.libeufin.sandbox") - class CustomerNotFound(id: String?) : Exception("Customer ${id} not found") class BadInputData(inputData: String?) : Exception("Customer provided invalid input data: ${inputData}") class BadAmount(badValue: Any?) : Exception("Value '${badValue}' is not a valid amount") @@ -128,8 +127,7 @@ fun BigDecimal.signToString(): String { // minus sign is added by default already. } -fun main() { - dbCreateTables() +fun sampleData() { transaction { val pairA = CryptoUtil.generateRsaKeyPair(2048) @@ -146,7 +144,7 @@ fun main() { val customerEntity = BankCustomerEntity.new { name = "Mina" - } + } EbicsSubscriberEntity.new { partnerId = "PARTNER1" @@ -169,8 +167,22 @@ fun main() { } } + +} + +val LOGGER: Logger = LoggerFactory.getLogger("tech.libeufin.sandbox") + +fun main() { + + dbCreateTables() + sampleData() + val server = embeddedServer(Netty, port = 5000) { - install(CallLogging) + install(CallLogging) { + this.level = Level.DEBUG + this.logger = LOGGER + + } install(ContentNegotiation) { gson { setDateFormat(DateFormat.LONG) @@ -179,11 +191,11 @@ fun main() { } install(StatusPages) { exception<Throwable> { cause -> - logger.error("Exception while handling '${call.request.uri}'", cause) + LOGGER.error("Exception while handling '${call.request.uri}'", cause) call.respondText("Internal server error.", ContentType.Text.Plain, HttpStatusCode.InternalServerError) } exception<ArithmeticException> { cause -> - logger.error("Exception while handling '${call.request.uri}'", cause) + LOGGER.error("Exception while handling '${call.request.uri}'", cause) call.respondText("Invalid arithmetic attempted.", ContentType.Text.Plain, HttpStatusCode.InternalServerError) } } @@ -198,13 +210,13 @@ fun main() { post("/{id}/history") { - logger.debug("/history fired up") + LOGGER.debug("/history fired up") val req = call.receive<CustomerHistoryRequest>() val startDate = DateTime.parse(req.start) val endDate = DateTime.parse(req.end) - logger.debug("Fetching history from ${startDate.toString()}, to ${endDate.toString()}") + LOGGER.debug("Fetching history from ${startDate.toString()}, to ${endDate.toString()}") val ret = CustomerHistoryResponse() @@ -309,6 +321,6 @@ fun main() { } } } - logger.info("Up and running") + LOGGER.info("Up and running") server.start(wait = true) } diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/XMLUtil.kt @@ -160,7 +160,7 @@ class XMLUtil private constructor() { try { getEbicsValidator().validate(xmlDoc) } catch (e: Exception) { - logger.warn("Validation failed: ${e}") + LOGGER.warn("Validation failed: ${e}") return false } return true;