Skip to content

Commit 6d52796

Browse files
committed
refactor: mv qrcode logic to cli
1 parent 2f7c25b commit 6d52796

7 files changed

Lines changed: 55 additions & 33 deletions

File tree

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bourso-cli"
3-
version = "0.5.2"
3+
version = "0.5.3"
44
edition = "2021"
55
repository = "https://github.com/azerpas/bourso-api"
66

@@ -18,6 +18,7 @@ serde_json = { version = "1.0.107" }
1818
tracing = { version = "0.1.41" }
1919
tracing-subscriber = { version = "0.3.20", features = ["fmt", "env-filter", "json"] }
2020
futures-util = { version = "0.3.31" }
21+
qrcode = { version = "0.14.1" }
2122

2223
[lints.rust]
2324
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] }

src/bourso_api/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bourso_api"
3-
version = "0.5.2"
3+
version = "0.5.3"
44
edition = "2021"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -19,7 +19,6 @@ chrono = { version = "0.4.39" }
1919
tracing = { version = "0.1.41" }
2020
futures-util = { version = "0.3.31" }
2121
async-stream = { version = "0.3.6" }
22-
qrcode = { version = "0.14.1" }
2322
rand = { version = "0.9.2" }
2423

2524
[lints.rust]

src/bourso_api/src/client/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::fmt;
44
pub enum ClientError {
55
InvalidCredentials,
66
MfaRequired,
7+
QRCodeRequired(String),
78
InvalidMfa,
89
}
910

@@ -12,6 +13,7 @@ impl fmt::Display for ClientError {
1213
match self {
1314
ClientError::InvalidCredentials => write!(f, "Invalid credentials"),
1415
ClientError::MfaRequired => write!(f, "MFA required"),
16+
ClientError::QRCodeRequired(msg) => write!(f, "{}", msg),
1517
ClientError::InvalidMfa => write!(f, "Invalid MFA"),
1618
}
1719
}

src/bourso_api/src/client/mod.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
pub mod account;
22
pub mod config;
33
pub mod error;
4-
pub mod qrcode;
54
pub mod trade;
65
pub mod transfer;
76
pub mod virtual_pad;
@@ -516,17 +515,9 @@ impl BoursoWebClient {
516515
debug!("⏳ MFA not yet validated");
517516

518517
if json_body["qrcode"].is_string() {
519-
match qrcode::generate_qr_code(json_body["qrcode"].as_str().unwrap()) {
520-
Ok(qr) => {
521-
println!();
522-
println!("{}", qrcode::render_to_terminal(&qr));
523-
println!();
524-
}
525-
Err(e) => bail!("Could not render the QR code {}", e),
526-
}
527-
info!(
528-
"Please scan the latest QR code in your BoursoBank app to validate the login request."
529-
);
518+
bail!(ClientError::QRCodeRequired(
519+
json_body["qrcode"].as_str().unwrap().to_string()
520+
));
530521
}
531522

532523
Ok(false)

src/lib.rs

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use clap::ArgMatches;
1212
use futures_util::{pin_mut, StreamExt};
1313
use tracing::{debug, info, warn};
1414

15+
pub mod qrcode;
1516
pub mod settings;
1617
pub mod validate;
1718

@@ -174,28 +175,56 @@ pub async fn parse_matches(matches: ArgMatches) -> Result<()> {
174175
"Checking MFA status... (waited {}s/{})",
175176
wait_time, max_wait_time
176177
);
177-
let mfa_validated = web_client
178+
match web_client
178179
.check_mfa(
179180
mfa_type.clone(),
180181
otp_id.clone(),
181182
form_state.clone(),
182183
token.clone(),
183184
)
184-
.await?;
185-
186-
if mfa_validated {
187-
break;
188-
}
189-
190-
if wait_time >= max_wait_time {
191-
return Err(anyhow::anyhow!(
192-
"MFA validation timed out after {} seconds",
193-
max_wait_time
194-
));
185+
.await
186+
{
187+
Ok(mfa_validated) => {
188+
if mfa_validated {
189+
break;
190+
}
191+
192+
if wait_time >= max_wait_time {
193+
return Err(anyhow::anyhow!(
194+
"MFA validation timed out after {} seconds",
195+
max_wait_time
196+
));
197+
}
198+
199+
wait_time += wait_interval;
200+
tokio::time::sleep(std::time::Duration::from_secs(wait_interval)).await;
201+
}
202+
Err(e) => match e.downcast_ref() {
203+
Some(bourso_api::client::error::ClientError::QRCodeRequired(code)) => {
204+
match qrcode::generate_qr_code(code) {
205+
Ok(qr) => {
206+
println!();
207+
println!("{}", qrcode::render_to_terminal(&qr));
208+
println!();
209+
}
210+
Err(e) => {
211+
debug!("{:#?}", e);
212+
return Err(e);
213+
}
214+
}
215+
info!(
216+
"Please scan the latest QR code in your BoursoBank app to validate the login request."
217+
);
218+
wait_time += wait_interval;
219+
tokio::time::sleep(std::time::Duration::from_secs(wait_interval))
220+
.await;
221+
}
222+
_ => {
223+
debug!("{:#?}", e);
224+
return Err(e);
225+
}
226+
},
195227
}
196-
197-
wait_time += wait_interval;
198-
tokio::time::sleep(std::time::Duration::from_secs(wait_interval)).await;
199228
}
200229

201230
info!("MFA successful ✅");

0 commit comments

Comments
 (0)