From 7328ba8dd5aa79a7548247313e264ec3ae0aaa47 Mon Sep 17 00:00:00 2001 From: mdecimus Date: Wed, 15 May 2024 17:42:00 +0200 Subject: [PATCH] Range scanning of message and report queues --- crates/jmap/src/api/management/queue.rs | 24 ++++++++++++++++-------- crates/jmap/src/api/management/report.rs | 24 +++++++++++++++++------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/crates/jmap/src/api/management/queue.rs b/crates/jmap/src/api/management/queue.rs index 51b155d9..b829aa01 100644 --- a/crates/jmap/src/api/management/queue.rs +++ b/crates/jmap/src/api/management/queue.rs @@ -135,14 +135,18 @@ impl JMAP { let to = params.get("to"); let before = params.parse::("before").map(|t| t.into_inner()); let after = params.parse::("after").map(|t| t.into_inner()); - let page: usize = params.parse::("page").unwrap_or_default(); - let limit: usize = params.parse::("limit").unwrap_or_default(); + let page = params.parse::("page").unwrap_or_default(); + let limit = params.parse::("limit").unwrap_or_default(); let values = params.has_key("values"); + let range_start = params.parse::("range-start").unwrap_or_default(); + let range_end = params.parse::("range-end").unwrap_or(u64::MAX); + let max_total = params.parse::("max-total").unwrap_or_default(); + let mut result_ids = Vec::new(); let mut result_values = Vec::new(); - let from_key = ValueKey::from(ValueClass::Queue(QueueClass::Message(0))); - let to_key = ValueKey::from(ValueClass::Queue(QueueClass::Message(u64::MAX))); + let from_key = ValueKey::from(ValueClass::Queue(QueueClass::Message(range_start))); + let to_key = ValueKey::from(ValueClass::Queue(QueueClass::Message(range_end))); let has_filters = text.is_some() || from.is_some() || to.is_some() @@ -203,7 +207,7 @@ impl JMAP { total += 1; } - Ok(true) + Ok(max_total == 0 || total < max_total) }, ) .await; @@ -376,10 +380,14 @@ impl JMAP { let page: usize = params.parse("page").unwrap_or_default(); let limit: usize = params.parse("limit").unwrap_or_default(); + let range_start = params.parse::("range-start").unwrap_or_default(); + let range_end = params.parse::("range-end").unwrap_or(u64::MAX); + let max_total = params.parse::("max-total").unwrap_or_default(); + let mut result = Vec::new(); let from_key = ValueKey::from(ValueClass::Queue(QueueClass::DmarcReportHeader( ReportEvent { - due: 0, + due: range_start, policy_hash: 0, seq_id: 0, domain: String::new(), @@ -387,7 +395,7 @@ impl JMAP { ))); let to_key = ValueKey::from(ValueClass::Queue(QueueClass::TlsReportHeader( ReportEvent { - due: u64::MAX, + due: range_end, policy_hash: 0, seq_id: 0, domain: String::new(), @@ -428,7 +436,7 @@ impl JMAP { } } - Ok(true) + Ok(max_total == 0 || total < max_total) }, ) .await; diff --git a/crates/jmap/src/api/management/report.rs b/crates/jmap/src/api/management/report.rs index f4eb5185..525f473c 100644 --- a/crates/jmap/src/api/management/report.rs +++ b/crates/jmap/src/api/management/report.rs @@ -61,30 +61,40 @@ impl JMAP { let page: usize = params.parse::("page").unwrap_or_default(); let limit: usize = params.parse::("limit").unwrap_or_default(); + let range_start = params.parse::("range-start").unwrap_or_default(); + let range_end = params.parse::("range-end").unwrap_or(u64::MAX); + let max_total = params.parse::("max-total").unwrap_or_default(); + let (from_key, to_key, typ) = match class { "dmarc" => ( ValueKey::from(ValueClass::Report(ReportClass::Dmarc { - id: 0, + id: range_start, expires: 0, })), ValueKey::from(ValueClass::Report(ReportClass::Dmarc { - id: u64::MAX, + id: range_end, expires: u64::MAX, })), ReportType::Dmarc, ), "tls" => ( - ValueKey::from(ValueClass::Report(ReportClass::Tls { id: 0, expires: 0 })), ValueKey::from(ValueClass::Report(ReportClass::Tls { - id: u64::MAX, + id: range_start, + expires: 0, + })), + ValueKey::from(ValueClass::Report(ReportClass::Tls { + id: range_end, expires: u64::MAX, })), ReportType::Tls, ), "arf" => ( - ValueKey::from(ValueClass::Report(ReportClass::Arf { id: 0, expires: 0 })), ValueKey::from(ValueClass::Report(ReportClass::Arf { - id: u64::MAX, + id: range_start, + expires: 0, + })), + ValueKey::from(ValueClass::Report(ReportClass::Arf { + id: range_end, expires: u64::MAX, })), ReportType::Arf, @@ -145,7 +155,7 @@ impl JMAP { total += 1; } - Ok(true) + Ok(max_total == 0 || total < max_total) }, ) .await;