Tengo una aplicación web simple para cargar archivos zip en un servidor. En la parte de Javascript, he usado un bloque try-catch para verificar si los archivos están protegidos con contraseña (una contraseña predefinida y conocida) leyendo las entradas y detectando el error correspondiente.
La biblioteca js que estoy usando es https://github.com/gildas-lormeau/zip.js/blob/master/dist/zip.min.js .
let reader; try { reader = new zip.ZipReader(new zip.BlobReader(file), { password }); const entries = await reader.getEntries(); for (const entry of entries) { try { await entry.getData(new zip.BlobWriter(), { onprogress: (index, max) => { zip.BlobWriter.$cancel() reader.close() } }); } catch (error) { if (error.message === zip.ERR_ENCRYPTED || error.message === zip.ERR_INVALID_PASSWORD) { alert("Incorrect password") return false; } else { console.log(error) } } } } catch (error) { console.log(error) } finally { await reader.close(); }El código anterior descubre con éxito si el archivo no está encriptado con la contraseña predeterminada. Sin embargo, para algunos archivos, la declaración de error es la siguiente. TypeError: no se pueden leer las propiedades de undefined (leyendo 'importKey')
Me gustaría saber por qué sucede esto y cómo saber si el archivo está protegido con contraseña o no.
Gracias
Hay algunos problemas con el código que propuso, por ejemplo, BlobWriter.$cancel no está documentado en ninguna parte y en realidad no existe. Además, debe llamar a reader.close() solo una vez.
A continuación se muestra cómo se podría escribir una función de este tipo.
const verifyZipPassword = async (file, password) => { const reader = new zip.ZipReader(new zip.BlobReader(file), { password }); const entries = await reader.getEntries(); try { for (const entry of entries) { const abortController = new AbortController(); const signal = abortController.signal; const onprogress = () => abortController.abort(); await entry.getData(new zip.BlobWriter(), { signal, onprogress }); } } catch (error) { if (error.message == zip.ERR_INVALID_PASSWORD) { return false; } else if (error.message != zip.ERR_ABORT) { throw error; } } finally { await reader.close(); } return true; };