| 'use strict'; |
| var utils = require('./utils'); |
| var external = require("./external"); |
| var utf8 = require('./utf8'); |
| var utils = require('./utils'); |
| var ZipEntries = require('./zipEntries'); |
| var Crc32Probe = require('./stream/Crc32Probe'); |
| var nodejsUtils = require("./nodejsUtils"); |
| |
| /** |
| * Check the CRC32 of an entry. |
| * @param {ZipEntry} zipEntry the zip entry to check. |
| * @return {Promise} the result. |
| */ |
| function checkEntryCRC32(zipEntry) { |
| return new external.Promise(function (resolve, reject) { |
| var worker = zipEntry.decompressed.getContentWorker().pipe(new Crc32Probe()); |
| worker.on("error", function (e) { |
| reject(e); |
| }) |
| .on("end", function () { |
| if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) { |
| reject(new Error("Corrupted zip : CRC32 mismatch")); |
| } else { |
| resolve(); |
| } |
| }) |
| .resume(); |
| }); |
| } |
| |
| module.exports = function(data, options) { |
| var zip = this; |
| options = utils.extend(options || {}, { |
| base64: false, |
| checkCRC32: false, |
| optimizedBinaryString: false, |
| createFolders: false, |
| decodeFileName: utf8.utf8decode |
| }); |
| |
| if (nodejsUtils.isNode && nodejsUtils.isStream(data)) { |
| return external.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")); |
| } |
| |
| return utils.prepareContent("the loaded zip file", data, true, options.optimizedBinaryString, options.base64) |
| .then(function(data) { |
| var zipEntries = new ZipEntries(options); |
| zipEntries.load(data); |
| return zipEntries; |
| }).then(function checkCRC32(zipEntries) { |
| var promises = [external.Promise.resolve(zipEntries)]; |
| var files = zipEntries.files; |
| if (options.checkCRC32) { |
| for (var i = 0; i < files.length; i++) { |
| promises.push(checkEntryCRC32(files[i])); |
| } |
| } |
| return external.Promise.all(promises); |
| }).then(function addFiles(results) { |
| var zipEntries = results.shift(); |
| var files = zipEntries.files; |
| for (var i = 0; i < files.length; i++) { |
| var input = files[i]; |
| zip.file(input.fileNameStr, input.decompressed, { |
| binary: true, |
| optimizedBinaryString: true, |
| date: input.date, |
| dir: input.dir, |
| comment : input.fileCommentStr.length ? input.fileCommentStr : null, |
| unixPermissions : input.unixPermissions, |
| dosPermissions : input.dosPermissions, |
| createFolders: options.createFolders |
| }); |
| } |
| if (zipEntries.zipComment.length) { |
| zip.comment = zipEntries.zipComment; |
| } |
| |
| return zip; |
| }); |
| }; |