gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-rust] branch master updated (3d298ba -> aeb633a)


From: Admin
Subject: [taler-rust] branch master updated (3d298ba -> aeb633a)
Date: Thu, 13 Feb 2025 17:00:41 +0100

This is an automated email from the git hooks/post-receive script.

antoine pushed a change to branch master
in repository taler-rust.

    from 3d298ba  common: sql migration
     new 7a64f76  common: add transfer payto
     new aeb633a  magnet-bank: setup improvements and fixes

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 Makefile                                    |   4 +
 common/taler-common/src/config.rs           |   1 -
 common/taler-common/src/lib.rs              |   2 +-
 common/taler-common/src/types/payto.rs      | 195 +++++++++++++++++++++++++++-
 taler-magnet-bank/src/adapter.rs            |   8 +-
 taler-magnet-bank/src/config.rs             |  22 +++-
 taler-magnet-bank/src/db.rs                 |  14 +-
 taler-magnet-bank/src/dev.rs                |  35 +++--
 taler-magnet-bank/src/lib.rs                |   9 +-
 taler-magnet-bank/src/magnet.rs             |   4 +-
 taler-magnet-bank/src/magnet/error.rs       |  15 ++-
 taler-magnet-bank/src/main.rs               |  29 +----
 taler-magnet-bank/src/{keys.rs => setup.rs} |  40 +++++-
 taler-magnet-bank/src/worker.rs             |   4 +-
 14 files changed, 309 insertions(+), 73 deletions(-)
 rename taler-magnet-bank/src/{keys.rs => setup.rs} (80%)

diff --git a/Makefile b/Makefile
index 5ca4138..9bf6101 100644
--- a/Makefile
+++ b/Makefile
@@ -37,6 +37,10 @@ check:
 doc:
        cargo doc
 
+.PHONY: deb
+deb:
+       cargo deb -v -p taler-magnet-bank --deb-version=$(shell 
./contrib/ci/version.sh)
+
 .PHONY: ci
 ci:
        contrib/ci/run-all-jobs.sh 
\ No newline at end of file
diff --git a/common/taler-common/src/config.rs 
b/common/taler-common/src/config.rs
index b3346eb..b0fe3f6 100644
--- a/common/taler-common/src/config.rs
+++ b/common/taler-common/src/config.rs
@@ -400,7 +400,6 @@ pub mod parser {
                 let bin_path = path_dir.join(self.exec_name);
                 if bin_path.exists() {
                     if let Some(parent) = path_dir.parent() {
-                        dbg!(parent);
                         return parent.canonicalize().map_err(|e| 
(parent.to_path_buf(), e));
                     }
                 }
diff --git a/common/taler-common/src/lib.rs b/common/taler-common/src/lib.rs
index ae4f426..b0f302a 100644
--- a/common/taler-common/src/lib.rs
+++ b/common/taler-common/src/lib.rs
@@ -27,11 +27,11 @@ pub mod api_revenue;
 pub mod api_wire;
 pub mod cli;
 pub mod config;
+pub mod db;
 pub mod error_code;
 pub mod json_file;
 mod log;
 pub mod types;
-pub mod db;
 
 #[derive(clap::Parser, Debug, Clone)]
 pub struct CommonArgs {
diff --git a/common/taler-common/src/types/payto.rs 
b/common/taler-common/src/types/payto.rs
index 7d6c744..20c7e85 100644
--- a/common/taler-common/src/types/payto.rs
+++ b/common/taler-common/src/types/payto.rs
@@ -38,6 +38,16 @@ pub trait PaytoImpl: Sized {
     fn as_full_payto(&self, name: &str) -> PaytoURI {
         self.as_payto().with_query([("receiver-name", name)])
     }
+    fn as_transfer_payto(
+        &self,
+        name: &str,
+        amount: Option<&Amount>,
+        subject: Option<&str>,
+    ) -> PaytoURI {
+        self.as_full_payto(name)
+            .with_query([("amount", amount)])
+            .with_query([("message", subject)])
+    }
     fn parse(uri: &PaytoURI) -> Result<Self, PaytoErr>;
 }
 
@@ -192,20 +202,22 @@ struct FullQuery {
 }
 
 /// Transfer payto query
-// TODO TransferPayto
 #[derive(Debug, Clone, Deserialize)]
 struct TransferQuery {
-    #[serde(flatten)]
-    full: FullQuery,
+    #[serde(rename = "receiver-name")]
+    receiver_name: String,
     amount: Option<Amount>,
-    #[serde(rename = "message")]
-    subject: Option<String>,
+    message: Option<String>,
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, DeserializeFromStr, SerializeDisplay)]
 pub struct Payto<P>(P);
 
 impl<P: PaytoImpl> Payto<P> {
+    pub fn new(inner: P) -> Self {
+        Self(inner)
+    }
+
     pub fn as_payto(&self) -> PaytoURI {
         self.0.as_payto()
     }
@@ -266,6 +278,12 @@ impl<P: PaytoImpl> FullPayto<P> {
     }
 }
 
+impl<P: PaytoImpl> Into<Payto<P>> for FullPayto<P> {
+    fn into(self) -> Payto<P> {
+        Payto(self.inner)
+    }
+}
+
 impl<P: PaytoImpl> TryFrom<&PaytoURI> for FullPayto<P> {
     type Error = PaytoErr;
 
@@ -301,3 +319,170 @@ impl<P: PaytoImpl> Deref for FullPayto<P> {
         &self.inner
     }
 }
+
+#[derive(Debug, Clone, PartialEq, Eq, DeserializeFromStr, SerializeDisplay)]
+pub struct TransferPayto<P> {
+    inner: P,
+    pub name: String,
+    pub amount: Option<Amount>,
+    pub subject: Option<String>,
+}
+
+impl<P: PaytoImpl> TransferPayto<P> {
+    pub fn new(inner: P, name: String, amount: Option<Amount>, subject: 
Option<String>) -> Self {
+        Self {
+            inner,
+            name,
+            amount,
+            subject,
+        }
+    }
+
+    pub fn as_payto(&self) -> PaytoURI {
+        self.inner
+            .as_transfer_payto(&self.name, self.amount.as_ref(), 
self.subject.as_deref())
+    }
+
+    pub fn into_inner(self) -> P {
+        self.inner
+    }
+}
+
+impl<P: PaytoImpl> Into<Payto<P>> for TransferPayto<P> {
+    fn into(self) -> Payto<P> {
+        Payto(self.inner)
+    }
+}
+
+impl<P: PaytoImpl> Into<FullPayto<P>> for TransferPayto<P> {
+    fn into(self) -> FullPayto<P> {
+        FullPayto {
+            inner: self.inner,
+            name: self.name,
+        }
+    }
+}
+
+impl<P: PaytoImpl> TryFrom<&PaytoURI> for TransferPayto<P> {
+    type Error = PaytoErr;
+
+    fn try_from(value: &PaytoURI) -> Result<Self, Self::Error> {
+        let payto = P::parse(value)?;
+        let query: TransferQuery = value.query()?;
+        Ok(Self {
+            inner: payto,
+            name: query.receiver_name,
+            amount: query.amount,
+            subject: query.message,
+        })
+    }
+}
+
+impl<P: PaytoImpl> std::fmt::Display for TransferPayto<P> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        std::fmt::Display::fmt(&self.as_payto(), f)
+    }
+}
+
+impl<P: PaytoImpl> FromStr for TransferPayto<P> {
+    type Err = PaytoErr;
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        let raw: PaytoURI = s.parse()?;
+        Self::try_from(&raw)
+    }
+}
+
+impl<P: PaytoImpl> Deref for TransferPayto<P> {
+    type Target = P;
+
+    fn deref(&self) -> &Self::Target {
+        &self.inner
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use std::str::FromStr as _;
+
+    use crate::types::{
+        amount::amount,
+        iban::IBAN,
+        payto::{FullPayto, Payto, TransferPayto},
+    };
+
+    #[test]
+    pub fn parse() {
+        let iban = IBAN::from_str("FR1420041010050500013M02606").unwrap();
+
+        // Simple payto
+        let simple_payto = Payto::new(iban.clone());
+        assert_eq!(
+            simple_payto,
+            Payto::from_str(&format!("payto://iban/{iban}")).unwrap()
+        );
+        assert_eq!(
+            simple_payto,
+            Payto::try_from(&simple_payto.as_payto()).unwrap()
+        );
+        assert_eq!(
+            simple_payto,
+            Payto::from_str(&simple_payto.as_payto().to_string()).unwrap()
+        );
+
+        // Full payto
+        let full_payto = FullPayto::new(iban.clone(), "John Smith".to_owned());
+        assert_eq!(
+            full_payto,
+            
FullPayto::from_str(&format!("payto://iban/{iban}?receiver-name=John+Smith")).unwrap()
+        );
+        assert_eq!(
+            full_payto,
+            FullPayto::try_from(&full_payto.as_payto()).unwrap()
+        );
+        assert_eq!(
+            full_payto,
+            FullPayto::from_str(&full_payto.as_payto().to_string()).unwrap()
+        );
+        assert_eq!(simple_payto, full_payto.clone().into());
+
+        // Transfer simple payto
+        let transfer_payto = TransferPayto::new(iban.clone(), "John 
Smith".to_owned(), None, None);
+        assert_eq!(
+            transfer_payto,
+            
TransferPayto::from_str(&format!("payto://iban/{iban}?receiver-name=John+Smith"))
+                .unwrap()
+        );
+        assert_eq!(
+            transfer_payto,
+            TransferPayto::try_from(&transfer_payto.as_payto()).unwrap()
+        );
+        assert_eq!(
+            transfer_payto,
+            
TransferPayto::from_str(&transfer_payto.as_payto().to_string()).unwrap()
+        );
+        assert_eq!(full_payto, transfer_payto.clone().into());
+
+        // Transfer full payto
+        let transfer_payto = TransferPayto::new(
+            iban.clone(),
+            "John Smith".to_owned(),
+            Some(amount("EUR:12")),
+            Some("Wire transfer subject".to_owned()),
+        );
+        assert_eq!(
+            transfer_payto,
+            
TransferPayto::from_str(&format!("payto://iban/{iban}?receiver-name=John+Smith&amount=EUR:12&message=Wire+transfer+subject"))
+                .unwrap()
+        );
+        assert_eq!(
+            transfer_payto,
+            TransferPayto::try_from(&transfer_payto.as_payto()).unwrap()
+        );
+        assert_eq!(
+            transfer_payto,
+            
TransferPayto::from_str(&transfer_payto.as_payto().to_string()).unwrap()
+        );
+        assert_eq!(full_payto, transfer_payto.clone().into());
+    }
+}
diff --git a/taler-magnet-bank/src/adapter.rs b/taler-magnet-bank/src/adapter.rs
index a6f1643..2de3628 100644
--- a/taler-magnet-bank/src/adapter.rs
+++ b/taler-magnet-bank/src/adapter.rs
@@ -36,7 +36,7 @@ use tokio::sync::watch::Sender;
 use crate::{
     constant::CURRENCY,
     db::{self, AddIncomingResult, TxInAdmin},
-    MagnetPayto,
+    FullHuPayto,
 };
 
 pub struct MagnetApi {
@@ -85,7 +85,7 @@ impl TalerApi for MagnetApi {
 
 impl WireGateway for MagnetApi {
     async fn transfer(&self, req: TransferRequest) -> 
ApiResult<TransferResponse> {
-        let creditor = MagnetPayto::try_from(&req.credit_account)?;
+        let creditor = FullHuPayto::try_from(&req.credit_account)?;
         let result = db::make_transfer(&self.pool, &req, &creditor, 
&Timestamp::now()).await?;
         match result {
             db::TransferResult::Success { id, timestamp } => 
Ok(TransferResponse {
@@ -139,7 +139,7 @@ impl WireGateway for MagnetApi {
         &self,
         req: AddIncomingRequest,
     ) -> ApiResult<AddIncomingResponse> {
-        let debtor = MagnetPayto::try_from(&req.debit_account)?;
+        let debtor = FullHuPayto::try_from(&req.debit_account)?;
         let res = db::register_tx_in_admin(
             &self.pool,
             &TxInAdmin {
@@ -166,7 +166,7 @@ impl WireGateway for MagnetApi {
     }
 
     async fn add_incoming_kyc(&self, req: AddKycauthRequest) -> 
ApiResult<AddKycauthResponse> {
-        let debtor = MagnetPayto::try_from(&req.debit_account)?;
+        let debtor = FullHuPayto::try_from(&req.debit_account)?;
         let res = db::register_tx_in_admin(
             &self.pool,
             &TxInAdmin {
diff --git a/taler-magnet-bank/src/config.rs b/taler-magnet-bank/src/config.rs
index 910b9b0..c5445f4 100644
--- a/taler-magnet-bank/src/config.rs
+++ b/taler-magnet-bank/src/config.rs
@@ -20,9 +20,12 @@ use base64::{prelude::BASE64_STANDARD, Engine};
 use reqwest::Url;
 use sqlx::postgres::PgConnectOptions;
 use taler_api::{auth::AuthMethod, Serve};
-use taler_common::config::{map_config, Config, Section, ValueErr};
+use taler_common::{
+    config::{map_config, Config, Section, ValueErr},
+    types::payto::PaytoURI,
+};
 
-use crate::magnet::Token;
+use crate::{magnet::Token, FullHuPayto, HuIban};
 
 pub struct DbCfg {
     pub cfg: PgConnectOptions,
@@ -39,6 +42,14 @@ impl DbCfg {
     }
 }
 
+pub fn parse_account_payto(cfg: &Config) -> Result<FullHuPayto, ValueErr> {
+    let sect = cfg.section("magnet-bank");
+    let iban: HuIban = sect.parse("iban", "IBAN").require()?;
+    let name = sect.str("NAME").require()?;
+
+    Ok(FullHuPayto::new(iban, name))
+}
+
 pub struct ApiCfg {
     pub auth: AuthMethod,
 }
@@ -70,6 +81,7 @@ impl ApiCfg {
 }
 
 pub struct ServeCfg {
+    pub payto: PaytoURI,
     pub serve: Serve,
     pub wire_gateway: Option<ApiCfg>,
     pub revenue: Option<ApiCfg>,
@@ -77,6 +89,8 @@ pub struct ServeCfg {
 
 impl ServeCfg {
     pub fn parse(cfg: &Config) -> Result<Self, ValueErr> {
+        let payto = parse_account_payto(cfg)?;
+
         let sect = cfg.section("magnet-bank-httpd");
 
         let serve = map_config!(sect, "serve", "SERVE",
@@ -97,6 +111,7 @@ impl ServeCfg {
         let revenue = 
ApiCfg::parse(cfg.section("magnet-bank-httpd-revenue-api"))?;
 
         Ok(Self {
+            payto: payto.as_payto(),
             serve,
             wire_gateway,
             revenue,
@@ -105,6 +120,7 @@ impl ServeCfg {
 }
 
 pub struct WorkerCfg {
+    pub payto: FullHuPayto,
     pub api_url: Url,
     pub consumer: Token,
     pub keys_path: String,
@@ -112,8 +128,10 @@ pub struct WorkerCfg {
 
 impl WorkerCfg {
     pub fn parse(cfg: &Config) -> Result<Self, ValueErr> {
+        let payto = parse_account_payto(cfg)?;
         let sect = cfg.section("magnet-bank-worker");
         Ok(Self {
+            payto,
             api_url: sect.parse("URL", "API_URL").require()?,
             consumer: Token {
                 key: sect.str("CONSUMER_KEY").require()?,
diff --git a/taler-magnet-bank/src/db.rs b/taler-magnet-bank/src/db.rs
index 221d233..05f6514 100644
--- a/taler-magnet-bank/src/db.rs
+++ b/taler-magnet-bank/src/db.rs
@@ -32,7 +32,7 @@ use taler_common::{
 };
 use tokio::sync::watch::{Receiver, Sender};
 
-use crate::{constant::CURRENCY, MagnetPayto};
+use crate::{constant::CURRENCY, FullHuPayto};
 
 pub async fn notification_listener(
     pool: PgPool,
@@ -62,7 +62,7 @@ pub struct TxIn {
     pub code: u64,
     pub amount: Amount,
     pub subject: String,
-    pub debtor: MagnetPayto,
+    pub debtor: FullHuPayto,
     pub timestamp: Timestamp,
 }
 
@@ -84,7 +84,7 @@ pub struct TxOut {
     pub code: u64,
     pub amount: Amount,
     pub subject: String,
-    pub creditor: MagnetPayto,
+    pub creditor: FullHuPayto,
     pub timestamp: Timestamp,
 }
 
@@ -105,7 +105,7 @@ impl Display for TxOut {
 pub struct TxInAdmin {
     pub amount: Amount,
     pub subject: String,
-    pub debtor: MagnetPayto,
+    pub debtor: FullHuPayto,
     pub timestamp: Timestamp,
     pub metadata: IncomingSubject,
 }
@@ -132,7 +132,7 @@ pub struct Initiated {
     pub id: u64,
     pub amount: Amount,
     pub subject: String,
-    pub creditor: MagnetPayto,
+    pub creditor: FullHuPayto,
 }
 
 impl Display for Initiated {
@@ -248,7 +248,7 @@ pub enum TransferResult {
 pub async fn make_transfer<'a>(
     db: impl PgExecutor<'a>,
     req: &TransferRequest,
-    creditor: &MagnetPayto,
+    creditor: &FullHuPayto,
     timestamp: &Timestamp,
 ) -> sqlx::Result<TransferResult> {
     let subject = format!("{} {}", req.wtid, req.exchange_base_url);
@@ -548,7 +548,7 @@ pub async fn pending_batch<'a>(
             id: r.try_get_u64(0)?,
             amount: r.try_get_amount_i(1, CURRENCY)?,
             subject: r.try_get(3)?,
-            creditor: MagnetPayto::new(r.try_get_parse(4)?, r.try_get(5)?),
+            creditor: FullHuPayto::new(r.try_get_parse(4)?, r.try_get(5)?),
         })
     })
     .fetch_all(db)
diff --git a/taler-magnet-bank/src/dev.rs b/taler-magnet-bank/src/dev.rs
index 05a27ae..b501831 100644
--- a/taler-magnet-bank/src/dev.rs
+++ b/taler-magnet-bank/src/dev.rs
@@ -14,20 +14,21 @@
   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */
 
+use anyhow::anyhow;
 use clap::ValueEnum;
 use jiff::Zoned;
 use taler_common::{
     config::Config,
-    types::{amount::Amount, iban::IBAN, payto::PaytoImpl},
+    types::{amount::Amount, payto::PaytoImpl},
 };
 use tracing::info;
 
 use crate::{
     config::WorkerCfg,
-    keys,
     magnet::{AuthClient, Direction},
+    setup,
     worker::{extract_tx_info, Tx},
-    HuPayto, MagnetPayto,
+    HuPayto, TransferHuPayto,
 };
 
 #[derive(Debug, Clone, PartialEq, Eq, ValueEnum)]
@@ -52,17 +53,17 @@ pub enum DevCmd {
         #[clap(long)]
         debtor: HuPayto,
         #[clap(long)]
-        creditor: MagnetPayto,
+        creditor: TransferHuPayto,
         #[clap(long)]
-        amount: Amount,
+        amount: Option<Amount>,
         #[clap(long)]
-        subject: String,
+        subject: Option<String>,
     },
 }
 
 pub async fn dev(cfg: Config, cmd: DevCmd) -> anyhow::Result<()> {
     let cfg = WorkerCfg::parse(&cfg)?;
-    let keys = keys::load(&cfg)?;
+    let keys = setup::load(&cfg)?;
     let client = reqwest::Client::new();
     let client = AuthClient::new(&client, &cfg.api_url, 
&cfg.consumer).upgrade(&keys.access_token);
     match cmd {
@@ -70,8 +71,7 @@ pub async fn dev(cfg: Config, cmd: DevCmd) -> 
anyhow::Result<()> {
             let res = client.list_accounts().await?;
             for partner in res.partners {
                 for account in partner.bank_accounts {
-                    let iban: IBAN = account.iban.parse()?;
-                    let payto = iban.as_full_payto(&partner.partner.name);
+                    let payto = 
account.iban.as_full_payto(&partner.partner.name);
                     info!("{} {} {}", account.code, account.currency.symbol, 
payto);
                 }
             }
@@ -107,13 +107,24 @@ pub async fn dev(cfg: Config, cmd: DevCmd) -> 
anyhow::Result<()> {
             amount,
             subject,
         } => {
-            let debtor = client.account(debtor.bban()).await?;
+            let account = client.account(debtor.bban()).await?;
+            let amount = creditor
+                .amount
+                .clone()
+                .or(amount)
+                .ok_or_else(|| anyhow!("Missing amount"))?;
+            let subject = creditor
+                .subject
+                .clone()
+                .or(subject)
+                .ok_or_else(|| anyhow!("Missing subject"))?;
+
             let now = Zoned::now();
             let date = now.date();
 
             let init = client
                 .init_tx(
-                    debtor.code,
+                    account.code,
                     amount.val as f64,
                     &subject,
                     &date,
@@ -124,7 +135,7 @@ pub async fn dev(cfg: Config, cmd: DevCmd) -> 
anyhow::Result<()> {
             client
                 .sign_tx(
                     &keys.signing_key,
-                    &debtor.number,
+                    &account.number,
                     init.code,
                     init.amount,
                     &date,
diff --git a/taler-magnet-bank/src/lib.rs b/taler-magnet-bank/src/lib.rs
index affe8f3..0eb99f8 100644
--- a/taler-magnet-bank/src/lib.rs
+++ b/taler-magnet-bank/src/lib.rs
@@ -18,7 +18,7 @@ use std::{borrow::Cow, str::FromStr};
 
 use taler_common::types::{
     iban::{IbanErrorKind, ParseIbanError, IBAN},
-    payto::{FullPayto, IbanPayto, Payto, PaytoErr, PaytoImpl, PaytoURI},
+    payto::{FullPayto, IbanPayto, Payto, PaytoErr, PaytoImpl, PaytoURI, 
TransferPayto},
 };
 
 pub mod adapter;
@@ -26,8 +26,8 @@ pub mod config;
 pub mod constant;
 pub mod db;
 pub mod dev;
-pub mod keys;
 pub mod magnet;
+pub mod setup;
 pub mod worker;
 pub mod failure_injection {
     pub fn fail_point(_name: &'static str) {
@@ -160,12 +160,13 @@ impl FromStr for HuIban {
 }
 
 /// Parse a magnet payto URI, panic if malformed
-pub fn magnet_payto(url: impl AsRef<str>) -> MagnetPayto {
+pub fn magnet_payto(url: impl AsRef<str>) -> FullHuPayto {
     url.as_ref().parse().expect("invalid magnet payto")
 }
 
-pub type MagnetPayto = FullPayto<HuIban>;
 pub type HuPayto = Payto<HuIban>;
+pub type FullHuPayto = FullPayto<HuIban>;
+pub type TransferHuPayto = TransferPayto<HuIban>;
 
 #[cfg(test)]
 mod test {
diff --git a/taler-magnet-bank/src/magnet.rs b/taler-magnet-bank/src/magnet.rs
index 5c9b5c6..74a3822 100644
--- a/taler-magnet-bank/src/magnet.rs
+++ b/taler-magnet-bank/src/magnet.rs
@@ -24,7 +24,7 @@ use p256::{
 use serde::{Deserialize, Serialize};
 use serde_json::{json, Value};
 use spki::EncodePublicKey;
-use taler_common::types::amount;
+use taler_common::types::{amount, iban::IBAN};
 
 use crate::magnet::{error::MagnetBuilder, oauth::OAuthBuilder};
 
@@ -123,7 +123,7 @@ pub struct Account {
     #[serde(rename = "deviza")]
     pub currency: Currency,
     #[serde(rename = "ibanSzamlaszam")]
-    pub iban: String,
+    pub iban: IBAN,
     #[serde(rename = "kod")]
     pub code: u64,
     #[serde(rename = "szamlaszam")]
diff --git a/taler-magnet-bank/src/magnet/error.rs 
b/taler-magnet-bank/src/magnet/error.rs
index ce400bf..db20204 100644
--- a/taler-magnet-bank/src/magnet/error.rs
+++ b/taler-magnet-bank/src/magnet/error.rs
@@ -21,7 +21,7 @@ use tracing::{error, Level};
 
 #[derive(Deserialize, Debug)]
 struct Header {
-    #[serde(alias = "errorCode")]
+    #[serde(rename = "errorCode")]
     pub error_code: Option<u16>,
 }
 
@@ -31,11 +31,11 @@ struct Empty {}
 #[derive(Deserialize, Error, Debug)]
 #[error("{error_code} {short_message} '{long_message}'")]
 pub struct MagnetError {
-    #[serde(alias = "errorCode")]
+    #[serde(rename = "errorCode")]
     pub error_code: u16,
-    #[serde(alias = "shortMessage")]
+    #[serde(rename = "shortMessage")]
     pub short_message: String,
-    #[serde(alias = "longMessage")]
+    #[serde(rename = "longMessage")]
     pub long_message: String,
 }
 
@@ -129,9 +129,10 @@ fn parse<'de, T: Deserialize<'de>>(str: &'de str) -> 
ApiResult<T> {
 async fn magnet_json<T: DeserializeOwned>(res: reqwest::Result<Response>) -> 
ApiResult<T> {
     let body = error_handling(res).await?;
     let header: Header = parse(&body)?;
-    match header.error_code {
-        Some(_) => Err(ApiError::Magnet(parse(&body)?)),
-        None => parse(&body),
+    if header.error_code.unwrap_or(200) == 200 {
+        parse(&body)
+    } else {
+        Err(ApiError::Magnet(parse(&body)?))
     }
 }
 
diff --git a/taler-magnet-bank/src/main.rs b/taler-magnet-bank/src/main.rs
index f02da23..849af38 100644
--- a/taler-magnet-bank/src/main.rs
+++ b/taler-magnet-bank/src/main.rs
@@ -22,18 +22,15 @@ use taler_common::{
     cli::ConfigCmd,
     config::{parser::ConfigSource, Config},
     db::{dbinit, pool},
-    taler_main,
-    types::payto::{payto, PaytoURI},
-    CommonArgs,
+    taler_main, CommonArgs,
 };
 use taler_magnet_bank::{
     adapter::MagnetApi,
     config::{DbCfg, ServeCfg, WorkerCfg},
     dev::{self, DevCmd},
-    keys,
     magnet::AuthClient,
+    setup,
     worker::Worker,
-    HuPayto,
 };
 
 pub fn long_version() -> &'static str {
@@ -76,8 +73,6 @@ enum Command {
         /// Execute once and return
         #[clap(long, short)]
         transient: bool,
-        // TODO account in config
-        account: PaytoURI,
     },
     /// Run taler-magnet-bank HTTP server
     Serve {
@@ -97,7 +92,7 @@ async fn app(args: Args, cfg: Config) -> anyhow::Result<()> {
     match args.cmd {
         Command::Setup { reset } => {
             let cfg = WorkerCfg::parse(&cfg)?;
-            keys::setup(cfg, reset).await?
+            setup::setup(cfg, reset).await?
         }
         Command::Dbinit { reset } => {
             let cfg = DbCfg::parse(&cfg)?;
@@ -115,13 +110,7 @@ async fn app(args: Args, cfg: Config) -> 
anyhow::Result<()> {
                 let db = DbCfg::parse(&cfg)?;
                 let pool = pool(db.cfg, "magnet_bank").await?;
                 let cfg = ServeCfg::parse(&cfg)?;
-                let api = Arc::new(
-                    MagnetApi::start(
-                        pool,
-                        
payto("payto://iban/HU02162000031000164800000000?receiver-name=name"),
-                    )
-                    .await,
-                );
+                let api = Arc::new(MagnetApi::start(pool, cfg.payto).await);
                 let mut builder = TalerApiBuilder::new();
                 if let Some(cfg) = cfg.wire_gateway {
                     builder = builder.wire_gateway(api.clone(), cfg.auth);
@@ -132,19 +121,15 @@ async fn app(args: Args, cfg: Config) -> 
anyhow::Result<()> {
                 builder.serve(cfg.serve, None).await?;
             }
         }
-        Command::Worker {
-            account,
-            transient: _,
-        } => {
+        Command::Worker { transient: _ } => {
             let db = DbCfg::parse(&cfg)?;
             let pool = pool(db.cfg, "magnet_bank").await?;
             let cfg = WorkerCfg::parse(&cfg)?;
-            let keys = keys::load(&cfg)?;
+            let keys = setup::load(&cfg)?;
             let client = reqwest::Client::new();
             let client =
                 AuthClient::new(&client, &cfg.api_url, 
&cfg.consumer).upgrade(&keys.access_token);
-            let account = HuPayto::try_from(&account)?;
-            let account = client.account(account.bban()).await?;
+            let account = client.account(cfg.payto.bban()).await?;
             let mut db = pool.acquire().await?.detach();
             // TODO run in loop and handle errors
             let mut worker = Worker {
diff --git a/taler-magnet-bank/src/keys.rs b/taler-magnet-bank/src/setup.rs
similarity index 80%
rename from taler-magnet-bank/src/keys.rs
rename to taler-magnet-bank/src/setup.rs
index 2d4980d..c10d512 100644
--- a/taler-magnet-bank/src/keys.rs
+++ b/taler-magnet-bank/src/setup.rs
@@ -18,7 +18,7 @@ use std::io::ErrorKind;
 
 use p256::ecdsa::SigningKey;
 use taler_common::{json_file, types::base32::Base32};
-use tracing::info;
+use tracing::{info, warn};
 
 use crate::{
     config::WorkerCfg,
@@ -44,7 +44,13 @@ pub fn load(cfg: &WorkerCfg) -> anyhow::Result<Keys> {
     // Load JSON file
     let file: KeysFile = match json_file::load(&cfg.keys_path) {
         Ok(file) => file,
-        Err(e) => return Err(anyhow::anyhow!("Could not magnet keys: {e}")),
+        Err(e) => {
+            return Err(anyhow::anyhow!(
+                "Could not read magnet keys at '{}': {}",
+                cfg.keys_path,
+                e.kind()
+            ))
+        }
     };
 
     fn incomplete_err() -> anyhow::Error {
@@ -137,11 +143,37 @@ pub async fn setup(cfg: WorkerCfg, reset: bool) -> 
anyhow::Result<()> {
     };
     if let Err(e) = client.upload_public_key(&signing_key).await {
         // Ignore error if public key already uploaded
-        if !matches!(e, ApiError::Magnet(MagnetError { ref short_message, .. 
}) if short_message == "KULCS_MAR_HASZNALATBAN")
+        if !matches!(e, ApiError::Magnet(MagnetError { ref short_message, .. 
}) if short_message== "KULCS_MAR_HASZNALATBAN")
         {
             return Err(e.into());
         }
     }
 
-    Ok(())
+    info!("Check account");
+    let res = client.list_accounts().await?;
+    let mut ibans = Vec::new();
+    for partner in res.partners {
+        for account in partner.bank_accounts {
+            if cfg.payto.0 == account.iban {
+                if partner.partner.name != cfg.payto.name {
+                    warn!(
+                        "Expected name '{}' from config got '{}' from bank",
+                        cfg.payto.name, partner.partner.name
+                    );
+                }
+                return Ok(());
+            } else {
+                ibans.push(account.iban);
+            }
+        }
+    }
+    Err(anyhow::anyhow!(
+        "Unknown account {} from config, expected one of the following account 
{}",
+        cfg.payto.0,
+        ibans
+            .into_iter()
+            .map(|it| it.to_string())
+            .collect::<Vec<_>>()
+            .join(", ")
+    ))
 }
diff --git a/taler-magnet-bank/src/worker.rs b/taler-magnet-bank/src/worker.rs
index 9b9f31c..5a7f164 100644
--- a/taler-magnet-bank/src/worker.rs
+++ b/taler-magnet-bank/src/worker.rs
@@ -29,7 +29,7 @@ use crate::{
     db::{self, AddIncomingResult, Initiated, TxIn, TxOut},
     failure_injection::fail_point,
     magnet::{error::ApiError, ApiClient, Direction, Transaction},
-    HuIban, MagnetPayto,
+    FullHuPayto, HuIban,
 };
 
 #[derive(Debug, thiserror::Error)]
@@ -225,7 +225,7 @@ pub fn extract_tx_info(tx: Transaction) -> Tx {
     } else {
         HuIban::from_bban(&tx.counter_account).unwrap()
     };
-    let counter_account = MagnetPayto::new(iban, tx.counter_name);
+    let counter_account = FullHuPayto::new(iban, tx.counter_name);
     if tx.amount.is_sign_positive() {
         Tx::In(TxIn {
             code: tx.code,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]