feat(users): add endpoint to check 2fa status (#4810)

This commit is contained in:
Apoorv Dixit
2024-05-29 19:00:08 +05:30
committed by GitHub
parent e410eba6ed
commit 0f7f3d9e74
7 changed files with 45 additions and 3 deletions

View File

@ -16,8 +16,9 @@ use crate::user::{
GetUserRoleDetailsResponse, InviteUserRequest, ListUsersResponse, ReInviteUserRequest, GetUserRoleDetailsResponse, InviteUserRequest, ListUsersResponse, ReInviteUserRequest,
RecoveryCodes, ResetPasswordRequest, RotatePasswordRequest, SendVerifyEmailRequest, RecoveryCodes, ResetPasswordRequest, RotatePasswordRequest, SendVerifyEmailRequest,
SignInResponse, SignUpRequest, SignUpWithMerchantIdRequest, SwitchMerchantIdRequest, SignInResponse, SignUpRequest, SignUpWithMerchantIdRequest, SwitchMerchantIdRequest,
TokenOrPayloadResponse, TokenResponse, UpdateUserAccountDetailsRequest, UserFromEmailRequest, TokenOrPayloadResponse, TokenResponse, TwoFactorAuthStatusResponse,
UserMerchantCreate, VerifyEmailRequest, VerifyRecoveryCodeRequest, VerifyTotpRequest, UpdateUserAccountDetailsRequest, UserFromEmailRequest, UserMerchantCreate, VerifyEmailRequest,
VerifyRecoveryCodeRequest, VerifyTotpRequest,
}; };
impl ApiEventMetric for DashboardEntryResponse { impl ApiEventMetric for DashboardEntryResponse {
@ -73,6 +74,7 @@ common_utils::impl_misc_api_event_type!(
GetUserRoleDetailsRequest, GetUserRoleDetailsRequest,
GetUserRoleDetailsResponse, GetUserRoleDetailsResponse,
TokenResponse, TokenResponse,
TwoFactorAuthStatusResponse,
UserFromEmailRequest, UserFromEmailRequest,
BeginTotpResponse, BeginTotpResponse,
VerifyRecoveryCodeRequest, VerifyRecoveryCodeRequest,

View File

@ -235,6 +235,12 @@ pub struct TokenResponse {
pub token_type: TokenPurpose, pub token_type: TokenPurpose,
} }
#[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct TwoFactorAuthStatusResponse {
pub totp: bool,
pub recovery_code: bool,
}
#[derive(Debug, serde::Serialize)] #[derive(Debug, serde::Serialize)]
#[serde(untagged)] #[serde(untagged)]
pub enum TokenOrPayloadResponse<T> { pub enum TokenOrPayloadResponse<T> {

View File

@ -1874,3 +1874,16 @@ pub async fn terminate_two_factor_auth(
token, token,
) )
} }
pub async fn check_two_factor_auth_status(
state: AppState,
user_token: auth::UserFromToken,
) -> UserResponse<user_api::TwoFactorAuthStatusResponse> {
Ok(ApplicationResponse::Json(
user_api::TwoFactorAuthStatusResponse {
totp: tfa_utils::check_totp_in_redis(&state, &user_token.user_id).await?,
recovery_code: tfa_utils::check_recovery_code_in_redis(&state, &user_token.user_id)
.await?,
},
))
}

View File

@ -1214,6 +1214,7 @@ impl User {
// Two factor auth routes // Two factor auth routes
route = route.service( route = route.service(
web::scope("/2fa") web::scope("/2fa")
.service(web::resource("").route(web::get().to(check_two_factor_auth_status)))
.service( .service(
web::scope("/totp") web::scope("/totp")
.service(web::resource("/begin").route(web::get().to(totp_begin))) .service(web::resource("/begin").route(web::get().to(totp_begin)))

View File

@ -218,7 +218,8 @@ impl From<Flow> for ApiIdentifier {
| Flow::TotpUpdate | Flow::TotpUpdate
| Flow::RecoveryCodeVerify | Flow::RecoveryCodeVerify
| Flow::RecoveryCodesGenerate | Flow::RecoveryCodesGenerate
| Flow::TerminateTwoFactorAuth => Self::User, | Flow::TerminateTwoFactorAuth
| Flow::TwoFactorAuthStatus => Self::User,
Flow::ListRoles Flow::ListRoles
| Flow::GetRole | Flow::GetRole

View File

@ -735,3 +735,20 @@ pub async fn terminate_two_factor_auth(
)) ))
.await .await
} }
pub async fn check_two_factor_auth_status(
state: web::Data<AppState>,
req: HttpRequest,
) -> HttpResponse {
let flow = Flow::TwoFactorAuthStatus;
Box::pin(api::server_wrap(
flow,
state.clone(),
&req,
(),
|state, user, _, _| user_core::check_two_factor_auth_status(state, user),
&auth::DashboardNoPermissionAuth,
api_locking::LockAction::NotApplicable,
))
.await
}

View File

@ -414,6 +414,8 @@ pub enum Flow {
RecoveryCodesGenerate, RecoveryCodesGenerate,
// Terminate two factor authentication // Terminate two factor authentication
TerminateTwoFactorAuth, TerminateTwoFactorAuth,
// Check 2FA status
TwoFactorAuthStatus,
/// List initial webhook delivery attempts /// List initial webhook delivery attempts
WebhookEventInitialDeliveryAttemptList, WebhookEventInitialDeliveryAttemptList,
/// List delivery attempts for a webhook event /// List delivery attempts for a webhook event