modi-cli
Version:
Console application for provisioning, displaying or destroying virtual machines in MODI
147 lines (111 loc) • 5.39 kB
JavaScript
var security = require('./Lib/CryptoLib.js');
var hidden = require('./Lib/HidePassword.js');
var definitions = require('./Lib/Define.js');
var httpntlm = require('httpntlm');
var fs = require('fs');
var readline = require('readline');
var rl_interface = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var osversion = process.platform;
var homePath;
var modiSettingsPath = '.modisettings';
switch(osversion) {
case 'win32':
homePath = process.env.USERPROFILE;
modiSettingsPath = homePath + '\\.modisettings';
break;
case 'linux':
homePath = process.env.HOME;
modiSettingsPath = homePath + '/.modisettings';
break;
case 'darwin':
homePath = process.env.HOME;
modiSettingsPath = homePath + '/.modisettings';
break;
}
exports.login = function (callback, args1, args2, args3){ //there are 3 arguments for the Provsioning request: provrequestxml, machineName, saveCredentials
rl_interface.question('Enter your domain name:', function (answerDomain) {
rl_interface.question('Enter your user name:', function (answerUserName) {
hidden(rl_interface, 'Enter your password: ', function (inputPassword) {
//test the credentials before saving
//web api call
if (callback == undefined) {
httpntlm.get({
url: definitions.testUrl,
username: answerUserName,
password: inputPassword,
workstation: '',
domain: answerDomain
},
function(err, res) {
if (err) {
process.stdout.write(''); //a control command.seems to cut some remaining text in the console
console.log('There was an authentication error. Error is ' + err);
deleteExistingLogin();
process.exit(0);
}
if (res != undefined
&& res != null
&& res.body != null
&& res.body != undefined) {
if (res.body.indexOf(definitions.AccessDeniedMessage) > 0) {
process.stdout.write(''); //a control command.seems to cut some remaining text in the console
console.log(definitions.WrongCredentialsMessage);
deleteExistingLogin();
process.exit(0);
} else {
storeExistingLogin(answerDomain, answerUserName, inputPassword);
var loginData = [];
loginData.UserName = answerUserName;
loginData.Password = inputPassword;
loginData.UserDomain = answerDomain;
return loginData;
}
}
else {
console.log(definitions.DefaultStatusErrorMessage);
deleteExistingLogin();
process.exit(0);
}
});
}
else{
if (args1 == undefined) {
callback(answerUserName, inputPassword, answerDomain);
} else {
callback(answerUserName, inputPassword, answerDomain, args1, args2, args3);
}
}
});
});
});
}
exports.loadExistingLogin = function () {
if (fs.existsSync(modiSettingsPath))
{
var encryptedLoginData = fs.readFileSync(modiSettingsPath).toString();
try {
var jsonLoginData = security.Decrypt(encryptedLoginData); //Json format
var loginData = JSON.parse(jsonLoginData);
return loginData;
} catch (e) {
console.log('Unable to load the previously used credentials. Redirecting to login...');
return null;
}
}
else return null;
}
storeExistingLogin = function (userDomain, userName, password) {
var jsonLoginData = { 'UserDomain': userDomain, 'UserName': userName, 'Password': password };
var stringLoginData = JSON.stringify(jsonLoginData);
var encryptedLoginData = security.Encrypt(stringLoginData);
fs.writeFileSync(modiSettingsPath, encryptedLoginData);
};
exports.storeExistingLogin = storeExistingLogin;
deleteExistingLogin = function() {
if (fs.existsSync(modiSettingsPath)) {
fs.unlinkSync(modiSettingsPath);
}
}