Skip to main content

openauth_core/options/
password.rs

1use std::fmt;
2use std::sync::Arc;
3
4use http::Request;
5
6use crate::db::User;
7use crate::error::OpenAuthError;
8
9/// Payload passed to password reset lifecycle callbacks.
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct PasswordResetPayload {
12    pub user: User,
13}
14
15/// Hook invoked after a password reset has updated or created the credential.
16pub trait OnPasswordReset: Send + Sync + 'static {
17    fn on_password_reset(
18        &self,
19        payload: PasswordResetPayload,
20        request: Option<&Request<Vec<u8>>>,
21    ) -> Result<(), OpenAuthError>;
22}
23
24impl<F> OnPasswordReset for F
25where
26    F: for<'a> Fn(PasswordResetPayload, Option<&'a Request<Vec<u8>>>) -> Result<(), OpenAuthError>
27        + Send
28        + Sync
29        + 'static,
30{
31    fn on_password_reset(
32        &self,
33        payload: PasswordResetPayload,
34        request: Option<&Request<Vec<u8>>>,
35    ) -> Result<(), OpenAuthError> {
36        self(payload, request)
37    }
38}
39
40/// Password policy configuration.
41#[derive(Clone)]
42pub struct PasswordOptions {
43    pub min_password_length: usize,
44    pub max_password_length: usize,
45    pub on_password_reset: Option<Arc<dyn OnPasswordReset>>,
46    pub revoke_sessions_on_password_reset: bool,
47}
48
49impl Default for PasswordOptions {
50    fn default() -> Self {
51        Self {
52            min_password_length: 8,
53            max_password_length: 128,
54            on_password_reset: None,
55            revoke_sessions_on_password_reset: false,
56        }
57    }
58}
59
60impl fmt::Debug for PasswordOptions {
61    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
62        formatter
63            .debug_struct("PasswordOptions")
64            .field("min_password_length", &self.min_password_length)
65            .field("max_password_length", &self.max_password_length)
66            .field(
67                "on_password_reset",
68                &self
69                    .on_password_reset
70                    .as_ref()
71                    .map(|_| "<on-password-reset>"),
72            )
73            .field(
74                "revoke_sessions_on_password_reset",
75                &self.revoke_sessions_on_password_reset,
76            )
77            .finish()
78    }
79}