use rusqlite::Connection; use std; use auth::HashedPassword; // TODO Replace the unwraps in this file with a custom error type. type Result = std::result::Result; fn is_initialized(conn: &mut Connection) -> Result { // We just initialize every time for now. Ok(false) } pub fn init(conn: &mut Connection) -> Result<()> { if !is_initialized(conn)? { info!("Initializing db..."); conn.execute_batch(" BEGIN; CREATE TABLE IF NOT EXISTS users (username TEXT PRIMARY KEY, salt TEXT, passwd TEXT); COMMIT; ") .unwrap(); } Ok(()) } pub fn insert_user(conn: &Connection, username: &str, password: &HashedPassword) -> Result<()> { conn.execute("INSERT INTO users (username, salt, passwd) VALUES (?1, ?2, ?3)", &[&username, &password.salt, &password.enc]) .unwrap(); Ok(()) } pub fn lookup_user(conn: &Connection, username: &str) -> Result> { let mut stmt = conn.prepare("SELECT salt, passwd FROM users WHERE username = ?") .unwrap(); let result = stmt.query_map(&[&username], |row| { HashedPassword { salt: row.get(0), enc: row.get(1), } }) .unwrap() .map(|v| v.unwrap()) .next(); Ok(result) }