Bagaimana cara mendekompres file jsonlz4 (backup bookmark Firefox) menggunakan baris perintah?

Jawaban:

18

Saya dapat membongkar jsonlz4 dengan menggunakan lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Rolf
sumber
1
Solusi andikleen juga baik untuk .json.mozlz4file misalnya seperti yang ditunjukkan di github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (catatan untuk diri sendiri: ingat, ingat, gmakedi FreeBSD ...).
Graham Perrin
3
Juga: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) di bawah Mozilla bug 1209390 - Gunakan format file lz4 standar alih-alih jsonlz4 / mozlz4 yang non-standar menarik perhatian avih / dejsonlz4: Dekompresi file cadangan bookmark Mozilla Firefox
Graham Perrin
1
FWIW, alat andikleen gagal dikompilasi, dengan kesalahan "referensi tidak ditentukan untuk LZ4_decompress_safe_partial" (saya menginstal liblz4-devsebelum membangunnya). Alat avih, OTOH, bekerja dengan sempurna untuk saya.
waldyrious
1
Bukankah ironis bahwa web org terbuka menggunakan format kompresi berpemilik untuk data pengguna, membuatnya tidak sepele untuk memeriksa data Anda sendiri ?!
cnst
@ Graham-Perrin: dejsonlz4 bekerja sangat baik untuk saya. Itu tidak " mengubah file jsonlz4 menjadi sesuatu yang unlz4 akan baca " seperti yang diminta tetapi langsung mendekompresinya. Akan lebih baik menjadikannya jawaban nyata untuk membuatnya lebih terlihat.
mivk
17

Simpan skrip ini dalam file, misalnya 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)
Haak A. Hjortland
sumber
Saya harus pindah import lz4ke import lz4.block as lz4, tetapi masih tidak berhasil. Beberapa byte terkait kesalahan terkait string. OTOH skrip ini berfungsi dengan perubahan impor: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389
1
@ user31389: Saya memperbarui skrip. Apakah ini berfungsi sekarang?
Håkon A. Hjortland
Tidak bekerja untuk saya sampai saya melakukannya $ pip install lz4.
Daniel
5

Sebenarnya hampir semua file profil lz4 Firefox adalah file mozlz4 . Itu berarti mereka memiliki "header format file" yang sama. Kecuali satu file. Saya berbicara tentang file webext.sc.lz4 . Memiliki mozJSSCLz40v001\0header file dan mungkin beberapa sckemasan untuk mengemas grup file ke pada byte stream.

Ada addon Firefox untuk membaca atau kompres .mozlz4 file teks mozlz4-edit

hlovdal
sumber
4

Googling yang cukup gigih untuk ini menghasilkan banyak solusi, tetapi sebagian besar dari mereka tampaknya (a) rusak oleh perubahan berikutnya pada pustaka yang mendasarinya, atau (b) tidak perlu rumit (setidaknya sesuai dengan selera pribadi saya), membuat mereka kikuk untuk masukkan ke dalam kode yang ada.

Berikut ini tampaknya berfungsi setidaknya pada Python 2.7 dan 3.6 menggunakan versi terbaru dari binding 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

Tentu saja ini tidak mencoba untuk memvalidasi input (atau output), tidak dimaksudkan untuk aman, dll., Tetapi jika seseorang hanya ingin dapat mengurai data FF sendiri, itu akan menyelesaikan pekerjaan dasar.

Versi baris perintah di sini , yang dapat disimpan di direktori yang relevan dan dipanggil dari baris perintah sebagai:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
Samuel Henderson
sumber