Skip to content

Commit 14239e4

Browse files
committed
Unconditionally reject crates published without a verified email
Remove all code and tests having to do with the warnings we issued and the date checking around the cutover date.
1 parent 5ef9aee commit 14239e4

10 files changed

+41
-311
lines changed

Cargo.toml

+1-4
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ parking_lot = "0.7.1"
6666
jemallocator = { version = "0.1.8", features = ['unprefixed_malloc_on_supported_platforms'] }
6767
jemalloc-ctl = "0.2.0"
6868

69-
# This can be moved back to a dev dependency after 2019-02-28, when the
70-
# VERIFIED_EMAIL_REQUIRED_DATE is removed from src/controllers/krate/publish.rs.
71-
lazy_static = "1.0"
72-
7369
lettre = {git = "https://github.com/lettre/lettre", version = "0.9"}
7470
lettre_email = {git = "https://github.com/lettre/lettre", version = "0.9"}
7571

@@ -88,6 +84,7 @@ conduit-test = "0.8"
8884
hyper = "0.12"
8985
hyper-tls = "0.3"
9086
futures = "0.1"
87+
lazy_static = "1.0"
9188
tokio-core = "0.1"
9289
tokio-service = "0.1"
9390

src/bin/update-downloads.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,7 @@ mod test {
149149
user_id,
150150
)
151151
.unwrap();
152-
let version = version
153-
.save(conn, &[], Some("[email protected]".into()))
154-
.unwrap();
152+
let version = version.save(conn, &[], "[email protected]").unwrap();
155153
(krate, version)
156154
}
157155

src/controllers/krate/publish.rs

+11-110
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
use std::collections::HashMap;
44
use std::sync::Arc;
55

6-
use chrono::offset::TimeZone;
7-
use chrono::{DateTime, Utc};
86
use hex::ToHex;
97

108
use crate::git;
@@ -67,14 +65,13 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
6765

6866
let conn = app.diesel_database.get()?;
6967

70-
let mut other_warnings = vec![];
7168
let verified_email_address = user.verified_email(&conn)?;
72-
73-
// This function can be inlined (with only the error-returning functionality) and its unit
74-
// tests deleted after 2019-02-28; it was created to make injecting the date for tests easier.
75-
// The integration tests in src/tests/krate.rs cover the current production behavior (and will
76-
// need to be updated at that time)
77-
verified_email_check(&mut other_warnings, &verified_email_address, Utc::now())?;
69+
let verified_email_address = verified_email_address.ok_or_else(|| {
70+
human(
71+
"A verified email address is required to publish crates to crates.io. \
72+
Visit https://crates.io/me to set and verify your email address.",
73+
)
74+
})?;
7875

7976
// Create a transaction on the database, if there are no errors,
8077
// commit the transactions to record a new or updated crate.
@@ -150,7 +147,7 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
150147
file_length as i32,
151148
user.id,
152149
)?
153-
.save(&conn, &new_crate.authors, verified_email_address)?;
150+
.save(&conn, &new_crate.authors, &verified_email_address)?;
154151

155152
// Link this new version to all dependencies
156153
let git_deps = dependency::add_dependencies(&conn, &new_crate.deps, version.id)?;
@@ -210,10 +207,13 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
210207
crate_bomb.path = None;
211208
readme_bomb.path = None;
212209

210+
// The `other` field on `PublishWarnings` was introduced to handle a temporary warning
211+
// that is no longer needed. As such, crates.io currently does not return any `other`
212+
// warnings at this time, but if we need to, the field is available.
213213
let warnings = PublishWarnings {
214214
invalid_categories: ignored_invalid_categories,
215215
invalid_badges: ignored_invalid_badges,
216-
other: other_warnings,
216+
other: vec![],
217217
};
218218

219219
Ok(req.json(&GoodCrate {
@@ -268,102 +268,3 @@ fn parse_new_headers(req: &mut dyn Request) -> CargoResult<(EncodableCrateUpload
268268
let user = req.user()?;
269269
Ok((new, user.clone()))
270270
}
271-
272-
lazy_static! {
273-
static ref VERIFIED_EMAIL_REQUIRED_DATE: DateTime<Utc> =
274-
{ Utc.ymd(2019, 3, 1).and_hms(0, 0, 0) };
275-
}
276-
277-
fn verified_email_check(
278-
other_warnings: &mut Vec<String>,
279-
verified_email_address: &Option<String>,
280-
now: DateTime<Utc>,
281-
) -> CargoResult<()> {
282-
match verified_email_address {
283-
Some(_) => Ok(()),
284-
None => {
285-
if now < *VERIFIED_EMAIL_REQUIRED_DATE {
286-
other_warnings.push(String::from(
287-
"You do not currently have a verified email address associated with your \
288-
crates.io account. Starting 2019-02-28, a verified email will be required to \
289-
publish crates. Visit https://crates.io/me to set and verify your email \
290-
address.",
291-
));
292-
Ok(())
293-
} else {
294-
Err(human(
295-
"A verified email address is required to publish crates to crates.io. \
296-
Visit https://crates.io/me to set and verify your email address.",
297-
))
298-
}
299-
}
300-
}
301-
}
302-
303-
// These tests should be deleted after 2018-02-28; this functionality will then be covered by
304-
// integration tests in src/tests/krate.rs.
305-
#[cfg(test)]
306-
mod tests {
307-
use super::*;
308-
use chrono::offset::TimeZone;
309-
310-
#[test]
311-
fn allow_publish_with_verified_email_without_warning_before_2018_02_28() {
312-
let mut warnings = vec![];
313-
314-
let fake_current_date = Utc.ymd(2019, 2, 27).and_hms(0, 0, 0);
315-
let result = verified_email_check(
316-
&mut warnings,
317-
&Some("[email protected]".into()),
318-
fake_current_date,
319-
);
320-
321-
assert!(result.is_ok());
322-
assert_eq!(warnings.len(), 0);
323-
}
324-
325-
#[test]
326-
fn allow_publish_with_verified_email_without_error_after_2018_02_28() {
327-
let mut warnings = vec![];
328-
329-
let fake_current_date = Utc.ymd(2019, 3, 1).and_hms(0, 0, 0);
330-
let result = verified_email_check(
331-
&mut warnings,
332-
&Some("[email protected]".into()),
333-
fake_current_date,
334-
);
335-
336-
assert!(result.is_ok());
337-
assert_eq!(warnings.len(), 0);
338-
}
339-
340-
#[test]
341-
fn warn_without_verified_email_before_2018_02_28() {
342-
let mut warnings = vec![];
343-
344-
let fake_current_date = Utc.ymd(2019, 2, 27).and_hms(0, 0, 0);
345-
let result = verified_email_check(&mut warnings, &None, fake_current_date);
346-
347-
assert!(result.is_ok());
348-
assert_eq!(warnings.len(), 1);
349-
assert_eq!(warnings[0], "You do not currently have a verified email address associated \
350-
with your crates.io account. Starting 2019-02-28, a verified email will be required to \
351-
publish crates. Visit https://crates.io/me to set and verify your email address.");
352-
}
353-
354-
#[test]
355-
fn error_without_verified_email_after_2018_02_28() {
356-
let mut warnings = vec![];
357-
358-
let fake_current_date = Utc.ymd(2019, 3, 1).and_hms(0, 0, 0);
359-
let result = verified_email_check(&mut warnings, &None, fake_current_date);
360-
361-
assert!(result.is_err());
362-
assert_eq!(
363-
result.err().unwrap().description(),
364-
"A verified email address is required to \
365-
publish crates to crates.io. Visit https://crates.io/me to set and verify your email \
366-
address."
367-
);
368-
}
369-
}

src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ extern crate log;
1818
extern crate serde_derive;
1919
#[macro_use]
2020
extern crate serde_json;
21-
#[macro_use]
22-
extern crate lazy_static;
2321

2422
pub use crate::{app::App, config::Config, uploaders::Uploader};
2523
use std::sync::Arc;

src/models/version.rs

+7-11
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,11 @@ impl NewVersion {
148148
Ok(new_version)
149149
}
150150

151-
// TODO: change `published_by_email` to be `String` after 2019-02-28
152151
pub fn save(
153152
&self,
154153
conn: &PgConnection,
155154
authors: &[String],
156-
published_by_email: Option<String>,
155+
published_by_email: &str,
157156
) -> CargoResult<Version> {
158157
use crate::schema::version_authors::{name, version_id};
159158
use crate::schema::versions::dsl::*;
@@ -176,15 +175,12 @@ impl NewVersion {
176175
.values(self)
177176
.get_result::<Version>(conn)?;
178177

179-
// TODO: Remove the `if` around this insert after 2019-02-28
180-
if let Some(published_by_email) = published_by_email {
181-
insert_into(versions_published_by::table)
182-
.values((
183-
versions_published_by::version_id.eq(version.id),
184-
versions_published_by::email.eq(published_by_email),
185-
))
186-
.execute(conn)?;
187-
}
178+
insert_into(versions_published_by::table)
179+
.values((
180+
versions_published_by::version_id.eq(version.id),
181+
versions_published_by::email.eq(published_by_email),
182+
))
183+
.execute(conn)?;
188184

189185
let new_authors = authors
190186
.iter()

src/tests/builders.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ impl<'a> VersionBuilder<'a> {
9090
self.size,
9191
published_by,
9292
)?
93-
.save(connection, &[], Some("[email protected]".into()))?;
93+
.save(connection, &[], "[email protected]")?;
9494

9595
if self.yanked {
9696
vers = update(&vers)

src/tests/http-data/krate_new_krate_with_unverified_email_warns

-73
This file was deleted.

src/tests/http-data/krate_new_krate_without_any_email_warns

-73
This file was deleted.

0 commit comments

Comments
 (0)