From f8df3678b14c8b8110fe4a7a4d20d9cb7dc8728c Mon Sep 17 00:00:00 2001 From: Cameron Cordes Date: Tue, 7 Jul 2020 21:06:43 -0400 Subject: [PATCH] Setup Auth DB --- database/.env | 1 + database/Cargo.lock | 196 ++++++++++++++++++ database/Cargo.toml | 12 ++ database/diesel.toml | 5 + database/migrations/.gitkeep | 0 .../2020-07-08-000046_setup_auth/down.sql | 1 + .../2020-07-08-000046_setup_auth/up.sql | 5 + database/src/lib.rs | 62 ++++++ database/src/models.rs | 15 ++ database/src/schema.rs | 7 + 10 files changed, 304 insertions(+) create mode 100644 database/.env create mode 100644 database/Cargo.lock create mode 100644 database/Cargo.toml create mode 100644 database/diesel.toml create mode 100644 database/migrations/.gitkeep create mode 100644 database/migrations/2020-07-08-000046_setup_auth/down.sql create mode 100644 database/migrations/2020-07-08-000046_setup_auth/up.sql create mode 100644 database/src/lib.rs create mode 100644 database/src/models.rs create mode 100644 database/src/schema.rs diff --git a/database/.env b/database/.env new file mode 100644 index 0000000..0a894d6 --- /dev/null +++ b/database/.env @@ -0,0 +1 @@ +DATABASE_URL=auth.db diff --git a/database/Cargo.lock b/database/Cargo.lock new file mode 100644 index 0000000..ec7b5d3 --- /dev/null +++ b/database/Cargo.lock @@ -0,0 +1,196 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "bcrypt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6378bd17c4830c1b7ed644dde88f247b1560d46c68ff3da1b788984b09c0df31" +dependencies = [ + "base64", + "blowfish", + "byteorder", + "getrandom", +] + +[[package]] +name = "block-cipher" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa136449e765dc7faa244561ccae839c394048667929af599b5d931ebe7b7f10" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blowfish" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d01392750dd899a2528948d6b856afe2df508d627fc7c339868c0bd0141b4b" +dependencies = [ + "block-cipher", + "byteorder", + "opaque-debug", +] + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "database" +version = "0.1.0" +dependencies = [ + "bcrypt", + "diesel", + "dotenv", +] + +[[package]] +name = "diesel" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2de9deab977a153492a1468d1b1c0662c1cf39e5ea87d0c060ecd59ef18d8c" +dependencies = [ + "byteorder", + "diesel_derives", + "libsqlite3-sys", +] + +[[package]] +name = "diesel_derives" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "generic-array" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac746a5f3bbfdadd6106868134545e684693d54d9d44f6e9588a7d54af0bf980" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701" + +[[package]] +name = "libsqlite3-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e704a02bcaecd4a08b93a23f6be59d0bd79cd161e0963e9499165a0a35df7bd" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "pkg-config" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" + +[[package]] +name = "proc-macro2" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "typenum" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "vcpkg" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" diff --git a/database/Cargo.toml b/database/Cargo.toml new file mode 100644 index 0000000..d491efe --- /dev/null +++ b/database/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "database" +version = "0.1.0" +authors = ["Cameron Cordes "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +diesel = { version = "1.4.4", features = ["sqlite"] } +dotenv = "0.15" +bcrypt = "0.8.1" diff --git a/database/diesel.toml b/database/diesel.toml new file mode 100644 index 0000000..92267c8 --- /dev/null +++ b/database/diesel.toml @@ -0,0 +1,5 @@ +# For documentation on how to configure this file, +# see diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/schema.rs" diff --git a/database/migrations/.gitkeep b/database/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/database/migrations/2020-07-08-000046_setup_auth/down.sql b/database/migrations/2020-07-08-000046_setup_auth/down.sql new file mode 100644 index 0000000..9951735 --- /dev/null +++ b/database/migrations/2020-07-08-000046_setup_auth/down.sql @@ -0,0 +1 @@ +DROP TABLE users diff --git a/database/migrations/2020-07-08-000046_setup_auth/up.sql b/database/migrations/2020-07-08-000046_setup_auth/up.sql new file mode 100644 index 0000000..f81a069 --- /dev/null +++ b/database/migrations/2020-07-08-000046_setup_auth/up.sql @@ -0,0 +1,5 @@ +CREATE TABLE users ( + id INT PRIMARY KEY AUTOINCREMENT, + username TEXT NOT NULL, + password TEXT NOT NULL +) diff --git a/database/src/lib.rs b/database/src/lib.rs new file mode 100644 index 0000000..83c5fc6 --- /dev/null +++ b/database/src/lib.rs @@ -0,0 +1,62 @@ +#[macro_use] +extern crate diesel; + +use bcrypt::{hash, verify, DEFAULT_COST}; +use diesel::prelude::*; +use diesel::sqlite::SqliteConnection; +use dotenv::dotenv; + +use crate::models::{InsertUser, User}; + +pub mod models; +pub mod schema; + +fn connect() -> SqliteConnection { + dotenv().ok(); + + let db_url = dotenv::var("DATABASE_URL").expect("DATABASE_URL must be set"); + SqliteConnection::establish(&db_url).expect("Error connecting to DB") +} + +// TODO: Should probably use Result here +pub fn create_user(user: &str, pass: &str) -> Option { + use schema::users::dsl::*; + + let hashed = hash(pass, DEFAULT_COST); + if let Ok(hash) = hashed { + let connection = connect(); + diesel::insert_into(users) + .values(InsertUser { + username: user, + password: &hash, + }) + .execute(&connection) + .unwrap(); + + match users + .filter(username.eq(user)) + .load::(&connection) + .unwrap() + .first() + { + Some(u) => Some(u.clone()), + None => None, + } + } else { + None + } +} + +pub fn get_user(user: &str, pass: &str) -> Option { + use schema::users::dsl::*; + + match users + .filter(username.eq(user)) + .load::(&connect()) + .unwrap_or(Vec::::new()) + .first() + { + Some(u) if verify(pass, &u.password).unwrap_or(false) => Some(u.clone()), + _ => None, + } +} diff --git a/database/src/models.rs b/database/src/models.rs new file mode 100644 index 0000000..241831c --- /dev/null +++ b/database/src/models.rs @@ -0,0 +1,15 @@ +use crate::schema::users; + +#[derive(Insertable)] +#[table_name = "users"] +pub struct InsertUser<'a> { + pub username: &'a str, + pub password: &'a str, +} + +#[derive(Queryable, Clone)] +pub struct User { + pub id: i32, + pub username: String, + pub password: String, +} diff --git a/database/src/schema.rs b/database/src/schema.rs new file mode 100644 index 0000000..b746bf7 --- /dev/null +++ b/database/src/schema.rs @@ -0,0 +1,7 @@ +table! { + users (id) { + id -> Integer, + username -> Text, + password -> Text, + } +}