From c73ece5e465b19e0410a8be5f07873d9b8124b2b Mon Sep 17 00:00:00 2001 From: c0nstructer Date: Tue, 13 Jun 2017 02:32:15 +0200 Subject: [PATCH] finished plain aes256 encryption, written test --- README.md | 2 ++ index.js | 66 +++++++++++++++++++++++++++++++-------- package.json | 3 ++ spec/encrypt.spec.js | 25 +++++++++++++++ spec/support/jasmine.json | 3 +- spec/test.spec.js | 4 ++- 6 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 spec/encrypt.spec.js diff --git a/README.md b/README.md index 11a4a33..d431a07 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ parse-server file system storage adapter "module": "parse-server-fs-adapter", "options": { "filesSubDirectory": "my/files/folder" // optional + "encrypt": true //optional, + "secretKey: 'someKey' //mandatory if encrypt is true } } } diff --git a/index.js b/index.js index 5563804..6efd4d0 100644 --- a/index.js +++ b/index.js @@ -7,9 +7,21 @@ var fs = require('fs'); var path = require('path'); var pathSep = require('path').sep; +var nodecipher = require('node-cipher'); function FileSystemAdapter(options) { options = options || {}; + + this._encrypt = false; + this._secretKey = ""; + + if (options.encrypt && options.encrypt == true){ + if (!options.secretKey){ + throw "Encrypt key not defined"; + } + this._encrypt =true; + this._secretKey = options.secretKey; + } let filesSubDirectory = options.filesSubDirectory || ''; this._filesDir = filesSubDirectory; this._mkdir(this._getApplicationDir()); @@ -20,14 +32,28 @@ function FileSystemAdapter(options) { FileSystemAdapter.prototype.createFile = function(filename, data) { return new Promise((resolve, reject) => { - let filepath = this._getLocalFilePath(filename); - fs.writeFile(filepath, data, (err) => { - if(err !== null) { - return reject(err); - } - resolve(data); - }); - }); + let filepath = this._getLocalFilePath(filename); + + fs.writeFile(filepath, data, (err) => { + if (err !== null) { + return reject(err); + } + if(this._encrypt === true){ + nodecipher.encryptSync({ + algorithm: 'aes-256-cbc', + input: filepath, + output: filepath, + password: this._secretKey + }, function (err, opts) { + if(err){ + return reject(err); + } + return resolve() + }) + } + return resolve(data); + }); + }) } FileSystemAdapter.prototype.deleteFile = function(filename) { @@ -51,11 +77,25 @@ FileSystemAdapter.prototype.deleteFile = function(filename) { FileSystemAdapter.prototype.getFileData = function(filename) { return new Promise((resolve, reject) => { let filepath = this._getLocalFilePath(filename); - fs.readFile( filepath , function (err, data) { - if(err !== null) { - return reject(err); - } - resolve(data); + if(this._encrypt && this._encrypt == true){ + console.log(filename); + console.log(filepath) + nodecipher.decryptSync({ + input: filepath, + output: filepath, + algorithm: 'aes-256-cbc', + password: this._secretKey + }, function (err) { + if (err){ + return reject(err) + } + }) + } + fs.readFile(filepath , function (err, data) { + if(err) { + return reject(err); + } + return resolve(data); }); }); } diff --git a/package.json b/package.json index 0654fcb..c23d365 100644 --- a/package.json +++ b/package.json @@ -19,5 +19,8 @@ "istanbul": "^0.4.2", "jasmine": "^2.4.1", "parse-server-conformance-tests": "^1.0.0" + }, + "dependencies": { + "node-cipher": "^6.3.2" } } diff --git a/spec/encrypt.spec.js b/spec/encrypt.spec.js new file mode 100644 index 0000000..c178752 --- /dev/null +++ b/spec/encrypt.spec.js @@ -0,0 +1,25 @@ +'use strict'; +let FileSystemAdapter = require('../index.js'); + +describe('File encryption tests', () => { + var adapter = new FileSystemAdapter({ + filesSubDirectory: 'sub1/sub2', + encrypt: true, + secretKey: 'test' + }) + it("should properly create, read, delete files", (done) => { + var filename = 'file.txt'; + adapter.createFile(filename, "hello world", 'text/utf8').then((result) => { + return adapter.getFileData(filename); + }, (err) => { + fail("The adapter should create the file"); + done(); + }).then((result) => { + expect(result instanceof Buffer).toBe(true); + expect(result.toString('utf-8')).toEqual("hello world"); + adapter.deleteFile(filename); + done() + }) + }, 5000); +}) + diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json index e8f0320..e9410a4 100644 --- a/spec/support/jasmine.json +++ b/spec/support/jasmine.json @@ -1,6 +1,7 @@ { "spec_dir": "spec", "spec_files": [ - "test.spec.js" + "test.spec.js", + "encrypt.spec.js" ] } diff --git a/spec/test.spec.js b/spec/test.spec.js index 773a8e3..9a7ff64 100644 --- a/spec/test.spec.js +++ b/spec/test.spec.js @@ -8,5 +8,7 @@ describe('FileSystemAdapter tests', () => { filesSubDirectory: 'sub1/sub2' }); - filesAdapterTests.testAdapter("FileSystemAdapter", fsAdapter); + filesAdapterTests.testAdapter("FileSystemAdapter", fsAdapter); }) + +