|
3 | 3 | use std::collections::HashMap;
|
4 | 4 | use std::sync::Arc;
|
5 | 5 |
|
| 6 | +use chrono::offset::TimeZone; |
| 7 | +use chrono::{DateTime, Utc}; |
6 | 8 | use hex::ToHex;
|
7 | 9 |
|
8 | 10 | use crate::git;
|
@@ -67,13 +69,12 @@ pub fn publish(req: &mut dyn Request) -> CargoResult<Response> {
|
67 | 69 |
|
68 | 70 | let mut other_warnings = vec![];
|
69 | 71 | 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())?; |
77 | 78 |
|
78 | 79 | // Create a transaction on the database, if there are no errors,
|
79 | 80 | // commit the transactions to record a new or updated crate.
|
@@ -267,3 +268,97 @@ fn parse_new_headers(req: &mut dyn Request) -> CargoResult<(EncodableCrateUpload
|
267 | 268 | let user = req.user()?;
|
268 | 269 | Ok((new, user.clone()))
|
269 | 270 | }
|
| 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 | +} |
0 commit comments