Added tanMethodsNotSupportedByApplication to filter out TAN methods that client application does not support (e.g. chipTanUsb)

This commit is contained in:
dankito 2024-09-10 02:57:12 +02:00
parent 6908f52e48
commit c158097d3a
10 changed files with 29 additions and 18 deletions

View File

@ -80,7 +80,7 @@ open class FinTsClient(
} }
protected open suspend fun getAccountTransactions(param: GetAccountDataParameter, bank: BankData, account: AccountData): GetAccountTransactionsResponse { protected open suspend fun getAccountTransactions(param: GetAccountDataParameter, bank: BankData, account: AccountData): GetAccountTransactionsResponse {
val context = JobContext(JobContextType.GetTransactions, this.callback, config, bank, account, param.preferredTanMethods, param.preferredTanMedium) val context = JobContext(JobContextType.GetTransactions, this.callback, config, bank, account, param.preferredTanMethods, param.tanMethodsNotSupportedByApplication, param.preferredTanMedium)
return config.jobExecutor.getTransactionsAsync(context, mapper.toGetAccountTransactionsParameter(param, bank, account)) return config.jobExecutor.getTransactionsAsync(context, mapper.toGetAccountTransactionsParameter(param, bank, account))
} }
@ -138,7 +138,7 @@ open class FinTsClient(
accountToUse = selectedAccount accountToUse = selectedAccount
} }
val context = JobContext(JobContextType.TransferMoney, this.callback, config, bank, accountToUse, param.preferredTanMethods, param.preferredTanMedium) val context = JobContext(JobContextType.TransferMoney, this.callback, config, bank, accountToUse, param.preferredTanMethods, param.tanMethodsNotSupportedByApplication, param.preferredTanMedium)
val response = config.jobExecutor.transferMoneyAsync(context, BankTransferData(param.recipientName, param.recipientAccountIdentifier, recipientBankIdentifier, val response = config.jobExecutor.transferMoneyAsync(context, BankTransferData(param.recipientName, param.recipientAccountIdentifier, recipientBankIdentifier,
param.amount, param.reference, param.instantPayment)) param.amount, param.reference, param.instantPayment))
@ -205,7 +205,7 @@ open class FinTsClient(
// return GetAccountInfoResponse(it) // return GetAccountInfoResponse(it)
} }
val context = JobContext(JobContextType.GetAccountInfo, this.callback, config, bank, null, param.preferredTanMethods, param.preferredTanMedium) val context = JobContext(JobContextType.GetAccountInfo, this.callback, config, bank, null, param.preferredTanMethods, param.tanMethodsNotSupportedByApplication, param.preferredTanMedium)
/* First dialog: Get user's basic data like BPD, customer system ID and her TAN methods */ /* First dialog: Get user's basic data like BPD, customer system ID and her TAN methods */

View File

@ -39,7 +39,7 @@ open class FinTsClientDeprecated(
open suspend fun addAccountAsync(param: AddAccountParameter): AddAccountResponse { open suspend fun addAccountAsync(param: AddAccountParameter): AddAccountResponse {
val bank = param.bank val bank = param.bank
val context = JobContext(JobContextType.AddAccount, this.callback, config, bank, null, param.preferredTanMethods, param.preferredTanMedium) val context = JobContext(JobContextType.AddAccount, this.callback, config, bank, null, param.preferredTanMethods, param.tanMethodsNotSupportedByApplication, param.preferredTanMedium)
/* First dialog: Get user's basic data like BPD, customer system ID and her TAN methods */ /* First dialog: Get user's basic data like BPD, customer system ID and her TAN methods */

View File

@ -145,6 +145,7 @@ open class FinTsJobExecutor(
return BankResponse(true, internalError = "Die TAN Verfahren der Bank konnten nicht ermittelt werden") // TODO: translate return BankResponse(true, internalError = "Die TAN Verfahren der Bank konnten nicht ermittelt werden") // TODO: translate
} else { } else {
bank.tanMethodsAvailableForUser = bank.tanMethodsSupportedByBank bank.tanMethodsAvailableForUser = bank.tanMethodsSupportedByBank
.filterNot { context.tanMethodsNotSupportedByApplication.contains(it.type) }
val didSelectTanMethod = getUsersTanMethod(context) val didSelectTanMethod = getUsersTanMethod(context)
@ -714,13 +715,13 @@ Log.info { "Terminating waiting for TAN input" } // TODO: remove again
return true return true
} }
else { else {
tanMethodSelector.findPreferredTanMethod(bank.tanMethodsAvailableForUser, context.preferredTanMethods)?.let { tanMethodSelector.findPreferredTanMethod(bank.tanMethodsAvailableForUser, context.preferredTanMethods, context.tanMethodsNotSupportedByApplication)?.let {
bank.selectedTanMethod = it bank.selectedTanMethod = it
return true return true
} }
// we know user's supported tan methods, now ask user which one to select // we know user's supported tan methods, now ask user which one to select
val suggestedTanMethod = tanMethodSelector.getSuggestedTanMethod(bank.tanMethodsAvailableForUser) val suggestedTanMethod = tanMethodSelector.getSuggestedTanMethod(bank.tanMethodsAvailableForUser, context.tanMethodsNotSupportedByApplication)
val selectedTanMethod = context.callback.askUserForTanMethod(bank.tanMethodsAvailableForUser, suggestedTanMethod) val selectedTanMethod = context.callback.askUserForTanMethod(bank.tanMethodsAvailableForUser, suggestedTanMethod)
@ -741,14 +742,14 @@ Log.info { "Terminating waiting for TAN input" } // TODO: remove again
protected open fun updateBankAndCustomerDataIfResponseSuccessful(context: JobContext, response: BankResponse) { protected open fun updateBankAndCustomerDataIfResponseSuccessful(context: JobContext, response: BankResponse) {
if (response.successful) { if (response.successful) {
updateBankAndCustomerData(context.bank, response) updateBankAndCustomerData(context.bank, response, context)
} }
} }
protected open fun updateBankAndCustomerData(bank: BankData, response: BankResponse) { protected open fun updateBankAndCustomerData(bank: BankData, response: BankResponse, context: JobContext) {
updateBankData(bank, response) updateBankData(bank, response)
modelMapper.updateCustomerData(bank, response) modelMapper.updateCustomerData(bank, response, context)
} }

View File

@ -7,6 +7,7 @@ open class AddAccountParameter @JvmOverloads constructor(
open val bank: BankData, open val bank: BankData,
open val fetchBalanceAndTransactions: Boolean = true, open val fetchBalanceAndTransactions: Boolean = true,
open val preferredTanMethods: List<TanMethodType>? = null, open val preferredTanMethods: List<TanMethodType>? = null,
open val tanMethodsNotSupportedByApplication: List<TanMethodType>? = null,
open val preferredTanMedium: String? = null open val preferredTanMedium: String? = null
) { ) {

View File

@ -26,6 +26,7 @@ open class JobContext(
*/ */
open val account: AccountData? = null, open val account: AccountData? = null,
open val preferredTanMethods: List<TanMethodType>? = null, open val preferredTanMethods: List<TanMethodType>? = null,
tanMethodsNotSupportedByApplication: List<TanMethodType>? = null,
open val preferredTanMedium: String? = null, open val preferredTanMedium: String? = null,
protected open val messageLogCollector: MessageLogCollector = MessageLogCollector(callback, config.options) protected open val messageLogCollector: MessageLogCollector = MessageLogCollector(callback, config.options)
) : MessageBaseData(bank, config.options.product), IMessageLogAppender { ) : MessageBaseData(bank, config.options.product), IMessageLogAppender {
@ -37,6 +38,8 @@ open class JobContext(
protected open val _dialogs = mutableListOf<DialogContext>() protected open val _dialogs = mutableListOf<DialogContext>()
open val tanMethodsNotSupportedByApplication: List<TanMethodType> = tanMethodsNotSupportedByApplication ?: emptyList()
open val mt940Parser: IAccountTransactionsParser = Mt940AccountTransactionsParser(Mt940Parser(this), this) open val mt940Parser: IAccountTransactionsParser = Mt940AccountTransactionsParser(Mt940Parser(this), this)
open val responseParser: ResponseParser = ResponseParser(logAppender = this) open val responseParser: ResponseParser = ResponseParser(logAppender = this)

View File

@ -63,7 +63,7 @@ open class ModelMapper(
} }
} }
open fun updateCustomerData(bank: BankData, response: BankResponse) { open fun updateCustomerData(bank: BankData, response: BankResponse, context: JobContext) {
response.getFirstSegmentById<BankParameters>(InstituteSegmentId.BankParameters)?.let { bankParameters -> response.getFirstSegmentById<BankParameters>(InstituteSegmentId.BankParameters)?.let { bankParameters ->
// TODO: ask user if there is more than one supported language? But it seems that almost all banks only support German. // TODO: ask user if there is more than one supported language? But it seems that almost all banks only support German.
if (bank.selectedLanguage == Dialogsprache.Default && bankParameters.supportedLanguages.isNotEmpty()) { if (bank.selectedLanguage == Dialogsprache.Default && bankParameters.supportedLanguages.isNotEmpty()) {
@ -146,6 +146,7 @@ open class ModelMapper(
if (response.supportedTanMethodsForUser.isNotEmpty()) { if (response.supportedTanMethodsForUser.isNotEmpty()) {
bank.tanMethodsAvailableForUser = response.supportedTanMethodsForUser.mapNotNull { findTanMethod(it, bank) } bank.tanMethodsAvailableForUser = response.supportedTanMethodsForUser.mapNotNull { findTanMethod(it, bank) }
.filterNot { context.tanMethodsNotSupportedByApplication.contains(it.type) }
if (bank.tanMethodsAvailableForUser.firstOrNull { it.securityFunction == bank.selectedTanMethod.securityFunction } == null) { // supportedTanMethods don't contain selectedTanMethod anymore if (bank.tanMethodsAvailableForUser.firstOrNull { it.securityFunction == bank.selectedTanMethod.securityFunction } == null) { // supportedTanMethods don't contain selectedTanMethod anymore
bank.resetSelectedTanMethod() bank.resetSelectedTanMethod()

View File

@ -27,15 +27,17 @@ open class TanMethodSelector {
} }
open fun getSuggestedTanMethod(tanMethods: List<TanMethod>): TanMethod? { open fun getSuggestedTanMethod(tanMethods: List<TanMethod>, tanMethodsNotSupportedByApplication: List<TanMethodType> = emptyList()): TanMethod? {
return findPreferredTanMethod(tanMethods, NonVisualOrImageBased) // we use NonVisualOrImageBased as it provides a good default for most users return findPreferredTanMethod(tanMethods, NonVisualOrImageBased, tanMethodsNotSupportedByApplication) // we use NonVisualOrImageBased as it provides a good default for most users
?: tanMethods.firstOrNull() ?: tanMethods.firstOrNull { it.type !in tanMethodsNotSupportedByApplication }
} }
open fun findPreferredTanMethod(tanMethods: List<TanMethod>, preferredTanMethods: List<TanMethodType>?): TanMethod? { open fun findPreferredTanMethod(tanMethods: List<TanMethod>, preferredTanMethods: List<TanMethodType>?, tanMethodsNotSupportedByApplication: List<TanMethodType> = emptyList()): TanMethod? {
preferredTanMethods?.forEach { preferredTanMethodType -> preferredTanMethods?.forEach { preferredTanMethodType ->
tanMethods.firstOrNull { it.type == preferredTanMethodType }?.let { if (preferredTanMethodType !in tanMethodsNotSupportedByApplication) {
return it tanMethods.firstOrNull { it.type == preferredTanMethodType }?.let {
return it
}
} }
} }

View File

@ -12,6 +12,7 @@ open class FinTsClientParameter(
password: String, password: String,
open val preferredTanMethods: List<TanMethodType>? = null, open val preferredTanMethods: List<TanMethodType>? = null,
open val tanMethodsNotSupportedByApplication: List<TanMethodType>? = null,
open val preferredTanMedium: String? = null, // the ID of the medium open val preferredTanMedium: String? = null, // the ID of the medium
open val abortIfTanIsRequired: Boolean = false, open val abortIfTanIsRequired: Boolean = false,
open val finTsModel: BankData? = null open val finTsModel: BankData? = null

View File

@ -21,11 +21,12 @@ open class GetAccountDataParameter(
open val retrieveTransactionsTo: LocalDate? = null, open val retrieveTransactionsTo: LocalDate? = null,
preferredTanMethods: List<TanMethodType>? = null, preferredTanMethods: List<TanMethodType>? = null,
tanMethodsNotSupportedByApplication: List<TanMethodType>? = null,
preferredTanMedium: String? = null, preferredTanMedium: String? = null,
abortIfTanIsRequired: Boolean = false, abortIfTanIsRequired: Boolean = false,
finTsModel: BankData? = null, finTsModel: BankData? = null,
open val defaultBankValues: BankData? = null open val defaultBankValues: BankData? = null
) : FinTsClientParameter(bankCode, loginName, password, preferredTanMethods, preferredTanMedium, abortIfTanIsRequired, finTsModel) { ) : FinTsClientParameter(bankCode, loginName, password, preferredTanMethods, tanMethodsNotSupportedByApplication, preferredTanMedium, abortIfTanIsRequired, finTsModel) {
open val retrieveOnlyAccountInfo: Boolean open val retrieveOnlyAccountInfo: Boolean
get() = retrieveBalance == false && retrieveTransactions == RetrieveTransactions.No get() = retrieveBalance == false && retrieveTransactions == RetrieveTransactions.No

View File

@ -34,10 +34,11 @@ open class TransferMoneyParameter(
open val instantPayment: Boolean = false, open val instantPayment: Boolean = false,
preferredTanMethods: List<TanMethodType>? = null, preferredTanMethods: List<TanMethodType>? = null,
tanMethodsNotSupportedByApplication: List<TanMethodType>? = null,
preferredTanMedium: String? = null, preferredTanMedium: String? = null,
abortIfTanIsRequired: Boolean = false, abortIfTanIsRequired: Boolean = false,
finTsModel: BankData? = null, finTsModel: BankData? = null,
open val selectAccountToUseForTransfer: ((List<AccountData>) -> AccountData?)? = null // TODO: use BankAccount instead of AccountData open val selectAccountToUseForTransfer: ((List<AccountData>) -> AccountData?)? = null // TODO: use BankAccount instead of AccountData
) : FinTsClientParameter(bankCode, loginName, password, preferredTanMethods, preferredTanMedium, abortIfTanIsRequired, finTsModel) ) : FinTsClientParameter(bankCode, loginName, password, preferredTanMethods, tanMethodsNotSupportedByApplication, preferredTanMedium, abortIfTanIsRequired, finTsModel)