user page + passwd

This commit is contained in:
JMARyA 2025-02-23 23:11:08 +01:00
parent f91b4ed6da
commit 240d6cd5ce
Signed by: jmarya
GPG key ID: 901B2ADDF27C2263
4 changed files with 157 additions and 42 deletions

60
Cargo.lock generated
View file

@ -251,9 +251,9 @@ checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
[[package]]
name = "cc"
version = "1.2.14"
version = "1.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9"
checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af"
dependencies = [
"shlex",
]
@ -1160,9 +1160,9 @@ checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
[[package]]
name = "inout"
version = "0.1.3"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
dependencies = [
"generic-array",
]
@ -1211,9 +1211,9 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.169"
version = "0.2.170"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
[[package]]
name = "libm"
@ -1255,9 +1255,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.25"
version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
[[package]]
name = "loom"
@ -1329,9 +1329,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "miniz_oxide"
version = "0.8.4"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
dependencies = [
"adler2",
]
@ -1368,9 +1368,9 @@ dependencies = [
[[package]]
name = "native-tls"
version = "0.2.13"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c"
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
dependencies = [
"libc",
"log",
@ -1748,9 +1748,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.8"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f"
dependencies = [
"bitflags 2.8.0",
]
@ -2088,18 +2088,18 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.217"
version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.217"
version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [
"proc-macro2",
"quote",
@ -2108,9 +2108,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.138"
version = "1.0.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
dependencies = [
"itoa",
"memchr",
@ -2536,9 +2536,9 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.16.0"
version = "3.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91"
checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
dependencies = [
"cfg-if",
"fastrand",
@ -2816,9 +2816,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "typenum"
version = "1.17.0"
version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]]
name = "ubyte"
@ -2863,9 +2863,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
[[package]]
name = "unicode-ident"
version = "1.0.16"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]]
name = "unicode-normalization"
@ -2919,9 +2919,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.13.1"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0"
checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1"
dependencies = [
"getrandom 0.3.1",
"serde",
@ -3303,9 +3303,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.7.2"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603"
checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1"
dependencies = [
"memchr",
]

View file

@ -79,7 +79,10 @@ async fn launch() -> _ {
pages::user::login_post,
pages::user::history_page,
pages::index::latest_page,
pages::index::latest_api
pages::index::latest_api,
pages::user::account,
pages::user::change_password,
pages::user::change_password_post
],
)
.attach(cors)

View file

@ -1,8 +1,8 @@
use crate::library::Video;
use based::ui::components::prelude::Avatar;
use based::ui::components::prelude::*;
use based::ui::components::{AppBar, Card, NavBar, Shell};
use based::ui::primitives::flex::Column;
use based::ui::components::{NavBar, Shell};
use based::ui::primitives::flex::Row;
use based::ui::primitives::Optional;
use based::ui::wrapper::HoverWrapper;
use based::ui::{prelude::*, UIWidget};
@ -33,12 +33,28 @@ pub async fn render_page(
// TODO : profile pictures
DropDown(
Avatar("", &user.username).use_initials(),
DropdownMenu(vec![DropdownMenuEntry(
"/history",
Padding(Text("Video History").medium())
.x(ScreenValue::_4)
.y(ScreenValue::_2),
)]),
DropdownMenu(vec![
DropdownMenuEntry(
"/account",
Row(vec![
MaterialIcon("account_circle"),
Text("Account").medium().render(),
])
.gap(ScreenValue::_2)
.items_center()
.justify(Justify::Start),
),
DropdownMenuEntry(
"/history",
Row(vec![
MaterialIcon("history"),
Text("Video History").medium().render(),
])
.gap(ScreenValue::_2)
.items_center()
.justify(Justify::Start),
),
]),
)
}))
.no_dropdown(),

View file

@ -1,10 +1,13 @@
use based::auth::csrf::CSRF;
use based::auth::{Sessions, User};
use based::page;
use based::request::StringResponse;
use based::ui::components::{Card, Shell};
use based::ui::prelude::*;
use based::ui::components::prelude::Avatar;
use based::ui::components::{prelude::*, Shell};
use based::ui::primitives::flex::Row;
use based::ui::{prelude::*, AttrExtendable};
use based::{auth::MaybeUser, request::RequestContext};
use maud::{html, Render};
use maud::{html, PreEscaped, Render};
use rocket::http::CookieJar;
use rocket::State;
use rocket::{form::Form, get, http::Cookie, post, response::Redirect, FromForm};
@ -82,3 +85,96 @@ pub async fn history_page(ctx: RequestContext, user: User, shell: &State<Shell>)
render_page(&shell, ctx, content, "History", Some(user)).await
}
#[get("/account")]
pub async fn account(ctx: RequestContext, user: User, shell: &State<Shell>) -> StringResponse {
let content = Width(
ScreenValue::fit,
Margin(
Div()
.push(
Row(vec![
Avatar("", &user.username).render(),
Text(&user.username)._2xl().bold().render(),
])
.gap(ScreenValue::_2),
)
.push(Link("/passwd", Button(Text("Change Password")))),
)
.top(ScreenValue::_8)
.x(ScreenValue::auto),
)
.render();
render_page(&shell, ctx, content, "Account", Some(user)).await
}
#[derive(FromForm)]
pub struct PasswordChangeForm {
password_old: String,
password_new: String,
password_new_repeat: String,
csrf: String,
}
#[post("/passwd", data = "<form>")]
pub async fn change_password_post(form: Form<PasswordChangeForm>, user: User) -> Redirect {
if form.password_new != form.password_new_repeat {
return Redirect::to("/passwd");
}
if !user.verify_csrf(&form.csrf).await {
return Redirect::to("/passwd");
}
user.passwd(&form.password_old, &form.password_new)
.await
.unwrap();
Redirect::to("/account")
}
#[get("/passwd")]
pub async fn change_password(
ctx: RequestContext,
user: User,
shell: &State<Shell>,
) -> StringResponse {
let csrf = user.get_csrf().await.to_string();
let form = based::ui::primitives::input::Form::new("/passwd")
.method(FormMethod::POST)
.add_input(
Margin(
Text("Change Password")
._2xl()
.bold()
.align(TextAlignment::Center),
)
.bottom(ScreenValue::_6),
)
.add_input(
TextInput("password_old")
.password()
.placeholder("Old Password")
.required(),
)
.add_input(
TextInput("password_new")
.password()
.placeholder("New Password")
.required(),
)
.add_input(
TextInput("password_new_repeat")
.password()
.placeholder("Repeat new password")
.required(),
)
.add_input(FormSubmitButton("Change"))
.add_input(HiddenInput("csrf", &csrf).add_attr("class", "csrf"))
.render();
let content = Div().vanish().push(form).render();
render_page(&shell, ctx, content, "Change Password", Some(user)).await
}