From fbbcb4e1828495c0ca193da66101a869c49de246 Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Mon, 1 May 2023 11:58:29 +0200 Subject: [PATCH] totp: added page to verify totp token --- crates/ezidam/src/page.rs | 5 + crates/ezidam/src/routes/oauth.rs | 12 ++ crates/ezidam/src/routes/oauth/totp.rs | 143 ++++++++++++++++++ .../templates/pages/oauth/totp.html.tera | 74 +++++++++ 4 files changed, 234 insertions(+) create mode 100644 crates/ezidam/src/routes/oauth/totp.rs create mode 100644 crates/ezidam/templates/pages/oauth/totp.html.tera diff --git a/crates/ezidam/src/page.rs b/crates/ezidam/src/page.rs index 0551d24..1fec61b 100644 --- a/crates/ezidam/src/page.rs +++ b/crates/ezidam/src/page.rs @@ -28,6 +28,7 @@ pub enum Page { ForgotPassword, ResetPassword(ResetPassword), UserSecurityTotp(UserSecurityTotp), + AuthorizeTotp(AuthorizeTotp), } impl Page { @@ -52,6 +53,7 @@ impl Page { Page::ForgotPassword => "pages/forgot-password", Page::ResetPassword(_) => "pages/reset-password", Page::UserSecurityTotp(_) => "pages/settings/totp", + Page::AuthorizeTotp(_) => "pages/oauth/totp", } } @@ -76,6 +78,7 @@ impl Page { Page::ForgotPassword => "Forgot password", Page::ResetPassword(_) => "Reset password", Page::UserSecurityTotp(_) => "Enable One-time password", + Page::AuthorizeTotp(_) => "Verifying your account", } } @@ -102,6 +105,7 @@ impl Page { Page::ForgotPassword => None, Page::ResetPassword(_) => None, Page::UserSecurityTotp(_) => Some(UserMenu::Settings.into()), + Page::AuthorizeTotp(_) => None, } } @@ -126,6 +130,7 @@ impl Page { Page::ForgotPassword => Box::new(()), Page::ResetPassword(reset) => Box::new(reset), Page::UserSecurityTotp(totp) => Box::new(totp), + Page::AuthorizeTotp(totp) => Box::new(totp), } } } diff --git a/crates/ezidam/src/routes/oauth.rs b/crates/ezidam/src/routes/oauth.rs index b6a2622..2553d15 100644 --- a/crates/ezidam/src/routes/oauth.rs +++ b/crates/ezidam/src/routes/oauth.rs @@ -1,3 +1,4 @@ +use self::totp::*; use authorize::*; use redirect::*; use rocket::{routes, Route}; @@ -7,6 +8,7 @@ use userinfo::*; pub mod authorize; pub mod redirect; pub mod token; +pub mod totp; pub mod userinfo; pub fn routes() -> Vec { @@ -17,6 +19,8 @@ pub fn routes() -> Vec { redirect_page, request_token, get_userinfo, + totp_page, + totp_verify, ] } @@ -42,4 +46,12 @@ pub mod content { pub username: String, pub home_page: String, } + + #[derive(Serialize)] + #[serde(crate = "rocket::serde")] + #[derive(Clone)] + pub struct AuthorizeTotp { + pub name: Option, + pub username: String, + } } diff --git a/crates/ezidam/src/routes/oauth/totp.rs b/crates/ezidam/src/routes/oauth/totp.rs new file mode 100644 index 0000000..26655b9 --- /dev/null +++ b/crates/ezidam/src/routes/oauth/totp.rs @@ -0,0 +1,143 @@ +use crate::routes::oauth::{redirect_uri, AUTHORIZATION_CODE_LEN}; +use crate::routes::prelude::*; +use apps::App; +use authorization_codes::AuthorizationCode; +use hash::SecretString; +use rocket::http::{Cookie, CookieJar}; +use rocket::{get, post}; +use users::totp_login_request::TOTP_REQUEST_COOKIE_NAME; +use users::User; + +#[get("/oauth/totp?")] +pub async fn totp_page( + totp_request: TotpRequest, + mut db: Connection, + flash: Option>, + auth_request: AuthenticationRequest<'_>, +) -> Result