Skip to content

Commit 9070263

Browse files
committed
Require a verified email after 2019-03-01 00:00 UTC
Because that's at least on 2019-02-28 (the date we announced) in all timezones, and should definitely be after the release scheduled for that day. As per the plan at rust-lang/crates-io-cargo-teams#8
1 parent 6fa8ad3 commit 9070263

File tree

4 files changed

+115
-10
lines changed

4 files changed

+115
-10
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ 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+
6973
lettre = {git = "https://github.com/lettre/lettre", version = "0.9"}
7074
lettre_email = {git = "https://github.com/lettre/lettre", version = "0.9"}
7175

@@ -84,7 +88,6 @@ conduit-test = "0.8"
8488
hyper = "0.12"
8589
hyper-tls = "0.3"
8690
futures = "0.1"
87-
lazy_static = "1.0"
8891
tokio-core = "0.1"
8992
tokio-service = "0.1"
9093

src/controllers/krate/publish.rs

Lines changed: 107 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
use std::collections::HashMap;
44
use std::sync::Arc;
55

6+
use chrono::offset::TimeZone;
7+
use chrono::{DateTime, Utc};
68
use hex::ToHex;
79

810
use crate::git;
@@ -67,13 +69,12 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
6769

6870
let mut other_warnings = vec![];
6971
let verified_email_address = user.verified_email(&conn)?;
70-
if verified_email_address.is_none() {
71-
other_warnings.push(String::from(
72-
"You do not currently have a verified email address associated with your crates.io \
73-
account. Starting 2019-02-28, a verified email will be required to publish crates. \
74-
Visit https://crates.io/me to set and verify your email address.",
75-
));
76-
}
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())?;
7778

7879
// Create a transaction on the database, if there are no errors,
7980
// commit the transactions to record a new or updated crate.
@@ -267,3 +268,102 @@ fn parse_new_headers(req: &mut dyn Request) -> CargoResult<(EncodableCrateUpload
267268
let user = req.user()?;
268269
Ok((new, user.clone()))
269270
}
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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ extern crate log;
1818
extern crate serde_derive;
1919
#[macro_use]
2020
extern crate serde_json;
21+
#[macro_use]
22+
extern crate lazy_static;
2123

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

src/tests/krate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ fn new_krate_with_readme() {
10731073
assert_eq!(json.krate.max_version, "1.0.0");
10741074
}
10751075

1076-
// This warning will soon become a hard error.
1076+
// This test will start failing on 2019-02-28 and should be updated at that time.
10771077
// See https://github.com/rust-lang/crates-io-cargo-teams/issues/8
10781078
#[test]
10791079
fn new_krate_without_any_email_warns() {
@@ -1096,7 +1096,7 @@ fn new_krate_without_any_email_warns() {
10961096
});
10971097
}
10981098

1099-
// This warning will soon become a hard error.
1099+
// This test will start failing on 2019-02-28 and should be updated at that time.
11001100
// See https://github.com/rust-lang/crates-io-cargo-teams/issues/8
11011101
#[test]
11021102
fn new_krate_with_unverified_email_warns() {

0 commit comments

Comments
 (0)