libeufin

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

commit be8f352a7e202e0857a401f277f899ac80ebf9e3
parent 0baa2eefdae2194949d017bc120b775bc3b87829
Author: Antoine A <>
Date:   Tue, 15 Jul 2025 17:34:10 +0200

nexus: make HKB a requirement for setup

Diffstat:
Mnexus/src/main/kotlin/tech/libeufin/nexus/cli/EbicsSetup.kt | 166++++++++++++++++++++++++++++++++++++++-----------------------------------------
1 file changed, 80 insertions(+), 86 deletions(-)

diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/cli/EbicsSetup.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/cli/EbicsSetup.kt @@ -246,109 +246,103 @@ class EbicsSetup: CliktCommand() { // Check account information logger.info("Doing administrative request HKD") - try { - cfg.withDb { db, _ -> - EbicsClient( - cfg, - client, - db, - ebicsLogger, - clientKeys, - bankKeys - ).download(EbicsOrder.V3.HKD, null, null, false) { stream -> - val (partner, users) = EbicsAdministrative.parseHKD(stream) - val user = users.find { it -> it.id == cfg.ebics.host.ebicsUserId } - // Debug logging - logger.debug { - buildString { - if (partner.name != null || partner.accounts.isNotEmpty()) { - append("Partner Info: ") - if (partner.name != null) { - append("'") - append(partner.name) - append("' - ") - } - for ((iban, currency) in partner.accounts) { - append(iban) - append('_') - append(currency) - } - append('\n') + cfg.withDb { db, _ -> + EbicsClient( + cfg, + client, + db, + ebicsLogger, + clientKeys, + bankKeys + ).download(EbicsOrder.V3.HKD, null, null, false) { stream -> + val (partner, users) = EbicsAdministrative.parseHKD(stream) + val user = users.find { it -> it.id == cfg.ebics.host.ebicsUserId } + // Debug logging + logger.debug { + buildString { + if (partner.name != null || partner.accounts.isNotEmpty()) { + append("Partner Info: ") + if (partner.name != null) { + append("'") + append(partner.name) + append("' - ") + } + for ((iban, currency) in partner.accounts) { + append(iban) + append('_') + append(currency) } - append("Supported orders:\n") - for ((order, description) in partner.orders) { + append('\n') + } + append("Supported orders:\n") + for ((order, description) in partner.orders) { + append("- ") + append(order.description()) + append(": ") + append(description) + append('\n') + } + if (user != null) { + append("Authorized orders:\n") + for ((order) in partner.orders) { append("- ") append(order.description()) - append(": ") - append(description) append('\n') } - if (user != null) { - append("Authorized orders:\n") - for ((order) in partner.orders) { - append("- ") - append(order.description()) - append('\n') - } - } } } + } - // Check partner info match config - if (partner.name != null && partner.name != cfg.ebics.account.name) - logger.warn("Expected NAME '${cfg.ebics.account.name}' from config got '${partner.name}' from bank") - val account = partner.accounts.find { it.iban == cfg.ebics.account.iban } - if (account != null) { - if (account.currency != null && account.currency != cfg.currency) - logger.error("Expected CURRENCY '${cfg.currency}' from config got '${account.currency}' from bank") - } else if (partner.accounts.isNotEmpty()) { - val ibans = partner.accounts.map { it.iban }.joinToString(" ") - logger.error("Expected IBAN ${cfg.ebics.account.iban} from config got $ibans from bank") - } + // Check partner info match config + if (partner.name != null && partner.name != cfg.ebics.account.name) + logger.warn("Expected NAME '${cfg.ebics.account.name}' from config got '${partner.name}' from bank") + val account = partner.accounts.find { it.iban == cfg.ebics.account.iban } + if (account != null) { + if (account.currency != null && account.currency != cfg.currency) + logger.error("Expected CURRENCY '${cfg.currency}' from config got '${account.currency}' from bank") + } else if (partner.accounts.isNotEmpty()) { + val ibans = partner.accounts.map { it.iban }.joinToString(" ") + logger.error("Expected IBAN ${cfg.ebics.account.iban} from config got $ibans from bank") + } - val instantDebitOrder = cfg.ebics.dialect.instantDirectDebit() - val debitOrder = cfg.ebics.dialect.directDebit() - val requireOrders = cfg.ebics.dialect.downloadOrders() + val instantDebitOrder = cfg.ebics.dialect.instantDirectDebit() + val debitOrder = cfg.ebics.dialect.directDebit() + val requireOrders = cfg.ebics.dialect.downloadOrders() - val partnerOrders = partner.orders.map { it.order } + val partnerOrders = partner.orders.map { it.order } - // Check partner support for direct debit orders - if (instantDebitOrder != null && instantDebitOrder !in partnerOrders) { - logger.warn("Unsupported instant debit order: ${instantDebitOrder.description()}") - } - if (debitOrder !in partnerOrders) { - logger.warn("Unsupported debit order: ${debitOrder.description()}") + // Check partner support for direct debit orders + if (instantDebitOrder != null && instantDebitOrder !in partnerOrders) { + logger.warn("Unsupported instant debit order: ${instantDebitOrder.description()}") + } + if (debitOrder !in partnerOrders) { + logger.warn("Unsupported debit order: ${debitOrder.description()}") + } + + // Check partner support required orders + val unsupportedOrder = requireOrders subtract partnerOrders + if (unsupportedOrder.isNotEmpty()) { + logger.warn("Unsupported orders: {}", unsupportedOrder.map(EbicsOrder::description).joinToString(" ")) + } + + if (user != null) { + // Check user is authorized for direct debit orders + if (instantDebitOrder != null && instantDebitOrder in partnerOrders && instantDebitOrder !in user.permissions) { + logger.warn("Unauthorized instant debit order: ${instantDebitOrder.description()}") } - - // Check partner support required orders - val unsupportedOrder = requireOrders subtract partnerOrders - if (unsupportedOrder.isNotEmpty()) { - logger.warn("Unsupported orders: {}", unsupportedOrder.map(EbicsOrder::description).joinToString(" ")) + if (debitOrder in partnerOrders && debitOrder !in user.permissions) { + logger.warn("Unauthorized debit order: ${debitOrder.description()}") } - if (user != null) { - // Check user is authorized for direct debit orders - if (instantDebitOrder != null && instantDebitOrder in partnerOrders && instantDebitOrder !in user.permissions) { - logger.warn("Unauthorized instant debit order: ${instantDebitOrder.description()}") - } - if (debitOrder in partnerOrders && debitOrder !in user.permissions) { - logger.warn("Unauthorized debit order: ${debitOrder.description()}") - } - - // Check user is authorized for required orders - val unauthorizedOrders = requireOrders subtract user.permissions subtract unsupportedOrder - if (unauthorizedOrders.isNotEmpty()) { - logger.warn("Unauthorized orders: {}", unauthorizedOrders.map(EbicsOrder::description).joinToString(" ")) - } - - logger.info("Subscriber status: {}", user.status.description) + // Check user is authorized for required orders + val unauthorizedOrders = requireOrders subtract user.permissions subtract unsupportedOrder + if (unauthorizedOrders.isNotEmpty()) { + logger.warn("Unauthorized orders: {}", unauthorizedOrders.map(EbicsOrder::description).joinToString(" ")) } + + logger.info("Subscriber status: {}", user.status.description) } } - } catch (e: Exception) { - // This can happen if HKD is not supported - logger.warn("HKD failed: ${e.fmt()}") - logger.trace("", e) } println("setup ready")