1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Rearrange ssh logic to bring it together

This commit is contained in:
Nick O'Leary 2018-01-18 23:13:55 +00:00
parent f7f795f58a
commit d93a92c1c8
No known key found for this signature in database
GPG Key ID: 4F2157149161A6C9
11 changed files with 517 additions and 574 deletions

View File

@ -41,7 +41,7 @@ module.exports = {
// List all SSH keys // List all SSH keys
app.get("/", needsPermission("settings.read"), function(req,res) { app.get("/", needsPermission("settings.read"), function(req,res) {
var username = getUsername(req.user); var username = getUsername(req.user);
runtime.storage.sshkeys.listSSHKeys(username) runtime.storage.projects.ssh.listSSHKeys(username)
.then(function(list) { .then(function(list) {
res.json({ res.json({
keys: list keys: list
@ -61,7 +61,7 @@ module.exports = {
app.get("/:id", needsPermission("settings.read"), function(req,res) { app.get("/:id", needsPermission("settings.read"), function(req,res) {
var username = getUsername(req.user); var username = getUsername(req.user);
// console.log('username:', username); // console.log('username:', username);
runtime.storage.sshkeys.getSSHKey(username, req.params.id) runtime.storage.projects.ssh.getSSHKey(username, req.params.id)
.then(function(data) { .then(function(data) {
if (data) { if (data) {
res.json({ res.json({
@ -85,7 +85,7 @@ module.exports = {
var username = getUsername(req.user); var username = getUsername(req.user);
// console.log('req.body:', req.body); // console.log('req.body:', req.body);
if ( req.body && req.body.name && /^[a-zA-Z0-9\-_]+$/.test(req.body.name)) { 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) { .then(function(name) {
// console.log('generate key --- success name:', name); // console.log('generate key --- success name:', name);
res.json({ res.json({
@ -108,7 +108,7 @@ module.exports = {
// Delete a SSH key // Delete a SSH key
app.delete("/:id", needsPermission("settings.write"), function(req,res) { app.delete("/:id", needsPermission("settings.write"), function(req,res) {
var username = getUsername(req.user); var username = getUsername(req.user);
runtime.storage.sshkeys.deleteSSHKey(username, req.params.id) runtime.storage.projects.ssh.deleteSSHKey(username, req.params.id)
.then(function() { .then(function() {
res.status(204).end(); res.status(204).end();
}) })

View File

@ -24,7 +24,6 @@ var library = require("./library");
var sessions = require("./sessions"); var sessions = require("./sessions");
var runtimeSettings = require("./settings"); var runtimeSettings = require("./settings");
var projects = require("./projects"); var projects = require("./projects");
var sshkeys = require("./sshkeys");
var initialFlowLoadComplete = false; var initialFlowLoadComplete = false;
var settings; var settings;
@ -61,7 +60,6 @@ var localfilesystem = {
runtimeSettings.init(settings); runtimeSettings.init(settings);
promises.push(library.init(settings)); promises.push(library.init(settings));
promises.push(projects.init(settings, runtime)); promises.push(projects.init(settings, runtime));
promises.push(sshkeys.init(settings, runtime));
var packageFile = fspath.join(settings.userDir,"package.json"); var packageFile = fspath.join(settings.userDir,"package.json");
var packagePromise = when.resolve(); var packagePromise = when.resolve();
@ -96,8 +94,7 @@ var localfilesystem = {
saveSessions: sessions.saveSessions, saveSessions: sessions.saveSessions,
getLibraryEntry: library.getLibraryEntry, getLibraryEntry: library.getLibraryEntry,
saveLibraryEntry: library.saveLibraryEntry, saveLibraryEntry: library.saveLibraryEntry,
projects: projects, projects: projects
sshkeys: sshkeys
}; };
module.exports = localfilesystem; module.exports = localfilesystem;

View File

@ -23,7 +23,7 @@ var os = require('os');
var gitTools = require("./git"); var gitTools = require("./git");
var util = require("../util"); var util = require("../util");
var defaultFileSet = require("./defaultFileSet"); var defaultFileSet = require("./defaultFileSet");
var sshKeys = require("../sshkeys"); var sshKeys = require("./ssh");
var settings; var settings;
var runtime; var runtime;
var log; var log;

View File

@ -23,7 +23,7 @@ var crypto = require('crypto');
var storageSettings = require("../settings"); var storageSettings = require("../settings");
var util = require("../util"); var util = require("../util");
var gitTools = require("./git"); var gitTools = require("./git");
var sshTools = require("./sshKeygen"); var sshTools = require("./ssh");
var Projects = require("./Project"); var Projects = require("./Project");
@ -85,45 +85,47 @@ function init(_settings, _runtime) {
var setupProjectsPromise; var setupProjectsPromise;
if (projectsEnabled) { if (projectsEnabled) {
return gitTools.init(_settings, _runtime).then(function(gitVersion) { return sshTools.init(settings,runtime).then(function() {
if (!gitVersion) { gitTools.init(_settings, _runtime).then(function(gitVersion) {
projectLogMessages.push(log._("storage.localfilesystem.projects.git-not-found")) if (!gitVersion) {
projectsEnabled = false; projectLogMessages.push(log._("storage.localfilesystem.projects.git-not-found"))
} else { projectsEnabled = false;
Projects.init(settings,runtime); } else {
sshTools.init(settings,runtime); Projects.init(settings,runtime);
projectsDir = fspath.join(settings.userDir,"projects"); sshTools.init(settings,runtime);
if (!settings.readOnly) { projectsDir = fspath.join(settings.userDir,"projects");
return fs.ensureDir(projectsDir) if (!settings.readOnly) {
//TODO: this is accessing settings from storage directly as settings return fs.ensureDir(projectsDir)
// has not yet been initialised. That isn't ideal - can this be deferred? //TODO: this is accessing settings from storage directly as settings
.then(storageSettings.getSettings) // has not yet been initialised. That isn't ideal - can this be deferred?
.then(function(globalSettings) { .then(storageSettings.getSettings)
var saveSettings = false; .then(function(globalSettings) {
if (!globalSettings.projects) { var saveSettings = false;
globalSettings.projects = { if (!globalSettings.projects) {
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;
saveSettings = true; saveSettings = true;
} else {
activeProject = globalSettings.projects.activeProject;
} }
} if (settings.flowFile) {
if (!activeProject) { if (globalSettings.projects.projects.hasOwnProperty(settings.flowFile)) {
projectLogMessages.push(log._("storage.localfilesystem.no-active-project")) activeProject = settings.flowFile;
} globalSettings.projects.activeProject = settings.flowFile;
if (saveSettings) { saveSettings = true;
return storageSettings.saveSettings(globalSettings); }
} }
}); if (!activeProject) {
projectLogMessages.push(log._("storage.localfilesystem.no-active-project"))
}
if (saveSettings) {
return storageSettings.saveSettings(globalSettings);
}
});
}
} }
} });
}); });
} }
return Promise.resolve(); return Promise.resolve();
@ -552,6 +554,8 @@ module.exports = {
getFlows: getFlows, getFlows: getFlows,
saveFlows: saveFlows, saveFlows: saveFlows,
getCredentials: getCredentials, getCredentials: getCredentials,
saveCredentials: saveCredentials saveCredentials: saveCredentials,
ssh: sshTools
}; };

View File

@ -17,7 +17,7 @@
var fs = require('fs-extra'); var fs = require('fs-extra');
var when = require('when'); var when = require('when');
var fspath = require("path"); var fspath = require("path");
var sshTools = require("./projects/ssh"); var keygen = require("./keygen");
var settings; var settings;
var runtime; var runtime;
@ -32,10 +32,6 @@ function init(_settings, _runtime) {
sshkeyDir = fspath.join(settings.userDir, "projects", ".sshkeys"); sshkeyDir = fspath.join(settings.userDir, "projects", ".sshkeys");
userSSHKeyDir = fspath.join(process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH, ".ssh"); userSSHKeyDir = fspath.join(process.env.HOME || process.env.USERPROFILE || process.env.HOMEPATH, ".ssh");
// console.log('sshkeys.init()'); // console.log('sshkeys.init()');
return createSSHKeyDirectory();
}
function createSSHKeyDirectory() {
return fs.ensureDir(sshkeyDir); return fs.ensureDir(sshkeyDir);
} }
@ -176,7 +172,7 @@ function deleteSSHKeyFiles(username, name) {
function generateSSHKeyPair(name, privateKeyPath, comment, password, size) { function generateSSHKeyPair(name, privateKeyPath, comment, password, size) {
log.trace("ssh-keygen["+[name,privateKeyPath,comment,size,"hasPassword?"+!!password].join(",")+"]"); 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) { .then(function(stdout) {
return name; return name;
}) })

View File

@ -56,12 +56,14 @@ describe("api/editor/sshkeys", function() {
log:{audit:function(){},error:function(msg){errors.push(msg)}} log:{audit:function(){},error:function(msg){errors.push(msg)}}
}, },
storage: { storage: {
sshkeys: { projects: {
init: function(){}, ssh: {
listSSHKeys: function(){}, init: function(){},
getSSHKey: function(){}, listSSHKeys: function(){},
generateSSHKey: function(){}, getSSHKey: function(){},
deleteSSHKey: function(){}, generateSSHKey: function(){},
deleteSSHKey: function(){}
}
} }
}, },
events:{on:function(){},removeListener:function(){}}, events:{on:function(){},removeListener:function(){}},
@ -79,20 +81,20 @@ describe("api/editor/sshkeys", function() {
}) })
beforeEach(function() { beforeEach(function() {
sinon.stub(mockRuntime.storage.sshkeys, "listSSHKeys"); sinon.stub(mockRuntime.storage.projects.ssh, "listSSHKeys");
sinon.stub(mockRuntime.storage.sshkeys, "getSSHKey"); sinon.stub(mockRuntime.storage.projects.ssh, "getSSHKey");
sinon.stub(mockRuntime.storage.sshkeys, "generateSSHKey"); sinon.stub(mockRuntime.storage.projects.ssh, "generateSSHKey");
sinon.stub(mockRuntime.storage.sshkeys, "deleteSSHKey"); sinon.stub(mockRuntime.storage.projects.ssh, "deleteSSHKey");
}) })
afterEach(function() { afterEach(function() {
mockRuntime.storage.sshkeys.listSSHKeys.restore(); mockRuntime.storage.projects.ssh.listSSHKeys.restore();
mockRuntime.storage.sshkeys.getSSHKey.restore(); mockRuntime.storage.projects.ssh.getSSHKey.restore();
mockRuntime.storage.sshkeys.generateSSHKey.restore(); mockRuntime.storage.projects.ssh.generateSSHKey.restore();
mockRuntime.storage.sshkeys.deleteSSHKey.restore(); mockRuntime.storage.projects.ssh.deleteSSHKey.restore();
}) })
it('GET /settings/user/keys --- return empty list', function(done) { 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) request(app)
.get("/settings/user/keys") .get("/settings/user/keys")
.expect(200) .expect(200)
@ -116,7 +118,7 @@ describe("api/editor/sshkeys", function() {
name: elem name: elem
}; };
}); });
mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.resolve(retList)); mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.resolve(retList));
request(app) request(app)
.get("/settings/user/keys") .get("/settings/user/keys")
.expect(200) .expect(200)
@ -135,7 +137,7 @@ describe("api/editor/sshkeys", function() {
it('GET /settings/user/keys --- return Error', function(done) { it('GET /settings/user/keys --- return Error', function(done) {
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
errInstance.code = "test_code"; errInstance.code = "test_code";
mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.reject(errInstance));
request(app) request(app)
.get("/settings/user/keys") .get("/settings/user/keys")
.expect(400) .expect(400)
@ -152,7 +154,7 @@ describe("api/editor/sshkeys", function() {
}); });
it('GET /settings/user/keys/<key_file_name> --- return 404', function(done) { it('GET /settings/user/keys/<key_file_name> --- return 404', function(done) {
mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.resolve(null)); mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.resolve(null));
request(app) request(app)
.get("/settings/user/keys/NOT_REAL") .get("/settings/user/keys/NOT_REAL")
.expect(404) .expect(404)
@ -165,7 +167,7 @@ describe("api/editor/sshkeys", function() {
}); });
it('GET /settings/user/keys --- return Unexpected Error', function(done) { it('GET /settings/user/keys --- return Unexpected Error', function(done) {
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
mockRuntime.storage.sshkeys.listSSHKeys.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.listSSHKeys.returns(Promise.reject(errInstance));
request(app) request(app)
.get("/settings/user/keys") .get("/settings/user/keys")
.expect(400) .expect(400)
@ -184,7 +186,7 @@ describe("api/editor/sshkeys", function() {
it('GET /settings/user/keys/<key_file_name> --- return content', function(done) { it('GET /settings/user/keys/<key_file_name> --- return content', function(done) {
var key_file_name = "test_key"; 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"; 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) request(app)
.get("/settings/user/keys/" + key_file_name) .get("/settings/user/keys/" + key_file_name)
.expect(200) .expect(200)
@ -192,7 +194,7 @@ describe("api/editor/sshkeys", function() {
if (err) { if (err) {
return done(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 }); res.body.should.be.deepEqual({ publickey: fileContent });
done(); done();
}); });
@ -202,7 +204,7 @@ describe("api/editor/sshkeys", function() {
var key_file_name = "test_key"; var key_file_name = "test_key";
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
errInstance.code = "test_code"; errInstance.code = "test_code";
mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.reject(errInstance));
request(app) request(app)
.get("/settings/user/keys/" + key_file_name) .get("/settings/user/keys/" + key_file_name)
.expect(400) .expect(400)
@ -221,7 +223,7 @@ describe("api/editor/sshkeys", function() {
it('GET /settings/user/keys/<key_file_name> --- return Unexpected Error', function(done) { it('GET /settings/user/keys/<key_file_name> --- return Unexpected Error', function(done) {
var key_file_name = "test_key"; var key_file_name = "test_key";
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
mockRuntime.storage.sshkeys.getSSHKey.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.getSSHKey.returns(Promise.reject(errInstance));
request(app) request(app)
.get("/settings/user/keys/" + key_file_name) .get("/settings/user/keys/" + key_file_name)
.expect(400) .expect(400)
@ -239,7 +241,7 @@ describe("api/editor/sshkeys", function() {
it('POST /settings/user/keys --- success', function(done) { it('POST /settings/user/keys --- success', function(done) {
var key_file_name = "test_key"; 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) request(app)
.post("/settings/user/keys") .post("/settings/user/keys")
.send({ name: key_file_name }) .send({ name: key_file_name })
@ -254,7 +256,7 @@ describe("api/editor/sshkeys", function() {
it('POST /settings/user/keys --- return parameter error', function(done) { it('POST /settings/user/keys --- return parameter error', function(done) {
var key_file_name = "test_key"; 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) request(app)
.post("/settings/user/keys") .post("/settings/user/keys")
.expect(400) .expect(400)
@ -274,7 +276,7 @@ describe("api/editor/sshkeys", function() {
var key_file_name = "test_key"; var key_file_name = "test_key";
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
errInstance.code = "test_code"; errInstance.code = "test_code";
mockRuntime.storage.sshkeys.generateSSHKey.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.generateSSHKey.returns(Promise.reject(errInstance));
request(app) request(app)
.post("/settings/user/keys") .post("/settings/user/keys")
.send({ name: key_file_name }) .send({ name: key_file_name })
@ -294,7 +296,7 @@ describe("api/editor/sshkeys", function() {
it('POST /settings/user/keys --- return Unexpected error', function(done) { it('POST /settings/user/keys --- return Unexpected error', function(done) {
var key_file_name = "test_key"; var key_file_name = "test_key";
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
mockRuntime.storage.sshkeys.generateSSHKey.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.generateSSHKey.returns(Promise.reject(errInstance));
request(app) request(app)
.post("/settings/user/keys") .post("/settings/user/keys")
.send({ name: key_file_name }) .send({ name: key_file_name })
@ -313,7 +315,7 @@ describe("api/editor/sshkeys", function() {
it('DELETE /settings/user/keys/<key_file_name> --- success', function(done) { it('DELETE /settings/user/keys/<key_file_name> --- success', function(done) {
var key_file_name = "test_key"; 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) request(app)
.delete("/settings/user/keys/" + key_file_name) .delete("/settings/user/keys/" + key_file_name)
.expect(204) .expect(204)
@ -330,7 +332,7 @@ describe("api/editor/sshkeys", function() {
var key_file_name = "test_key"; var key_file_name = "test_key";
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
errInstance.code = "test_code"; errInstance.code = "test_code";
mockRuntime.storage.sshkeys.deleteSSHKey.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.deleteSSHKey.returns(Promise.reject(errInstance));
request(app) request(app)
.delete("/settings/user/keys/" + key_file_name) .delete("/settings/user/keys/" + key_file_name)
.expect(400) .expect(400)
@ -349,7 +351,7 @@ describe("api/editor/sshkeys", function() {
it('DELETE /settings/user/keys/<key_file_name> --- return Unexpected Error', function(done) { it('DELETE /settings/user/keys/<key_file_name> --- return Unexpected Error', function(done) {
var key_file_name = "test_key"; var key_file_name = "test_key";
var errInstance = new Error("Messages....."); var errInstance = new Error("Messages.....");
mockRuntime.storage.sshkeys.deleteSSHKey.returns(Promise.reject(errInstance)); mockRuntime.storage.projects.ssh.deleteSSHKey.returns(Promise.reject(errInstance));
request(app) request(app)
.delete("/settings/user/keys/" + key_file_name) .delete("/settings/user/keys/" + key_file_name)
.expect(400) .expect(400)

View File

@ -292,13 +292,14 @@ describe('storage/localfilesystem', function() {
it('should fsync the flows file',function(done) { it('should fsync the flows file',function(done) {
var flowFile = 'test.json'; var flowFile = 'test.json';
var flowFilePath = path.join(userDir,flowFile); 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"); sinon.spy(fs,"fsync");
localfilesystem.saveFlows(testFlow).then(function() { localfilesystem.saveFlows(testFlow).then(function() {
fs.fsync.callCount.should.eql(1); fs.fsync.callCount.should.eql(1);
fs.fsync.restore(); fs.fsync.restore();
done(); done();
}).otherwise(function(err) { }).otherwise(function(err) {
fs.fsync.restore();
done(err); done(err);
}); });
}).otherwise(function(err) { }).otherwise(function(err) {

View File

@ -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);
});
});
});

View File

@ -19,9 +19,9 @@ var sinon = require("sinon");
var child_process = require('child_process'); var child_process = require('child_process');
var EventEmitter = require("events"); 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() { afterEach(function() {
child_process.spawn.restore(); child_process.spawn.restore();
@ -46,7 +46,7 @@ describe("localfilesystem/projects/ssh", function() {
return e; return e;
}); });
ssh.generateKey({ keygen.generateKey({
size: 123, size: 123,
location: 'location', location: 'location',
comment: 'comment', comment: 'comment',
@ -79,7 +79,7 @@ describe("localfilesystem/projects/ssh", function() {
return e; return e;
}); });
ssh.generateKey({ keygen.generateKey({
size: 123, size: 123,
location: 'location', location: 'location',
comment: 'comment', comment: 'comment',
@ -112,7 +112,7 @@ describe("localfilesystem/projects/ssh", function() {
return e; return e;
}); });
ssh.generateKey({ keygen.generateKey({
size: 123, size: 123,
location: 'location', location: 'location',
comment: 'comment', comment: 'comment',

View File

@ -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);
});
});
});