¿Cómo descomprimir archivos jsonlz4 (copias de seguridad de marcadores de Firefox) usando la línea de comando?

Respuestas:

18

Pude descomprimir el jsonlz4 usando lz4json:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
Rolf
fuente
1
La solución andikleen también es buena para .json.mozlz4archivos, por ejemplo, como se muestra en github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (nota para sí mismo: recuerde, recuerde, gmakeen FreeBSD ...).
Graham Perrin
3
También: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) en Mozilla bug 1209390 - Use el formato de archivo lz4 estándar en lugar del no estándar jsonlz4 / mozlz4 llama la atención sobre avih / dejsonlz4: Descomprima los archivos de respaldo de marcadores de Mozilla Firefox
Graham Perrin
1
FWIW, la herramienta de andikleen no pudo compilarse, con el error "referencia indefinida a LZ4_decompress_safe_partial" (lo instalé liblz4-devantes de construirlo). La herramienta de avih, OTOH, funcionó perfectamente para mí.
waldyrious
1
¿No es irónico que una organización de web abierta esté utilizando un formato de compresión patentado para los datos del usuario, por lo que no es trivial examinar sus propios datos?
cnst
@ Graham-Perrin: dejsonlz4 funcionó muy bien para mí. No " transforma los archivos jsonlz4 en algo que leerá unlz4 " como se solicitó, sino que los descomprime directamente. Sería bueno que sea una respuesta real para que sea más visible.
mivk
17

Guarde este script en un archivo, por ejemplo 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
fuente
Tuve que cambiar import lz4a import lz4.block as lz4, pero aún no funcionaba. Algunos bytes vs error relacionado con la cadena. OTOH, este script funcionó con el cambio de importación: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389
1
@ user31389: Actualicé el script. ¿Funciona ahora?
Håkon A. Hjortland
No estaba trabajando para mí hasta que lo hice $ pip install lz4.
Daniel
5

En realidad, casi todos los archivos lz4 de perfil de Firefox son archivos mozlz4 . Significa que tienen el mismo "encabezado de formato de archivo". Excepto un archivo. Hablo de webext.sc.lz4 archivo. Tiene mozJSSCLz40v001\0encabezado de archivo y tal vez algún scpaquete para empacar un grupo de archivos en una secuencia de bytes.

No es un complemento de Firefox para leer o comprimir .mozlz4 archivos de texto mozlz4-edit

hlovdal
fuente
4

Buscar en Google lo suficientemente persistente para esto arroja muchas soluciones, pero la mayoría de ellas parecen estar (a) interrumpidas por cambios posteriores en las bibliotecas subyacentes, o (b) innecesariamente complejas (al menos para mi gusto personal), lo que las hace torpes para caer en el código existente.

Lo siguiente parece funcionar al menos en Python 2.7 y 3.6 usando una versión reciente de los enlaces 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

Por supuesto, esto no intenta validar entradas (o salidas), no está destinado a ser seguro, etc., pero si uno solo quiere poder analizar sus propios datos FF, realiza el trabajo básico.

Versión de línea de comando aquí , que se puede guardar en el directorio correspondiente e invocar desde la línea de comando como:

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