@@ -4,6 +4,7 @@ use crate::auth::AuthCheck;
4
4
use crate :: background_jobs:: { Job , PRIORITY_RENDER_README } ;
5
5
use axum:: body:: Bytes ;
6
6
use crates_io_tarball:: { process_tarball, TarballError } ;
7
+ use diesel:: dsl:: { exists, select} ;
7
8
use hex:: ToHex ;
8
9
use hyper:: body:: Buf ;
9
10
use sha2:: { Digest , Sha256 } ;
@@ -19,6 +20,7 @@ use crate::middleware::log_request::RequestLogExt;
19
20
use crate :: models:: token:: EndpointScope ;
20
21
use crate :: rate_limiter:: LimitedAction ;
21
22
use crate :: schema:: * ;
23
+ use crate :: sql:: canon_crate_name;
22
24
use crate :: util:: errors:: { cargo_err, internal, AppResult } ;
23
25
use crate :: util:: Maximums ;
24
26
use crate :: views:: {
@@ -144,7 +146,7 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
144
146
let license_file = metadata. license_file . as_deref ( ) ;
145
147
146
148
persist. validate ( ) ?;
147
- persist . ensure_name_not_reserved ( conn) ?;
149
+ ensure_name_not_reserved ( persist . name , conn) ?;
148
150
149
151
let krate = persist. create_or_update ( conn, user. id ) ?;
150
152
@@ -336,6 +338,19 @@ fn split_body(mut bytes: Bytes) -> AppResult<(Bytes, Bytes)> {
336
338
Ok ( ( json_bytes, tarball_bytes) )
337
339
}
338
340
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
+
339
354
fn missing_metadata_error_message ( missing : & [ & str ] ) -> String {
340
355
format ! (
341
356
"missing or empty metadata fields: {}. Please \
0 commit comments