diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClient.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClient.kt index 74abb52d..7f8a6bb2 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClient.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClient.kt @@ -18,7 +18,8 @@ import kotlin.jvm.JvmOverloads */ open class FinTsClient @JvmOverloads constructor( open var callback: FinTsClientCallback, - protected open val jobExecutor: FinTsJobExecutor = FinTsJobExecutor() + protected open val jobExecutor: FinTsJobExecutor = FinTsJobExecutor(), + protected open val product: ProductData = ProductData("15E53C26816138699C7B6A3E8", "1.0.0") // TODO: get version dynamically ) { companion object { @@ -50,7 +51,7 @@ open class FinTsClient @JvmOverloads constructor( * On success [bank] parameter is updated afterwards. */ open fun getAnonymousBankInfo(bank: BankData, callback: (FinTsClientResponse) -> Unit) { - jobExecutor.getAnonymousBankInfo(JobContext(JobContextType.AnonymousBankInfo, this.callback, bank)) { response -> + jobExecutor.getAnonymousBankInfo(JobContext(JobContextType.AnonymousBankInfo, this.callback, product, bank)) { response -> callback(FinTsClientResponse(response)) } } @@ -58,7 +59,7 @@ open class FinTsClient @JvmOverloads constructor( open fun addAccountAsync(parameter: AddAccountParameter, callback: (AddAccountResponse) -> Unit) { val bank = parameter.bank - val context = JobContext(JobContextType.AddAccount, this.callback, bank) + val context = JobContext(JobContextType.AddAccount, this.callback, product, bank) /* First dialog: Get user's basic data like BPD, customer system ID and her TAN methods */ @@ -155,7 +156,7 @@ open class FinTsClient @JvmOverloads constructor( open fun getTransactionsAsync(parameter: GetTransactionsParameter, bank: BankData, callback: (GetTransactionsResponse) -> Unit) { - val context = JobContext(JobContextType.GetTransactions, this.callback, bank, parameter.account) + val context = JobContext(JobContextType.GetTransactions, this.callback, product, bank, parameter.account) jobExecutor.getTransactionsAsync(context, parameter, callback) } @@ -164,14 +165,14 @@ open class FinTsClient @JvmOverloads constructor( open fun getTanMediaList(bank: BankData, tanMediaKind: TanMedienArtVersion = TanMedienArtVersion.Alle, tanMediumClass: TanMediumKlasse = TanMediumKlasse.AlleMedien, callback: (GetTanMediaListResponse) -> Unit) { - val context = JobContext(JobContextType.GetTanMedia, this.callback, bank) + val context = JobContext(JobContextType.GetTanMedia, this.callback, product, bank) jobExecutor.getTanMediaList(context, tanMediaKind, tanMediumClass, callback) } open fun changeTanMedium(newActiveTanMedium: TanGeneratorTanMedium, bank: BankData, callback: (FinTsClientResponse) -> Unit) { - val context = JobContext(JobContextType.ChangeTanMedium, this.callback, bank) + val context = JobContext(JobContextType.ChangeTanMedium, this.callback, product, bank) jobExecutor.changeTanMedium(context, newActiveTanMedium) { response -> callback(FinTsClientResponse(response)) @@ -180,7 +181,7 @@ open class FinTsClient @JvmOverloads constructor( open fun doBankTransferAsync(bankTransferData: BankTransferData, bank: BankData, account: AccountData, callback: (FinTsClientResponse) -> Unit) { - val context = JobContext(JobContextType.TransferMoney, this.callback, bank, account) + val context = JobContext(JobContextType.TransferMoney, this.callback, product, bank, account) jobExecutor.doBankTransferAsync(context, bankTransferData, callback) } diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClientForCustomer.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClientForCustomer.kt index 7185f3eb..25647055 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClientForCustomer.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsClientForCustomer.kt @@ -32,7 +32,7 @@ open class FinTsClientForCustomer( : this(bank, callback, RequestExecutor(MessageBuilder(), webClient, base64Service)) - protected val client = FinTsClient(callback, FinTsJobExecutor(requestExecutor, messageBuilder, mt940Parser, modelMapper, tanMethodSelector, product)) + protected val client = FinTsClient(callback, FinTsJobExecutor(requestExecutor, messageBuilder, mt940Parser, modelMapper, tanMethodSelector), product) open val messageLogWithoutSensitiveData: List diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsJobExecutor.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsJobExecutor.kt index 49294bd2..329ad04a 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsJobExecutor.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/FinTsJobExecutor.kt @@ -36,8 +36,7 @@ open class FinTsJobExecutor( protected open val messageBuilder: MessageBuilder = MessageBuilder(), protected open val mt940Parser: IAccountTransactionsParser = Mt940AccountTransactionsParser(), protected open val modelMapper: ModelMapper = ModelMapper(messageBuilder), - protected open val tanMethodSelector: TanMethodSelector = TanMethodSelector(), - protected open val product: ProductData = ProductData("15E53C26816138699C7B6A3E8", "1.0.0") // TODO: get version dynamically + protected open val tanMethodSelector: TanMethodSelector = TanMethodSelector() ) { companion object { @@ -55,8 +54,7 @@ open class FinTsJobExecutor( open fun getAnonymousBankInfo(context: JobContext, callback: (BankResponse) -> Unit) { - val dialogContext = DialogContext(context.bank, product) - context.startNewDialog(dialogContext) + context.startNewDialog() val message = messageBuilder.createAnonymousDialogInitMessage(context) @@ -106,8 +104,7 @@ open class FinTsJobExecutor( bank.resetSelectedTanMethod() // this is the only case where Einschritt-TAN-Verfahren is accepted: to get user's TAN methods - val dialogContext = DialogContext(bank, product, closeDialog, versionOfSecurityMethod = VersionDesSicherheitsverfahrens.Version_1) - context.startNewDialog(dialogContext) + context.startNewDialog(closeDialog, versionOfSecurityMethod = VersionDesSicherheitsverfahrens.Version_1) val message = messageBuilder.createInitDialogMessage(context) @@ -166,8 +163,7 @@ open class FinTsJobExecutor( getUsersTanMethod(context) { didSelectTanMethod -> if (didSelectTanMethod) { - val dialogContext = DialogContext(bank, product) - context.startNewDialog(dialogContext) + context.startNewDialog() initDialogWithStrongCustomerAuthenticationAfterSuccessfulPreconditionChecks(context) { initDialogResponse -> closeDialog(context) @@ -185,8 +181,7 @@ open class FinTsJobExecutor( open fun getAccounts(context: JobContext, callback: (BankResponse) -> Unit) { - val dialogContext = DialogContext(context.bank, product, false) - context.startNewDialog(dialogContext) + context.startNewDialog(false) initDialogWithStrongCustomerAuthenticationAfterSuccessfulPreconditionChecks(context) { response -> closeDialog(context) @@ -198,8 +193,7 @@ open class FinTsJobExecutor( open fun getTransactionsAsync(context: JobContext, parameter: GetTransactionsParameter, callback: (GetTransactionsResponse) -> Unit) { - val dialogContext = DialogContext(context.bank, product) - context.startNewDialog(dialogContext) + val dialogContext = context.startNewDialog() initDialogWithStrongCustomerAuthentication(context) { initDialogResponse -> @@ -300,8 +294,7 @@ open class FinTsJobExecutor( */ protected open fun synchronizeCustomerSystemId(context: JobContext, callback: (FinTsClientResponse) -> Unit) { - val dialogContext = DialogContext(context.bank, product) - context.startNewDialog(dialogContext) + context.startNewDialog() val message = messageBuilder.createSynchronizeCustomerSystemIdMessage(context) @@ -522,9 +515,7 @@ open class FinTsJobExecutor( protected open fun resendMessageInNewDialog(context: JobContext, lastCreatedMessage: MessageBuilderResult?, callback: (BankResponse) -> Unit) { if (lastCreatedMessage != null) { // do not use previousDialogContext.currentMessage as this may is previous dialog's dialog close message - val previousDialog = context.dialog - val newDialogContext = DialogContext(context.bank, previousDialog.product, chunkedResponseHandler = previousDialog.chunkedResponseHandler) - context.startNewDialog(newDialogContext) + context.startNewDialog(chunkedResponseHandler = context.dialog.chunkedResponseHandler) initDialogWithStrongCustomerAuthentication(context) { initDialogResponse -> if (initDialogResponse.successful == false) { @@ -551,8 +542,7 @@ open class FinTsJobExecutor( protected open fun sendMessageAndHandleResponse(context: JobContext, segmentForNonStrongCustomerAuthenticationTwoStepTanProcess: CustomerSegmentId? = null, closeDialog: Boolean = true, createMessage: () -> MessageBuilderResult, callback: (BankResponse) -> Unit) { - val dialogContext = DialogContext(context.bank, product, closeDialog) - context.startNewDialog(dialogContext) + context.startNewDialog(closeDialog) if (segmentForNonStrongCustomerAuthenticationTwoStepTanProcess == null) { initDialogWithStrongCustomerAuthentication(context) { initDialogResponse -> diff --git a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/model/JobContext.kt b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/model/JobContext.kt index aad94f43..4b2201b7 100644 --- a/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/model/JobContext.kt +++ b/fints4k/src/commonMain/kotlin/net/dankito/banking/fints/model/JobContext.kt @@ -1,24 +1,43 @@ package net.dankito.banking.fints.model import net.dankito.banking.fints.callback.FinTsClientCallback +import net.dankito.banking.fints.messages.datenelemente.implementierte.signatur.VersionDesSicherheitsverfahrens +import net.dankito.banking.fints.response.BankResponse -class JobContext( - val type: JobContextType, - val callback: FinTsClientCallback, - val bank: BankData, +open class JobContext( + open val type: JobContextType, + open val callback: FinTsClientCallback, + open val product: ProductData, + open val bank: BankData, /** * Only set if the current context is for a specific account (like get account's transactions). */ - val account: AccountData? = null + open val account: AccountData? = null ) { - lateinit var dialog: DialogContext + protected open val _dialogs = mutableListOf() - fun startNewDialog(dialog: DialogContext) { - this.dialog = dialog + open var dialog: DialogContext = DialogContext(bank, product) // create null value so that variable is not null + protected set + + open val dialogs: List + get() = ArrayList(_dialogs) // create a copy + + + fun startNewDialog(closeDialog: Boolean = true, dialogId: String = DialogContext.InitialDialogId, + versionOfSecurityMethod: VersionDesSicherheitsverfahrens = VersionDesSicherheitsverfahrens.Version_2, + chunkedResponseHandler: ((BankResponse) -> Unit)? = null) : DialogContext { + val newDialogContext = DialogContext(bank, product, closeDialog, dialogId = dialogId, + versionOfSecurityMethod = versionOfSecurityMethod, chunkedResponseHandler = chunkedResponseHandler) + + this.dialog = newDialogContext + + this._dialogs.add(newDialogContext) + + return newDialogContext } } \ No newline at end of file diff --git a/fints4k/src/commonTest/kotlin/net/dankito/banking/fints/FinTsTestBase.kt b/fints4k/src/commonTest/kotlin/net/dankito/banking/fints/FinTsTestBase.kt index 633a71e1..fdb0bd22 100644 --- a/fints4k/src/commonTest/kotlin/net/dankito/banking/fints/FinTsTestBase.kt +++ b/fints4k/src/commonTest/kotlin/net/dankito/banking/fints/FinTsTestBase.kt @@ -63,10 +63,8 @@ abstract class FinTsTestBase { protected open fun createContext(dialogId: String = DialogContext.InitialDialogId): JobContext { - val dialogContext = DialogContext(Bank, Product, dialogId = dialogId) - - val context = JobContext(JobContextType.AnonymousBankInfo, SimpleFinTsClientCallback(), Bank) - context.startNewDialog(dialogContext) + val context = JobContext(JobContextType.AnonymousBankInfo, SimpleFinTsClientCallback(), Product, Bank) + context.startNewDialog(dialogId = dialogId) return context } diff --git a/fints4k/src/jvm6Test/kotlin/net/dankito/banking/fints/bankdetails/BanksFinTsDetailsRetriever.kt b/fints4k/src/jvm6Test/kotlin/net/dankito/banking/fints/bankdetails/BanksFinTsDetailsRetriever.kt index 2efc877d..8cb41eb7 100644 --- a/fints4k/src/jvm6Test/kotlin/net/dankito/banking/fints/bankdetails/BanksFinTsDetailsRetriever.kt +++ b/fints4k/src/jvm6Test/kotlin/net/dankito/banking/fints/bankdetails/BanksFinTsDetailsRetriever.kt @@ -127,9 +127,8 @@ class BanksFinTsDetailsRetriever { private fun getAnonymousBankInfo(bank: BankData): BankResponse { - val dialogContext = DialogContext(bank, product) - val context = JobContext(JobContextType.AnonymousBankInfo, SimpleFinTsClientCallback(), bank) - context.startNewDialog(dialogContext) + val context = JobContext(JobContextType.AnonymousBankInfo, SimpleFinTsClientCallback(), product, bank) + context.startNewDialog() val requestBody = messageBuilder.createAnonymousDialogInitMessage(context)