2023-06-23 13:36:23 -04:00
|
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
|
|
|
|
use log::*;
|
|
|
|
use qrcode::QrCode;
|
|
|
|
use secrecy::ExposeSecret;
|
|
|
|
|
|
|
|
use crate::AccountManager;
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Parser)]
|
|
|
|
#[clap(about = "Generate QR codes. This *will* print sensitive data to stdout.")]
|
|
|
|
pub struct QrCommand {
|
|
|
|
#[clap(
|
|
|
|
long,
|
|
|
|
help = "Force using ASCII chars to generate QR codes. Useful for terminals that don't support unicode."
|
|
|
|
)]
|
|
|
|
pub ascii: bool,
|
|
|
|
}
|
|
|
|
|
2023-07-02 08:57:13 -04:00
|
|
|
impl<T> AccountCommand<T> for QrCommand
|
|
|
|
where
|
|
|
|
T: Transport,
|
|
|
|
{
|
2023-06-23 13:36:23 -04:00
|
|
|
fn execute(
|
|
|
|
&self,
|
2023-07-02 08:57:13 -04:00
|
|
|
_transport: T,
|
2023-06-23 13:36:23 -04:00
|
|
|
_manager: &mut AccountManager,
|
|
|
|
accounts: Vec<Arc<Mutex<SteamGuardAccount>>>,
|
2023-09-28 17:52:42 -04:00
|
|
|
_args: &GlobalArgs,
|
2023-06-23 13:36:23 -04:00
|
|
|
) -> anyhow::Result<()> {
|
|
|
|
use anyhow::Context;
|
|
|
|
|
|
|
|
info!("Generating QR codes for {} accounts", accounts.len());
|
|
|
|
|
|
|
|
for account in accounts {
|
|
|
|
let account = account.lock().unwrap();
|
|
|
|
let qr = QrCode::new(account.uri.expose_secret())
|
|
|
|
.context(format!("generating qr code for {}", account.account_name))?;
|
|
|
|
|
|
|
|
info!("Printing QR code for {}", account.account_name);
|
|
|
|
let qr_string = if self.ascii {
|
|
|
|
qr.render()
|
|
|
|
.light_color(' ')
|
|
|
|
.dark_color('#')
|
|
|
|
.module_dimensions(2, 1)
|
|
|
|
.build()
|
|
|
|
} else {
|
|
|
|
use qrcode::render::unicode;
|
|
|
|
qr.render::<unicode::Dense1x2>()
|
|
|
|
.dark_color(unicode::Dense1x2::Light)
|
|
|
|
.light_color(unicode::Dense1x2::Dark)
|
|
|
|
.build()
|
|
|
|
};
|
|
|
|
|
|
|
|
println!("{}", qr_string);
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|