@@ -4,6 +4,7 @@ use crate::auth::AuthCheck;
44use crate :: background_jobs:: { Job , PRIORITY_RENDER_README } ;
55use axum:: body:: Bytes ;
66use crates_io_tarball:: { process_tarball, TarballError } ;
7+ use diesel:: dsl:: { exists, select} ;
78use hex:: ToHex ;
89use hyper:: body:: Buf ;
910use sha2:: { Digest , Sha256 } ;
@@ -19,6 +20,7 @@ use crate::middleware::log_request::RequestLogExt;
1920use crate :: models:: token:: EndpointScope ;
2021use crate :: rate_limiter:: LimitedAction ;
2122use crate :: schema:: * ;
23+ use crate :: sql:: canon_crate_name;
2224use crate :: util:: errors:: { cargo_err, internal, AppResult } ;
2325use crate :: util:: Maximums ;
2426use crate :: views:: {
@@ -144,7 +146,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
144146 let license_file = metadata. license_file . as_deref ( ) ;
145147
146148 persist. validate ( ) ?;
147- persist . ensure_name_not_reserved ( conn) ?;
149+ ensure_name_not_reserved ( persist . name , conn) ?;
148150
149151 let krate = persist. create_or_update ( conn, user. id ) ?;
150152
@@ -336,6 +338,19 @@ fn split_body(mut bytes: Bytes) -> AppResult<(Bytes, Bytes)> {
336338 Ok ( ( json_bytes, tarball_bytes) )
337339}
338340
341+ fn ensure_name_not_reserved ( name : & str , conn : & mut PgConnection ) -> AppResult < ( ) > {
342+ let reserved_name: bool = select ( exists (
343+ reserved_crate_names:: table
344+ . filter ( canon_crate_name ( reserved_crate_names:: name) . eq ( canon_crate_name ( name) ) ) ,
345+ ) )
346+ . get_result ( conn) ?;
347+ if reserved_name {
348+ Err ( cargo_err ( "cannot upload a crate with a reserved name" ) )
349+ } else {
350+ Ok ( ( ) )
351+ }
352+ }
353+
339354fn missing_metadata_error_message ( missing : & [ & str ] ) -> String {
340355 format ! (
341356 "missing or empty metadata fields: {}. Please \
0 commit comments