Add session
This commit is contained in:
parent
9384aa540f
commit
ad918232c2
29
crates/oswilno-session/src/hashing.rs
Normal file
29
crates/oswilno-session/src/hashing.rs
Normal file
@ -0,0 +1,29 @@
|
||||
use argon2::{
|
||||
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
|
||||
Argon2,
|
||||
};
|
||||
|
||||
pub fn encrypt(password: &str) -> argon2::password_hash::Result<String> {
|
||||
let salt = SaltString::generate(&mut OsRng);
|
||||
let argon2 = Argon2::default();
|
||||
argon2
|
||||
.hash_password(password.as_bytes(), &salt)
|
||||
.map(|hash| hash.to_string())
|
||||
}
|
||||
|
||||
pub fn verify(password_hash: &str, password: &str) -> argon2::password_hash::Result<()> {
|
||||
let parsed_hash = PasswordHash::new(&password_hash)?;
|
||||
Argon2::default().verify_password(password.as_bytes(), &parsed_hash)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn check_always_random_salt() {
|
||||
let pass = "ahs9dya8tsd7fa8tsa86tT&^R%^DS^%ARS&A";
|
||||
let hash = encrypt(pass).unwrap();
|
||||
assert!(verify(hash.as_str(), pass).is_ok());
|
||||
}
|
||||
}
|
18
crates/oswilno-session/template/base.html
Normal file
18
crates/oswilno-session/template/base.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>OS Wilno</title>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<script src="/assets/build.js" type="module"></script>
|
||||
{% block head %}
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<base url="/" />
|
||||
<main>
|
||||
{% block body %}
|
||||
{% endblock %}
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
22
crates/oswilno-session/template/register/parial.html
Normal file
22
crates/oswilno-session/template/register/parial.html
Normal file
@ -0,0 +1,22 @@
|
||||
{% extends "../base.html" %}
|
||||
{% block body %}
|
||||
<section>
|
||||
<form>
|
||||
<div>
|
||||
<label for="login">Login</label>
|
||||
<input id="login" name="login" />
|
||||
</div>
|
||||
<div>
|
||||
<label for="email">E-Mail</label>
|
||||
<input id="email" name="email" type="email" />
|
||||
</div>
|
||||
<div>
|
||||
<label for="password">Password</label>
|
||||
<input id="password" name="password" type="password" />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" value="Sign Up" />
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
{% endblock %}
|
18
crates/oswilno-session/template/sign-in/partial.html
Normal file
18
crates/oswilno-session/template/sign-in/partial.html
Normal file
@ -0,0 +1,18 @@
|
||||
{% extends "../base.html" %}
|
||||
{% block body %}
|
||||
<section>
|
||||
<form>
|
||||
<div>
|
||||
<label for="login">Login</label>
|
||||
<input id="login" name="login" />
|
||||
</div>
|
||||
<div>
|
||||
<label for="password">Password</label>
|
||||
<input id="password" name="password" type="password" />
|
||||
</div>
|
||||
<div>
|
||||
<input type="submit" value="Sign In" />
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
{% endblock %}
|
7
crates/oswilno-view/Cargo.toml
Normal file
7
crates/oswilno-view/Cargo.toml
Normal file
@ -0,0 +1,7 @@
|
||||
[package]
|
||||
name = "oswilno-view"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
askama = { version = "0.12.0", features = ["serde", "with-actix-web", "comrak", "mime"] }
|
5
crates/oswilno-view/src/helpers.rs
Normal file
5
crates/oswilno-view/src/helpers.rs
Normal file
@ -0,0 +1,5 @@
|
||||
use askama::Result;
|
||||
|
||||
pub fn t(text: &str) -> Result<String> {
|
||||
Ok(text.to_string())
|
||||
}
|
91
crates/oswilno-view/src/lib.rs
Normal file
91
crates/oswilno-view/src/lib.rs
Normal file
@ -0,0 +1,91 @@
|
||||
use std::collections::HashMap;
|
||||
use std::sync::{Arc, RwLock};
|
||||
|
||||
pub mod helpers;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct TranslationStorage {
|
||||
storage: Arc<RwLock<HashMap<String, HashMap<String, Translation>>>>,
|
||||
}
|
||||
|
||||
impl TranslationStorage {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
storage: Arc::new(RwLock::new(HashMap::with_capacity(32))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn to_lang(&self, lang: &str, s: &str) -> String {
|
||||
let lock = self.storage.read().unwrap();
|
||||
let lang_storage = lock.get(lang);
|
||||
match lang_storage {
|
||||
Some(h) => h,
|
||||
_ => return s.into(),
|
||||
}
|
||||
.get(s)
|
||||
.map(|f| format!("{f}"))
|
||||
.unwrap_or_else(|| s.into())
|
||||
}
|
||||
|
||||
pub fn with_lang(&mut self, lang: &'static str) -> TranslationPusher {
|
||||
TranslationPusher {
|
||||
lang,
|
||||
storage: self.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn transform<D>(&mut self, lang: &str, from_text: &str, to_display: D)
|
||||
where
|
||||
D: std::fmt::Display + 'static + Sync + Send,
|
||||
{
|
||||
self.storage
|
||||
.write()
|
||||
.unwrap()
|
||||
.entry(lang.to_string())
|
||||
.or_insert_with(|| HashMap::with_capacity(1_000))
|
||||
.insert(
|
||||
from_text.to_string(),
|
||||
Translation::Format(Box::new(to_display)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TranslationPusher {
|
||||
lang: &'static str,
|
||||
storage: TranslationStorage,
|
||||
}
|
||||
|
||||
impl TranslationPusher {
|
||||
#[must_use]
|
||||
pub fn add(self, from_text: &str, to_text: &str) -> Self {
|
||||
self.storage
|
||||
.storage
|
||||
.write()
|
||||
.unwrap()
|
||||
.entry(self.lang.to_string())
|
||||
.or_insert_with(|| HashMap::with_capacity(1_000))
|
||||
.insert(
|
||||
from_text.to_string(),
|
||||
Translation::Simple(to_text.to_string()),
|
||||
);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn done(self) -> TranslationStorage {
|
||||
self.storage
|
||||
}
|
||||
}
|
||||
|
||||
pub enum Translation {
|
||||
Simple(String),
|
||||
Format(Box<dyn std::fmt::Display + 'static + Send + Sync>),
|
||||
}
|
||||
|
||||
impl std::fmt::Display for Translation {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
match self {
|
||||
Self::Simple(s) => f.write_str(&s),
|
||||
Self::Format(inner) => inner.fmt(f),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user