diff --git a/red/api/editor/sshkeys.js b/red/api/editor/sshkeys.js index ee43880c3..7b14a7f6d 100644 --- a/red/api/editor/sshkeys.js +++ b/red/api/editor/sshkeys.js @@ -41,7 +41,7 @@ module.exports = { // List all SSH keys app.get("/", needsPermission("settings.read"), function(req,res) { var username = getUsername(req.user); - runtime.storage.sshkeys.listSSHKeys(username) + runtime.storage.projects.ssh.listSSHKeys(username) .then(function(list) { res.json({ keys: list @@ -61,7 +61,7 @@ module.exports = { app.get("/:id", needsPermission("settings.read"), function(req,res) { var username = getUsername(req.user); // console.log('username:', username); - runtime.storage.sshkeys.getSSHKey(username, req.params.id) + runtime.storage.projects.ssh.getSSHKey(username, req.params.id) .then(function(data) { if (data) { res.json({ @@ -85,7 +85,7 @@ module.exports = { var username = getUsername(req.user); // console.log('req.body:', req.body); if ( req.body && req.body.name && /^[a-zA-Z0-9\-_]+$/.test(req.body.name)) { - runtime.storage.sshkeys.generateSSHKey(username, req.body) + runtime.storage.projects.ssh.generateSSHKey(username, req.body) .then(function(name) { // console.log('generate key --- success name:', name); res.json({ @@ -108,7 +108,7 @@ module.exports = { // Delete a SSH key app.delete("/:id", needsPermission("settings.write"), function(req,res) { var username = getUsername(req.user); - runtime.storage.sshkeys.deleteSSHKey(username, req.params.id) + runtime.storage.projects.ssh.deleteSSHKey(username, req.params.id) .then(function() { res.status(204).end(); }) diff --git a/red/runtime/storage/localfilesystem/index.js b/red/runtime/storage/localfilesystem/index.js index bcd8969dd..2a57c7323 100644 --- a/red/runtime/storage/localfilesystem/index.js +++ b/red/runtime/storage/localfilesystem/index.js @@ -24,7 +24,6 @@ var library = require("./library"); var sessions = require("./sessions"); var runtimeSettings = require("./settings"); var projects = require("./projects"); -var sshkeys = require("./sshkeys"); var initialFlowLoadComplete = false; var settings; @@ -61,7 +60,6 @@ var localfilesystem = { runtimeSettings.init(settings); promises.push(library.init(settings)); promises.push(projects.init(settings, runtime)); - promises.push(sshkeys.init(settings, runtime)); var packageFile = fspath.join(settings.userDir,"package.json"); var packagePromise = when.resolve(); @@ -96,8 +94,7 @@ var localfilesystem = { saveSessions: sessions.saveSessions, getLibraryEntry: library.getLibraryEntry, saveLibraryEntry: library.saveLibraryEntry, - projects: projects, - sshkeys: sshkeys + projects: projects }; module.exports = localfilesystem; diff --git a/red/runtime/storage/localfilesystem/projects/Project.js b/red/runtime/storage/localfilesystem/projects/Project.js index 14547e129..c801d0085 100644 --- a/red/runtime/storage/localfilesystem/projects/Project.js +++ b/red/runtime/storage/localfilesystem/projects/Project.js @@ -23,7 +23,7 @@ var os = require('os'); var gitTools = require("./git"); var util = require("../util"); var defaultFileSet = require("./defaultFileSet"); -var sshKeys = require("../sshkeys"); +var sshKeys = require("./ssh"); var settings; var runtime; var log; diff --git a/red/runtime/storage/localfilesystem/projects/index.js b/red/runtime/storage/localfilesystem/projects/index.js index 86cdfb245..d3df90f8f 100644 --- a/red/runtime/storage/localfilesystem/projects/index.js +++ b/red/runtime/storage/localfilesystem/projects/index.js @@ -23,7 +23,7 @@ var crypto = require('crypto'); var storageSettings = require("../settings"); var util = require("../util"); var gitTools = require("./git"); -var sshTools = require("./sshKeygen"); +var sshTools = require("./ssh"); var Projects = require("./Project"); @@ -85,45 +85,47 @@ function init(_settings, _runtime) { var setupProjectsPromise; if (projectsEnabled) { - return gitTools.init(_settings, _runtime).then(function(gitVersion) { - if (!gitVersion) { - projectLogMessages.push(log._("storage.localfilesystem.projects.git-not-found")) - projectsEnabled = false; - } else { - Projects.init(settings,runtime); - sshTools.init(settings,runtime); - projectsDir = fspath.join(settings.userDir,"projects"); - if (!settings.readOnly) { - return fs.ensureDir(projectsDir) - //TODO: this is accessing settings from storage directly as settings - // has not yet been initialised. That isn't ideal - can this be deferred? - .then(storageSettings.getSettings) - .then(function(globalSettings) { - var saveSettings = false; - if (!globalSettings.projects) { - globalSettings.projects = { - projects: {} - } - saveSettings = true; - } else { - activeProject = globalSettings.projects.activeProject; - } - if (settings.flowFile) { - if (globalSettings.projects.projects.hasOwnProperty(settings.flowFile)) { - activeProject = settings.flowFile; - globalSettings.projects.activeProject = settings.flowFile; + return sshTools.init(settings,runtime).then(function() { + gitTools.init(_settings, _runtime).then(function(gitVersion) { + if (!gitVersion) { + projectLogMessages.push(log._("storage.localfilesystem.projects.git-not-found")) + projectsEnabled = false; + } else { + Projects.init(settings,runtime); + sshTools.init(settings,runtime); + projectsDir = fspath.join(settings.userDir,"projects"); + if (!settings.readOnly) { + return fs.ensureDir(projectsDir) + //TODO: this is accessing settings from storage directly as settings + // has not yet been initialised. That isn't ideal - can this be deferred? + .then(storageSettings.getSettings) + .then(function(globalSettings) { + var saveSettings = false; + if (!globalSettings.projects) { + globalSettings.projects = { + projects: {} + } saveSettings = true; + } else { + activeProject = globalSettings.projects.activeProject; } - } - if (!activeProject) { - projectLogMessages.push(log._("storage.localfilesystem.no-active-project")) - } - if (saveSettings) { - return storageSettings.saveSettings(globalSettings); - } - }); + if (settings.flowFile) { + if (globalSettings.projects.projects.hasOwnProperty(settings.flowFile)) { + activeProject = settings.flowFile; + globalSettings.projects.activeProject = settings.flowFile; + saveSettings = true; + } + } + if (!activeProject) { + projectLogMessages.push(log._("storage.localfilesystem.no-active-project")) + } + if (saveSettings) { + return storageSettings.saveSettings(globalSettings); + } + }); + } } - } + }); }); } return Promise.resolve(); @@ -552,6 +554,8 @@ module.exports = { getFlows: getFlows, saveFlows: saveFlows, getCredentials: getCredentials, - saveCredentials: saveCredentials + saveCredentials: saveCredentials, + + ssh: sshTools }; diff --git a/red/runtime/storage/localfilesystem/sshkeys.js b/red/runtime/storage/localfilesystem/projects/ssh/index.js similarity index 96% rename from red/runtime/storage/localfilesystem/sshkeys.js rename to red/runtime/storage/localfilesystem/projects/ssh/index.js index 6a02de210..5acf6721a 100644 --- a/red/runtime/storage/localfilesystem/sshkeys.js +++ b/red/runtime/storage/localfilesystem/projects/ssh/index.js @@ -17,7 +17,7 @@ var fs = require('fs-extra'); var when = require('when'); var fspath = require("path"); -var sshTools = require("./projects/ssh"); +var keygen = require("./keygen"); var settings; var runtime; @@ -32,10 +32,6 @@ function init(_settings, _runtime) { sshkeyDir = fspath.join(settings.userDir, "projects", ".sshkeys"); userSSHKeyDir = fspath.join(process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH, ".ssh"); // console.log('sshkeys.init()'); - return createSSHKeyDirectory(); -} - -function createSSHKeyDirectory() { return fs.ensureDir(sshkeyDir); } @@ -176,7 +172,7 @@ function deleteSSHKeyFiles(username, name) { function generateSSHKeyPair(name, privateKeyPath, comment, password, size) { log.trace("ssh-keygen["+[name,privateKeyPath,comment,size,"hasPassword?"+!!password].join(",")+"]"); - return sshTools.generateKey({location: privateKeyPath, comment: comment, password: password, size: size}) + return keygen.generateKey({location: privateKeyPath, comment: comment, password: password, size: size}) .then(function(stdout) { return name; }) diff --git a/red/runtime/storage/localfilesystem/projects/sshKeygen.js b/red/runtime/storage/localfilesystem/projects/ssh/keygen.js similarity index 100% rename from red/runtime/storage/localfilesystem/projects/sshKeygen.js rename to red/runtime/storage/localfilesystem/projects/ssh/keygen.js diff --git a/test/red/api/editor/sshkeys_spec.js b/test/red/api/editor/sshkeys_spec.js index bc9ea4ee6..c6fea9e59 100644 --- a/test/red/api/editor/sshkeys_spec.js +++ b/test/red/api/editor/sshkeys_spec.js @@ -56,12 +56,14 @@ describe("api/editor/sshkeys", function() { log:{audit:function(){},error:function(msg){errors.push(msg)}} }, storage: { - sshkeys: { - init: function(){}, - listSSHKeys: function(){}, - getSSHKey: function(){}, - generateSSHKey: function(){}, - deleteSSHKey: function(){}, + projects: { + ssh: { + init: function(){}, + listSSHKeys: function(){}, + getSSHKey: function(){}, + generateSSHKey: function(){}, + deleteSSHKey: function(){} + } } }, events:{on:function(){},removeListener:function(){}}, @@ -79,20 +81,20 @@ describe("api/editor/sshkeys", function() { }) beforeEach(function() { - sinon.stub(mockRuntime.storage.sshkeys, "listSSHKeys"); - sinon.stub(mockRuntime.storage.sshkeys, "getSSHKey"); - sinon.stub(mockRuntime.storage.sshkeys, "generateSSHKey"); - sinon.stub(mockRuntime.storage.sshkeys, "deleteSSHKey"); + sinon.stub(mockRuntime.storage.projects.ssh, "listSSHKeys"); + sinon.stub(mockRuntime.storage.projects.ssh, "getSSHKey"); + sinon.stub(mockRuntime.storage.projects.ssh, "generateSSHKey"); + sinon.stub(mockRuntime.storage.projects.ssh, "deleteSSHKey"); }) afterEach(function() { - mockRuntime.storage.sshkeys.listSSHKeys.restore(); - mockRuntime.storage.sshkeys.getSSHKey.restore(); - mockRuntime.storage.sshkeys.generateSSHKey.restore(); - mockRuntime.storage.sshkeys.deleteSSHKey.restore(); + mockRuntime.storage.projects.ssh.listSSHKeys.restore(); + mockRuntime.storage.projects.ssh.getSSHKey.restore(); + mockRuntime.storage.projects.ssh.generateSSHKey.restore(); + mockRuntime.storage.projects.ssh.deleteSSHKey.restore(); }) it('GET /settings/user/keys --- return empty list', function(done) { - mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.resolve([])); + mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.resolve([])); request(app) .get("/settings/user/keys") .expect(200) @@ -116,7 +118,7 @@ describe("api/editor/sshkeys", function() { name: elem }; }); - mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.resolve(retList)); + mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.resolve(retList)); request(app) .get("/settings/user/keys") .expect(200) @@ -135,7 +137,7 @@ describe("api/editor/sshkeys", function() { it('GET /settings/user/keys --- return Error', function(done) { var errInstance = new Error("Messages....."); errInstance.code = "test_code"; - mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.reject(errInstance)); request(app) .get("/settings/user/keys") .expect(400) @@ -152,7 +154,7 @@ describe("api/editor/sshkeys", function() { }); it('GET /settings/user/keys/ --- return 404', function(done) { - mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.resolve(null)); + mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.resolve(null)); request(app) .get("/settings/user/keys/NOT_REAL") .expect(404) @@ -165,7 +167,7 @@ describe("api/editor/sshkeys", function() { }); it('GET /settings/user/keys --- return Unexpected Error', function(done) { var errInstance = new Error("Messages....."); - mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.reject(errInstance)); request(app) .get("/settings/user/keys") .expect(400) @@ -184,7 +186,7 @@ describe("api/editor/sshkeys", function() { it('GET /settings/user/keys/ --- return content', function(done) { var key_file_name = "test_key"; var fileContent = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3a+sgtgzSbbliWxmOq5p6+H/mE+0gjWfLWrkIVmHENd1mifV4uCmIHAR2NfuadUYMQ3+bQ90kpmmEKTMYPsyentsKpHQZxTzG7wOCAIpJnbPTHDMxEJhVTaAwEjbVyMSIzTTPfnhoavWIBu0+uMgKDDlBm+RjlgkFlyhXyCN6UwFrIUUMH6Gw+eQHLiooKIl8ce7uDxIlt+9b7hFCU+sQ3kvuse239DZluu6+8buMWqJvrEHgzS9adRFKku8nSPAEPYn85vDi7OgVAcLQufknNgs47KHBAx9h04LeSrFJ/P5J1b//ItRpMOIme+O9d1BR46puzhvUaCHLdvO9czj+OmW+dIm+QIk6lZIOOMnppG72kZxtLfeKT16ur+2FbwAdL9ItBp4BI/YTlBPoa5mLMxpuWfmX1qHntvtGc9wEwS1P7YFfmF3XiK5apxalzrn0Qlr5UmDNbVIqJb1OlbC0w03Z0oktti1xT+R2DGOLWM4lBbpXDHV1BhQ7oYOvbUD8Cnof55lTP0WHHsOHlQc/BGDti1XA9aBX/OzVyzBUYEf0pkimsD0RYo6aqt7QwehJYdlz9x1NBguBffT0s4NhNb9IWr+ASnFPvNl2sw4XH/8U0J0q8ZkMpKkbLM1Zdp1Fv00GF0f5UNRokai6uM3w/ccantJ3WvZ6GtctqytWrw== \n"; - mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.resolve(fileContent)); + mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.resolve(fileContent)); request(app) .get("/settings/user/keys/" + key_file_name) .expect(200) @@ -192,7 +194,7 @@ describe("api/editor/sshkeys", function() { if (err) { return done(err); } - mockRuntime.storage.sshkeys.getSSHKey.called.should.be.true(); + mockRuntime.storage.projects.ssh.getSSHKey.called.should.be.true(); res.body.should.be.deepEqual({ publickey: fileContent }); done(); }); @@ -202,7 +204,7 @@ describe("api/editor/sshkeys", function() { var key_file_name = "test_key"; var errInstance = new Error("Messages....."); errInstance.code = "test_code"; - mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.reject(errInstance)); request(app) .get("/settings/user/keys/" + key_file_name) .expect(400) @@ -221,7 +223,7 @@ describe("api/editor/sshkeys", function() { it('GET /settings/user/keys/ --- return Unexpected Error', function(done) { var key_file_name = "test_key"; var errInstance = new Error("Messages....."); - mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.reject(errInstance)); request(app) .get("/settings/user/keys/" + key_file_name) .expect(400) @@ -239,7 +241,7 @@ describe("api/editor/sshkeys", function() { it('POST /settings/user/keys --- success', function(done) { var key_file_name = "test_key"; - mockRuntime.storage.sshkeys.generateSSHKey.returns(Promise.resolve(key_file_name)); + mockRuntime.storage.projects.ssh.generateSSHKey.returns(Promise.resolve(key_file_name)); request(app) .post("/settings/user/keys") .send({ name: key_file_name }) @@ -254,7 +256,7 @@ describe("api/editor/sshkeys", function() { it('POST /settings/user/keys --- return parameter error', function(done) { var key_file_name = "test_key"; - mockRuntime.storage.sshkeys.generateSSHKey.returns(Promise.resolve(key_file_name)); + mockRuntime.storage.projects.ssh.generateSSHKey.returns(Promise.resolve(key_file_name)); request(app) .post("/settings/user/keys") .expect(400) @@ -274,7 +276,7 @@ describe("api/editor/sshkeys", function() { var key_file_name = "test_key"; var errInstance = new Error("Messages....."); errInstance.code = "test_code"; - mockRuntime.storage.sshkeys.generateSSHKey.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.generateSSHKey.returns(Promise.reject(errInstance)); request(app) .post("/settings/user/keys") .send({ name: key_file_name }) @@ -294,7 +296,7 @@ describe("api/editor/sshkeys", function() { it('POST /settings/user/keys --- return Unexpected error', function(done) { var key_file_name = "test_key"; var errInstance = new Error("Messages....."); - mockRuntime.storage.sshkeys.generateSSHKey.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.generateSSHKey.returns(Promise.reject(errInstance)); request(app) .post("/settings/user/keys") .send({ name: key_file_name }) @@ -313,7 +315,7 @@ describe("api/editor/sshkeys", function() { it('DELETE /settings/user/keys/ --- success', function(done) { var key_file_name = "test_key"; - mockRuntime.storage.sshkeys.deleteSSHKey.returns(Promise.resolve(true)); + mockRuntime.storage.projects.ssh.deleteSSHKey.returns(Promise.resolve(true)); request(app) .delete("/settings/user/keys/" + key_file_name) .expect(204) @@ -330,7 +332,7 @@ describe("api/editor/sshkeys", function() { var key_file_name = "test_key"; var errInstance = new Error("Messages....."); errInstance.code = "test_code"; - mockRuntime.storage.sshkeys.deleteSSHKey.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.deleteSSHKey.returns(Promise.reject(errInstance)); request(app) .delete("/settings/user/keys/" + key_file_name) .expect(400) @@ -349,7 +351,7 @@ describe("api/editor/sshkeys", function() { it('DELETE /settings/user/keys/ --- return Unexpected Error', function(done) { var key_file_name = "test_key"; var errInstance = new Error("Messages....."); - mockRuntime.storage.sshkeys.deleteSSHKey.returns(Promise.reject(errInstance)); + mockRuntime.storage.projects.ssh.deleteSSHKey.returns(Promise.reject(errInstance)); request(app) .delete("/settings/user/keys/" + key_file_name) .expect(400) diff --git a/test/red/runtime/storage/localfilesystem/index_spec.js b/test/red/runtime/storage/localfilesystem/index_spec.js index aa9e15af6..a55cfb9a8 100644 --- a/test/red/runtime/storage/localfilesystem/index_spec.js +++ b/test/red/runtime/storage/localfilesystem/index_spec.js @@ -292,13 +292,14 @@ describe('storage/localfilesystem', function() { it('should fsync the flows file',function(done) { var flowFile = 'test.json'; var flowFilePath = path.join(userDir,flowFile); - localfilesystem.init({userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { + localfilesystem.init({editorTheme:{projects:{enabled:false}},userDir:userDir, flowFile:flowFilePath}, mockRuntime).then(function() { sinon.spy(fs,"fsync"); localfilesystem.saveFlows(testFlow).then(function() { fs.fsync.callCount.should.eql(1); fs.fsync.restore(); done(); }).otherwise(function(err) { + fs.fsync.restore(); done(err); }); }).otherwise(function(err) { diff --git a/test/red/runtime/storage/localfilesystem/projects/ssh/index_spec.js b/test/red/runtime/storage/localfilesystem/projects/ssh/index_spec.js new file mode 100644 index 000000000..59e5e6d76 --- /dev/null +++ b/test/red/runtime/storage/localfilesystem/projects/ssh/index_spec.js @@ -0,0 +1,428 @@ +/** +* Copyright JS Foundation and other contributors, http://js.foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +**/ +var should = require("should"); +var fs = require('fs-extra'); +var path = require('path'); + +var sshkeys = require("../../../../../../../red/runtime/storage/localfilesystem/projects/ssh"); + +describe("storage/localfilesystem/sshkeys", function() { + var userDir = path.join(__dirname,".testSSHKeyUserHome"); + var mockSettings = { + userDir: userDir + }; + var mockRuntime = { + log:{ + _:function() { return "placeholder message"}, + info: function() { }, + log: function() { }, + trace: function() { } + } + }; + var oldHOME; + + beforeEach(function(done) { + oldHOME = process.env.HOME; + process.env.HOME = "/tmp/doesnt/exist"; + fs.remove(userDir,function(err) { + fs.mkdir(userDir,done); + }); + }); + afterEach(function(done) { + process.env.HOME = oldHOME; + fs.remove(userDir,done); + }); + + it('should create sshkey directory when sshkey initializes', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + sshkeys.init(mockSettings, mockRuntime).then(function() { + var ret = fs.existsSync(sshkeyDirPath); + fs.existsSync(sshkeyDirPath).should.be.true(); + done(); + }).catch(function(err) { + done(err); + }); + }); + + it('should get sshkey empty list if there is no sshkey file', function(done) { + var username = 'test'; + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.listSSHKeys(username).then(function(retObj) { + retObj.should.be.instanceOf(Array).and.have.lengthOf(0); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should get sshkey list', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var filenameList = ['test-key01', 'test-key02']; + sshkeys.init(mockSettings, mockRuntime).then(function() { + for(var filename of filenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); + } + sshkeys.listSSHKeys(username).then(function(retObj) { + retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); + for(var filename of filenameList) { + retObj.should.containEql({ name: filename }); + } + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should not get sshkey file if there is only private key', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var filenameList = ['test-key01', 'test-key02']; + var onlyPrivateKeyFilenameList = ['test-key03', 'test-key04']; + sshkeys.init(mockSettings, mockRuntime).then(function() { + for(var filename of filenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); + } + for(var filename of onlyPrivateKeyFilenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + } + sshkeys.listSSHKeys(username).then(function(retObj) { + retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); + for(var filename of filenameList) { + retObj.should.containEql({ name: filename }); + } + for(var filename of onlyPrivateKeyFilenameList) { + retObj.should.not.containEql({ name: filename }); + } + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should not get sshkey file if there is only public key', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var filenameList = ['test-key01', 'test-key02']; + var directoryList = ['test-key03', '.test-key04']; + sshkeys.init(mockSettings, mockRuntime).then(function() { + for(var filename of filenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); + } + for(var filename of directoryList) { + fs.ensureDirSync(path.join(sshkeyDirPath,filename)); + } + sshkeys.listSSHKeys(username).then(function(retObj) { + retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); + for(var filename of filenameList) { + retObj.should.containEql({ name: filename }); + } + for(var directoryname of directoryList) { + retObj.should.not.containEql({ name: directoryname }); + } + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should get sshkey list that does not have directory', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var otherUsername = 'other'; + var filenameList = ['test-key01', 'test-key02']; + var otherUserFilenameList = ['test-key03', 'test-key04']; + sshkeys.init(mockSettings, mockRuntime).then(function() { + for(var filename of filenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); + } + for(var filename of otherUserFilenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename+".pub"),"","utf8"); + } + sshkeys.listSSHKeys(username).then(function(retObj) { + retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); + for(var filename of filenameList) { + retObj.should.containEql({ name: filename }); + } + for(var filename of otherUserFilenameList) { + retObj.should.not.containEql({ name: filename }); + } + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should get sshkey list that have keys of specified user', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var otherUsername = 'other'; + var filenameList = ['test-key01', 'test-key02']; + var otherUserFilenameList = ['test-key03', 'test-key04']; + sshkeys.init(mockSettings, mockRuntime).then(function() { + for(var filename of filenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); + } + for(var filename of otherUserFilenameList) { + fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename+".pub"),"","utf8"); + } + sshkeys.listSSHKeys(username).then(function(retObj) { + retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); + for(var filename of filenameList) { + retObj.should.containEql({ name: filename }); + } + for(var filename of otherUserFilenameList) { + retObj.should.not.containEql({ name: filename }); + } + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should generate sshkey file with empty data', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + name: 'test-key01' + }; + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + retObj.should.be.equal(options.name); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should generate sshkey file with only comment data', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + comment: 'test@test.com', + name: 'test-key01' + }; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + retObj.should.be.equal(options.name); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should generate sshkey file with password data', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + comment: 'test@test.com', + name: 'test-key01', + password: 'testtest' + }; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + retObj.should.be.equal(options.name); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should generate sshkey file with size data', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + comment: 'test@test.com', + name: 'test-key01', + size: 4096 + }; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + retObj.should.be.equal(options.name); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should generate sshkey file with password & size data', function(done) { + this.timeout(5000); + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + comment: 'test@test.com', + name: 'test-key01', + password: 'testtest', + size: 4096 + }; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + retObj.should.be.equal(options.name); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should not generate sshkey file with illegal size data', function(done) { + this.timeout(5000); + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + comment: 'test@test.com', + name: 'test-key01', + size: 1023 + }; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + done(new Error('Does NOT throw error!')); + }).catch(function(err) { + try { + err.should.have.have.property('code', 'key_length_too_short'); + done(); + } + catch (error) { + done(error); + } + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should not generate sshkey file with illegal password', function(done) { + this.timeout(5000); + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var options = { + comment: 'test@test.com', + name: 'test-key01', + password: 'aa' + }; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + sshkeys.generateSSHKey(username, options).then(function(retObj) { + done(new Error('Does NOT throw error!')); + }).catch(function(err) { + try { + err.should.have.have.property('code', 'key_passphrase_too_short'); + done(); + } + catch (error) { + done(error); + } + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should get sshkey file content', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var filename = 'test-key01'; + var fileContent = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3a+sgtgzSbbliWxmOq5p6+H/mE+0gjWfLWrkIVmHENd1mifV4uCmIHAR2NfuadUYMQ3+bQ90kpmmEKTMYPsyentsKpHQZxTzG7wOCAIpJnbPTHDMxEJhVTaAwEjbVyMSIzTTPfnhoavWIBu0+uMgKDDlBm+RjlgkFlyhXyCN6UwFrIUUMH6Gw+eQHLiooKIl8ce7uDxIlt+9b7hFCU+sQ3kvuse239DZluu6+8buMWqJvrEHgzS9adRFKku8nSPAEPYn85vDi7OgVAcLQufknNgs47KHBAx9h04LeSrFJ/P5J1b//ItRpMOIme+O9d1BR46puzhvUaCHLdvO9czj+OmW+dIm+QIk6lZIOOMnppG72kZxtLfeKT16ur+2FbwAdL9ItBp4BI/YTlBPoa5mLMxpuWfmX1qHntvtGc9wEwS1P7YFfmF3XiK5apxalzrn0Qlr5UmDNbVIqJb1OlbC0w03Z0oktti1xT+R2DGOLWM4lBbpXDHV1BhQ7oYOvbUD8Cnof55lTP0WHHsOHlQc/BGDti1XA9aBX/OzVyzBUYEf0pkimsD0RYo6aqt7QwehJYdlz9x1NBguBffT0s4NhNb9IWr+ASnFPvNl2sw4XH/8U0J0q8ZkMpKkbLM1Zdp1Fv00GF0f5UNRokai6uM3w/ccantJ3WvZ6GtctqytWrw== \n"; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),fileContent,"utf8"); + sshkeys.getSSHKey(username, filename).then(function(retObj) { + retObj.should.be.equal(fileContent); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); + + it('should delete sshkey files', function(done) { + var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); + var username = 'test'; + var filename = 'test-key01'; + var fileContent = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3a+sgtgzSbbliWxmOq5p6+H/mE+0gjWfLWrkIVmHENd1mifV4uCmIHAR2NfuadUYMQ3+bQ90kpmmEKTMYPsyentsKpHQZxTzG7wOCAIpJnbPTHDMxEJhVTaAwEjbVyMSIzTTPfnhoavWIBu0+uMgKDDlBm+RjlgkFlyhXyCN6UwFrIUUMH6Gw+eQHLiooKIl8ce7uDxIlt+9b7hFCU+sQ3kvuse239DZluu6+8buMWqJvrEHgzS9adRFKku8nSPAEPYn85vDi7OgVAcLQufknNgs47KHBAx9h04LeSrFJ/P5J1b//ItRpMOIme+O9d1BR46puzhvUaCHLdvO9czj+OmW+dIm+QIk6lZIOOMnppG72kZxtLfeKT16ur+2FbwAdL9ItBp4BI/YTlBPoa5mLMxpuWfmX1qHntvtGc9wEwS1P7YFfmF3XiK5apxalzrn0Qlr5UmDNbVIqJb1OlbC0w03Z0oktti1xT+R2DGOLWM4lBbpXDHV1BhQ7oYOvbUD8Cnof55lTP0WHHsOHlQc/BGDti1XA9aBX/OzVyzBUYEf0pkimsD0RYo6aqt7QwehJYdlz9x1NBguBffT0s4NhNb9IWr+ASnFPvNl2sw4XH/8U0J0q8ZkMpKkbLM1Zdp1Fv00GF0f5UNRokai6uM3w/ccantJ3WvZ6GtctqytWrw== \n"; + + sshkeys.init(mockSettings, mockRuntime).then(function() { + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); + fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),fileContent,"utf8"); + sshkeys.deleteSSHKey(username, filename).then(function() { + fs.existsSync(path.join(sshkeyDirPath,username+'_'+filename)).should.be.false(); + fs.existsSync(path.join(sshkeyDirPath,username+'_'+filename+'.pub')).should.be.false(); + done(); + }).catch(function(err) { + done(err); + }); + }).catch(function(err) { + done(err); + }); + }); +}); diff --git a/test/red/runtime/storage/localfilesystem/projects/sshKeygen_spec.js b/test/red/runtime/storage/localfilesystem/projects/ssh/keygen_spec.js similarity index 93% rename from test/red/runtime/storage/localfilesystem/projects/sshKeygen_spec.js rename to test/red/runtime/storage/localfilesystem/projects/ssh/keygen_spec.js index 0dab247ad..6239931eb 100644 --- a/test/red/runtime/storage/localfilesystem/projects/sshKeygen_spec.js +++ b/test/red/runtime/storage/localfilesystem/projects/ssh/keygen_spec.js @@ -19,9 +19,9 @@ var sinon = require("sinon"); var child_process = require('child_process'); var EventEmitter = require("events"); -var ssh = require("../../../../../../red/runtime/storage/localfilesystem/projects/sshKeygen") +var keygen = require("../../../../../../../red/runtime/storage/localfilesystem/projects/ssh/keygen") -describe("localfilesystem/projects/ssh", function() { +describe("localfilesystem/projects/ssh/keygen", function() { afterEach(function() { child_process.spawn.restore(); @@ -46,7 +46,7 @@ describe("localfilesystem/projects/ssh", function() { return e; }); - ssh.generateKey({ + keygen.generateKey({ size: 123, location: 'location', comment: 'comment', @@ -79,7 +79,7 @@ describe("localfilesystem/projects/ssh", function() { return e; }); - ssh.generateKey({ + keygen.generateKey({ size: 123, location: 'location', comment: 'comment', @@ -112,7 +112,7 @@ describe("localfilesystem/projects/ssh", function() { return e; }); - ssh.generateKey({ + keygen.generateKey({ size: 123, location: 'location', comment: 'comment', diff --git a/test/red/runtime/storage/localfilesystem/sshkeys_spec.js b/test/red/runtime/storage/localfilesystem/sshkeys_spec.js deleted file mode 100644 index 094afc39b..000000000 --- a/test/red/runtime/storage/localfilesystem/sshkeys_spec.js +++ /dev/null @@ -1,485 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ -var should = require("should"); -var fs = require('fs-extra'); -var path = require('path'); - -var localfilesystem = require("../../../../../red/runtime/storage/localfilesystem"); -var sshkeys = require("../../../../../red/runtime/storage/localfilesystem/sshkeys"); - -describe("storage/localfilesystem/sshkeys", function() { - var userDir = path.join(__dirname,".testSSHKeyUserHome"); - var mockSettings = { - userDir: userDir - }; - var mockRuntime = { - log:{ - _:function() { return "placeholder message"}, - info: function() { }, - log: function() { }, - trace: function() { } - } - }; - var oldHOME; - - beforeEach(function(done) { - oldHOME = process.env.HOME; - process.env.HOME = "/tmp/doesnt/exist"; - fs.remove(userDir,function(err) { - fs.mkdir(userDir,done); - }); - }); - afterEach(function(done) { - process.env.HOME = oldHOME; - fs.remove(userDir,done); - }); - - it('should create sshkey directory when sshkey initializes', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - var ret = fs.existsSync(sshkeyDirPath); - fs.existsSync(sshkeyDirPath).should.be.true(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should get sshkey empty list if there is no sshkey file', function(done) { - var username = 'test'; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.listSSHKeys(username).then(function(retObj) { - retObj.should.be.instanceOf(Array).and.have.lengthOf(0); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should get sshkey list', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var filenameList = ['test-key01', 'test-key02']; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - for(var filename of filenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); - } - sshkeys.listSSHKeys(username).then(function(retObj) { - retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); - for(var filename of filenameList) { - retObj.should.containEql({ name: filename }); - } - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should not get sshkey file if there is only private key', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var filenameList = ['test-key01', 'test-key02']; - var onlyPrivateKeyFilenameList = ['test-key03', 'test-key04']; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - for(var filename of filenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); - } - for(var filename of onlyPrivateKeyFilenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - } - sshkeys.listSSHKeys(username).then(function(retObj) { - retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); - for(var filename of filenameList) { - retObj.should.containEql({ name: filename }); - } - for(var filename of onlyPrivateKeyFilenameList) { - retObj.should.not.containEql({ name: filename }); - } - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should not get sshkey file if there is only public key', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var filenameList = ['test-key01', 'test-key02']; - var directoryList = ['test-key03', '.test-key04']; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - for(var filename of filenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); - } - for(var filename of directoryList) { - fs.ensureDirSync(path.join(sshkeyDirPath,filename)); - } - sshkeys.listSSHKeys(username).then(function(retObj) { - retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); - for(var filename of filenameList) { - retObj.should.containEql({ name: filename }); - } - for(var directoryname of directoryList) { - retObj.should.not.containEql({ name: directoryname }); - } - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should get sshkey list that does not have directory', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var otherUsername = 'other'; - var filenameList = ['test-key01', 'test-key02']; - var otherUserFilenameList = ['test-key03', 'test-key04']; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - for(var filename of filenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); - } - for(var filename of otherUserFilenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename+".pub"),"","utf8"); - } - sshkeys.listSSHKeys(username).then(function(retObj) { - retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); - for(var filename of filenameList) { - retObj.should.containEql({ name: filename }); - } - for(var filename of otherUserFilenameList) { - retObj.should.not.containEql({ name: filename }); - } - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should get sshkey list that have keys of specified user', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var otherUsername = 'other'; - var filenameList = ['test-key01', 'test-key02']; - var otherUserFilenameList = ['test-key03', 'test-key04']; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - for(var filename of filenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),"","utf8"); - } - for(var filename of otherUserFilenameList) { - fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,otherUsername+"_"+filename+".pub"),"","utf8"); - } - sshkeys.listSSHKeys(username).then(function(retObj) { - retObj.should.be.instanceOf(Array).and.have.lengthOf(filenameList.length); - for(var filename of filenameList) { - retObj.should.containEql({ name: filename }); - } - for(var filename of otherUserFilenameList) { - retObj.should.not.containEql({ name: filename }); - } - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should generate sshkey file with empty data', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - name: 'test-key01' - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - retObj.should.be.equal(options.name); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should generate sshkey file with only comment data', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - comment: 'test@test.com', - name: 'test-key01' - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - retObj.should.be.equal(options.name); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should generate sshkey file with password data', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - comment: 'test@test.com', - name: 'test-key01', - password: 'testtest' - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - retObj.should.be.equal(options.name); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should generate sshkey file with size data', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - comment: 'test@test.com', - name: 'test-key01', - size: 4096 - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - retObj.should.be.equal(options.name); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should generate sshkey file with password & size data', function(done) { - this.timeout(5000); - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - comment: 'test@test.com', - name: 'test-key01', - password: 'testtest', - size: 4096 - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - retObj.should.be.equal(options.name); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name)).should.be.true(); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+options.name+'.pub')).should.be.true(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should not generate sshkey file with illegal size data', function(done) { - this.timeout(5000); - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - comment: 'test@test.com', - name: 'test-key01', - size: 1023 - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - done(new Error('Does NOT throw error!')); - }).catch(function(err) { - try { - err.should.have.have.property('code', 'key_length_too_short'); - done(); - } - catch (error) { - done(error); - } - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should not generate sshkey file with illegal password', function(done) { - this.timeout(5000); - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var options = { - comment: 'test@test.com', - name: 'test-key01', - password: 'aa' - }; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - sshkeys.generateSSHKey(username, options).then(function(retObj) { - done(new Error('Does NOT throw error!')); - }).catch(function(err) { - try { - err.should.have.have.property('code', 'key_passphrase_too_short'); - done(); - } - catch (error) { - done(error); - } - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should get sshkey file content', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var filename = 'test-key01'; - var fileContent = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3a+sgtgzSbbliWxmOq5p6+H/mE+0gjWfLWrkIVmHENd1mifV4uCmIHAR2NfuadUYMQ3+bQ90kpmmEKTMYPsyentsKpHQZxTzG7wOCAIpJnbPTHDMxEJhVTaAwEjbVyMSIzTTPfnhoavWIBu0+uMgKDDlBm+RjlgkFlyhXyCN6UwFrIUUMH6Gw+eQHLiooKIl8ce7uDxIlt+9b7hFCU+sQ3kvuse239DZluu6+8buMWqJvrEHgzS9adRFKku8nSPAEPYn85vDi7OgVAcLQufknNgs47KHBAx9h04LeSrFJ/P5J1b//ItRpMOIme+O9d1BR46puzhvUaCHLdvO9czj+OmW+dIm+QIk6lZIOOMnppG72kZxtLfeKT16ur+2FbwAdL9ItBp4BI/YTlBPoa5mLMxpuWfmX1qHntvtGc9wEwS1P7YFfmF3XiK5apxalzrn0Qlr5UmDNbVIqJb1OlbC0w03Z0oktti1xT+R2DGOLWM4lBbpXDHV1BhQ7oYOvbUD8Cnof55lTP0WHHsOHlQc/BGDti1XA9aBX/OzVyzBUYEf0pkimsD0RYo6aqt7QwehJYdlz9x1NBguBffT0s4NhNb9IWr+ASnFPvNl2sw4XH/8U0J0q8ZkMpKkbLM1Zdp1Fv00GF0f5UNRokai6uM3w/ccantJ3WvZ6GtctqytWrw== \n"; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),fileContent,"utf8"); - sshkeys.getSSHKey(username, filename).then(function(retObj) { - retObj.should.be.equal(fileContent); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); - - it('should delete sshkey files', function(done) { - var sshkeyDirPath = path.join(userDir, 'projects', '.sshkeys'); - var username = 'test'; - var filename = 'test-key01'; - var fileContent = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD3a+sgtgzSbbliWxmOq5p6+H/mE+0gjWfLWrkIVmHENd1mifV4uCmIHAR2NfuadUYMQ3+bQ90kpmmEKTMYPsyentsKpHQZxTzG7wOCAIpJnbPTHDMxEJhVTaAwEjbVyMSIzTTPfnhoavWIBu0+uMgKDDlBm+RjlgkFlyhXyCN6UwFrIUUMH6Gw+eQHLiooKIl8ce7uDxIlt+9b7hFCU+sQ3kvuse239DZluu6+8buMWqJvrEHgzS9adRFKku8nSPAEPYn85vDi7OgVAcLQufknNgs47KHBAx9h04LeSrFJ/P5J1b//ItRpMOIme+O9d1BR46puzhvUaCHLdvO9czj+OmW+dIm+QIk6lZIOOMnppG72kZxtLfeKT16ur+2FbwAdL9ItBp4BI/YTlBPoa5mLMxpuWfmX1qHntvtGc9wEwS1P7YFfmF3XiK5apxalzrn0Qlr5UmDNbVIqJb1OlbC0w03Z0oktti1xT+R2DGOLWM4lBbpXDHV1BhQ7oYOvbUD8Cnof55lTP0WHHsOHlQc/BGDti1XA9aBX/OzVyzBUYEf0pkimsD0RYo6aqt7QwehJYdlz9x1NBguBffT0s4NhNb9IWr+ASnFPvNl2sw4XH/8U0J0q8ZkMpKkbLM1Zdp1Fv00GF0f5UNRokai6uM3w/ccantJ3WvZ6GtctqytWrw== \n"; - localfilesystem.init(mockSettings, mockRuntime).then(function() { - sshkeys.init(mockSettings, mockRuntime).then(function() { - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename),"","utf8"); - fs.writeFileSync(path.join(sshkeyDirPath,username+"_"+filename+".pub"),fileContent,"utf8"); - sshkeys.deleteSSHKey(username, filename).then(function() { - fs.existsSync(path.join(sshkeyDirPath,username+'_'+filename)).should.be.false(); - fs.existsSync(path.join(sshkeyDirPath,username+'_'+filename+'.pub')).should.be.false(); - done(); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }).catch(function(err) { - done(err); - }); - }); -});