add ssh route tests and fixup the code accordingly

This commit is contained in:
Johannes Zellner
2017-03-07 14:12:25 +01:00
parent 77ef212daa
commit d49d76c1ee
4 changed files with 285 additions and 15 deletions

View File

@@ -6,16 +6,22 @@ exports = module.exports = {
getAuthorizedKeys: getAuthorizedKeys,
getAuthorizedKey: getAuthorizedKey,
addAuthorizedKey: addAuthorizedKey,
delAuthorizedKey: delAuthorizedKey
delAuthorizedKey: delAuthorizedKey,
_clear: clear
};
// var AUTHORIZED_KEYS_FILEPATH = '/root/.ssh/authorized_keys';
var AUTHORIZED_KEYS_FILEPATH = '/home/nebulon/.ssh/authorized_keys';
var assert = require('assert'),
config = require('./config.js'),
fs = require('fs'),
path = require('path'),
safe = require('safetydance'),
util = require('util');
var AUTHORIZED_KEYS_FILEPATH = config.TEST ? path.join(config.baseDir(), 'authorized_keys') : '/root/.ssh/authorized_keys';
var VALID_KEY_TYPES = ['ssh-rsa']; // TODO add all supported ones
var VALID_MIN_KEY_LENGTH = 370; // TODO verify this length requirement
function SshError(reason, errorOrMessage) {
assert.strictEqual(typeof reason, 'string');
assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined');
@@ -39,14 +45,22 @@ SshError.NOT_FOUND = 'Not found';
SshError.INVALID_KEY = 'Invalid key';
SshError.INTERNAL_ERROR = 'Internal Error';
function clear(callback) {
assert.strictEqual(typeof callback, 'function');
fs.unlink(AUTHORIZED_KEYS_FILEPATH, function (error) {
if (error && error.code !== 'ENOENT') return callback(error);
callback();
});
}
function getKeys() {
var content = safe.fs.readFileSync(AUTHORIZED_KEYS_FILEPATH, 'utf8');
if (!content) return [];
var keys = content.split('/n')
var keys = content.split('\n')
.filter(function (k) { return !!k.trim(); })
.map(function (k) { return { identifier: k.split(' ')[2] || null, value: k }; })
.filter(function (k) { return k.identifier && k.value; });
.map(function (k) { return { identifier: k.split(' ')[2], key: k }; })
.filter(function (k) { return k.identifier && k.key; });
return keys;
}
@@ -54,7 +68,7 @@ function getKeys() {
function getAuthorizedKeys(callback) {
assert.strictEqual(typeof callback, 'function');
return callback(null, getKeys());
return callback(null, getKeys().sort(function (a, b) { return a.identifier.localeCompare(b.identifier); }));
}
function getAuthorizedKey(identifier, callback) {
@@ -76,14 +90,17 @@ function addAuthorizedKey(key, callback) {
var tmp = key.split(' ');
if (tmp.length !== 3) return callback(new SshError(SshError.INVALID_KEY));
if (!VALID_KEY_TYPES.some(function (t) { return tmp[0] === t; })) return callback(new SshError(SshError.INVALID_KEY, 'Invalid key type'));
if (tmp[1].length < VALID_MIN_KEY_LENGTH) return callback(new SshError(SshError.INVALID_KEY));
var identifier = tmp[2];
var keys = getKeys();
var index = keys.findIndex(function (k) { return k.identifier === identifier; });
if (index !== -1) keys[index] = { identifier: identifier, value: key };
else keys.push({ identifier: identifier, value: key });
if (index !== -1) keys[index] = { identifier: identifier, key: key };
else keys.push({ identifier: identifier, key: key });
if (!safe.fs.writeFileSync(AUTHORIZED_KEYS_FILEPATH, keys.map(function (k) { return k.value; }).join('\n'))) {
if (!safe.fs.writeFileSync(AUTHORIZED_KEYS_FILEPATH, keys.map(function (k) { return k.key; }).join('\n'))) {
console.error(safe.error);
return callback(new SshError(SshError.INTERNAL_ERROR, safe.error));
}
@@ -102,7 +119,7 @@ function delAuthorizedKey(identifier, callback) {
// now remove the key
keys.splice(index, 1);
if (!safe.fs.writeFileSync(AUTHORIZED_KEYS_FILEPATH, keys.map(function (k) { return k.value; }).join('\n'))) {
if (!safe.fs.writeFileSync(AUTHORIZED_KEYS_FILEPATH, keys.map(function (k) { return k.key; }).join('\n'))) {
console.error(safe.error);
return callback(new SshError(SshError.INTERNAL_ERROR, safe.error));
}