aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/account/mod.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-20 00:50:20 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-20 00:50:20 +0100
commit46c251655db7bb3d9aa814b1a5dde85336b0b9b1 (patch)
treeab0696f2c92e8854ce6aa0737877cc15184bd8b6 /server/src/routes/ui/account/mod.rs
parent1c37d32a0985ff7390313833345b9299f9f0b196 (diff)
downloadjellything-46c251655db7bb3d9aa814b1a5dde85336b0b9b1.tar
jellything-46c251655db7bb3d9aa814b1a5dde85336b0b9b1.tar.bz2
jellything-46c251655db7bb3d9aa814b1a5dde85336b0b9b1.tar.zst
replace sled with redb
Diffstat (limited to 'server/src/routes/ui/account/mod.rs')
-rw-r--r--server/src/routes/ui/account/mod.rs71
1 files changed, 40 insertions, 31 deletions
diff --git a/server/src/routes/ui/account/mod.rs b/server/src/routes/ui/account/mod.rs
index cd8695f..8af92a0 100644
--- a/server/src/routes/ui/account/mod.rs
+++ b/server/src/routes/ui/account/mod.rs
@@ -8,7 +8,7 @@ pub mod settings;
use super::{error::MyError, layout::LayoutPage};
use crate::{
- database::Database,
+ database::DataAcid,
routes::ui::{
account::session::Session, error::MyResult, home::rocket_uri_macro_r_home,
layout::DynLayoutPage,
@@ -18,7 +18,10 @@ use crate::{
use anyhow::anyhow;
use argon2::{password_hash::Salt, Argon2, PasswordHasher};
use chrono::Duration;
-use jellybase::CONF;
+use jellybase::{
+ database::{Ser, TableExt, T_INVITE, T_USER},
+ CONF,
+};
use jellycommon::user::{PermissionSet, Theme, User, UserPermission};
use rocket::{
form::{Contextual, Form},
@@ -121,7 +124,7 @@ pub fn r_account_logout() -> DynLayoutPage<'static> {
#[post("/account/register", data = "<form>")]
pub fn r_account_register_post<'a>(
- database: &'a State<Database>,
+ database: &'a State<DataAcid>,
_sess: Option<Session>,
form: Form<Contextual<'a, RegisterForm>>,
) -> MyResult<DynLayoutPage<'a>> {
@@ -131,15 +134,17 @@ pub fn r_account_register_post<'a>(
None => return Err(format_form_error(form)),
};
- if database.invite.remove(&form.invitation).unwrap().is_none() {
- return Err(MyError(anyhow!("invitation invalid")));
+ let txn = database.begin_write()?;
+ let mut invites = txn.open_table(T_INVITE)?;
+ let mut users = txn.open_table(T_USER)?;
+
+ if invites.remove(&*form.invitation)?.is_none() {
+ Err(anyhow!("invitation invalid"))?;
}
- match database
- .user
- .compare_and_swap(
- &form.username,
- None,
- Some(&User {
+ let prev_user = users
+ .insert(
+ &*form.username,
+ Ser(User {
display_name: form.username.clone(),
name: form.username.clone(),
password: hash_password(&form.username, &form.password),
@@ -147,27 +152,32 @@ pub fn r_account_register_post<'a>(
theme: Theme::Dark,
permissions: PermissionSet::default(),
}),
- )
- .unwrap()
- {
- Ok(_) => Ok(LayoutPage {
- title: "Registration successful".to_string(),
- content: markup::new! {
- h1 { @if logged_in {
- "Registration successful, you may switch account now."
- } else {
- "Registration successful, you may log in now."
- }}
- },
- ..Default::default()
- }),
- Err(_) => Err(MyError(anyhow!("username is taken"))),
+ )?
+ .map(|x| x.value().0);
+ if prev_user.is_some() {
+ Err(anyhow!("username taken"))?;
}
+
+ drop(users);
+ drop(invites);
+ txn.commit()?;
+
+ Ok(LayoutPage {
+ title: "Registration successful".to_string(),
+ content: markup::new! {
+ h1 { @if logged_in {
+ "Registration successful, you may switch account now."
+ } else {
+ "Registration successful, you may log in now."
+ }}
+ },
+ ..Default::default()
+ })
}
#[post("/account/login", data = "<form>")]
pub fn r_account_login_post(
- database: &State<Database>,
+ database: &State<DataAcid>,
jar: &CookieJar,
form: Form<Contextual<LoginForm>>,
) -> MyResult<Redirect> {
@@ -194,7 +204,7 @@ pub fn r_account_logout_post(jar: &CookieJar) -> MyResult<Redirect> {
}
pub fn login_logic(
- database: &Database,
+ database: &DataAcid,
username: &str,
password: &str,
expire: Option<i64>,
@@ -203,9 +213,8 @@ pub fn login_logic(
// hashing the password regardless if the accounts exists to prevent timing attacks
let password = hash_password(username, password);
- let mut user = database
- .user
- .get(&username.to_string())?
+ let mut user = T_USER
+ .get(database, username)?
.ok_or(anyhow!("invalid password"))?;
if user.password != password {