From fa9d3ce0beef75301fe7bfdb29e1fa57a634e73c Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Sun, 18 Aug 2013 06:17:11 -0500 Subject: [PATCH] zip: always convert filename to utf8. closes #41. --- lib/headers/zip.js | 8 +++++++- package.json | 3 ++- test/archiver.js | 20 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/headers/zip.js b/lib/headers/zip.js index bddd4ab5..39cf48e7 100644 --- a/lib/headers/zip.js +++ b/lib/headers/zip.js @@ -7,6 +7,7 @@ */ var inherits = require('util').inherits; +var iconv = require('iconv-lite'); function HeaderZip() { this.bufferSize = 0; @@ -60,7 +61,12 @@ HeaderZip.prototype.toObject = function(buf) { HeaderZip.prototype._normalize = function(data) { if (data.name) { - data.filenameLength = data.name.length; + var nameUTF8 = iconv.encode(data.name, 'utf8'); + data.name = iconv.decode(nameUTF8, 'utf8'); + + data.filenameLength = nameUTF8.length; + + data.flags |= (1<<11); } if (data.comment) { diff --git a/package.json b/package.json index 0946a26b..012cdb64 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "mocha": "~1.12.0", "rimraf": "~2.2.0", "mkdirp": "~0.3.5", - "stream-bench": "~0.1.2" + "stream-bench": "~0.1.2", + "iconv-lite" : "~0.2.11" }, "keywords": [ "archive", diff --git a/test/archiver.js b/test/archiver.js index 77348ae8..381f20ad 100644 --- a/test/archiver.js +++ b/test/archiver.js @@ -334,6 +334,26 @@ describe('archiver', function() { .append(binaryBuffer(20000), { name: 'buffer.txt', date: testDate }) .finalize(); }); + + it('should properly handle accented characters in filenames', function(done) { + var archive = archiver('zip', { + forceUTC: true + }); + + var testStream = new WriteHashStream('tmp/accentedchars-filenames.zip'); + + testStream.on('close', function() { + assert.equal(testStream.digest, '69194ccb7175d7fcfcb06c8cb0ed2c429dadb9f9'); + done(); + }); + + archive.pipe(testStream); + + archive + .append(binaryBuffer(20000), { name: 'àáâãäçèéêëìíîïñòóôõöùúûüýÿ.txt', date: testDate }) + .append(binaryBuffer(20000), { name: 'ÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ.txt', date: testDate2 }) + .finalize(); + }); }); });