diff --git a/.github/workflows/glean-probe-scraper.yml b/.github/workflows/glean-probe-scraper.yml index 49fdccb2b0..06ad97414f 100644 --- a/.github/workflows/glean-probe-scraper.yml +++ b/.github/workflows/glean-probe-scraper.yml @@ -12,4 +12,4 @@ jobs: permissions: contents: read checks: write - uses: mozilla/probe-scraper/.github/workflows/glean.yaml@6cb549542a9d81fddbbaa8d5e6fdf95bf4761488 # v1.0 + uses: mozilla/probe-scraper/.github/workflows/glean.yaml@78f5c5f20dfca6bcb68138a1122dae5acfd06605 # v1.0 diff --git a/Cargo.lock b/Cargo.lock index 03afe6d86f..cf4f8ec764 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4010,7 +4010,6 @@ dependencies = [ "syncstorage-settings", "temp-env", "thiserror 2.0.18", - "time", "tokenserver-auth", "tokenserver-common", "tokenserver-db", @@ -4161,7 +4160,6 @@ dependencies = [ "rand 0.10.0", "serde", "syncserver-common", - "time", ] [[package]] @@ -4171,6 +4169,7 @@ dependencies = [ "actix-web", "async-trait", "backtrace", + "chrono", "deadpool", "form_urlencoded", "futures 0.3.32", @@ -4406,6 +4405,7 @@ name = "tokenserver-db" version = "0.21.1" dependencies = [ "async-trait", + "chrono", "env_logger 0.11.9", "syncserver-common", "syncserver-db-common", @@ -4425,6 +4425,7 @@ version = "0.21.1" dependencies = [ "async-trait", "backtrace", + "chrono", "deadpool", "diesel", "diesel-async", @@ -4443,6 +4444,7 @@ name = "tokenserver-mysql" version = "0.21.1" dependencies = [ "async-trait", + "chrono", "deadpool", "diesel", "diesel-async", @@ -4461,6 +4463,7 @@ name = "tokenserver-postgres" version = "0.21.1" dependencies = [ "async-trait", + "chrono", "deadpool", "diesel", "diesel-async", diff --git a/Cargo.toml b/Cargo.toml index 7fbbb3d67e..4e086b68e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,7 +91,6 @@ slog-term = "2.9" temp-env = { version = "0.3", features = ["async_closure"] } tokio = "1" thiserror = "2.0.18" -time = "0.3.47" utoipa = "5.4.0" utoipa-swagger-ui = { version = "9", features = ["actix-web"] } uuid = { version = "1.20", features = ["serde", "v4"] } diff --git a/syncserver/Cargo.toml b/syncserver/Cargo.toml index 113bf72b30..f99e46aa18 100644 --- a/syncserver/Cargo.toml +++ b/syncserver/Cargo.toml @@ -46,7 +46,6 @@ syncserver-db-common = { path = "../syncserver-db-common" } syncserver-settings = { path = "../syncserver-settings" } syncstorage-db = { path = "../syncstorage-db" } syncstorage-settings = { path = "../syncstorage-settings" } -time.workspace = true tokenserver-auth = { path = "../tokenserver-auth" } tokenserver-common = { path = "../tokenserver-common" } tokenserver-db = { path = "../tokenserver-db" } diff --git a/syncserver/src/tokenserver/extractors.rs b/syncserver/src/tokenserver/extractors.rs index 4ee1c8d591..a34e8fc1b6 100644 --- a/syncserver/src/tokenserver/extractors.rs +++ b/syncserver/src/tokenserver/extractors.rs @@ -675,8 +675,8 @@ mod tests { use crate::tokenserver::ServerState; + use chrono::Utc; use std::sync::Arc; - use std::time::{SystemTime, UNIX_EPOCH}; lazy_static! { static ref SECRETS: Arc = Arc::new(Secrets::new("Ted Koppel is a robot").unwrap()); @@ -886,11 +886,10 @@ mod tests { fn build_request() -> TestRequest { let fxa_uid = "test123"; let oauth_verifier = { - let start = SystemTime::now(); - let current_time = start.duration_since(UNIX_EPOCH).unwrap(); + let current_time = Utc::now().timestamp(); let verify_output = oauth::VerifyOutput { fxa_uid: fxa_uid.to_owned(), - generation: Some(current_time.as_secs() as i64), + generation: Some(current_time), }; let valid = true; diff --git a/syncserver/src/tokenserver/handlers.rs b/syncserver/src/tokenserver/handlers.rs index b42fd4844d..59539bb6c7 100644 --- a/syncserver/src/tokenserver/handlers.rs +++ b/syncserver/src/tokenserver/handlers.rs @@ -1,10 +1,8 @@ -use std::{ - collections::HashMap, - time::{Duration, SystemTime, UNIX_EPOCH}, -}; +use std::{collections::HashMap, time::Duration}; use actix_web::{Error, HttpResponse, http::StatusCode}; use base64::{Engine, engine}; +use chrono::{TimeDelta, Utc}; use serde::Serialize; use serde_json::Value; use tokenserver_auth::{MakeTokenPlaintext, Tokenlib, TokenserverOrigin}; @@ -79,10 +77,7 @@ pub async fn get_tokenserver_result( node_type: req.node_type, }; - let timestamp = { - let start = SystemTime::now(); - start.duration_since(UNIX_EPOCH).unwrap().as_secs() - }; + let timestamp = Utc::now().timestamp() as u64; Ok(HttpResponse::build(StatusCode::OK) .insert_header(("X-Timestamp", timestamp.to_string())) @@ -116,13 +111,7 @@ fn get_token_plaintext( ) }; - let expires = { - let start = SystemTime::now(); - let current_time = start.duration_since(UNIX_EPOCH).unwrap(); - let expires = current_time + Duration::from_secs(req.duration); - - expires.as_secs() - }; + let expires = (Utc::now() + TimeDelta::seconds(req.duration as i64)).timestamp() as u64; Ok(MakeTokenPlaintext { node: req.user.node.to_owned(), @@ -226,10 +215,7 @@ async fn update_user( // If the client state changed, we need to mark the current user as "replaced" and create a // new user record. Otherwise, we can update the user in place. if req.auth_data.client_state != req.user.client_state { - let timestamp = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as i64; + let timestamp = Utc::now().timestamp_millis(); // Create new user record with updated generation/keys_changed_at let post_user_params = PostUser { diff --git a/syncserver/src/web/auth.rs b/syncserver/src/web/auth.rs index 0c4b3b6d7f..d7f4410718 100644 --- a/syncserver/src/web/auth.rs +++ b/syncserver/src/web/auth.rs @@ -6,17 +6,14 @@ allow(dead_code, unused_imports, unused_variables) )] -use std::convert::TryInto; - use base64::{Engine, engine}; -use chrono::offset::Utc; +use chrono::{TimeDelta, offset::Utc}; use hawk::{self, Header as HawkHeader, Key, RequestBuilder}; use hmac::{Hmac, Mac}; use serde::{Deserialize, Serialize}; use sha2::Sha256; use syncserver_common; use syncserver_settings::Secrets; -use time::Duration; use tokenserver_auth::TokenserverOrigin; use actix_web::dev::ConnectionInfo; @@ -104,8 +101,8 @@ impl HawkPayload { #[cfg(not(feature = "no_auth"))] { - let mut duration: std::time::Duration = Duration::weeks(52) - .try_into() + let mut duration = TimeDelta::weeks(52) + .to_std() .map_err(|_| ApiErrorKind::Internal("Duration::weeks".to_owned()))?; if cfg!(test) { // test cases are valid until 3018. Add millenia as required. diff --git a/syncstorage-settings/Cargo.toml b/syncstorage-settings/Cargo.toml index fd139a5e19..77cc24d2a7 100644 --- a/syncstorage-settings/Cargo.toml +++ b/syncstorage-settings/Cargo.toml @@ -10,4 +10,3 @@ rand.workspace=true serde.workspace=true syncserver-common = { path = "../syncserver-common" } -time.workspace = true diff --git a/syncstorage-spanner/Cargo.toml b/syncstorage-spanner/Cargo.toml index a8f0638a28..15958a07da 100644 --- a/syncstorage-spanner/Cargo.toml +++ b/syncstorage-spanner/Cargo.toml @@ -9,6 +9,7 @@ edition.workspace = true actix-web.workspace = true async-trait.workspace = true backtrace.workspace = true +chrono.workspace = true deadpool.workspace = true futures.workspace = true http.workspace = true diff --git a/syncstorage-spanner/src/lib.rs b/syncstorage-spanner/src/lib.rs index 10010ad575..20fa1ee1e4 100644 --- a/syncstorage-spanner/src/lib.rs +++ b/syncstorage-spanner/src/lib.rs @@ -1,4 +1,4 @@ -use std::time::SystemTime; +use chrono::Utc; #[macro_use] extern crate slog_scope; @@ -18,9 +18,7 @@ pub use pool::SpannerDbPool; type DbResult = Result; +/// Return a timestamp of the seconds since Epoch, repr as `i64`. fn now() -> i64 { - SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap_or_default() - .as_secs() as i64 + Utc::now().timestamp() } diff --git a/tokenserver-db-common/Cargo.toml b/tokenserver-db-common/Cargo.toml index 0e619ffdec..b53c3ed121 100644 --- a/tokenserver-db-common/Cargo.toml +++ b/tokenserver-db-common/Cargo.toml @@ -8,6 +8,7 @@ license.workspace = true [dependencies] async-trait.workspace = true backtrace.workspace = true +chrono.workspace = true deadpool.workspace = true diesel.workspace = true diesel-async.workspace = true diff --git a/tokenserver-db-common/src/lib.rs b/tokenserver-db-common/src/lib.rs index 879868eea6..52d1ac1e6d 100644 --- a/tokenserver-db-common/src/lib.rs +++ b/tokenserver-db-common/src/lib.rs @@ -5,12 +5,10 @@ mod error; pub mod params; pub mod results; -use std::{ - cmp, - time::{Duration, SystemTime, UNIX_EPOCH}, -}; +use std::{cmp, time::Duration}; use async_trait::async_trait; +use chrono::Utc; use syncserver_common::Metrics; use syncserver_db_common::{GetPoolState, PoolState}; @@ -248,10 +246,7 @@ pub trait Db { }) .await?; - let created_at = { - let start = SystemTime::now(); - start.duration_since(UNIX_EPOCH).unwrap().as_millis() as i64 - }; + let created_at: i64 = Utc::now().timestamp_millis(); let uid = self .post_user(params::PostUser { service_id: params.service_id, diff --git a/tokenserver-db/Cargo.toml b/tokenserver-db/Cargo.toml index f5c314b0f7..52957f560b 100644 --- a/tokenserver-db/Cargo.toml +++ b/tokenserver-db/Cargo.toml @@ -7,6 +7,7 @@ edition.workspace = true [dependencies] async-trait.workspace = true +chrono.workspace = true syncserver-common = { path = "../syncserver-common" } syncserver-db-common = { path = "../syncserver-db-common" } tokenserver-db-common = { path = "../tokenserver-db-common" } diff --git a/tokenserver-db/src/tests.rs b/tokenserver-db/src/tests.rs index e02c1f4cf4..45cfd9b1cc 100644 --- a/tokenserver-db/src/tests.rs +++ b/tokenserver-db/src/tests.rs @@ -1,7 +1,5 @@ -use std::{ - thread, - time::{Duration, SystemTime, UNIX_EPOCH}, -}; +use chrono::{TimeDelta, Utc}; +use std::thread; use syncserver_common::Metrics; use syncserver_settings::Settings; @@ -160,10 +158,7 @@ async fn replace_users() -> DbResult<()> { let pool = db_pool().await?; let mut db = pool.get().await?; - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as i64; + let now: i64 = Utc::now().timestamp_millis(); let an_hour_ago = now - MILLISECONDS_IN_AN_HOUR; let service_id = db @@ -1198,7 +1193,7 @@ async fn test_correct_created_at_used_during_node_reassignment() -> DbResult<()> // Sleep very briefly to ensure the timestamp created during node reassignment is greater // than the timestamp created during user creation - thread::sleep(Duration::from_millis(5)); + thread::sleep(TimeDelta::milliseconds(5).to_std().unwrap()); // Get the user, prompting the user's reassignment to the same node let user2 = db @@ -1255,7 +1250,7 @@ async fn test_correct_created_at_used_during_user_retrieval() -> DbResult<()> { // Sleep very briefly to ensure that any timestamp that might be created below is greater // than the timestamp created during user creation - thread::sleep(Duration::from_millis(5)); + thread::sleep(TimeDelta::milliseconds(5).to_std().unwrap()); // Get the user let user2 = db @@ -1301,11 +1296,7 @@ async fn test_latest_created_at() -> DbResult<()> { .id; let email = "test_user"; - let now = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as i64; - + let now: i64 = Utc::now().timestamp_millis(); // Add a user marked as replaced let post_user = params::PostUser { service_id, diff --git a/tokenserver-mysql/Cargo.toml b/tokenserver-mysql/Cargo.toml index ce8124efb8..e7ba0ac75a 100644 --- a/tokenserver-mysql/Cargo.toml +++ b/tokenserver-mysql/Cargo.toml @@ -8,6 +8,7 @@ license.workspace = true [dependencies] async-trait.workspace = true +chrono.workspace = true deadpool.workspace = true diesel.workspace = true diesel-async.workspace = true diff --git a/tokenserver-mysql/src/db/db_impl.rs b/tokenserver-mysql/src/db/db_impl.rs index 3db0e51f80..d03ae79d43 100644 --- a/tokenserver-mysql/src/db/db_impl.rs +++ b/tokenserver-mysql/src/db/db_impl.rs @@ -1,8 +1,8 @@ use std::time::Duration; -#[cfg(debug_assertions)] -use std::time::{SystemTime, UNIX_EPOCH}; use async_trait::async_trait; +#[cfg(debug_assertions)] +use chrono::Utc; use diesel::{ OptionalExtension, sql_types::{Bigint, Float, Integer, Nullable, Text}, @@ -448,10 +448,7 @@ impl Db for TokenserverDb { WHERE nodeid = ? "#; - let current_time = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as i64; + let current_time = Utc::now().timestamp_millis(); diesel::sql_query(QUERY) .bind::(current_time) diff --git a/tokenserver-postgres/Cargo.toml b/tokenserver-postgres/Cargo.toml index 07d0698c85..420d3bb332 100644 --- a/tokenserver-postgres/Cargo.toml +++ b/tokenserver-postgres/Cargo.toml @@ -7,6 +7,7 @@ license.workspace = true [dependencies] async-trait.workspace = true +chrono.workspace = true deadpool.workspace = true diesel = { workspace = true, features = ["postgres"] } diesel-async = { workspace = true, features = ["postgres"] } diff --git a/tokenserver-postgres/src/db/db_impl.rs b/tokenserver-postgres/src/db/db_impl.rs index 6cf75520bd..f705aa5b37 100644 --- a/tokenserver-postgres/src/db/db_impl.rs +++ b/tokenserver-postgres/src/db/db_impl.rs @@ -2,10 +2,10 @@ /// imports only to be added during debug builds. /// cargo build --release will not include this code in the binary. use std::time::Duration; -#[cfg(debug_assertions)] -use std::time::{SystemTime, UNIX_EPOCH}; use async_trait::async_trait; +#[cfg(debug_assertions)] +use chrono::Utc; use diesel::{ OptionalExtension, sql_types::{BigInt, Float, Integer, Nullable, Text}, @@ -461,10 +461,7 @@ impl Db for TokenserverPgDb { WHERE nodeid = $2 "#; - let current_time: i64 = SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() as i64; + let current_time = Utc::now().timestamp_millis(); diesel::sql_query(QUERY) .bind::(current_time)