libeufin

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

commit 664956c4f633956fc01e2c20ec30328e414d4556
parent e512ebce96f185b2983095c934093b4ab25530b7
Author: Antoine A <>
Date:   Thu, 17 Sep 2026 18:13:07 +0200

common: sync taler-rust

Diffstat:
MCargo.lock | 62+++++++++++++++++++++++++++++++-------------------------------
Mlibeufin-bank/src/config.rs | 6+++---
Mlibeufin-ebics/src/keys.rs | 18++++++++++--------
Mlibeufin-ebisync/src/config.rs | 26+++++++++++++-------------
Mlibeufin-nexus/src/config.rs | 36++++++++++++++++++------------------
5 files changed, 75 insertions(+), 73 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -402,9 +402,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -476,7 +476,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -739,7 +739,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -750,7 +750,7 @@ checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" dependencies = [ "darling_core", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -901,7 +901,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -1141,7 +1141,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -1367,7 +1367,7 @@ dependencies = [ [[package]] name = "http-client" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#b2cc6de2b7551860d1c864df316c408df3708a14" +source = "git+git://git.taler.net/taler-rust.git/#14d99474e131e33f86cbe1ead7ce68bd9f33c07a" dependencies = [ "compact_str", "futures-util", @@ -2110,7 +2110,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -2427,7 +2427,7 @@ checksum = "01e34894696ff94f64a20c2c373a6440903e9c2789a303d68ec6e6f953f890e4" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -2809,9 +2809,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags 2.13.2", "errno", @@ -2988,7 +2988,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3046,7 +3046,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3471,9 +3471,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" dependencies = [ "proc-macro2", "quote", @@ -3508,7 +3508,7 @@ checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3535,7 +3535,7 @@ dependencies = [ [[package]] name = "taler-api" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#b2cc6de2b7551860d1c864df316c408df3708a14" +source = "git+git://git.taler.net/taler-rust.git/#14d99474e131e33f86cbe1ead7ce68bd9f33c07a" dependencies = [ "aws-lc-rs", "axum", @@ -3564,12 +3564,12 @@ dependencies = [ [[package]] name = "taler-build" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#b2cc6de2b7551860d1c864df316c408df3708a14" +source = "git+git://git.taler.net/taler-rust.git/#14d99474e131e33f86cbe1ead7ce68bd9f33c07a" [[package]] name = "taler-common" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#b2cc6de2b7551860d1c864df316c408df3708a14" +source = "git+git://git.taler.net/taler-rust.git/#14d99474e131e33f86cbe1ead7ce68bd9f33c07a" dependencies = [ "anyhow", "aws-lc-rs", @@ -3599,17 +3599,17 @@ dependencies = [ [[package]] name = "taler-macros" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#b2cc6de2b7551860d1c864df316c408df3708a14" +source = "git+git://git.taler.net/taler-rust.git/#14d99474e131e33f86cbe1ead7ce68bd9f33c07a" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] name = "taler-test-utils" version = "1.5.0" -source = "git+git://git.taler.net/taler-rust.git/#b2cc6de2b7551860d1c864df316c408df3708a14" +source = "git+git://git.taler.net/taler-rust.git/#14d99474e131e33f86cbe1ead7ce68bd9f33c07a" dependencies = [ "aws-lc-rs", "axum", @@ -3692,7 +3692,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -3774,7 +3774,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] @@ -4019,9 +4019,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" [[package]] name = "unicode-normalization" @@ -4221,7 +4221,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "wasm-bindgen-shared", ] @@ -4614,7 +4614,7 @@ checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "synstructure 0.14.0", ] @@ -4655,7 +4655,7 @@ checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", "synstructure 0.14.0", ] @@ -4695,7 +4695,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.6", ] [[package]] diff --git a/libeufin-bank/src/config.rs b/libeufin-bank/src/config.rs @@ -28,7 +28,7 @@ use taler_api::{ error::{ApiResult, failure}, }; use taler_common::{ - config::{Config, ValueErr}, + config::{CfgErr, Config}, error_code::ErrorCode, map_config, types::amount::{Amount, Currency}, @@ -95,7 +95,7 @@ impl BankCfg { fn currency_specification( cfg: &Config, currency: &Currency, - ) -> Result<CurrencySpecification, ValueErr> { + ) -> Result<CurrencySpecification, CfgErr> { for s in cfg.sections() { if s.name.starts_with("currency-") && s.currency("code").require()? == *currency @@ -122,7 +122,7 @@ impl BankCfg { }) } - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("libeufin-bank"); let base_url = s.base_url("base_url").require()?; let hostname = base_url.host_str().unwrap_or_default().into(); diff --git a/libeufin-ebics/src/keys.rs b/libeufin-ebics/src/keys.rs @@ -19,7 +19,7 @@ use std::{borrow::Cow, io::ErrorKind, path::Path}; -use anyhow::{anyhow, bail}; +use anyhow::anyhow; use aws_lc_rs::{ encoding::{AsDer, Pkcs8V1Der, PublicKeyX509Der}, rsa::{KeyPair, KeySize, PublicKey}, @@ -27,6 +27,8 @@ use aws_lc_rs::{ }; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use taler_common::{ + config::CfgErr, + config_bail, encoding::base32::{self}, json_file, }; @@ -207,26 +209,26 @@ pub fn load_client_keys(path: &Path) -> anyhow::Result<Option<ClientKeys>> { pub fn expect_full_keys( cfg: &EbicsKeysCfg, setup_cmd: &str, -) -> anyhow::Result<(ClientKeys, BankKeys)> { - let client_keys = load_client_keys(cfg.client.as_ref())?; +) -> Result<(ClientKeys, BankKeys), CfgErr> { + let client_keys = load_client_keys(cfg.client.as_ref()).map_err(CfgErr::custom)?; let Some(client_keys) = client_keys else { - bail!( + config_bail!( "Missing client private keys file at '{}', run '{setup_cmd}' first", cfg.client ) }; if !client_keys.submitted_ini || !client_keys.submitted_hia { - bail!("Unsubmitted client private keys, run '{setup_cmd}' first") + config_bail!("Unsubmitted client private keys, run '{setup_cmd}' first") } - let bank_keys = load_bank_keys(cfg.bank.as_ref())?; + let bank_keys = load_bank_keys(cfg.bank.as_ref()).map_err(CfgErr::custom)?; let Some(bank_keys) = bank_keys else { - bail!( + config_bail!( "Missing bank public keys file at '{}', run '{setup_cmd}' first", cfg.bank ) }; if !bank_keys.accepted { - bail!("Unaccepted bank public keys, run '{setup_cmd}' until accepting the bank keys") + config_bail!("Unaccepted bank public keys, run '{setup_cmd}' until accepting the bank keys") } Ok((client_keys, bank_keys)) } diff --git a/libeufin-ebisync/src/config.rs b/libeufin-ebisync/src/config.rs @@ -31,14 +31,14 @@ use taler_api::{ config::{AuthCfg, DbCfg}, }; use taler_common::{ - config::{Config, Section, ValueErr, parser::ConfigSource}, + config::{CfgErr, Config, Section, parser::ConfigSource}, map_config, }; pub const CONFIG_SOURCE: ConfigSource = ConfigSource::new("libeufin-ebisync", "ebisync", "libeufin-ebisync"); -pub fn parse_db_cfg(cfg: &Config) -> Result<DbCfg, ValueErr> { +pub fn parse_db_cfg(cfg: &Config) -> Result<DbCfg, CfgErr> { DbCfg::parse(cfg.section("ebisyncdb-postgres")) } @@ -48,7 +48,7 @@ pub struct EbisyncSetupCfg { } impl EbisyncSetupCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("ebisync-setup"); Ok(Self { enc: s.hex("bank_encryption_pub_key_hash").opt()?, @@ -80,7 +80,7 @@ pub struct EbisyncFetchCfg { } impl EbisyncFetchCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("ebisync-fetch"); Ok(Self { frequency: s.duration("frequency").require()?, @@ -101,7 +101,7 @@ pub struct EbisyncSubmitCfg { } impl EbisyncSubmitCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("ebisync-submit"); Ok(Self { source: map_config!(s, "ebics file source", "source", @@ -119,7 +119,7 @@ pub struct EbisyncServeCfg { } impl EbisyncServeCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("ebisync-httpd"); Ok(Self { serve: Serve::parse(&s)?, @@ -138,7 +138,7 @@ pub struct EbisyncHostCfg { } impl EbisyncHostCfg { - pub fn parse(s: &Section) -> Result<Self, ValueErr> { + pub fn parse(s: &Section) -> Result<Self, CfgErr> { Ok(Self { base_url: s.url("host_base_url").require()?, unix_path: s.path("UNIXPATH").opt()?, @@ -172,7 +172,7 @@ pub struct EbisyncCfg<'a> { } impl<'a> EbisyncCfg<'a> { - pub fn parse(cfg: &'a Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &'a Config) -> Result<Self, CfgErr> { let s = cfg.section("ebisync"); Ok(Self { host: EbisyncHostCfg::parse(&s)?, @@ -187,7 +187,7 @@ impl<'a> EbisyncCfg<'a> { }) } - pub fn fetch(&self) -> Result<&EbisyncFetchCfg, ValueErr> { + pub fn fetch(&self) -> Result<&EbisyncFetchCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(fetch) = self.fetch.get() { return Ok(fetch); @@ -197,7 +197,7 @@ impl<'a> EbisyncCfg<'a> { Ok(self.fetch.get().unwrap()) } - pub fn submit(&self) -> Result<&EbisyncSubmitCfg, ValueErr> { + pub fn submit(&self) -> Result<&EbisyncSubmitCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(submit) = self.submit.get() { return Ok(submit); @@ -207,7 +207,7 @@ impl<'a> EbisyncCfg<'a> { Ok(self.submit.get().unwrap()) } - pub fn serve(&self) -> Result<&EbisyncServeCfg, ValueErr> { + pub fn serve(&self) -> Result<&EbisyncServeCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(serve) = self.serve.get() { return Ok(serve); @@ -217,7 +217,7 @@ impl<'a> EbisyncCfg<'a> { Ok(self.serve.get().unwrap()) } - pub fn ebics_setup(&'a self) -> Result<EbicsSetupCfg<'a>, ValueErr> { + pub fn ebics_setup(&'a self) -> Result<EbicsSetupCfg<'a>, CfgErr> { let setup = { if let Some(setup) = self.setup.get() { setup @@ -238,7 +238,7 @@ impl<'a> EbisyncCfg<'a> { }) } - pub fn expect_full_keys(&self) -> anyhow::Result<(ClientKeys, BankKeys)> { + pub fn expect_full_keys(&self) -> Result<(ClientKeys, BankKeys), CfgErr> { libeufin_ebics::keys::expect_full_keys( &EbicsKeysCfg { bank: &self.bank, diff --git a/libeufin-nexus/src/config.rs b/libeufin-nexus/src/config.rs @@ -35,7 +35,7 @@ use taler_api::{ config::{ApiCfg, DbCfg}, }; use taler_common::{ - config::{Config, ValueErr}, + config::{CfgErr, Config}, types::{ amount::{Amount, Currency}, iban::IBAN, @@ -45,7 +45,7 @@ use taler_common::{ }; use taler_macros::EnumMeta; -pub fn parse_db_cfg(cfg: &Config) -> Result<DbCfg, ValueErr> { +pub fn parse_db_cfg(cfg: &Config) -> Result<DbCfg, CfgErr> { DbCfg::parse(cfg.section("libeufin-nexusdb-postgres")) } @@ -55,7 +55,7 @@ pub struct NexusKeysCfg { } impl NexusKeysCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("nexus-ebics"); Ok(Self { bank: s.path("bank_public_keys_file").require()?, @@ -81,7 +81,7 @@ pub struct NexusHostCfg { } impl NexusHostCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("nexus-ebics"); Ok(Self { base_url: s.url("host_base_url").require()?, @@ -147,7 +147,7 @@ pub struct NexusFetchCfg { } impl NexusFetchCfg { - pub fn parse(cfg: &Config, currency: &Currency) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config, currency: &Currency) -> Result<Self, CfgErr> { let s = cfg.section("nexus-fetch"); Ok(Self { @@ -176,7 +176,7 @@ pub struct NexusSubmitCfg { } impl NexusSubmitCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("nexus-submit"); Ok(Self { @@ -195,7 +195,7 @@ pub struct NexusEbicsConfig { } impl NexusEbicsConfig { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("nexus-ebics"); Ok(Self { account: FullIbanPayto::new( @@ -217,7 +217,7 @@ pub struct NexusSetupConfig { } impl NexusSetupConfig { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("nexus-setup"); Ok(Self { enc: s.hex("bank_encryption_pub_key_hash").opt()?, @@ -244,7 +244,7 @@ pub struct NexusCfg { } impl<'a> NexusCfg { - pub fn parse(cfg: &Config) -> Result<Self, ValueErr> { + pub fn parse(cfg: &Config) -> Result<Self, CfgErr> { let s = cfg.section("nexus-ebics"); Ok(Self { currency: s.currency("currency").require()?, @@ -264,7 +264,7 @@ impl<'a> NexusCfg { }) } - pub fn keys(&self) -> Result<&NexusKeysCfg, ValueErr> { + pub fn keys(&self) -> Result<&NexusKeysCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(keys) = self.keys.get() { return Ok(keys); @@ -274,7 +274,7 @@ impl<'a> NexusCfg { Ok(self.keys.get().unwrap()) } - pub fn host(&self) -> Result<&NexusHostCfg, ValueErr> { + pub fn host(&self) -> Result<&NexusHostCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(host) = self.host.get() { return Ok(host); @@ -284,7 +284,7 @@ impl<'a> NexusCfg { Ok(self.host.get().unwrap()) } - pub fn fetch(&self) -> Result<&NexusFetchCfg, ValueErr> { + pub fn fetch(&self) -> Result<&NexusFetchCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(fetch) = self.fetch.get() { return Ok(fetch); @@ -294,7 +294,7 @@ impl<'a> NexusCfg { Ok(self.fetch.get().unwrap()) } - pub fn submit(&self) -> Result<&NexusSubmitCfg, ValueErr> { + pub fn submit(&self) -> Result<&NexusSubmitCfg, CfgErr> { // TODO use get_or_try_init when stable if let Some(submit) = self.submit.get() { return Ok(submit); @@ -304,7 +304,7 @@ impl<'a> NexusCfg { Ok(self.submit.get().unwrap()) } - pub fn ebics(&self) -> Result<&NexusEbicsConfig, ValueErr> { + pub fn ebics(&self) -> Result<&NexusEbicsConfig, CfgErr> { // TODO use get_or_try_init when stable if let Some(ebics) = self.ebics.get() { return Ok(ebics); @@ -314,7 +314,7 @@ impl<'a> NexusCfg { Ok(self.ebics.get().unwrap()) } - pub fn setup(&self) -> Result<&NexusSetupConfig, ValueErr> { + pub fn setup(&self) -> Result<&NexusSetupConfig, CfgErr> { // TODO use get_or_try_init when stable if let Some(setup) = self.setup.get() { return Ok(setup); @@ -324,7 +324,7 @@ impl<'a> NexusCfg { Ok(self.setup.get().unwrap()) } - pub fn ingest(&self) -> Result<NexusIngestCfg, ValueErr> { + pub fn ingest(&self) -> Result<NexusIngestCfg, CfgErr> { let fetch = self.fetch()?; Ok(NexusIngestCfg { account_type: self.account_type, @@ -337,7 +337,7 @@ impl<'a> NexusCfg { }) } - pub fn ebics_setup(&'a self) -> Result<EbicsSetupCfg<'a>, ValueErr> { + pub fn ebics_setup(&'a self) -> Result<EbicsSetupCfg<'a>, CfgErr> { let setup = self.setup()?; Ok(EbicsSetupCfg { keys: self.keys()?.ebics(), @@ -347,7 +347,7 @@ impl<'a> NexusCfg { }) } - pub fn expect_full_keys(&self) -> anyhow::Result<(ClientKeys, BankKeys)> { + pub fn expect_full_keys(&self) -> Result<(ClientKeys, BankKeys), CfgErr> { libeufin_ebics::keys::expect_full_keys(&self.keys()?.ebics(), "libeufin-nexus ebics-setup") } }