1use super::{
2 ExtensionSettings, SettingsDeserializeExt, SettingsDeserializer, SettingsSerializeExt,
3 SettingsSerializer,
4};
5use garde::Validate;
6use serde::{Deserialize, Serialize};
7use utoipa::ToSchema;
8
9#[derive(Clone, Copy, Validate, ToSchema, Serialize, Deserialize)]
10pub struct RatelimitConfiguration {
11 #[garde(range(min = 1))]
12 pub hits: u64,
13 #[garde(range(min = 1))]
14 pub window_seconds: u64,
15}
16
17#[derive(Clone, ToSchema, Serialize, Deserialize)]
18pub struct AppSettingsRatelimits {
19 pub auth_register: RatelimitConfiguration,
20 pub auth_login: RatelimitConfiguration,
21 pub auth_login_checkpoint: RatelimitConfiguration,
22 pub auth_login_security_key: RatelimitConfiguration,
23 pub auth_password_forgot: RatelimitConfiguration,
24 pub auth_password_reset: RatelimitConfiguration,
25
26 pub client: RatelimitConfiguration,
27 pub client_servers_backups_create: RatelimitConfiguration,
28 pub client_servers_files_pull: RatelimitConfiguration,
29 pub client_servers_files_pull_query: RatelimitConfiguration,
30
31 pub remote: RatelimitConfiguration,
32 pub remote_sftp_auth: RatelimitConfiguration,
33}
34
35#[async_trait::async_trait]
36impl SettingsSerializeExt for AppSettingsRatelimits {
37 async fn serialize(
38 &self,
39 serializer: SettingsSerializer,
40 ) -> Result<SettingsSerializer, anyhow::Error> {
41 Ok(serializer
42 .write_serde_setting("auth_register", &self.auth_register)?
43 .write_serde_setting("auth_login", &self.auth_login)?
44 .write_serde_setting("auth_login_checkpoint", &self.auth_login_checkpoint)?
45 .write_serde_setting("auth_login_security_key", &self.auth_login_security_key)?
46 .write_serde_setting("auth_password_forgot", &self.auth_password_forgot)?
47 .write_serde_setting("auth_password_reset", &self.auth_password_reset)?
48 .write_serde_setting("client", &self.client)?
49 .write_serde_setting(
50 "client_servers_backups_create",
51 &self.client_servers_backups_create,
52 )?
53 .write_serde_setting("client_servers_files_pull", &self.client_servers_files_pull)?
54 .write_serde_setting(
55 "client_servers_files_pull_query",
56 &self.client_servers_files_pull_query,
57 )?
58 .write_serde_setting("remote", &self.remote)?
59 .write_serde_setting("remote_sftp_auth", &self.remote_sftp_auth)?)
60 }
61}
62
63pub struct AppSettingsRatelimitsDeserializer;
64
65#[async_trait::async_trait]
66impl SettingsDeserializeExt for AppSettingsRatelimitsDeserializer {
67 async fn deserialize_boxed(
68 &self,
69 deserializer: SettingsDeserializer<'_>,
70 ) -> Result<ExtensionSettings, anyhow::Error> {
71 Ok(Box::new(AppSettingsRatelimits {
72 auth_register: deserializer.read_serde_setting("auth_register").unwrap_or(
73 RatelimitConfiguration {
74 hits: 10,
75 window_seconds: 3600,
76 },
77 ),
78 auth_login: deserializer.read_serde_setting("auth_login").unwrap_or(
79 RatelimitConfiguration {
80 hits: 20,
81 window_seconds: 300,
82 },
83 ),
84 auth_login_checkpoint: deserializer
85 .read_serde_setting("auth_login_checkpoint")
86 .unwrap_or(RatelimitConfiguration {
87 hits: 10,
88 window_seconds: 300,
89 }),
90 auth_login_security_key: deserializer
91 .read_serde_setting("auth_login_security_key")
92 .unwrap_or(RatelimitConfiguration {
93 hits: 10,
94 window_seconds: 300,
95 }),
96 auth_password_forgot: deserializer
97 .read_serde_setting("auth_password_forgot")
98 .unwrap_or(RatelimitConfiguration {
99 hits: 10,
100 window_seconds: 3600,
101 }),
102 auth_password_reset: deserializer
103 .read_serde_setting("auth_password_reset")
104 .unwrap_or(RatelimitConfiguration {
105 hits: 10,
106 window_seconds: 300,
107 }),
108 client: deserializer
109 .read_serde_setting("client")
110 .unwrap_or(RatelimitConfiguration {
111 hits: 360,
112 window_seconds: 30,
113 }),
114 client_servers_backups_create: deserializer
115 .read_serde_setting("client_servers_backups_create")
116 .unwrap_or(RatelimitConfiguration {
117 hits: 4,
118 window_seconds: 300,
119 }),
120 client_servers_files_pull: deserializer
121 .read_serde_setting("client_servers_files_pull")
122 .unwrap_or(RatelimitConfiguration {
123 hits: 5,
124 window_seconds: 60,
125 }),
126 client_servers_files_pull_query: deserializer
127 .read_serde_setting("client_servers_files_pull_query")
128 .unwrap_or(RatelimitConfiguration {
129 hits: 10,
130 window_seconds: 60,
131 }),
132 remote: deserializer
133 .read_serde_setting("remote")
134 .unwrap_or(RatelimitConfiguration {
135 hits: 720,
136 window_seconds: 30,
137 }),
138 remote_sftp_auth: deserializer
139 .read_serde_setting("remote_sftp_auth")
140 .unwrap_or(RatelimitConfiguration {
141 hits: 60,
142 window_seconds: 30,
143 }),
144 }))
145 }
146}