Распакуйте защищенный паролем файл в Node.js
Есть ли библиотека, которую я могу использовать для распаковки защищенного паролем файла (сайт заставляет меня вводить пароль в файл при его загрузке)? Существует множество библиотек для распаковки обычных файлов, но я не могу найти, что это сделает с паролем.
Здесь я нашел несколько полезных стартеров. Но я бы предпочел не прибегать к использованию child_process
и использовать встроенные unix-распаковки, но это может быть моим последним средством. Я даже хотел бы подготовить свои собственные манипуляции к зашифрованному коду, но я не могу даже узнать, как определить тип шифрования (он, кажется, просто очень стандартный, так как я могу сделать это в терминале).
Снова я бы предпочел не делать этого, но я боюсь, что это мой единственный вариант, поэтому я пробовал следующее:
var fs = require('fs')
, unzip = require('unzip')
, spawn = require('child_process').spawn
, expand = function(filepath, cb) {
var self = this
, unzipStream = fs.createReadStream(filepath).pipe(unzip.Parse())
, xmlData = '';
unzipStream.on('entry', function (entry) {
var filename = entry.path;
// first zip contains files and one password protected zipfile.
// Here I can just do pipe(unzip.Parse()) again, but then i just get a giant encoded string that I don't know how to handle, so i tried other things bellow.
if(filename.match(/\.zip$/)){
entry.on('data', function (data) {
var funzip = spawn('funzip','-P','ThisIsATestPsswd','-');
var newFile = funzip.stdin.write(data);
// more closing code...
Тогда я вроде потерял, что делать. Я попытался записать newFile
в файл, но только что сказал [object]
.
Затем я попробовал просто сделать что-то более простое, изменив последние 3 строки на
fs.writeFile('./tmp/this.zip', data, 'binary');
var newFile = spawn('unzip','-P','ThisIsATest','./tmp/this.zip');
console.log('Data: ' + data);
Но данные больше ничего не полезны только [object Object]
. Я не могу понять, что делать дальше, чтобы получить этот новый распакованный файл в рабочий файл или в удобочитаемую строку.
Я супер новичок в Node
, и все асинхронные/слушатели, запущенные другими процессами, немного запутываются, поэтому я сожалею, если в этом нет никакого смысла. Большое спасибо за помощь!
EDIT:
Теперь я добавил следующий код:
var fs = require('fs')
, unzip = require('unzip')
, spawn = require('child_process').spawn
, expand = function(filepath, cb) {
var self = this
, unzipStream = fs.createReadStream(filepath)
.pipe(unzip.Parse())
, xmlData = '';
unzipStream.on('entry', function (entry) {
var filename = entry.path
, type = entry.type // 'Directory' or 'File'
, size = entry.size;
console.log('Filename: ' + filename);
if(filename.match(/\.zip$/)){
entry.on('data', function (data) {
fs.writeFile('./lib/mocks/tmp/this.zip', data, 'binary');
var newFile = spawn('unzip','-P','ThisIsATestPassword', '-','../tmp/this.zip');
newFile.stdout.on('data', function(data){
fs.writeFile('./lib/mocks/tmp/that.txt', data); //This needs to be something different
//The zip file contains an archive of files, so one file name shouldn't work
});
});
} else { //Not a zip so handle differently }
)};
};
Это кажется очень близким к тому, что мне нужно, но когда файл написан, все, что у него есть, это список опций для распаковки:
UnZip 5.52 of 28 February 2005, by Info-ZIP. Maintained by C. Spieler. Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.
Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
Default action is to extract files in list, except those in xlist, to exdir;
file[.zip] may be a wildcard. -Z => ZipInfo mode ("unzip -Z" for usage).
-p extract files to pipe, no messages -l list files (short format)
-f freshen existing files, create none -t test compressed archive data
-u update files, create if necessary -z display archive comment
-x exclude files that follow (in xlist) -d extract files into exdir
modifiers: -q quiet mode (-qq => quieter)
-n never overwrite existing files -a auto-convert any text files
-o overwrite files WITHOUT prompting -aa treat ALL files as text
-j junk paths (do not make directories) -v be verbose/print version info
-C match filenames case-insensitively -L make (some) names lowercase
-X restore UID/GID info -V retain VMS version numbers
-K keep setuid/setgid/tacky permissions -M pipe through "more" pager
Examples (see unzip.txt for more info):
unzip data1 -x joe => extract all files except joe from zipfile data1.zip
unzip -p foo | more => send contents of foo.zip via pipe into program more
unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
Я не уверен, что вход был неправильным, так как это выглядит как ошибка для unzip. Или если я просто пишу неправильный контент. Я бы подумал, что он просто преформирует, как обычно, с консоли - просто добавляет все файлы по мере их извлечения в каталог. в то время как мне бы хотелось, чтобы я мог просто читать все содержимое из буфера, опция - не похоже на это, и поэтому я соглашусь на то, что файлы будут добавлены в каталог. Большое спасибо всем, кто имеет какие-либо предложения!
Изменить 2
Мне удалось получить эту работу, а не лучший способ, но она работает, по крайней мере, с использованием этой строки:
var newFile = spawn('unzip', [ '-P','ThisIsATestPassword', '-d','./lib/tmp/foo','./lib/mocks/tmp/this.zip' ])
Это просто распакует все файлы в каталог, а затем я смогу прочитать их оттуда. Моя ошибка заключалась в том, что вторым параметром должен быть массив.
Ответы
Ответ 1
Мне удалось получить эту работу, а не лучший способ, но она работает, по крайней мере, с использованием этой строки:
var newFile = spawn('unzip', [ '-P','ThisIsATestPassword', '-d','./lib/tmp/foo','./lib/mocks/tmp/this.zip' ])
Это просто распакует все файлы в каталог, а затем я смогу прочитать их оттуда. Моя ошибка заключалась в том, что вторым параметром должен быть массив.