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
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ version = "0.0.0"
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-lang/crates.io"
description = "Backend of crates.io"
edition = "2021"
edition = "2024"
default-run = "server"

[workspace]
Expand Down
6 changes: 3 additions & 3 deletions src/app.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! Application-wide components in a struct accessible from each request

use crate::config;
use crate::db::{connection_url, make_manager_config, ConnectionConfig};
use crate::db::{ConnectionConfig, connection_url, make_manager_config};
use std::sync::Arc;

use crate::email::Emails;
Expand All @@ -12,9 +12,9 @@ use axum::extract::{FromRef, FromRequestParts, State};
use crates_io_github::GitHubClient;
use deadpool_diesel::Runtime;
use derive_more::Deref;
use diesel_async::pooled_connection::deadpool::Pool as DeadpoolPool;
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
use diesel_async::AsyncPgConnection;
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
use diesel_async::pooled_connection::deadpool::Pool as DeadpoolPool;
use oauth2::basic::BasicClient;
use oauth2::{EndpointNotSet, EndpointSet};

Expand Down
2 changes: 1 addition & 1 deletion src/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use crate::middleware::log_request::RequestLogExt;
use crate::models::token::{CrateScope, EndpointScope};
use crate::models::{ApiToken, User};
use crate::util::errors::{
account_locked, forbidden, internal, AppResult, InsecurelyGeneratedTokenRevoked,
AppResult, InsecurelyGeneratedTokenRevoked, account_locked, forbidden, internal,
};
use crate::util::token::HashedToken;
use chrono::Utc;
Expand Down
4 changes: 2 additions & 2 deletions src/bin/background-worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ use crates_io::db::make_manager_config;
use crates_io::fastly::Fastly;
use crates_io::storage::Storage;
use crates_io::worker::{Environment, RunnerExt};
use crates_io::{config, Emails};
use crates_io::{Emails, config};
use crates_io::{db, ssh};
use crates_io_env_vars::var;
use crates_io_index::RepositoryConfig;
use crates_io_team_repo::TeamRepoImpl;
use crates_io_worker::Runner;
use diesel_async::pooled_connection::deadpool::Pool;
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
use diesel_async::pooled_connection::deadpool::Pool;
use object_store::prefix::PrefixStore;
use reqwest::Client;
use secrecy::ExposeSecret;
Expand Down
2 changes: 1 addition & 1 deletion src/bin/crates-admin/dialoguer.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use ::dialoguer::{theme::Theme, Confirm};
use ::dialoguer::{Confirm, theme::Theme};
use crates_io::tasks::spawn_blocking;

pub async fn confirm(msg: impl Into<String>) -> anyhow::Result<bool> {
Expand Down
6 changes: 3 additions & 3 deletions src/bin/crates-admin/migrate.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use anyhow::{anyhow, Context, Error};
use anyhow::{Context, Error, anyhow};
use crates_io::tasks::spawn_blocking;
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
use diesel_async::AsyncPgConnection;
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
use diesel_migrations::{
embed_migrations, EmbeddedMigrations, HarnessWithOutput, MigrationHarness,
EmbeddedMigrations, HarnessWithOutput, MigrationHarness, embed_migrations,
};

static CATEGORIES_TOML: &str = include_str!("../../boot/categories.toml");
Expand Down
4 changes: 2 additions & 2 deletions src/bin/crates-admin/render_readmes.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use anyhow::{anyhow, Context};
use anyhow::{Context, anyhow};
use crates_io::db;
use crates_io::models::Version;
use crates_io::schema::{crates, readme_renderings, versions};
Expand All @@ -17,7 +17,7 @@ use crates_io_tarball::{Manifest, StringOrBool};
use diesel::prelude::*;
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
use diesel_async::{AsyncPgConnection, RunQueryDsl};
use reqwest::{header, Client};
use reqwest::{Client, header};
use std::str::FromStr;
use tokio_tar::{self, Archive};

Expand Down
14 changes: 8 additions & 6 deletions src/bin/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
extern crate tracing;

use crates_io::middleware::normalize_path::normalize_path;
use crates_io::{metrics::LogEncoder, App, Emails};
use crates_io::{App, Emails, metrics::LogEncoder};
use std::{sync::Arc, time::Duration};

use axum::ServiceExt;
Expand All @@ -12,7 +12,7 @@ use reqwest::Client;
use std::io::Write;
use std::net::SocketAddr;
use tokio::net::TcpListener;
use tokio::signal::unix::{signal, SignalKind};
use tokio::signal::unix::{SignalKind, signal};
use tower::Layer;

const CORE_THREADS: usize = 4;
Expand Down Expand Up @@ -106,11 +106,13 @@ fn log_instance_metrics_thread(app: Arc<App>) {
None => return,
};

std::thread::spawn(move || loop {
if let Err(err) = log_instance_metrics_inner(&app) {
error!(?err, "log_instance_metrics error");
std::thread::spawn(move || {
loop {
if let Err(err) = log_instance_metrics_inner(&app) {
error!(?err, "log_instance_metrics error");
}
std::thread::sleep(interval);
}
std::thread::sleep(interval);
});
}

Expand Down
2 changes: 1 addition & 1 deletion src/config/database_pools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
//! - `READ_ONLY_MODE`: If defined (even as empty) then force all connections to be read-only.
//! - `DB_TCP_TIMEOUT_MS`: TCP timeout in milliseconds. See the doc comment for more details.

use crate::config::Base;
use crate::Env;
use crate::config::Base;
use anyhow::anyhow;
use crates_io_env_vars::{required_var, var, var_parsed};
use secrecy::SecretString;
Expand Down
2 changes: 1 addition & 1 deletion src/config/sentry.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use anyhow::Context;
use crates_io_env_vars::{required_var, var, var_parsed};
use sentry::types::Dsn;
use sentry::IntoDsn;
use sentry::types::Dsn;

pub struct SentryConfig {
pub dsn: Option<Dsn>,
Expand Down
16 changes: 11 additions & 5 deletions src/config/server.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
use anyhow::{anyhow, Context};
use anyhow::{Context, anyhow};
use ipnetwork::IpNetwork;
use oauth2::{ClientId, ClientSecret};
use url::Url;

use crate::rate_limiter::{LimitedAction, RateLimiterConfig};
use crate::Env;
use crate::rate_limiter::{LimitedAction, RateLimiterConfig};

use super::base::Base;
use super::database_pools::DatabasePools;
use crate::config::cdn_log_storage::CdnLogStorageConfig;
use crate::config::CdnLogQueueConfig;
use crate::config::cdn_log_storage::CdnLogStorageConfig;
use crate::middleware::cargo_compat::StatusCodeConfig;
use crate::storage::StorageConfig;
use crates_io_env_vars::{list, list_parsed, required_var, var, var_parsed};
Expand Down Expand Up @@ -179,7 +179,11 @@ impl Server {
font-src https://code.cdn.mozilla.net; \
img-src *; \
object-src 'none'",
cdn_domain = storage.cdn_prefix.as_ref().map(|cdn_prefix| format!("https://{cdn_prefix}")).unwrap_or_default()
cdn_domain = storage
.cdn_prefix
.as_ref()
.map(|cdn_prefix| format!("https://{cdn_prefix}"))
.unwrap_or_default()
);

Ok(Server {
Expand Down Expand Up @@ -259,7 +263,9 @@ fn parse_cidr_block(block: &str) -> anyhow::Result<IpNetwork> {
};

if cidr.prefix() < host_prefix {
return Err(anyhow!("WEB_PAGE_OFFSET_CIDR_BLOCKLIST only allows CIDR blocks with a host prefix of at least 16 bits (IPv4) or 64 bits (IPv6)."));
return Err(anyhow!(
"WEB_PAGE_OFFSET_CIDR_BLOCKLIST only allows CIDR blocks with a host prefix of at least 16 bits (IPv4) or 64 bits (IPv6)."
));
}

Ok(cidr)
Expand Down
6 changes: 3 additions & 3 deletions src/controllers/crate_owner_invitation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,23 @@ use crate::controllers::helpers::pagination::{Page, PaginationOptions, Paginatio
use crate::models::crate_owner_invitation::AcceptError;
use crate::models::{Crate, CrateOwnerInvitation, User};
use crate::schema::{crate_owner_invitations, crates, users};
use crate::util::errors::{bad_request, custom, forbidden, internal, AppResult, BoxedAppError};
use crate::util::RequestUtils;
use crate::util::errors::{AppResult, BoxedAppError, bad_request, custom, forbidden, internal};
use crate::views::{
EncodableCrateOwnerInvitation, EncodableCrateOwnerInvitationV1, EncodablePublicUser,
InvitationResponse,
};
use axum::extract::{FromRequestParts, Path, Query};
use axum::Json;
use axum::extract::{FromRequestParts, Path, Query};
use axum_extra::json;
use axum_extra::response::ErasedJson;
use chrono::Utc;
use diesel::pg::Pg;
use diesel::prelude::*;
use diesel::sql_types::Bool;
use diesel_async::{AsyncPgConnection, RunQueryDsl};
use http::request::Parts;
use http::StatusCode;
use http::request::Parts;
use indexmap::IndexMap;
use std::collections::{HashMap, HashSet};

Expand Down
2 changes: 1 addition & 1 deletion src/controllers/git.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use axum::extract::{ConnectInfo, Path, Request};
use axum::response::{IntoResponse, Response};
use http::header::HeaderName;
use http::request::Parts;
use http::{header, HeaderMap, HeaderValue, StatusCode};
use http::{HeaderMap, HeaderValue, StatusCode, header};
use hyper::body::Buf;
use std::io::{BufRead, Read};
use std::net::SocketAddr;
Expand Down
12 changes: 6 additions & 6 deletions src/controllers/github/secret_scanning.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@ use crate::app::AppState;
use crate::email::Email;
use crate::models::{ApiToken, User};
use crate::schema::api_tokens;
use crate::util::errors::{bad_request, AppResult, BoxedAppError};
use crate::util::errors::{AppResult, BoxedAppError, bad_request};
use crate::util::token::HashedToken;
use anyhow::{anyhow, Context};
use axum::body::Bytes;
use anyhow::{Context, anyhow};
use axum::Json;
use base64::{engine::general_purpose, Engine};
use axum::body::Bytes;
use base64::{Engine, engine::general_purpose};
use crates_io_github::GitHubPublicKey;
use diesel::prelude::*;
use diesel_async::{AsyncPgConnection, RunQueryDsl};
use http::HeaderMap;
use p256::ecdsa::signature::Verifier;
use p256::ecdsa::VerifyingKey;
use p256::PublicKey;
use p256::ecdsa::VerifyingKey;
use p256::ecdsa::signature::Verifier;
use serde_json as json;
use std::str::FromStr;
use std::sync::LazyLock;
Expand Down
19 changes: 9 additions & 10 deletions src/controllers/helpers/pagination.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ use crate::middleware::app::RequestApp;
use crate::middleware::log_request::RequestLogExt;
use crate::middleware::real_ip::RealIp;
use crate::models::helpers::with_count::*;
use crate::util::errors::{bad_request, AppResult};
use crate::util::HeaderMapExt;
use crate::util::errors::{AppResult, bad_request};
use std::num::NonZeroU32;

use axum::extract::FromRequestParts;
use base64::{engine::general_purpose, Engine};
use base64::{Engine, engine::general_purpose};
use diesel::pg::Pg;
use diesel::prelude::*;
use diesel::query_builder::{AstPass, Query, QueryFragment, QueryId};
Expand Down Expand Up @@ -133,8 +133,9 @@ impl PaginationOptionsBuilder {
{
parts.request_log().add("cause", "large page offset");

let error =
format!("Page {numeric_page} is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives.");
let error = format!(
"Page {numeric_page} is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives."
);

return Err(bad_request(error));
}
Expand Down Expand Up @@ -387,10 +388,8 @@ impl<T, C> QueryId for PaginatedQueryWithCountSubq<T, C> {
type QueryId = ();
}

impl<
T: Query,
C: Query + QueryDsl + diesel::query_dsl::methods::SelectDsl<diesel::dsl::CountStar>,
> Query for PaginatedQueryWithCountSubq<T, C>
impl<T: Query, C: Query + QueryDsl + diesel::query_dsl::methods::SelectDsl<diesel::dsl::CountStar>>
Query for PaginatedQueryWithCountSubq<T, C>
{
type SqlType = (T::SqlType, BigInt);
}
Expand Down Expand Up @@ -639,8 +638,8 @@ mod tests {
}

mod seek {
use chrono::serde::ts_microseconds;
use chrono::Utc;
use chrono::serde::ts_microseconds;

seek!(
pub(super) enum Seek {
Expand All @@ -662,8 +661,8 @@ mod tests {

#[test]
fn test_seek_macro_encode_and_decode() {
use chrono::serde::ts_microseconds;
use chrono::NaiveDate;
use chrono::serde::ts_microseconds;
use seek::*;

let assert_decode_after = |seek: Seek, query: &str, expect| {
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/keyword.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::app::AppState;
use crate::controllers::helpers::pagination::PaginationOptions;
use crate::controllers::helpers::{pagination::Paginated, Paginate};
use crate::controllers::helpers::{Paginate, pagination::Paginated};
use crate::models::Keyword;
use crate::util::errors::AppResult;
use crate::views::EncodableKeyword;
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/krate.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::models::Crate;
use crate::util::errors::{crate_not_found, AppResult};
use crate::util::errors::{AppResult, crate_not_found};
use axum::extract::{FromRequestParts, Path};
use crates_io_database::schema::crates;
use diesel::{OptionalExtension, QueryDsl};
Expand Down
8 changes: 5 additions & 3 deletions src/controllers/krate/delete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::controllers::krate::CratePath;
use crate::email::Email;
use crate::models::NewDeletedCrate;
use crate::schema::{crate_downloads, crates, dependencies};
use crate::util::errors::{custom, AppResult, BoxedAppError};
use crate::util::errors::{AppResult, BoxedAppError, custom};
use crate::worker::jobs;
use axum::extract::rejection::QueryRejection;
use axum::extract::{FromRequestParts, Query};
Expand All @@ -16,8 +16,8 @@ use crates_io_worker::BackgroundJob;
use diesel::prelude::*;
use diesel_async::scoped_futures::ScopedFutureExt;
use diesel_async::{AsyncConnection, AsyncPgConnection, RunQueryDsl};
use http::request::Parts;
use http::StatusCode;
use http::request::Parts;

const DOWNLOADS_PER_MONTH_LIMIT: u64 = 500;
const AVAILABLE_AFTER: TimeDelta = TimeDelta::hours(24);
Expand Down Expand Up @@ -92,7 +92,9 @@ pub async fn delete_crate(

let downloads = get_crate_downloads(&mut conn, krate.id).await?;
if downloads > max_downloads(&age) {
let msg = format!("only crates with less than {DOWNLOADS_PER_MONTH_LIMIT} downloads per month can be deleted after 72 hours");
let msg = format!(
"only crates with less than {DOWNLOADS_PER_MONTH_LIMIT} downloads per month can be deleted after 72 hours"
);
return Err(custom(StatusCode::UNPROCESSABLE_ENTITY, msg));
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/krate/downloads.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crate::controllers::krate::CratePath;
use crate::models::download::Version;
use crate::models::{User, Version as FullVersion, VersionDownload, VersionOwnerAction};
use crate::schema::{version_downloads, version_owner_actions, versions};
use crate::util::errors::{bad_request, AppResult, BoxedAppError};
use crate::util::errors::{AppResult, BoxedAppError, bad_request};
use crate::views::{EncodableVersion, EncodableVersionDownload};
use axum::extract::FromRequestParts;
use axum_extra::extract::Query;
Expand All @@ -18,8 +18,8 @@ use crates_io_database::schema::users;
use crates_io_diesel_helpers::to_char;
use diesel::prelude::*;
use diesel_async::{AsyncPgConnection, RunQueryDsl};
use futures_util::future::BoxFuture;
use futures_util::FutureExt;
use futures_util::future::BoxFuture;
use std::cmp;
use std::str::FromStr;

Expand Down
2 changes: 1 addition & 1 deletion src/controllers/krate/follow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use crate::controllers::helpers::ok_true;
use crate::controllers::krate::CratePath;
use crate::models::{Crate, Follow};
use crate::schema::*;
use crate::util::errors::{crate_not_found, AppResult};
use crate::util::errors::{AppResult, crate_not_found};
use axum::response::Response;
use axum_extra::json;
use axum_extra::response::ErasedJson;
Expand Down
Loading