node-red/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/ssh/keygen.js

97 lines
2.9 KiB
JavaScript

/**
* 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 child_process = require('child_process');
var sshkeygenCommand = "ssh-keygen";
var log = require("@node-red/util").log;
function runSshKeygenCommand(args,cwd,env) {
return new Promise(function(resolve, reject) {
var child = child_process.spawn(sshkeygenCommand, args, {cwd: cwd, detached: true, env: env});
var stdout = "";
var stderr = "";
child.stdout.on('data', function(data) {
stdout += data;
});
child.stderr.on('data', function(data) {
stderr += data;
});
child.on('close', function(code, signal) {
// console.log(code);
// console.log(stdout);
// console.log(stderr);
if (code !== 0) {
var err = new Error(stderr);
err.stdout = stdout;
err.stderr = stderr;
if (/short/.test(stderr)) {
err.code = "key_passphrase_too_short";
} else if(/Key must at least be 1024 bits/.test(stderr)) {
err.code = "key_length_too_short";
}
reject(err);
}
else {
resolve(stdout);
}
});
child.on('error', function(err) {
if (/ENOENT/.test(err.toString())) {
err.code = "command_not_found";
}
reject(err);
});
});
}
function generateKey(options) {
var args = ['-q', '-t', 'rsa'];
var err;
if (options.size) {
if (options.size < 1024) {
err = new Error("key_length_too_short");
err.code = "key_length_too_short";
throw err;
}
args.push('-b', options.size);
}
if (options.location) {
args.push('-f', options.location);
}
if (options.comment) {
args.push('-C', options.comment);
}
if (options.password) {
if (options.password.length < 5) {
err = new Error("key_passphrase_too_short");
err.code = "key_passphrase_too_short";
throw err;
}
args.push('-N', options.password||'');
} else {
args.push('-N', '');
}
return runSshKeygenCommand(args,__dirname);
}
module.exports = {
generateKey: generateKey
};