¿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

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)

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


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.