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.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							56 lines
						
					
					
						
							1.5 KiB
						
					
					
				| module.exports = Extract;
 | |
| 
 | |
| var Parse = require('./parse');
 | |
| var Writer = require('fstream').Writer;
 | |
| var path = require('path');
 | |
| var stream = require('stream');
 | |
| var duplexer2 = require('duplexer2');
 | |
| var Promise = require('bluebird');
 | |
| 
 | |
| function Extract (opts) {
 | |
|   // make sure path is normalized before using it
 | |
|   opts.path = path.resolve(path.normalize(opts.path));
 | |
| 
 | |
|   var parser = new Parse(opts);
 | |
| 
 | |
|   var outStream = new stream.Writable({objectMode: true});
 | |
|   outStream._write = function(entry, encoding, cb) {
 | |
| 
 | |
|     if (entry.type == 'Directory') return cb();
 | |
| 
 | |
|     // to avoid zip slip (writing outside of the destination), we resolve
 | |
|     // the target path, and make sure it's nested in the intended
 | |
|     // destination, or not extract it otherwise.
 | |
|     var extractPath = path.join(opts.path, entry.path);
 | |
|     if (extractPath.indexOf(opts.path) != 0) {
 | |
|       return cb();
 | |
|     }
 | |
| 
 | |
|     const writer = opts.getWriter ? opts.getWriter({path: extractPath}) :  Writer({ path: extractPath });
 | |
| 
 | |
|     entry.pipe(writer)
 | |
|       .on('error', cb)
 | |
|       .on('close', cb);
 | |
|   };
 | |
| 
 | |
|   var extract = duplexer2(parser,outStream);
 | |
|   parser.once('crx-header', function(crxHeader) {
 | |
|     extract.crxHeader = crxHeader;
 | |
|   });
 | |
| 
 | |
|   parser
 | |
|     .pipe(outStream)
 | |
|     .on('finish',function() {
 | |
|       extract.emit('close');
 | |
|     });
 | |
|   
 | |
|   extract.promise = function() {
 | |
|     return new Promise(function(resolve, reject) {
 | |
|       extract.on('close', resolve);
 | |
|       extract.on('error',reject);
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   return extract;
 | |
| }
 |