From 2dcee5cff0c1d9c6d9956b61f9c541599302405b Mon Sep 17 00:00:00 2001 From: xystrive Date: Thu, 4 Jul 2024 17:58:46 +0100 Subject: [PATCH] feat: add Request/Response and other necessary objects for MFA implementation --- src/types/entities/mfa_token.rs | 7 ++++ src/types/entities/mod.rs | 2 ++ src/types/schema/mfa.rs | 62 +++++++++++++++++++++++++++++++++ src/types/schema/mod.rs | 2 ++ 4 files changed, 73 insertions(+) create mode 100644 src/types/entities/mfa_token.rs create mode 100644 src/types/schema/mfa.rs diff --git a/src/types/entities/mfa_token.rs b/src/types/entities/mfa_token.rs new file mode 100644 index 0000000..1c2a3e8 --- /dev/null +++ b/src/types/entities/mfa_token.rs @@ -0,0 +1,7 @@ +use chrono::{DateTime, Utc}; + +#[derive(Debug, Clone)] +pub struct MfaToken { + pub token: String, + pub expires_at: DateTime, +} diff --git a/src/types/entities/mod.rs b/src/types/entities/mod.rs index 4227e24..cd343c8 100644 --- a/src/types/entities/mod.rs +++ b/src/types/entities/mod.rs @@ -26,6 +26,7 @@ pub use user::*; pub use user_settings::*; pub use voice_state::*; pub use webhook::*; +pub use mfa_token::*; use crate::types::Shared; #[cfg(feature = "client")] @@ -67,6 +68,7 @@ mod user; mod user_settings; mod voice_state; mod webhook; +mod mfa_token; #[cfg(feature = "client")] #[async_trait(?Send)] diff --git a/src/types/schema/mfa.rs b/src/types/schema/mfa.rs new file mode 100644 index 0000000..10709cf --- /dev/null +++ b/src/types/schema/mfa.rs @@ -0,0 +1,62 @@ +use std::fmt::Display; + +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "snake_case")] +pub struct MfaRequiredSchema { + pub message: String, + pub code: i32, + pub mfa: MfaVerificationSchema, +} + +impl Display for MfaRequiredSchema { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("MfaRequired") + .field("message", &self.message) + .field("code", &self.code) + .field("mfa", &self.mfa) + .finish() + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "snake_case")] +pub struct MfaVerificationSchema { + pub ticket: String, + pub methods: Vec +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "snake_case")] +pub struct MfaMethod { + #[serde(rename = "type")] + pub kind: MfaType, + #[serde(skip_serializing_if = "Option::is_none")] + pub challenge: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub backup_codes_allowed: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "snake_case")] +pub enum MfaType { + TOTP, + SMS, + Backup, + WebAuthn, + Password, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub struct MfaVerifySchema { + pub ticket: String, + pub mfa_type: MfaType, + pub data: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MfaTokenSchema { + pub token: String, +} diff --git a/src/types/schema/mod.rs b/src/types/schema/mod.rs index ef3233d..b2cb80f 100644 --- a/src/types/schema/mod.rs +++ b/src/types/schema/mod.rs @@ -4,6 +4,7 @@ pub use apierror::*; pub use auth::*; +pub use mfa::*; pub use channel::*; pub use guild::*; pub use message::*; @@ -14,6 +15,7 @@ pub use invites::*; mod apierror; mod auth; +mod mfa; mod channel; mod guild; mod message;