Chrome tabs & session snss file reading
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix timestamp parsing for LAST_ACTIVE_TIME and TAB_CLOSED commands

rektide 77961621 13952941

+57 -15
+57 -15
src/command/session.rs
··· 2 2 use crate::common::NavigationEntry; 3 3 use crate::common::{TabGroupColor, Token, WindowShowState, WindowType}; 4 4 use byteorder::{ByteOrder, LittleEndian}; 5 - use jiff::{Span, Timestamp, Zoned}; 5 + use jiff::{Timestamp, Zoned}; 6 6 use serde::Serialize; 7 7 use std::collections::HashMap; 8 8 ··· 451 451 } 452 452 453 453 fn parse_closed(data: &[u8], is_tab: bool) -> Self { 454 - if data.len() < 12 { 454 + if data.len() < 16 { 455 455 let cmd = if is_tab { 456 456 session_command_id::TAB_CLOSED 457 457 } else { ··· 463 463 }; 464 464 } 465 465 let id = LittleEndian::read_i32(&data[0..4]); 466 - let close_time_micros = LittleEndian::read_i64(&data[4..12]); 466 + let close_time_micros = LittleEndian::read_i64(&data[8..16]); 467 + 468 + let span = match jiff::Span::new().try_microseconds(close_time_micros) { 469 + Ok(s) => s, 470 + Err(_) => { 471 + let cmd = if is_tab { 472 + session_command_id::TAB_CLOSED 473 + } else { 474 + session_command_id::WINDOW_CLOSED 475 + }; 476 + return SnssCommand::Unknown { 477 + command_id: cmd, 478 + data_len: data.len(), 479 + }; 480 + } 481 + }; 482 + 467 483 let base = Timestamp::from_second(-11644473600).unwrap(); 468 - let span = Span::new().microseconds(close_time_micros); 469 - let close_time = base 470 - .checked_add(span) 471 - .unwrap() 472 - .to_zoned(jiff::tz::TimeZone::UTC); 484 + let close_time = match base.checked_add(span) { 485 + Ok(t) => t.to_zoned(jiff::tz::TimeZone::UTC), 486 + Err(_) => { 487 + let cmd = if is_tab { 488 + session_command_id::TAB_CLOSED 489 + } else { 490 + session_command_id::WINDOW_CLOSED 491 + }; 492 + return SnssCommand::Unknown { 493 + command_id: cmd, 494 + data_len: data.len(), 495 + }; 496 + } 497 + }; 498 + 473 499 let payload = ClosedPayload { id, close_time }; 474 500 if is_tab { 475 501 SnssCommand::TabClosed(payload) ··· 599 625 } 600 626 601 627 fn parse_last_active_time(data: &[u8]) -> Self { 602 - if data.len() < 12 { 628 + if data.len() < 16 { 603 629 return SnssCommand::Unknown { 604 630 command_id: session_command_id::LAST_ACTIVE_TIME, 605 631 data_len: data.len(), 606 632 }; 607 633 } 608 634 let tab_id = LittleEndian::read_i32(&data[0..4]); 609 - let time_micros = LittleEndian::read_i64(&data[4..12]); 635 + let time_micros = LittleEndian::read_i64(&data[8..16]); 636 + 637 + let span = match jiff::Span::new().try_microseconds(time_micros) { 638 + Ok(s) => s, 639 + Err(_) => { 640 + return SnssCommand::Unknown { 641 + command_id: session_command_id::LAST_ACTIVE_TIME, 642 + data_len: data.len(), 643 + }; 644 + } 645 + }; 646 + 610 647 let base = Timestamp::from_second(-11644473600).unwrap(); 611 - let span = Span::new().microseconds(time_micros); 612 - let last_active_time = base 613 - .checked_add(span) 614 - .unwrap() 615 - .to_zoned(jiff::tz::TimeZone::UTC); 648 + let last_active_time = match base.checked_add(span) { 649 + Ok(t) => t.to_zoned(jiff::tz::TimeZone::UTC), 650 + Err(_) => { 651 + return SnssCommand::Unknown { 652 + command_id: session_command_id::LAST_ACTIVE_TIME, 653 + data_len: data.len(), 654 + }; 655 + } 656 + }; 657 + 616 658 SnssCommand::LastActiveTime(LastActiveTime { 617 659 tab_id, 618 660 last_active_time,