initial commit

This commit is contained in:
Max Hohlfeld 2023-06-09 15:54:09 +02:00
commit 7c6485d459
11 changed files with 2282 additions and 0 deletions

5
.env Normal file
View File

@ -0,0 +1,5 @@
# Postgres
# DATABASE_URL=postgres://postgres@localhost/my_database
# SQLite
DATABASE_URL=sqlite:brass.db

2
.gitignore vendored Normal file
View File

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

2149
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

13
Cargo.toml Normal file
View File

@ -0,0 +1,13 @@
[package]
name = "brass"
version = "0.1.0"
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" ] }
actix-web = { version = "4" }
askama = "0.12.0"
serde = { version = "1.0.164", features = [ "derive"]}
argon2 = "0.5.0"

1
README.md Normal file
View File

@ -0,0 +1 @@
`cargo install sqlx-cli`

View File

@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS users
(
id INTEGER PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
password TEXT NOT NULL
);

4
src/auth/mod.rs Normal file
View File

@ -0,0 +1,4 @@
pub mod routes;
mod utils;
pub use routes::init;

41
src/auth/routes.rs Normal file
View File

@ -0,0 +1,41 @@
use actix_web::{Responder, web, HttpResponse};
use askama::Template;
use serde::Deserialize;
use crate::auth::utils::hash_plain_password;
pub fn init(cfg: &mut web::ServiceConfig) {
cfg.service(get_login);
cfg.service(post_login);
}
#[derive(Deserialize)]
struct LoginForm {
name: String,
password: String
}
#[derive(Template)]
#[template(path = "login.html")]
struct LoginTemplate {
}
#[actix_web::get("/login")]
async fn get_login() -> impl Responder {
let bla = LoginTemplate {};
HttpResponse::Ok()
.body(bla.render().unwrap())
}
#[actix_web::post("/login")]
async fn post_login(web::Form(form): web::Form<LoginForm>) -> impl Responder {
println!("{} - {}", form.name, form.password);
let hash = hash_plain_password(&form.password);
println!("{hash}");
"dfgdg"
}

20
src/auth/utils.rs Normal file
View File

@ -0,0 +1,20 @@
use argon2::{
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, SaltString},
Argon2,
};
pub fn hash_plain_password(plain: &str) -> String {
let salt = SaltString::generate(&mut OsRng);
// Argon2 with default params (Argon2id v19)
Argon2::default()
.hash_password(plain.as_bytes(), &salt)
.unwrap()
.to_string()
// Verify password against PHC string.
//
// NOTE: hash params from `parsed_hash` are used instead of what is configured in the
// `Argon2` instance.
// PasswordHash::new(&password_hash).unwrap().to_string()
}

23
src/main.rs Normal file
View File

@ -0,0 +1,23 @@
use actix_web::{web, App, HttpServer, Responder};
mod auth;
async fn index() -> impl Responder {
"Hello world!"
}
#[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)),
)
.configure(auth::init)
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}

18
templates/login.html Normal file
View File

@ -0,0 +1,18 @@
<html>
<head>
<title>Brass - Login</title>
</head>
<body>
<h1>Brass - Anmeldung</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">
<input type="submit" formmethod="post">
</form>
</body>
</html>