Reading/writing unencrypted db properties and starting work on getting the master key

master
Tom Alexander 5 years ago
parent 08db6c3e86
commit 151274d754

@ -13,6 +13,7 @@ log = "0.4.6"
pretty_env_logger = "0.3.0"
rand = "0.6.5"
dirs = "2.0.0"
rust-crypto = "0.2.36"
[dependencies.rusqlite]
version = "0.18.0"

@ -1,4 +1,5 @@
use rusqlite::Connection;
use std::error::Error;
use std::path::PathBuf;
static DB_INIT_QUERY: &'static str = include_str!("init.sql");
@ -7,6 +8,12 @@ pub struct DbHandle {
conn: Connection,
}
#[derive(Debug, Clone)]
struct DbProperty {
name: String,
value: Option<String>,
}
impl DbHandle {
pub fn new(db_path: &Option<String>) -> DbHandle {
let path: PathBuf = db_path
@ -19,4 +26,31 @@ impl DbHandle {
tx.commit();
DbHandle { conn: conn }
}
pub fn get_db_property(&self, name: &str) -> Result<Option<String>, Box<dyn Error>> {
let mut stmt = self
.conn
.prepare("SELECT name, value FROM props WHERE name=$1")
.unwrap();
let mut props = stmt.query_map(&[&name], |row| {
Ok(DbProperty {
name: row.get(0)?,
value: row.get(1)?,
})
})?;
match props.next() {
Some(prop) => Ok(Some(prop.unwrap().value.unwrap())),
None => Ok(None),
}
}
pub fn set_db_property(&self, name: &str, value: &str) {
self.conn
.execute(
"INSERT OR REPLACE INTO props (name, value) VALUES ($1, $2)",
&[&name, &value],
)
.unwrap();
}
}

@ -1,5 +1,8 @@
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;
@ -32,6 +35,31 @@ struct Args {
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)
@ -46,5 +74,7 @@ fn main() -> Result<(), Box<dyn Error>> {
let mut db_conn: db::DbHandle = db::DbHandle::new(&args.flag_db);
let master_key: [u8; 32] = get_master_key(&mut db_conn);
Ok(())
}

Loading…
Cancel
Save