Moved user structs out of db module

This commit is contained in:
Antoine Gersant 2017-07-01 11:52:41 -07:00
parent d70abba47e
commit ac93ec5b02
4 changed files with 70 additions and 64 deletions

View file

@ -11,6 +11,7 @@ use std::sync::{Arc, Mutex};
use config::UserConfig; use config::UserConfig;
use ddns::{DDNSConfigSource, DDNSConfig}; use ddns::{DDNSConfigSource, DDNSConfig};
use errors::*; use errors::*;
use user::*;
use vfs::{MountPoint, Vfs}; use vfs::{MountPoint, Vfs};
mod index; mod index;
@ -261,11 +262,9 @@ impl DB {
} }
pub fn auth(&self, username: &str, password: &str) -> Result<bool> { pub fn auth(&self, username: &str, password: &str) -> Result<bool> {
use self::users::dsl::*;
let connection = self.connection.lock().unwrap(); let connection = self.connection.lock().unwrap();
let connection = connection.deref(); let connection = connection.deref();
let user: User = users.filter(name.eq(username)).get_result(connection)?; auth(connection, username, password)
Ok(user.verify_password(password))
} }
} }

View file

@ -1,8 +1,3 @@
use rand;
use ring::{digest, pbkdf2};
use db::schema::*;
// Collection content // Collection content
#[derive(Debug, Queryable, Serialize)] #[derive(Debug, Queryable, Serialize)]
pub struct Song { pub struct Song {
@ -41,62 +36,6 @@ pub enum CollectionFile {
Song(Song), Song(Song),
} }
// User
#[derive(Debug, Queryable)]
pub struct User {
id: i32,
pub name: String,
pub password_salt: Vec<u8>,
pub password_hash: Vec<u8>,
}
impl User {
pub fn verify_password(&self, attempted_password: &str) -> bool {
pbkdf2::verify(DIGEST_ALG,
HASH_ITERATIONS,
&self.password_salt,
attempted_password.as_bytes(),
&self.password_hash)
.is_ok()
}
}
#[derive(Debug, Insertable)]
#[table_name="users"]
pub struct NewUser {
pub name: String,
pub password_salt: Vec<u8>,
pub password_hash: Vec<u8>,
}
static DIGEST_ALG: &'static pbkdf2::PRF = &pbkdf2::HMAC_SHA256;
const CREDENTIAL_LEN: usize = digest::SHA256_OUTPUT_LEN;
const HASH_ITERATIONS: u32 = 10000;
type PasswordHash = [u8; CREDENTIAL_LEN];
impl NewUser {
pub fn new(name: &str, password: &str) -> NewUser {
let salt = rand::random::<[u8; 16]>().to_vec();
let hash = NewUser::hash_password(&salt, password);
NewUser {
name: name.to_owned(),
password_salt: salt,
password_hash: hash,
}
}
pub fn hash_password(salt: &Vec<u8>, password: &str) -> Vec<u8> {
let mut hash: PasswordHash = [0; CREDENTIAL_LEN];
pbkdf2::derive(DIGEST_ALG,
HASH_ITERATIONS,
salt,
password.as_bytes(),
&mut hash);
hash.to_vec()
}
}
// Misc Settings // Misc Settings
#[derive(Debug, Queryable)] #[derive(Debug, Queryable)]
pub struct MiscSettings { pub struct MiscSettings {

View file

@ -65,6 +65,7 @@ mod ddns;
mod errors; mod errors;
mod metadata; mod metadata;
mod ui; mod ui;
mod user;
mod utils; mod utils;
mod thumbnails; mod thumbnails;
mod vfs; mod vfs;

67
src/user.rs Normal file
View file

@ -0,0 +1,67 @@
use diesel::prelude::*;
use diesel::sqlite::SqliteConnection;
use rand;
use ring::{digest, pbkdf2};
use db::users;
use errors::*;
#[derive(Debug, Queryable)]
pub struct User {
id: i32,
pub name: String,
pub password_salt: Vec<u8>,
pub password_hash: Vec<u8>,
}
impl User {
pub fn verify_password(&self, attempted_password: &str) -> bool {
pbkdf2::verify(DIGEST_ALG,
HASH_ITERATIONS,
&self.password_salt,
attempted_password.as_bytes(),
&self.password_hash)
.is_ok()
}
}
#[derive(Debug, Insertable)]
#[table_name="users"]
pub struct NewUser {
pub name: String,
pub password_salt: Vec<u8>,
pub password_hash: Vec<u8>,
}
static DIGEST_ALG: &'static pbkdf2::PRF = &pbkdf2::HMAC_SHA256;
const CREDENTIAL_LEN: usize = digest::SHA256_OUTPUT_LEN;
const HASH_ITERATIONS: u32 = 10000;
type PasswordHash = [u8; CREDENTIAL_LEN];
impl NewUser {
pub fn new(name: &str, password: &str) -> NewUser {
let salt = rand::random::<[u8; 16]>().to_vec();
let hash = NewUser::hash_password(&salt, password);
NewUser {
name: name.to_owned(),
password_salt: salt,
password_hash: hash,
}
}
pub fn hash_password(salt: &Vec<u8>, password: &str) -> Vec<u8> {
let mut hash: PasswordHash = [0; CREDENTIAL_LEN];
pbkdf2::derive(DIGEST_ALG,
HASH_ITERATIONS,
salt,
password.as_bytes(),
&mut hash);
hash.to_vec()
}
}
pub fn auth(connection: &SqliteConnection, username: &str, password: &str) -> Result<bool> {
use db::users::dsl::*;
let user: User = users.filter(name.eq(username)).get_result(connection)?;
Ok(user.verify_password(password))
}