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
25    pub client: RatelimitConfiguration,
26
27    pub client_servers_backups_create: RatelimitConfiguration,
28    pub client_servers_files_pull: RatelimitConfiguration,
29    pub client_servers_files_pull_query: RatelimitConfiguration,
30}
31
32#[async_trait::async_trait]
33impl SettingsSerializeExt for AppSettingsRatelimits {
34    async fn serialize(
35        &self,
36        serializer: SettingsSerializer,
37    ) -> Result<SettingsSerializer, anyhow::Error> {
38        Ok(serializer
39            .write_serde_setting("auth_register", &self.auth_register)?
40            .write_serde_setting("auth_login", &self.auth_login)?
41            .write_serde_setting("auth_login_checkpoint", &self.auth_login_checkpoint)?
42            .write_serde_setting("auth_login_security_key", &self.auth_login_security_key)?
43            .write_serde_setting("auth_password_forgot", &self.auth_password_forgot)?
44            .write_serde_setting("client", &self.client)?
45            .write_serde_setting(
46                "client_servers_backups_create",
47                &self.client_servers_backups_create,
48            )?
49            .write_serde_setting("client_servers_files_pull", &self.client_servers_files_pull)?
50            .write_serde_setting(
51                "client_servers_files_pull_query",
52                &self.client_servers_files_pull_query,
53            )?)
54    }
55}
56
57pub struct AppSettingsRatelimitsDeserializer;
58
59#[async_trait::async_trait]
60impl SettingsDeserializeExt for AppSettingsRatelimitsDeserializer {
61    async fn deserialize_boxed(
62        &self,
63        deserializer: SettingsDeserializer<'_>,
64    ) -> Result<ExtensionSettings, anyhow::Error> {
65        Ok(Box::new(AppSettingsRatelimits {
66            auth_register: deserializer.read_serde_setting("auth_register").unwrap_or(
67                RatelimitConfiguration {
68                    hits: 10,
69                    window_seconds: 3600,
70                },
71            ),
72            auth_login: deserializer.read_serde_setting("auth_login").unwrap_or(
73                RatelimitConfiguration {
74                    hits: 20,
75                    window_seconds: 300,
76                },
77            ),
78            auth_login_checkpoint: deserializer
79                .read_serde_setting("auth_login_checkpoint")
80                .unwrap_or(RatelimitConfiguration {
81                    hits: 10,
82                    window_seconds: 300,
83                }),
84            auth_login_security_key: deserializer
85                .read_serde_setting("auth_login_security_key")
86                .unwrap_or(RatelimitConfiguration {
87                    hits: 10,
88                    window_seconds: 300,
89                }),
90            auth_password_forgot: deserializer
91                .read_serde_setting("auth_password_forgot")
92                .unwrap_or(RatelimitConfiguration {
93                    hits: 10,
94                    window_seconds: 3600,
95                }),
96            client: deserializer
97                .read_serde_setting("client")
98                .unwrap_or(RatelimitConfiguration {
99                    hits: 360,
100                    window_seconds: 60,
101                }),
102            client_servers_backups_create: deserializer
103                .read_serde_setting("client_servers_backups_create")
104                .unwrap_or(RatelimitConfiguration {
105                    hits: 4,
106                    window_seconds: 300,
107                }),
108            client_servers_files_pull: deserializer
109                .read_serde_setting("client_servers_files_pull")
110                .unwrap_or(RatelimitConfiguration {
111                    hits: 5,
112                    window_seconds: 60,
113                }),
114            client_servers_files_pull_query: deserializer
115                .read_serde_setting("client_servers_files_pull_query")
116                .unwrap_or(RatelimitConfiguration {
117                    hits: 10,
118                    window_seconds: 60,
119                }),
120        }))
121    }
122}