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
*.db
*.db*

89
Cargo.lock generated
View File

@ -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"

View File

@ -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"

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
(
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)
);

View File

@ -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<Role>
}
#[actix_web::get("/login")]
async fn get_login() -> impl Responder {
@ -39,3 +48,27 @@ async fn post_login(web::Form(form): web::Form<LoginForm>) -> impl Responder {
"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;
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(())
}

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>