You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							89 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
	
	
							89 lines
						
					
					
						
							3.1 KiB
						
					
					
				"use strict";
 | 
						|
var utils = require("./utils");
 | 
						|
var external = require("./external");
 | 
						|
var utf8 = require("./utf8");
 | 
						|
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];
 | 
						|
 | 
						|
                var unsafeName = input.fileNameStr;
 | 
						|
                var safeName = utils.resolve(input.fileNameStr);
 | 
						|
 | 
						|
                zip.file(safeName, 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 (!input.dir) {
 | 
						|
                    zip.file(safeName).unsafeOriginalName = unsafeName;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (zipEntries.zipComment.length) {
 | 
						|
                zip.comment = zipEntries.zipComment;
 | 
						|
            }
 | 
						|
 | 
						|
            return zip;
 | 
						|
        });
 | 
						|
};
 |