test login credentials before entering main program

closes #58

this is a bit messy, as librespot panics, when authentication fails. thus, we
test the credentials in a separate thread to handle the panic.

see also: https://github.com/librespot-org/librespot/issues/108
This commit is contained in:
Henrik Friedrichsen
2019-04-15 21:59:19 +02:00
parent ea4ea5a853
commit 8738472e87
2 changed files with 41 additions and 17 deletions

View File

@@ -28,6 +28,7 @@ extern crate fern;
extern crate rand;
use std::fs;
use std::process;
use std::sync::Arc;
use std::thread;
@@ -83,6 +84,31 @@ fn setup_logging(filename: &str) -> Result<(), fern::InitError> {
Ok(())
}
fn get_credentials(reset: bool) -> Credentials {
let path = config::config_path("credentials.toml");
if reset {
if fs::remove_file(&path).is_err() {
error!("could not delete credential file");
}
}
let creds =
::config::load_or_generate_default(&path, authentication::create_credentials, true)
.unwrap_or_else(|e| {
eprintln!("{}", e);
process::exit(1);
});
#[cfg(target_family = "unix")]
std::fs::set_permissions(path, std::os::unix::fs::PermissionsExt::from_mode(0o600))
.unwrap_or_else(|e| {
eprintln!("{}", e);
process::exit(1);
});
creds
}
fn main() {
let matches = App::new("ncspot")
.version("0.1.0")
@@ -113,24 +139,11 @@ fn main() {
})
};
let credentials: Credentials = {
let path = config::config_path("credentials.toml");
let creds =
::config::load_or_generate_default(&path, authentication::create_credentials, true)
.unwrap_or_else(|e| {
eprintln!("{}", e);
process::exit(1);
});
let mut credentials = get_credentials(false);
#[cfg(target_family = "unix")]
std::fs::set_permissions(path, std::os::unix::fs::PermissionsExt::from_mode(0o600))
.unwrap_or_else(|e| {
eprintln!("{}", e);
process::exit(1);
});
creds
};
while !spotify::Spotify::test_credentials(credentials.clone()) {
credentials = get_credentials(true);
}
let theme = theme::load(&cfg);