Login

Please log in to access your profile.
← Back to home
● ● ●
// 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")
}