Started implementing message log (so that it later can be displayed to user)
This commit is contained in:
parent
ea96818d60
commit
2df12c4984
|
@ -35,6 +35,7 @@ import net.dankito.utils.web.client.WebClientResponse
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
|
|
||||||
|
|
||||||
open class FinTsClient @JvmOverloads constructor(
|
open class FinTsClient @JvmOverloads constructor(
|
||||||
|
@ -55,6 +56,12 @@ open class FinTsClient @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected val messageLogField = CopyOnWriteArrayList<MessageLogEntry>()
|
||||||
|
|
||||||
|
open val messageLog: List<MessageLogEntry>
|
||||||
|
get() = ArrayList(messageLogField)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves information about bank (e.g. supported HBCI versions, FinTS server address,
|
* Retrieves information about bank (e.g. supported HBCI versions, FinTS server address,
|
||||||
* supported jobs, ...).
|
* supported jobs, ...).
|
||||||
|
@ -568,6 +575,8 @@ open class FinTsClient @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun getAndHandleResponseForMessage(requestBody: String, dialogContext: DialogContext): Response {
|
protected open fun getAndHandleResponseForMessage(requestBody: String, dialogContext: DialogContext): Response {
|
||||||
|
addMessageLog(requestBody, MessageLogEntryType.Sent, dialogContext)
|
||||||
|
|
||||||
val webResponse = getResponseForMessage(requestBody, dialogContext.bank.finTs3ServerAddress)
|
val webResponse = getResponseForMessage(requestBody, dialogContext.bank.finTs3ServerAddress)
|
||||||
|
|
||||||
val response = handleResponse(webResponse, dialogContext)
|
val response = handleResponse(webResponse, dialogContext)
|
||||||
|
@ -580,8 +589,6 @@ open class FinTsClient @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun getResponseForMessage(requestBody: String, finTs3ServerAddress: String): WebClientResponse {
|
protected open fun getResponseForMessage(requestBody: String, finTs3ServerAddress: String): WebClientResponse {
|
||||||
log.debug("Sending message:\n${prettyPrintHbciMessage(requestBody)}")
|
|
||||||
|
|
||||||
val encodedRequestBody = base64Service.encode(requestBody)
|
val encodedRequestBody = base64Service.encode(requestBody)
|
||||||
|
|
||||||
return webClient.post(
|
return webClient.post(
|
||||||
|
@ -597,7 +604,7 @@ open class FinTsClient @JvmOverloads constructor(
|
||||||
try {
|
try {
|
||||||
val decodedResponse = decodeBase64Response(responseBody)
|
val decodedResponse = decodeBase64Response(responseBody)
|
||||||
|
|
||||||
log.debug("Received message:\n${prettyPrintHbciMessage(decodedResponse)}")
|
addMessageLog(decodedResponse, MessageLogEntryType.Received, dialogContext)
|
||||||
|
|
||||||
return responseParser.parse(decodedResponse)
|
return responseParser.parse(decodedResponse)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
@ -618,10 +625,49 @@ open class FinTsClient @JvmOverloads constructor(
|
||||||
return base64Service.decode(responseBody.replace("\r", "").replace("\n", ""))
|
return base64Service.decode(responseBody.replace("\r", "").replace("\n", ""))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected open fun addMessageLog(message: String, type: MessageLogEntryType, dialogContext: DialogContext) {
|
||||||
|
val timeStamp = Date()
|
||||||
|
val prettyPrintMessage = prettyPrintHbciMessage(message)
|
||||||
|
|
||||||
|
val prettyPrintMessageWithoutSensitiveData = removeSensitiveDataFromMessage(prettyPrintMessage, dialogContext)
|
||||||
|
|
||||||
|
|
||||||
|
log.debug("${if (type == MessageLogEntryType.Sent) "Sending" else "Received"} message:\n$prettyPrintMessage")
|
||||||
|
|
||||||
|
messageLogField.add(MessageLogEntry(prettyPrintMessageWithoutSensitiveData, timeStamp, dialogContext.customer))
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun removeSensitiveDataFromMessage(prettyPrintMessage: String, dialogContext: DialogContext): String {
|
||||||
|
var prettyPrintMessageWithoutSensitiveData = prettyPrintMessage
|
||||||
|
.replace(dialogContext.customer.customerId, "<customer_id>")
|
||||||
|
.replace("+" + dialogContext.customer.pin, "+<pin>")
|
||||||
|
|
||||||
|
if (dialogContext.customer.name.isNotBlank()) { // TODO: log after response is parsed as otherwise this information may is not available
|
||||||
|
prettyPrintMessageWithoutSensitiveData = prettyPrintMessageWithoutSensitiveData
|
||||||
|
.replace(dialogContext.customer.name, "<customer_name>", true)
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogContext.customer.accounts.forEach { account ->
|
||||||
|
prettyPrintMessageWithoutSensitiveData = prettyPrintMessageWithoutSensitiveData
|
||||||
|
.replace(account.accountIdentifier, "<account_identifier>")
|
||||||
|
|
||||||
|
if (account.accountHolderName.isNotBlank()) {
|
||||||
|
prettyPrintMessageWithoutSensitiveData = prettyPrintMessageWithoutSensitiveData
|
||||||
|
.replace(account.accountHolderName, "<account_holder>", true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: remove account transactions
|
||||||
|
|
||||||
|
return prettyPrintMessageWithoutSensitiveData
|
||||||
|
}
|
||||||
|
|
||||||
protected fun prettyPrintHbciMessage(message: String): String {
|
protected fun prettyPrintHbciMessage(message: String): String {
|
||||||
return message.replace("'", "'\r\n")
|
return message.replace("'", "'\r\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected open fun handleMayRequiredTan(response: Response, dialogContext: DialogContext): Response { // TODO: use response from DialogContext
|
protected open fun handleMayRequiredTan(response: Response, dialogContext: DialogContext): Response { // TODO: use response from DialogContext
|
||||||
|
|
||||||
if (response.isStrongAuthenticationRequired) {
|
if (response.isStrongAuthenticationRequired) {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package net.dankito.fints.model
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
open class MessageLogEntry(
|
||||||
|
val message: String,
|
||||||
|
val time: Date,
|
||||||
|
val customer: CustomerData
|
||||||
|
) {
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return message
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package net.dankito.fints.model
|
||||||
|
|
||||||
|
|
||||||
|
enum class MessageLogEntryType {
|
||||||
|
|
||||||
|
Sent,
|
||||||
|
|
||||||
|
Received
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue