Merge pull request #81 from dyc3/remove-authenticator

add account removal, closes #10
This commit is contained in:
Carson McManus 2021-08-11 19:50:08 -04:00 committed by GitHub
commit 47be84aaca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 0 deletions

View file

@ -66,6 +66,16 @@ impl Manifest {
self.accounts.push(Arc::new(Mutex::new(account))); self.accounts.push(Arc::new(Mutex::new(account)));
} }
pub fn remove_account(&mut self, account_name: String) {
let index = self
.accounts
.iter()
.position(|a| a.lock().unwrap().account_name == account_name)
.unwrap();
self.accounts.remove(index);
self.entries.remove(index);
}
pub fn save(&self) -> anyhow::Result<()> { pub fn save(&self) -> anyhow::Result<()> {
ensure!( ensure!(
self.entries.len() == self.accounts.len(), self.entries.len() == self.accounts.len(),

View file

@ -85,6 +85,10 @@ fn main() {
App::new("setup") App::new("setup")
.about("Set up a new account with steamguard-cli") .about("Set up a new account with steamguard-cli")
) )
.subcommand(
App::new("remove")
.about("Remove the authenticator from an account.")
)
.subcommand( .subcommand(
App::new("debug") App::new("debug")
.arg( .arg(
@ -298,6 +302,55 @@ fn main() {
} }
manifest.save(); manifest.save();
} else if let Some(_) = matches.subcommand_matches("remove") {
println!(
"This will remove the mobile authenticator from {} accounts: {}",
selected_accounts.len(),
selected_accounts
.iter()
.map(|a| a.lock().unwrap().account_name.clone())
.collect::<Vec<String>>()
.join(", ")
);
print!("Do you want to continue? [yN] ");
match prompt().as_str() {
"y" => {}
_ => {
println!("Aborting!");
return;
}
}
let mut successful = vec![];
for a in selected_accounts {
let account = a.lock().unwrap();
match account.remove_authenticator(None) {
Ok(success) => {
if success {
println!("Removed authenticator from {}", account.account_name);
successful.push(account.account_name.clone());
} else {
println!(
"Failed to remove authenticator from {}",
account.account_name
);
}
}
Err(err) => {
println!(
"Unexpected error when removing authenticator from {}: {}",
account.account_name, err
);
}
}
}
for account_name in successful {
manifest.remove_account(account_name);
}
manifest.save().expect("Failed to save manifest.");
} else { } else {
let server_time = steamapi::get_server_time(); let server_time = steamapi::get_server_time();
for account in selected_accounts { for account in selected_accounts {

View file

@ -11,6 +11,7 @@ use reqwest::{
use scraper::{Html, Selector}; use scraper::{Html, Selector};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{collections::HashMap, convert::TryInto}; use std::{collections::HashMap, convert::TryInto};
use steamapi::SteamApiClient;
pub use userlogin::{LoginError, UserLogin}; pub use userlogin::{LoginError, UserLogin};
#[macro_use] #[macro_use]
extern crate lazy_static; extern crate lazy_static;
@ -245,6 +246,19 @@ impl SteamGuardAccount {
ensure!(resp.success); ensure!(resp.success);
Ok(resp.html) Ok(resp.html)
} }
/// Removes the mobile authenticator from the steam account. If this operation succeeds, this object can no longer be considered valid.
/// Returns whether or not the operation was successful.
pub fn remove_authenticator(&self, revocation_code: Option<String>) -> anyhow::Result<bool> {
ensure!(
matches!(revocation_code, Some(_)) || !self.revocation_code.is_empty(),
"Revocation code not provided."
);
let client: SteamApiClient = SteamApiClient::new(self.session.clone());
let resp =
client.remove_authenticator(revocation_code.unwrap_or(self.revocation_code.clone()))?;
Ok(resp.success)
}
} }
fn parse_confirmations(text: String) -> anyhow::Result<Vec<Confirmation>> { fn parse_confirmations(text: String) -> anyhow::Result<Vec<Confirmation>> {