@@ -10,6 +10,10 @@ var readline = require('readline');
1010var moment = require ( 'moment' ) ;
1111var exec = require ( 'child_process' ) . exec ;
1212
13+ // zip-slip
14+ var fileType = require ( 'file-type' ) ;
15+ var AdmZip = require ( 'adm-zip' ) ;
16+
1317exports . index = function ( req , res , next ) {
1418 Todo .
1519 find ( { } ) .
@@ -162,8 +166,27 @@ exports.import = function (req, res, next) {
162166 }
163167
164168 var importFile = req . files . importFile ;
165- var data = importFile . data . toString ( 'ascii' ) ;
166-
169+ var data ;
170+ var importedFileType = fileType ( importFile . data ) ;
171+ var zipFileExt = { ext : "zip" , mime : "application/zip" } ;
172+ if ( importedFileType === null ) {
173+ importedFileType = { ext : "txt" , mime : "text/plain" } ;
174+ }
175+ if ( importedFileType [ "mime" ] === zipFileExt [ "mime" ] ) {
176+ var zip = AdmZip ( importFile . data ) ;
177+ var extracted_path = "/tmp/extracted_files" ;
178+ zip . extractAllTo ( extracted_path , true ) ;
179+ var zipEntries = zip . getEntries ( ) ;
180+ zipEntries . forEach ( function ( zipEntry ) {
181+ if ( zipEntry . entryName === "backup.txt" ) {
182+ data = zipEntry . getData ( ) . toString ( 'ascii' ) ;
183+ } else {
184+ data = "No backup.txt file found" ;
185+ }
186+ } ) ;
187+ } else {
188+ data = importFile . data . toString ( 'ascii' ) ;
189+ }
167190 var lines = data . split ( '\n' ) ;
168191 lines . forEach ( function ( line ) {
169192 var parts = line . split ( ',' ) ;
0 commit comments