diff --git a/.gitignore b/.gitignore index 2c4918c1..417367ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ /target -*.db +*.db* diff --git a/Cargo.lock b/Cargo.lock index d100a2f4..17710449 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,6 +236,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + [[package]] name = "argon2" version = "0.5.0" @@ -488,8 +494,10 @@ name = "brass" version = "0.1.0" dependencies = [ "actix-web", + "anyhow", "argon2", "askama", + "dotenv", "serde", "sqlx", ] @@ -669,6 +677,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "dotenvy" version = "0.15.7" @@ -736,6 +750,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -767,6 +793,17 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-intrusive" version = "0.4.2" @@ -833,6 +870,7 @@ dependencies = [ "futures-task", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -1073,6 +1111,17 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +[[package]] +name = "libsqlite3-sys" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -1277,6 +1326,26 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pin-project" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1409,7 +1478,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi", @@ -1602,6 +1671,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "sqlformat" version = "0.2.1" @@ -1639,8 +1717,10 @@ dependencies = [ "dotenvy", "either", "event-listener", + "flume", "futures-channel", "futures-core", + "futures-executor", "futures-intrusive", "futures-util", "hashlink", @@ -1648,6 +1728,7 @@ dependencies = [ "indexmap", "itoa", "libc", + "libsqlite3-sys", "log", "memchr", "once_cell", @@ -1917,6 +1998,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4d330786735ea358f3bc09eea4caa098569c1c93f342d9aca0514915022fe7e" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index bf9abe0d..4426935f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -sqlx = { version = "0.6", features = [ "runtime-async-std-rustls" ] } +sqlx = { version = "0.6", features = [ "runtime-async-std-rustls", "sqlite" ] } actix-web = { version = "4" } askama = "0.12.0" serde = { version = "1.0.164", features = [ "derive"]} argon2 = "0.5.0" +anyhow = "1.0.71" +dotenv = "0.15.0" diff --git a/migrations/20230609121618_initial.sql b/migrations/20230609121618_initial.sql index ad559a16..2dadac14 100644 --- a/migrations/20230609121618_initial.sql +++ b/migrations/20230609121618_initial.sql @@ -1,6 +1,17 @@ +CREATE TABLE IF NOT EXISTS roles +( + id INTEGER PRIMARY KEY NOT NULL, + definition TEXT NOT NULL +); + +INSERT OR REPLACE INTO roles(id, definition) values(1, "Default"); +INSERT OR REPLACE INTO roles(id, definition) values(2, "Administrator"); + CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, - password TEXT NOT NULL + password TEXT NOT NULL, + role INTEGER NOT NULL, + FOREIGN KEY(role) REFERENCES roles(roleId) ); diff --git a/src/auth/routes.rs b/src/auth/routes.rs index 219df1c2..2d1f731b 100644 --- a/src/auth/routes.rs +++ b/src/auth/routes.rs @@ -1,12 +1,16 @@ use actix_web::{Responder, web, HttpResponse}; use askama::Template; use serde::Deserialize; +use sqlx::sqlite::SqlitePool; use crate::auth::utils::hash_plain_password; +use crate::models::Role; pub fn init(cfg: &mut web::ServiceConfig) { cfg.service(get_login); cfg.service(post_login); + cfg.service(get_register); + cfg.service(post_register); } #[derive(Deserialize)] @@ -20,6 +24,11 @@ struct LoginForm { struct LoginTemplate { } +#[derive(Template)] +#[template(path = "register.html")] +struct RegisterTemplate { + roles: Vec +} #[actix_web::get("/login")] async fn get_login() -> impl Responder { @@ -39,3 +48,27 @@ async fn post_login(web::Form(form): web::Form) -> impl Responder { "dfgdg" } + +#[actix_web::get("/register")] +async fn get_register(pool: web::Data) -> impl Responder { + let roles = match Role::GetAll(pool.get_ref()).await { + Ok(value) => value, + Err(error) => return HttpResponse::InternalServerError().body(error.to_string()) + }; + + let bla = RegisterTemplate { roles }; + + HttpResponse::Ok() + .body(bla.render().unwrap()) +} + +#[actix_web::post("/register")] +async fn post_register(web::Form(form): web::Form) -> impl Responder { + println!("{} - {}", form.name, form.password); + + let hash = hash_plain_password(&form.password); + + println!("{hash}"); + + "dfgdg" +} diff --git a/src/main.rs b/src/main.rs index 2ff16250..d6d9db0c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,23 +1,25 @@ -use actix_web::{web, App, HttpServer, Responder}; +use std::env; + +use actix_web::{App, HttpServer, web}; +use sqlx::sqlite::SqlitePool; +use dotenv::dotenv; mod auth; - -async fn index() -> impl Responder { - "Hello world!" -} +mod models; #[actix_web::main] -async fn main() -> std::io::Result<()> { - HttpServer::new(|| { - App::new().service( - // prefixes all resources and routes attached to it... - web::scope("/app") - // ...so this handles requests for `GET /app/index.html` - .route("/index.html", web::get().to(index)), - ) +async fn main() -> anyhow::Result<()> { + dotenv()?; + let pool = SqlitePool::connect(&env::var("DATABASE_URL")?).await?; + + HttpServer::new(move || { + App::new() + .app_data(web::Data::new(pool.clone())) .configure(auth::init) }) .bind(("127.0.0.1", 8080))? .run() - .await + .await?; + + Ok(()) } diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 00000000..81e0b782 --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1,32 @@ +use sqlx::sqlite::SqlitePool; + +pub struct Role { + pub id: u8, + pub definition: String +} + +impl Role { + pub async fn GetAll(pool: &SqlitePool) -> anyhow::Result> { + let records = sqlx::query!( + r#" + SELECT id, definition + FROM roles + ORDER BY id + "# + ) + .fetch_all(pool) + .await?; + + let mut result = Vec::new(); + + for record in records { + let role = Role { + id: record.id as u8, + definition: record.definition, + }; + result.push(role); + } + + Ok(result) + } +} diff --git a/templates/register.html b/templates/register.html new file mode 100644 index 00000000..6c7273a2 --- /dev/null +++ b/templates/register.html @@ -0,0 +1,25 @@ + + + Brass - Register + + +

Brass - Registrierung

+

Gib dein Nutzernamen und das Passwort ein:

+
+ + + + + + + + + + +
+ +