feat: start implementing register page

This commit is contained in:
Max Hohlfeld 2023-06-09 20:16:36 +02:00
parent 7c6485d459
commit 5807c00b2f
8 changed files with 210 additions and 18 deletions

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
/target /target
*.db *.db*

89
Cargo.lock generated
View File

@ -236,6 +236,12 @@ dependencies = [
"alloc-no-stdlib", "alloc-no-stdlib",
] ]
[[package]]
name = "anyhow"
version = "1.0.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
[[package]] [[package]]
name = "argon2" name = "argon2"
version = "0.5.0" version = "0.5.0"
@ -488,8 +494,10 @@ name = "brass"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"anyhow",
"argon2", "argon2",
"askama", "askama",
"dotenv",
"serde", "serde",
"sqlx", "sqlx",
] ]
@ -669,6 +677,12 @@ dependencies = [
"subtle", "subtle",
] ]
[[package]]
name = "dotenv"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
[[package]] [[package]]
name = "dotenvy" name = "dotenvy"
version = "0.15.7" version = "0.15.7"
@ -736,6 +750,18 @@ dependencies = [
"miniz_oxide", "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]] [[package]]
name = "fnv" name = "fnv"
version = "1.0.7" version = "1.0.7"
@ -767,6 +793,17 @@ version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" 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]] [[package]]
name = "futures-intrusive" name = "futures-intrusive"
version = "0.4.2" version = "0.4.2"
@ -833,6 +870,7 @@ dependencies = [
"futures-task", "futures-task",
"pin-project-lite", "pin-project-lite",
"pin-utils", "pin-utils",
"slab",
] ]
[[package]] [[package]]
@ -1073,6 +1111,17 @@ version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" 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]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.3.8" version = "0.3.8"
@ -1277,6 +1326,26 @@ version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 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]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.9" version = "0.2.9"
@ -1409,7 +1478,7 @@ dependencies = [
"cc", "cc",
"libc", "libc",
"once_cell", "once_cell",
"spin", "spin 0.5.2",
"untrusted", "untrusted",
"web-sys", "web-sys",
"winapi", "winapi",
@ -1602,6 +1671,15 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 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]] [[package]]
name = "sqlformat" name = "sqlformat"
version = "0.2.1" version = "0.2.1"
@ -1639,8 +1717,10 @@ dependencies = [
"dotenvy", "dotenvy",
"either", "either",
"event-listener", "event-listener",
"flume",
"futures-channel", "futures-channel",
"futures-core", "futures-core",
"futures-executor",
"futures-intrusive", "futures-intrusive",
"futures-util", "futures-util",
"hashlink", "hashlink",
@ -1648,6 +1728,7 @@ dependencies = [
"indexmap", "indexmap",
"itoa", "itoa",
"libc", "libc",
"libsqlite3-sys",
"log", "log",
"memchr", "memchr",
"once_cell", "once_cell",
@ -1917,6 +1998,12 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4d330786735ea358f3bc09eea4caa098569c1c93f342d9aca0514915022fe7e" checksum = "a4d330786735ea358f3bc09eea4caa098569c1c93f342d9aca0514915022fe7e"
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.4" version = "0.9.4"

View File

@ -6,8 +6,10 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
sqlx = { version = "0.6", features = [ "runtime-async-std-rustls" ] } sqlx = { version = "0.6", features = [ "runtime-async-std-rustls", "sqlite" ] }
actix-web = { version = "4" } actix-web = { version = "4" }
askama = "0.12.0" askama = "0.12.0"
serde = { version = "1.0.164", features = [ "derive"]} serde = { version = "1.0.164", features = [ "derive"]}
argon2 = "0.5.0" argon2 = "0.5.0"
anyhow = "1.0.71"
dotenv = "0.15.0"

View File

@ -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 CREATE TABLE IF NOT EXISTS users
( (
id INTEGER PRIMARY KEY NOT NULL, id INTEGER PRIMARY KEY NOT NULL,
name TEXT NOT NULL, name TEXT NOT NULL,
password TEXT NOT NULL password TEXT NOT NULL,
role INTEGER NOT NULL,
FOREIGN KEY(role) REFERENCES roles(roleId)
); );

View File

@ -1,12 +1,16 @@
use actix_web::{Responder, web, HttpResponse}; use actix_web::{Responder, web, HttpResponse};
use askama::Template; use askama::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::sqlite::SqlitePool;
use crate::auth::utils::hash_plain_password; use crate::auth::utils::hash_plain_password;
use crate::models::Role;
pub fn init(cfg: &mut web::ServiceConfig) { pub fn init(cfg: &mut web::ServiceConfig) {
cfg.service(get_login); cfg.service(get_login);
cfg.service(post_login); cfg.service(post_login);
cfg.service(get_register);
cfg.service(post_register);
} }
#[derive(Deserialize)] #[derive(Deserialize)]
@ -20,6 +24,11 @@ struct LoginForm {
struct LoginTemplate { struct LoginTemplate {
} }
#[derive(Template)]
#[template(path = "register.html")]
struct RegisterTemplate {
roles: Vec<Role>
}
#[actix_web::get("/login")] #[actix_web::get("/login")]
async fn get_login() -> impl Responder { async fn get_login() -> impl Responder {
@ -39,3 +48,27 @@ async fn post_login(web::Form(form): web::Form<LoginForm>) -> impl Responder {
"dfgdg" "dfgdg"
} }
#[actix_web::get("/register")]
async fn get_register(pool: web::Data<SqlitePool>) -> 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<LoginForm>) -> impl Responder {
println!("{} - {}", form.name, form.password);
let hash = hash_plain_password(&form.password);
println!("{hash}");
"dfgdg"
}

View File

@ -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; mod auth;
mod models;
async fn index() -> impl Responder {
"Hello world!"
}
#[actix_web::main] #[actix_web::main]
async fn main() -> std::io::Result<()> { async fn main() -> anyhow::Result<()> {
HttpServer::new(|| { dotenv()?;
App::new().service( let pool = SqlitePool::connect(&env::var("DATABASE_URL")?).await?;
// prefixes all resources and routes attached to it...
web::scope("/app") HttpServer::new(move || {
// ...so this handles requests for `GET /app/index.html` App::new()
.route("/index.html", web::get().to(index)), .app_data(web::Data::new(pool.clone()))
)
.configure(auth::init) .configure(auth::init)
}) })
.bind(("127.0.0.1", 8080))? .bind(("127.0.0.1", 8080))?
.run() .run()
.await .await?;
Ok(())
} }

32
src/models/mod.rs Normal file
View File

@ -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<Vec<Role>> {
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)
}
}

25
templates/register.html Normal file
View File

@ -0,0 +1,25 @@
<html>
<head>
<title>Brass - Register</title>
</head>
<body>
<h1>Brass - Registrierung</h1>
<p>Gib dein Nutzernamen und das Passwort ein:</p>
<form>
<label for="name">Nutzername:</label>
<input name="name" type="text">
<label for="password">Passwort:</label>
<input name="password" type="password">
<label for="role">Rolle:</label>
<select name="role">
{% for role in roles %}
<option value="{{ role.id }}">{{ role.definition }}</option>
{% endfor %}
</select>
<input type="submit" formmethod="post">
</form>
</body>
</html>