feat: start implementing register page
This commit is contained in:
parent
7c6485d459
commit
5807c00b2f
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
|||||||
/target
|
/target
|
||||||
*.db
|
*.db*
|
||||||
|
89
Cargo.lock
generated
89
Cargo.lock
generated
@ -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"
|
||||||
|
@ -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"
|
||||||
|
@ -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)
|
||||||
);
|
);
|
||||||
|
@ -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"
|
||||||
|
}
|
||||||
|
30
src/main.rs
30
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;
|
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
32
src/models/mod.rs
Normal 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
25
templates/register.html
Normal 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>
|
Loading…
x
Reference in New Issue
Block a user