From c6752007dcf6363bf494f8490b5cb2ba13fc91d1 Mon Sep 17 00:00:00 2001 From: besendorf Date: Sun, 13 Jul 2025 09:51:57 +0200 Subject: [PATCH] webkit session resource: fail gracefully when date conversion fails --- .../mixed/webkit_session_resource_log.py | 72 +++++++++++-------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/mvt/ios/modules/mixed/webkit_session_resource_log.py b/src/mvt/ios/modules/mixed/webkit_session_resource_log.py index 0ae2545..c27061d 100644 --- a/src/mvt/ios/modules/mixed/webkit_session_resource_log.py +++ b/src/mvt/ios/modules/mixed/webkit_session_resource_log.py @@ -116,38 +116,54 @@ class WebkitSessionResourceLog(IOSExtraction): ) def _extract_browsing_stats(self, log_path): - items = [] + items = [] - with open(log_path, "rb") as handle: - file_plist = plistlib.load(handle) + with open(log_path, "rb") as handle: + file_plist = plistlib.load(handle) + + if "browsingStatistics" not in file_plist: + return items + + browsing_stats = file_plist["browsingStatistics"] + + for item in browsing_stats: + most_recent_interaction, last_seen = None, None + if "mostRecentUserInteraction" in item: + try: + most_recent_interaction = convert_datetime_to_iso( + item["mostRecentUserInteraction"] + ) + except Exception: + self.log.error( + f'Error converting date of Safari resource"most recent interaction": {item["mostRecentUserInteraction"]}' + ) + if "lastSeen" in item: + try: + last_seen = convert_datetime_to_iso(item["lastSeen"]) + except Exception: + self.log.error( + f'Error converting date of Safari resource"last seen": {item["lastSeen"]}' + ) + + items.append( + { + "origin": item.get("PrevalentResourceOrigin", ""), + "redirect_source": item.get("topFrameUniqueRedirectsFrom", ""), + "redirect_destination": item.get("topFrameUniqueRedirectsTo", ""), + "subframe_under_origin": item.get( + "subframeUnderTopFrameOrigins", "" + ), + "subresource_under_origin": item.get( + "subresourceUnderTopFrameOrigins", "" + ), + "user_interaction": item.get("hadUserInteraction"), + "most_recent_interaction": most_recent_interaction, + "last_seen": last_seen, + } + ) - if "browsingStatistics" not in file_plist: return items - browsing_stats = file_plist["browsingStatistics"] - - for item in browsing_stats: - items.append( - { - "origin": item.get("PrevalentResourceOrigin", ""), - "redirect_source": item.get("topFrameUniqueRedirectsFrom", ""), - "redirect_destination": item.get("topFrameUniqueRedirectsTo", ""), - "subframe_under_origin": item.get( - "subframeUnderTopFrameOrigins", "" - ), - "subresource_under_origin": item.get( - "subresourceUnderTopFrameOrigins", "" - ), - "user_interaction": item.get("hadUserInteraction"), - "most_recent_interaction": convert_datetime_to_iso( - item["mostRecentUserInteraction"] - ), - "last_seen": convert_datetime_to_iso(item["lastSeen"]), - } - ) - - return items - def run(self) -> None: if self.is_backup: for log_file in self._get_backup_files_from_manifest(