diff --git a/src/storage/caas.js b/src/storage/caas.js index c6e0d8e19..6dd6b2c03 100644 --- a/src/storage/caas.js +++ b/src/storage/caas.js @@ -54,6 +54,8 @@ function getBackupFilePath(apiConfig, backupId) { assert.strictEqual(typeof apiConfig, 'object'); assert.strictEqual(typeof backupId, 'string'); + const FILE_TYPE = apiConfig.key ? '.tar.gz.enc' : '.tar.gz'; + return path.join(apiConfig.prefix, backupId.endsWith(FILE_TYPE) ? backupId : backupId+FILE_TYPE); } @@ -92,7 +94,7 @@ function backup(apiConfig, backupId, sourceDirectories, callback) { callback(null); }); - targz.create(sourceDirectories, apiConfig.key || '', passThrough, callback); + targz.create(sourceDirectories, apiConfig.key || null, passThrough, callback); }); } @@ -127,7 +129,7 @@ function restore(apiConfig, backupId, destination, callback) { callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); - targz.extract(s3get, destination, apiConfig.key || '', callback); + targz.extract(s3get, destination, apiConfig.key || null, callback); }); } diff --git a/src/storage/s3.js b/src/storage/s3.js index f29952819..49568f271 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -24,8 +24,6 @@ var assert = require('assert'), path = require('path'), targz = require('./targz.js'); -var FILE_TYPE = '.tar.gz.enc'; - // test only var originalAWS; function mockInject(mock) { @@ -61,6 +59,8 @@ function getBackupFilePath(apiConfig, backupId) { assert.strictEqual(typeof apiConfig, 'object'); assert.strictEqual(typeof backupId, 'string'); + const FILE_TYPE = apiConfig.key ? '.tar.gz.enc' : '.tar.gz'; + return path.join(apiConfig.prefix, backupId.endsWith(FILE_TYPE) ? backupId : backupId+FILE_TYPE); } @@ -99,7 +99,7 @@ function backup(apiConfig, backupId, sourceDirectories, callback) { callback(null); }); - targz.create(sourceDirectories, apiConfig.key || '', passThrough, callback); + targz.create(sourceDirectories, apiConfig.key || null, passThrough, callback); }); } @@ -135,7 +135,7 @@ function restore(apiConfig, backupId, destination, callback) { callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); - targz.extract(s3get, destination, apiConfig.key || '', callback); + targz.extract(s3get, destination, apiConfig.key || null, callback); }); } diff --git a/src/storage/targz.js b/src/storage/targz.js index c972f47ce..67ca4d00b 100644 --- a/src/storage/targz.js +++ b/src/storage/targz.js @@ -16,7 +16,7 @@ var assert = require('assert'), function create(sourceDirectories, key, outStream, callback) { assert(Array.isArray(sourceDirectories)); - assert.strictEqual(typeof key, 'string'); + assert(key === null || typeof key === 'string'); assert.strictEqual(typeof callback, 'function'); var pack = tar.pack('/', { @@ -30,7 +30,6 @@ function create(sourceDirectories, key, outStream, callback) { }); var gzip = zlib.createGzip({}); - var encrypt = crypto.createCipher('aes-256-cbc', key); var progressStream = progress({ time: 10000 }); // display a progress every 10 seconds pack.on('error', function (error) { @@ -43,28 +42,30 @@ function create(sourceDirectories, key, outStream, callback) { callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); }); - encrypt.on('error', function (error) { - debug('backup: encrypt stream error.', error); - callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); - }); - progressStream.on('progress', function(progress) { debug('backup: %s@%s', Math.round(progress.transferred/1024/1024) + 'M', Math.round(progress.speed/1024/1024) + 'Mbps'); }); - pack.pipe(gzip).pipe(encrypt).pipe(progressStream).pipe(outStream); + if (key !== null) { + var encrypt = crypto.createCipher('aes-256-cbc', key); + encrypt.on('error', function (error) { + debug('backup: encrypt stream error.', error); + callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + }); + pack.pipe(gzip).pipe(encrypt).pipe(progressStream).pipe(outStream); + } else { + pack.pipe(gzip).pipe(progressStream).pipe(outStream); + } } function extract(inStream, destination, key, callback) { assert.strictEqual(typeof destination, 'string'); - assert.strictEqual(typeof key, 'string'); + assert(key === null || typeof key === 'string'); assert.strictEqual(typeof callback, 'function'); mkdirp(destination, function (error) { if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); - var decrypt = crypto.createDecipher('aes-256-cbc', key); - var gunzip = zlib.createGunzip({}); var progressStream = progress({ time: 10000 }); // display a progress every 10 seconds var extract = tar.extract(destination); @@ -73,11 +74,6 @@ function extract(inStream, destination, key, callback) { debug('restore: %s@%s', Math.round(progress.transferred/1024/1024) + 'M', Math.round(progress.speed/1024/1024) + 'Mbps'); }); - decrypt.on('error', function (error) { - debug('restore: decrypt stream error.', error); - callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); - }); - gunzip.on('error', function (error) { debug('restore: gunzip stream error.', error); callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); @@ -93,6 +89,15 @@ function extract(inStream, destination, key, callback) { callback(null); }); - inStream.pipe(progressStream).pipe(decrypt).pipe(gunzip).pipe(extract); + if (key !== null) { + var decrypt = crypto.createDecipher('aes-256-cbc', key); + decrypt.on('error', function (error) { + debug('restore: decrypt stream error.', error); + callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error.message)); + }); + inStream.pipe(progressStream).pipe(decrypt).pipe(gunzip).pipe(extract); + } else { + inStream.pipe(progressStream).pipe(gunzip).pipe(extract); + } }); }