Skip to main content

shared/settings/
ratelimits.rs

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}