Jak rozpakować pliki jsonlz4 (kopie zapasowe zakładek Firefox) za pomocą wiersza polecenia?

Odpowiedzi:

18

Byłem w stanie rozpakować jsonlz4, używając lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Rolf
źródło
1
Rozwiązanie andikleen jest również dobre dla .json.mozlz4plików, np. Jak pokazano na github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (uwaga do siebie: pamiętaj, pamiętaj, gmakena FreeBSD…).
Graham Perrin
3
Również: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) w błędzie Mozilla 1209390 - Użyj standardowego formatu pliku LZ4 zamiast niestandardowego jsonlz4 / mozlz4 zwraca uwagę na avih / dejsonlz4: Rozpakuj pliki kopii zapasowej zakładek Mozilli Firefox
Graham Perrin
1
FWIW, narzędzie andikleen nie udało się skompilować, z błędem „niezdefiniowane odwołanie do LZ4_decompress_safe_partial” (zainstalowałem liblz4-devprzed jego zbudowaniem). narzędzie avih, OTOH, działało dla mnie idealnie.
waldyrious,
1
Czy to nie ironia, że ​​organizacja typu open-web korzysta z zastrzeżonego formatu kompresji danych użytkownika, co sprawia, że ​​sprawdzanie własnych danych nie jest trywialne ?!
cnst
@ Graham-Perrin: dejsonlz4 działał dla mnie bardzo dobrze. Nie „ przekształca plików jsonlz4 w coś, co przeczyta unlz4 ” zgodnie z żądaniem, ale bezpośrednio je dekompresuje. Dobrze byłoby uczynić to prawdziwą odpowiedzią, aby była bardziej widoczna.
mivk
17

Zapisz ten skrypt w pliku, np . mozlz4:

#!/usr/bin/env python
from sys import stdin, stdout, argv, stderr
import os
try:
    import lz4.block as lz4
except ImportError:
    import lz4

stdin = os.fdopen(stdin.fileno(), 'rb')
stdout = os.fdopen(stdout.fileno(), 'wb')

if argv[1:] == ['-c']:
    stdout.write(b'mozLz40\0' + lz4.compress(stdin.read()))
elif argv[1:] == ['-d']:
    assert stdin.read(8) == b'mozLz40\0'
    stdout.write(lz4.decompress(stdin.read()))
else:
    stderr.write('Usage: %s -c|-d < infile > outfile\n' % argv[0])
    stderr.write('Compress or decompress Mozilla-flavor LZ4 files.\n\n')
    stderr.write('Examples:\n')
    stderr.write('\t%s -d < infile.json.mozlz4 > outfile.json\n' % argv[0])
    stderr.write('\t%s -c < infile.json > outfile.json.mozlz4\n' % argv[0])
    exit(1)
Håkon A. Hjortland
źródło
Musiałem zmienić import lz4się import lz4.block as lz4, ale nadal nie działa. Błąd związany z niektórymi bajtami a ciągiem. OTOH ten skrypt działał ze zmianą importu: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389
1
@ user31389: Zaktualizowałem skrypt. Czy to działa teraz?
Håkon A. Hjortland,
Nie działało dla mnie, dopóki nie zrobiłem $ pip install lz4.
Daniel
5

Właściwie prawie wszystkie pliki lz4 profilu Firefox to pliki mozlz4 . Oznacza to, że mają ten sam „nagłówek formatu pliku”. Z wyjątkiem jednego pliku. Mówię o pliku webext.sc.lz4 . Ma mozJSSCLz40v001\0nagłówek pliku i może jakieś scopakowanie do spakowania grupy plików do strumienia bajtów.

Jest to dodatek do Firefoksa czytać lub kompresował .mozlz4 pliki tekstowe mozlz4-edit

hlovdal
źródło
4

Wystarczająco trwałe utrzymywanie googlingu w tym przypadku ujawnia wiele rozwiązań, ale większość z nich wydaje się albo (a) zepsuta przez późniejsze zmiany w bazowych bibliotekach, albo (b) niepotrzebnie skomplikowana (przynajmniej według mojego osobistego gustu), co czyni ich niezręcznymi upuść w istniejącym kodzie.

Następujące wydaje się działać przynajmniej w Pythonie 2.7 i 3.6 przy użyciu najnowszej wersji powiązań Python LZ4 :

def mozlz4_to_text(filepath):
    # Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file, 
    # return the uncompressed text.
    import lz4.block
    bytestream = open(filepath, "rb")
    bytestream.read(8)  # skip past the b"mozLz40\0" header
    valid_bytes = bytestream.read()
    text = lz4.block.decompress(valid_bytes)
    return text

Oczywiście nie ma to na celu sprawdzania poprawności danych wejściowych (lub danych wyjściowych), nie ma na celu zapewnienia bezpieczeństwa itp., Ale jeśli ktoś chce po prostu parsować własne dane FF, wykonuje podstawowe zadanie.

Wiersz poleceń wersja tutaj , które mogą być zapisane w odpowiednim katalogu i wywoływany z linii poleceń jak:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
Samuel Henderson
źródło