openauth_core/options/
password.rs1use std::fmt;
2use std::sync::Arc;
3
4use http::Request;
5
6use crate::db::User;
7use crate::error::OpenAuthError;
8
9#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct PasswordResetPayload {
12 pub user: User,
13}
14
15pub 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#[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}