You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.0 KiB
Rust

use docopt::Docopt;
use log::debug;
use rand::rngs::OsRng;
use rand::seq::IteratorRandom;
use rand::seq::SliceRandom;
use serde::Deserialize;
use std::error::Error;
pub mod db;
pub mod generate;
static USAGE: &'static str = "
foil
Usage:
foil set [--db=<db>]
foil get [--db=<db>]
foil list [--db=<db>]
foil generate <spec>
foil (-h | --help)
Options:
--db=<db> The path to the sqlite database [default: db.sqlite3].
-h --help Show this screen.
--version Show version.
";
#[derive(Debug, Deserialize)]
struct Args {
cmd_set: bool,
cmd_get: bool,
cmd_list: bool,
cmd_generate: bool,
flag_db: Option<String>,
arg_spec: Option<String>,
}
fn get_master_key(db_conn: &mut db::DbHandle) -> [u8; 32] {
let known_string = db_conn
.get_db_property("known_string")
.unwrap_or_else(|error| {
panic!("There was a problem reading from the db: {:?}", error);
})
.unwrap_or_else(|| {
println!("No master password set yet, create new one:");
let mut random = OsRng::new().unwrap();
let new_known: String = {
let mut new_chars: Vec<char> = "abcdefghijklmnopqrstuvwxyz"
.chars()
.choose_multiple(&mut random, 64);
new_chars.shuffle(&mut random);
new_chars.into_iter().collect()
};
db_conn.set_db_property("known_string", &new_known);
new_known
});
let master_key: [u8; 32] = [0; 32];
master_key
}
fn main() -> Result<(), Box<dyn Error>> {
pretty_env_logger::init();
let args: Args = Docopt::new(USAGE)
.and_then(|dopt| dopt.deserialize())
.unwrap_or_else(|e| e.exit());
debug!("{:?}", args);
if args.cmd_generate {
generate::generate(&args.arg_spec.unwrap());
return Ok(());
}
let mut db_conn: db::DbHandle = db::DbHandle::new(&args.flag_db);
let master_key: [u8; 32] = get_master_key(&mut db_conn);
Ok(())
}