Comment décompresser des fichiers jsonlz4 (sauvegardes de signets Firefox) en utilisant la ligne de commande?

Réponses:

18

J'ai pu déballer le jsonlz4 en utilisant lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Rolf
la source
1
La solution andikleen est également bonne pour les .json.mozlz4fichiers, par exemple, comme indiqué sur github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (note à soi: souviens-toi, souviens-toi, gmakesur FreeBSD…).
Graham Perrin
3
Aussi: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) sous Mozilla bug 1209390 - Utiliser le format de fichier lz4 standard au lieu du jsonlz4 / mozlz4 non standard attire l'attention sur avih / dejsonlz4: Décompressez les fichiers de sauvegarde des signets Mozilla Firefox
Graham Perrin
1
FWIW, l'outil d'Andikleen n'a pas pu être compilé, avec l'erreur "référence non définie à LZ4_decompress_safe_partial" (je l'ai installé liblz4-devavant de le construire). L'outil d'avih, OTOH, a parfaitement fonctionné pour moi.
waldyrious
1
N'est-il pas ironique qu'une organisation open-web utilise un format de compression propriétaire pour les données des utilisateurs, ce qui rend non trivial l'examen de vos propres données?!
2018 à 16h42
@ Graham-Perrin: dejsonlz4 a très bien fonctionné pour moi. Il ne " transforme pas les fichiers jsonlz4 en quelque chose que unlz4 lira " comme demandé mais les décompresse directement. Il serait bon d'en faire une vraie réponse pour la rendre plus visible.
mivk
17

Enregistrez ce script dans un fichier, par exemple 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
la source
J'ai dû changer import lz4pour import lz4.block as lz4, mais cela n'a toujours pas fonctionné. Certains octets par rapport à une erreur liée à une chaîne. OTOH, ce script a fonctionné avec la modification d'importation: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389
1
@ user31389: J'ai mis à jour le script. Ça marche maintenant?
Håkon A. Hjortland
Ne travaillait pas pour moi jusqu'à ce que je le fasse $ pip install lz4.
Daniel
5

En fait, presque tous les fichiers lz4 du profil Firefox sont des fichiers mozlz4 . Cela signifie qu'ils ont le même "en-tête de format de fichier". Sauf un fichier. Je parle du fichier webext.sc.lz4 . Il a mozJSSCLz40v001\0un en-tête de fichier et peut-être un scemballage pour emballer un groupe de fichiers dans un flux d'octets.

Il y a un addon Firefox pour lire ou Compresser .mozlz4 fichiers texte mozlz4-edit

hlovdal
la source
4

Googler suffisamment persistant pour cela se révèle beaucoup de solutions, mais la plupart d'entre elles semblent être soit (a) cassées par des modifications ultérieures des bibliothèques sous-jacentes, ou (b) inutilement complexes (au moins à mon goût personnel), les rendant maladroites à déposer dans le code existant.

Les éléments suivants semblent fonctionner au moins sur Python 2.7 et 3.6 à l'aide d'une version récente des liaisons 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

Bien sûr, cela ne tente pas de valider les entrées (ou les sorties), n'est pas destiné à être sécurisé, etc., mais si l'on veut simplement pouvoir analyser ses propres données FF, cela fait le travail de base.

Version de ligne de commande ici , qui pourrait être enregistrée dans le répertoire approprié et invoquée à partir de la ligne de commande en tant que:

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