#! /usr/bin/python
|
|
|
|
"""
|
|
List all Firefox tabs with title and URL
|
|
|
|
Supported input: json or jsonlz4 recovery files
|
|
Default output: title (URL)
|
|
Output format can be specified as argument
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import pathlib
|
|
import lz4.block
|
|
import json
|
|
|
|
class Node:
|
|
def __init__(self, url, lastAccessed):
|
|
self.url = url
|
|
self.lastAccessed = lastAccessed
|
|
self.left = None
|
|
self.right = None
|
|
self.parent = None
|
|
|
|
def insert(self, node):
|
|
if node.lastAccessed > self.lastAccessed:
|
|
if self.right:
|
|
self.right.insert(node)
|
|
else:
|
|
self.right = node
|
|
node.parent = self
|
|
else:
|
|
if self.left:
|
|
self.left.insert(node)
|
|
else:
|
|
self.left = node
|
|
node.parent = self
|
|
|
|
def print(self):
|
|
if self.right: # Print from high to low
|
|
self.right.print()
|
|
print(self.url)
|
|
if self.left:
|
|
self.left.print()
|
|
|
|
def main():
|
|
path = pathlib.Path('/dev/shm/firefox-' + os.environ['FIREFOX_PROFILE'] + "-" + os.environ['USER'] + '/sessionstore-backups')
|
|
files = path.glob('recovery.js*')
|
|
tree = None
|
|
|
|
for f in files:
|
|
b = f.read_bytes()
|
|
if b[:8] == b'mozLz40\0':
|
|
b = lz4.block.decompress(b[8:])
|
|
j = json.loads(b)
|
|
for w in j['windows']:
|
|
for t in w['tabs']:
|
|
i = t['index'] - 1
|
|
node = Node(t['entries'][i]['url'], t['lastAccessed'])
|
|
if tree:
|
|
tree.insert(node)
|
|
else:
|
|
tree = node
|
|
|
|
if tree:
|
|
tree.print()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|
|
|