From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 2D04EAB9B for ; Wed, 28 Jun 2023 10:54:32 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 13A5120043 for ; Wed, 28 Jun 2023 10:54:32 +0200 (CEST) Received: from nena.proxmox.com (unknown [94.136.29.99]) by firstgate.proxmox.com (Proxmox) with ESMTP for ; Wed, 28 Jun 2023 10:54:31 +0200 (CEST) Received: by nena.proxmox.com (Postfix, from userid 1000) id 71EAE255007; Wed, 28 Jun 2023 10:54:31 +0200 (CEST) From: Mira Limbeck To: pmg-devel@lists.proxmox.com Date: Wed, 28 Jun 2023 10:54:28 +0200 Message-Id: <20230628085429.324086-1-m.limbeck@proxmox.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.678 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record T_SCC_BODY_TEXT_LINE -0.01 - URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [main.rs] Subject: [pmg-devel] [PATCH log-tracker 1/2] add compatibility with API/Tracking Center X-BeenThere: pmg-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Mail Gateway development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Jun 2023 08:54:32 -0000 The API assumes the timestamps to be in the local timezone rather than UTC. It then subtracts the timezone offset leading to wrong values when timestamps are in UTC, but timezone is not. For compatibility, add the local timezone to those timestamps. Signed-off-by: Mira Limbeck --- src/main.rs | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index e7bffd8..e55f17b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1737,6 +1737,8 @@ struct Parser { string_match: bool, lines: u64, + + timezone_offset: time_t, } impl Parser { @@ -1762,6 +1764,7 @@ impl Parser { ctime: 0, string_match: false, lines: 0, + timezone_offset: ltime.tm_gmtoff, }) } @@ -1836,7 +1839,12 @@ impl Parser { let line = &buffer[0..size - 1]; let complete_line = line; - let (time, line) = match parse_time(line, self.current_year, self.current_month) { + let (time, line) = match parse_time( + line, + self.current_year, + self.current_month, + self.timezone_offset, + ) { Some(t) => t, None => continue, }; @@ -1920,9 +1928,12 @@ impl Parser { if size == 0 { return count; } - if let Some((time, _)) = - parse_time(&buffer[0..size], self.current_year, self.current_month) - { + if let Some((time, _)) = parse_time( + &buffer[0..size], + self.current_year, + self.current_month, + self.timezone_offset, + ) { // found the earliest file in the time frame if time < self.options.start { break; @@ -1937,9 +1948,12 @@ impl Parser { if size == 0 { return count; } - if let Some((time, _)) = - parse_time(&buffer[0..size], self.current_year, self.current_month) - { + if let Some((time, _)) = parse_time( + &buffer[0..size], + self.current_year, + self.current_month, + self.timezone_offset, + ) { if time < self.options.start { break; } @@ -2235,11 +2249,17 @@ fn parse_number(data: &[u8], max_digits: usize) -> Option<(usize, &[u8])> { } /// Parse time. Returns a tuple of (parsed_time, remaining_text) or None. -fn parse_time(data: &'_ [u8], cur_year: i64, cur_month: i64) -> Option<(time_t, &'_ [u8])> { - parse_time_with_year(data).or_else(|| parse_time_no_year(data, cur_year, cur_month)) +fn parse_time( + data: &'_ [u8], + cur_year: i64, + cur_month: i64, + timezone_offset: time_t, +) -> Option<(time_t, &'_ [u8])> { + parse_time_with_year(data, timezone_offset) + .or_else(|| parse_time_no_year(data, cur_year, cur_month)) } -fn parse_time_with_year(data: &'_ [u8]) -> Option<(time_t, &'_ [u8])> { +fn parse_time_with_year(data: &'_ [u8], timezone_offset: time_t) -> Option<(time_t, &'_ [u8])> { let mut timestamp_buffer = [0u8; 25]; let count = data.iter().take_while(|b| **b != b' ').count(); @@ -2266,7 +2286,8 @@ fn parse_time_with_year(data: &'_ [u8]) -> Option<(time_t, &'_ [u8])> { match proxmox_time::parse_rfc3339(unsafe { std::str::from_utf8_unchecked(×tamp_buffer[0..timestamp_len]) }) { - Ok(ltime) => Some((ltime, data)), + // TODO handle timezone offset in old code path instead + Ok(ltime) => Some((ltime + timezone_offset, data)), Err(_err) => None, } } -- 2.30.2