Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 22 additions & 20 deletions src/controllers/krate/publish.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,25 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
(existing_crate, auth)
};

let verified_email_address = auth.user().async_verified_email(&mut conn).await?;
let verified_email_address = verified_email_address.ok_or_else(|| {
bad_request(format!(
"A verified email address is required to publish crates to crates.io. \
Visit https://{}/settings/profile to set and verify your email address.",
app.config.domain_name,
))
})?;

// Use a different rate limit whether this is a new or an existing crate.
let rate_limit_action = match existing_crate {
Some(_) => LimitedAction::PublishUpdate,
None => LimitedAction::PublishNew,
};

app.rate_limiter
.check_rate_limit(auth.user().id, rate_limit_action, &mut conn)
.await?;

spawn_blocking(move || {
use diesel::RunQueryDsl;

Expand All @@ -132,23 +151,6 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
let api_token_id = auth.api_token_id();
let user = auth.user();

let verified_email_address = user.verified_email(conn)?;
let verified_email_address = verified_email_address.ok_or_else(|| {
bad_request(format!(
"A verified email address is required to publish crates to crates.io. \
Visit https://{}/settings/profile to set and verify your email address.",
app.config.domain_name,
))
})?;

// Use a different rate limit whether this is a new or an existing crate.
let rate_limit_action = match existing_crate {
Some(_) => LimitedAction::PublishUpdate,
None => LimitedAction::PublishNew,
};
app.rate_limiter
.check_rate_limit(user.id, rate_limit_action, conn)?;

let content_length = tarball_bytes.len() as u64;

let maximums = Maximums::new(
Expand Down Expand Up @@ -226,7 +228,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
validate_url(homepage.as_deref(), "homepage")?;
validate_url(documentation.as_deref(), "documentation")?;
validate_url(repository.as_deref(), "repository")?;
if let Some(ref rust_version) = rust_version {
if let Some(ref rust_version) = rust_version {
validate_rust_version(rust_version)?;
}

Expand Down Expand Up @@ -495,7 +497,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
repository,
pkg_path_in_vcs,
)
.enqueue(conn)?;
.enqueue(conn)?;
}
}

Expand Down Expand Up @@ -556,7 +558,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
}))
})
})
.await
.await
}

/// Counts the number of versions for `crate_id` that were published within
Expand Down
10 changes: 6 additions & 4 deletions src/controllers/version/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,12 @@ pub async fn update(
let (mut version, krate) = version_and_crate(&mut conn, &crate_name, &version).await?;
validate_yank_update(&update_request.version, &version)?;
let auth = authenticate(&req, &mut conn, &krate.name).await?;

state
.rate_limiter
.check_rate_limit(auth.user_id(), LimitedAction::YankUnyank, &mut conn)
.await?;

spawn_blocking(move || {
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();

Expand Down Expand Up @@ -192,10 +198,6 @@ pub fn perform_version_yank_update(
) -> AppResult<()> {
use diesel::RunQueryDsl;

state
.rate_limiter
.check_rate_limit(auth.user_id(), LimitedAction::YankUnyank, conn)?;

let api_token_id = auth.api_token_id();
let user = auth.user();
let owners = krate.owners(conn)?;
Expand Down
7 changes: 7 additions & 0 deletions src/controllers/version/yank.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use super::metadata::{authenticate, perform_version_yank_update};
use super::version_and_crate;
use crate::app::AppState;
use crate::controllers::helpers::ok_true;
use crate::rate_limiter::LimitedAction;
use crate::tasks::spawn_blocking;
use crate::util::errors::{version_not_found, AppResult};
use axum::extract::Path;
Expand Down Expand Up @@ -55,6 +56,12 @@ async fn modify_yank(
let mut conn = state.db_write().await?;
let (mut version, krate) = version_and_crate(&mut conn, &crate_name, &version).await?;
let auth = authenticate(&req, &mut conn, &crate_name).await?;

state
.rate_limiter
.check_rate_limit(auth.user_id(), LimitedAction::YankUnyank, &mut conn)
.await?;

spawn_blocking(move || {
let conn: &mut AsyncConnectionWrapper<_> = &mut conn.into();
perform_version_yank_update(
Expand Down
Loading