Skip to content

Commit 2a545df

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 2a545df

File tree

2 files changed

+104
-9
lines changed

2 files changed

+104
-9
lines changed

src/controllers/krate/publish.rs

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

src/tests/krate.rs

+2-2
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)