Skip to content

Commit 3987920

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 58d9247 commit 3987920

10 files changed

+37
-307
lines changed

Cargo.toml

+1-4
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,6 @@ reqwest = "0.9.1"
6464
tempdir = "0.3.7"
6565
parking_lot = "0.7.1"
6666

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

@@ -86,6 +82,7 @@ conduit-test = "0.8"
8682
hyper = "0.12"
8783
hyper-tls = "0.3"
8884
futures = "0.1"
85+
lazy_static = "1.0"
8986
tokio-core = "0.1"
9087
tokio-service = "0.1"
9188

src/bin/update-downloads.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ mod test {
150150
)
151151
.unwrap();
152152
let version = version
153-
.save(conn, &[], Some("[email protected]".into()))
153+
.save(conn, &[], "[email protected]")
154154
.unwrap();
155155
(krate, version)
156156
}

src/controllers/krate/publish.rs

+7-108
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,9 @@ 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(|| human("A verified email address is required to publish crates to crates.io. \
70+
Visit https://crates.io/me to set and verify your email address."))?;
7871

7972
// Create a transaction on the database, if there are no errors,
8073
// commit the transactions to record a new or updated crate.
@@ -150,7 +143,7 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
150143
file_length as i32,
151144
user.id,
152145
)?
153-
.save(&conn, &new_crate.authors, verified_email_address)?;
146+
.save(&conn, &new_crate.authors, &verified_email_address)?;
154147

155148
// Link this new version to all dependencies
156149
let git_deps = dependency::add_dependencies(&conn, &new_crate.deps, version.id)?;
@@ -210,10 +203,13 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
210203
crate_bomb.path = None;
211204
readme_bomb.path = None;
212205

206+
// The `other` field on `PublishWarnings` was introduced to handle a temporary warning
207+
// that is no longer needed. As such, crates.io currently does not return any `other`
208+
// warnings at this time, but if we need to, the field is available.
213209
let warnings = PublishWarnings {
214210
invalid_categories: ignored_invalid_categories,
215211
invalid_badges: ignored_invalid_badges,
216-
other: other_warnings,
212+
other: vec![],
217213
};
218214

219215
Ok(req.json(&GoodCrate {
@@ -268,100 +264,3 @@ fn parse_new_headers(req: &mut dyn Request) -> CargoResult<(EncodableCrateUpload
268264
let user = req.user()?;
269265
Ok((new, user.clone()))
270266
}
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("A verified email address is required to publish crates to crates.io. \
295-
Visit https://crates.io/me to set and verify your email address."))
296-
}
297-
}
298-
}
299-
}
300-
301-
// These tests should be deleted after 2018-02-28; this functionality will then be covered by
302-
// integration tests in src/tests/krate.rs.
303-
#[cfg(test)]
304-
mod tests {
305-
use super::*;
306-
use chrono::offset::TimeZone;
307-
308-
#[test]
309-
fn allow_publish_with_verified_email_without_warning_before_2018_02_28() {
310-
let mut warnings = vec![];
311-
312-
let fake_current_date = Utc.ymd(2019, 2, 27).and_hms(0, 0, 0);
313-
let result = verified_email_check(
314-
&mut warnings,
315-
&Some("[email protected]".into()),
316-
fake_current_date,
317-
);
318-
319-
assert!(result.is_ok());
320-
assert_eq!(warnings.len(), 0);
321-
}
322-
323-
#[test]
324-
fn allow_publish_with_verified_email_without_error_after_2018_02_28() {
325-
let mut warnings = vec![];
326-
327-
let fake_current_date = Utc.ymd(2019, 3, 1).and_hms(0, 0, 0);
328-
let result = verified_email_check(
329-
&mut warnings,
330-
&Some("[email protected]".into()),
331-
fake_current_date,
332-
);
333-
334-
assert!(result.is_ok());
335-
assert_eq!(warnings.len(), 0);
336-
}
337-
338-
#[test]
339-
fn warn_without_verified_email_before_2018_02_28() {
340-
let mut warnings = vec![];
341-
342-
let fake_current_date = Utc.ymd(2019, 2, 27).and_hms(0, 0, 0);
343-
let result = verified_email_check(&mut warnings, &None, fake_current_date);
344-
345-
assert!(result.is_ok());
346-
assert_eq!(warnings.len(), 1);
347-
assert_eq!(warnings[0], "You do not currently have a verified email address associated \
348-
with your crates.io account. Starting 2019-02-28, a verified email will be required to \
349-
publish crates. Visit https://crates.io/me to set and verify your email address.");
350-
}
351-
352-
#[test]
353-
fn error_without_verified_email_after_2018_02_28() {
354-
let mut warnings = vec![];
355-
356-
let fake_current_date = Utc.ymd(2019, 3, 1).and_hms(0, 0, 0);
357-
let result = verified_email_check(&mut warnings, &None, fake_current_date);
358-
359-
assert!(result.is_err());
360-
assert_eq!(
361-
result.err().unwrap().description(),
362-
"A verified email address is required to \
363-
publish crates to crates.io. Visit https://crates.io/me to set and verify your email \
364-
address."
365-
);
366-
}
367-
}

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)