shared/settings/
ratelimits.rs1use 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}