Login
No account yet?
Sign up
● ● ●
// Manual form — no model, no clean
pub struct LoginForm {
pub form: Forms,
}
impl RuniqueForm for LoginForm {
fn register_fields(form: &mut Forms) {
form.field(
&TextField::text("username")
.label("Username")
.required(),
);
form.field(
&TextField::password("password")
.label("Password")
.required(),
);
}
impl_form_access!();
}
pub async fn login(mut request: Request) -> AppResult<Response> {
let form: LoginForm = request.form();
let validated = match ValidationForm::try_new(form, &request).await {
Ok(validated) => validated,
Err(form) => {
context_update!(request => { "login_form" => &form });
return request.render("auth/login.html");
}
};
let username = validated.cleaned_string("username").unwrap_or_default();
let password = validated.cleaned_string("password").unwrap_or_default();
// Checks the password even for an unknown username (no timing difference)
// and refuses inactive or not yet activated accounts.
if let Some(user) = authenticate_user(&request.engine.db, &username, &password).await
&& login(&request.session, &user, None, false).await.is_ok()
{
return Ok(Redirect::to("/profile").into_response());
}
context_update!(request => {
"login_form" => &*validated,
"messages" => flash_now!(error => "Invalid credentials"),
});
request.render("auth/login.html")
}