Skip to content

Commit c4ebc04

Browse files
committed
rename PublishRateLimit to RateLimiter
1 parent bd10c97 commit c4ebc04

File tree

6 files changed

+34
-28
lines changed

6 files changed

+34
-28
lines changed

src/config/server.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use anyhow::{anyhow, Context};
22
use ipnetwork::IpNetwork;
33
use oauth2::{ClientId, ClientSecret};
44

5-
use crate::publish_rate_limit::PublishRateLimit;
5+
use crate::rate_limiter::RateLimiter;
66
use crate::{env, env_optional, Env};
77

88
use super::base::Base;
@@ -30,7 +30,7 @@ pub struct Server {
3030
pub gh_client_secret: ClientSecret,
3131
pub max_upload_size: u64,
3232
pub max_unpack_size: u64,
33-
pub publish_rate_limit: PublishRateLimit,
33+
pub rate_limiter: RateLimiter,
3434
pub new_version_rate_limit: Option<u32>,
3535
pub blocked_traffic: Vec<(String, Vec<String>)>,
3636
pub max_allowed_page_offset: u32,
@@ -153,7 +153,7 @@ impl Default for Server {
153153
gh_client_secret: ClientSecret::new(env("GH_CLIENT_SECRET")),
154154
max_upload_size: 10 * 1024 * 1024, // 10 MB default file upload size limit
155155
max_unpack_size: 512 * 1024 * 1024, // 512 MB max when decompressed
156-
publish_rate_limit: Default::default(),
156+
rate_limiter: Default::default(),
157157
new_version_rate_limit: env_optional("MAX_NEW_VERSIONS_DAILY"),
158158
blocked_traffic: blocked_traffic(),
159159
max_allowed_page_offset: env_optional("WEB_MAX_ALLOWED_PAGE_OFFSET").unwrap_or(200),

src/controllers/krate/publish.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
137137
};
138138

139139
let license_file = new_crate.license_file.as_deref();
140-
let krate =
141-
persist.create_or_update(conn, user.id, Some(&app.config.publish_rate_limit))?;
140+
let krate = persist.create_or_update(conn, user.id, Some(&app.config.rate_limiter))?;
142141

143142
let owners = krate.owners(conn)?;
144143
if user.rights(&app, &owners)? < Rights::Publish {

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub mod github;
4646
pub mod headers;
4747
pub mod metrics;
4848
pub mod middleware;
49-
mod publish_rate_limit;
49+
mod rate_limiter;
5050
pub mod schema;
5151
pub mod sql;
5252
pub mod ssh;

src/models/krate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::models::{
1717
use crate::util::errors::{cargo_err, AppResult};
1818

1919
use crate::models::helpers::with_count::*;
20-
use crate::publish_rate_limit::PublishRateLimit;
20+
use crate::rate_limiter::RateLimiter;
2121
use crate::schema::*;
2222
use crate::sql::canon_crate_name;
2323

@@ -107,7 +107,7 @@ impl<'a> NewCrate<'a> {
107107
self,
108108
conn: &mut PgConnection,
109109
uploader: i32,
110-
rate_limit: Option<&PublishRateLimit>,
110+
rate_limit: Option<&RateLimiter>,
111111
) -> AppResult<Crate> {
112112
use diesel::update;
113113

src/publish_rate_limit.rs renamed to src/rate_limiter.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ crate::pg_enum! {
1515
}
1616

1717
#[derive(Debug, Clone, Copy)]
18-
pub struct PublishRateLimit {
18+
pub struct RateLimiter {
1919
pub rate: Duration,
2020
pub burst: i32,
2121
}
2222

23-
impl Default for PublishRateLimit {
23+
impl Default for RateLimiter {
2424
fn default() -> Self {
2525
let minutes = dotenvy::var("WEB_NEW_PKG_RATE_LIMIT_RATE_MINUTES")
2626
.unwrap_or_default()
@@ -39,7 +39,7 @@ impl Default for PublishRateLimit {
3939
}
4040
}
4141

42-
impl PublishRateLimit {
42+
impl RateLimiter {
4343
pub fn check_rate_limit(&self, uploader: i32, conn: &mut PgConnection) -> AppResult<()> {
4444
let bucket = self.take_token(uploader, Utc::now().naive_utc(), conn)?;
4545
if bucket.tokens >= 1 {
@@ -67,8 +67,10 @@ impl PublishRateLimit {
6767
) -> QueryResult<Bucket> {
6868
use self::publish_limit_buckets::dsl::*;
6969

70+
let performed_action = LimitedAction::PublishNew;
71+
7072
let burst: i32 = publish_rate_overrides::table
71-
.find((uploader, LimitedAction::PublishNew))
73+
.find((uploader, performed_action))
7274
.filter(
7375
publish_rate_overrides::expires_at
7476
.is_null()
@@ -88,8 +90,13 @@ impl PublishRateLimit {
8890
);
8991

9092
diesel::insert_into(publish_limit_buckets)
91-
.values((user_id.eq(uploader), tokens.eq(burst), last_refill.eq(now)))
92-
.on_conflict(user_id)
93+
.values((
94+
user_id.eq(uploader),
95+
action.eq(performed_action),
96+
tokens.eq(burst),
97+
last_refill.eq(now),
98+
))
99+
.on_conflict((user_id, action))
93100
.do_update()
94101
.set((
95102
tokens.eq(least(burst, greatest(0, tokens - 1) + tokens_to_add)),
@@ -126,7 +133,7 @@ mod tests {
126133
let conn = &mut pg_connection();
127134
let now = now();
128135

129-
let rate = PublishRateLimit {
136+
let rate = RateLimiter {
130137
rate: Duration::from_secs(1),
131138
burst: 10,
132139
};
@@ -139,7 +146,7 @@ mod tests {
139146
};
140147
assert_eq!(expected, bucket);
141148

142-
let rate = PublishRateLimit {
149+
let rate = RateLimiter {
143150
rate: Duration::from_millis(50),
144151
burst: 20,
145152
};
@@ -159,7 +166,7 @@ mod tests {
159166
let conn = &mut pg_connection();
160167
let now = now();
161168

162-
let rate = PublishRateLimit {
169+
let rate = RateLimiter {
163170
rate: Duration::from_secs(1),
164171
burst: 10,
165172
};
@@ -180,7 +187,7 @@ mod tests {
180187
let conn = &mut pg_connection();
181188
let now = now();
182189

183-
let rate = PublishRateLimit {
190+
let rate = RateLimiter {
184191
rate: Duration::from_secs(1),
185192
burst: 10,
186193
};
@@ -206,7 +213,7 @@ mod tests {
206213
NaiveDateTime::parse_from_str("2019-03-19T21:11:24.620401", "%Y-%m-%dT%H:%M:%S%.f")
207214
.unwrap();
208215

209-
let rate = PublishRateLimit {
216+
let rate = RateLimiter {
210217
rate: Duration::from_millis(100),
211218
burst: 10,
212219
};
@@ -228,7 +235,7 @@ mod tests {
228235
let conn = &mut pg_connection();
229236
let now = now();
230237

231-
let rate = PublishRateLimit {
238+
let rate = RateLimiter {
232239
rate: Duration::from_millis(100),
233240
burst: 10,
234241
};
@@ -250,7 +257,7 @@ mod tests {
250257
let conn = &mut pg_connection();
251258
let now = now();
252259

253-
let rate = PublishRateLimit {
260+
let rate = RateLimiter {
254261
rate: Duration::from_secs(1),
255262
burst: 10,
256263
};
@@ -274,7 +281,7 @@ mod tests {
274281
let conn = &mut pg_connection();
275282
let now = now();
276283

277-
let rate = PublishRateLimit {
284+
let rate = RateLimiter {
278285
rate: Duration::from_secs(1),
279286
burst: 10,
280287
};
@@ -297,7 +304,7 @@ mod tests {
297304
let conn = &mut pg_connection();
298305
let now = now();
299306

300-
let rate = PublishRateLimit {
307+
let rate = RateLimiter {
301308
rate: Duration::from_secs(1),
302309
burst: 10,
303310
};
@@ -320,7 +327,7 @@ mod tests {
320327
let conn = &mut pg_connection();
321328
let now = now();
322329

323-
let rate = PublishRateLimit {
330+
let rate = RateLimiter {
324331
rate: Duration::from_secs(1),
325332
burst: 10,
326333
};
@@ -347,7 +354,7 @@ mod tests {
347354
let conn = &mut pg_connection();
348355
let now = now();
349356

350-
let rate = PublishRateLimit {
357+
let rate = RateLimiter {
351358
rate: Duration::from_secs(1),
352359
burst: 10,
353360
};

src/tests/util/test_app.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ impl TestAppBuilder {
331331

332332
pub fn with_publish_rate_limit(self, rate: Duration, burst: i32) -> Self {
333333
self.with_config(|config| {
334-
config.publish_rate_limit.rate = rate;
335-
config.publish_rate_limit.burst = burst;
334+
config.rate_limiter.rate = rate;
335+
config.rate_limiter.burst = burst;
336336
})
337337
}
338338

@@ -396,7 +396,7 @@ fn simple_config() -> config::Server {
396396
gh_client_secret: ClientSecret::new(dotenvy::var("GH_CLIENT_SECRET").unwrap_or_default()),
397397
max_upload_size: 3000,
398398
max_unpack_size: 2000,
399-
publish_rate_limit: Default::default(),
399+
rate_limiter: Default::default(),
400400
new_version_rate_limit: Some(10),
401401
blocked_traffic: Default::default(),
402402
max_allowed_page_offset: 200,

0 commit comments

Comments
 (0)