Come decomprimere i file jsonlz4 (backup dei segnalibri di Firefox) utilizzando la riga di comando?


Risposte:


18

Sono stato in grado di decomprimere jsonlz4 utilizzando lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4

1
La soluzione andikleen è buona anche per i .json.mozlz4file, ad esempio come mostrato su github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (nota per sé: ricorda, ricorda, gmakesu FreeBSD ...).
Graham Perrin,

3
Inoltre: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (13/05/2016) con il bug Mozilla 1209390 - Usa il formato file lz4 standard invece del jsonlz4 / mozlz4 non standard attira l'attenzione su avih / dejsonlz4: Decomprimi i file di backup dei segnalibri di Mozilla Firefox
Graham Perrin,

1
FWIW, lo strumento di andikleen non è stato compilato, con l'errore "riferimento indefinito a LZ4_decompress_safe_partial" (l'ho installato liblz4-devprima di crearlo ). Lo strumento di avih, OTOH, ha funzionato perfettamente per me.
waldyrious

1
Non è ironico che un'organizzazione open-web stia utilizzando un formato di compressione proprietario per i dati dell'utente, rendendo non banale esaminare i tuoi dati ?!
CNST

@ Graham-Perrin: dejsonlz4 ha funzionato molto bene per me. Non " trasforma i file jsonlz4 in qualcosa che unlz4 leggerà " come richiesto, ma li decomprime direttamente. Sarebbe bello renderlo una vera risposta per renderlo più visibile.
marzo

17

Salvare questo script in un file, ad esempio 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)

Ho dovuto cambiare import lz4a import lz4.block as lz4, ma ancora non ha funzionato. Alcuni byte vs errore relativo alla stringa. OTOH questo script ha funzionato con la modifica dell'importazione: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389

1
@ user31389: ho aggiornato lo script. Funziona adesso?
Håkon A. Hjortland,

Non funzionava per me fino a quando non l'ho fatto $ pip install lz4.
Daniel,

5

In realtà quasi tutti i file lz4 del profilo Firefox sono file mozlz4 . Significa che hanno la stessa "intestazione del formato file". Tranne un file. Parlo di webext.sc.lz4 file. Ha mozJSSCLz40v001\0un'intestazione di file e forse alcuni scpacchetti per comprimere un gruppo di file sul flusso di byte.

Esiste un componente aggiuntivo di Firefox per leggere o comprimere i file di testo .mozlz4 mozlz4-edit


4

Googling sufficientemente persistente per questo presenta molte soluzioni, ma la maggior parte di esse sembra essere (a) interrotta da successive modifiche alle librerie sottostanti, o (b) inutilmente complessa (almeno per i miei gusti personali), rendendole ingombranti a rilasciare nel codice esistente.

Quanto segue sembra funzionare almeno su Python 2.7 e 3.6 usando una versione recente dei collegamenti 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

Ovviamente questo non tenta di convalidare input (o output), non è inteso per essere sicuro, ecc., Ma se si vuole solo essere in grado di analizzare i propri dati FF, ottiene il lavoro di base.

Versione della riga di comando qui , che può essere salvata nella directory pertinente e richiamata dalla riga di comando come:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.