|
|
@ -244,7 +244,7 @@ const getViews = screen => { |
|
|
|
else |
|
|
|
addButton.focus(); |
|
|
|
}, |
|
|
|
setHost: ({ name, address, port, username, password } = {}, callback) => { |
|
|
|
setHost: ({ name, address, port, username, password, chain } = {}, callback) => { |
|
|
|
let action; |
|
|
|
const hostForm = form(); |
|
|
|
text({ content: 'Add host' }, { borderBottom: true }, hostForm); |
|
|
@ -259,6 +259,8 @@ const getViews = screen => { |
|
|
|
const userInput = textbox({ top: n += 2, name: 'username', content: username }, hostForm); |
|
|
|
text({ top: n += 4, content: 'Password :' }, hostForm); |
|
|
|
textbox({ top: n += 2, name: 'password', censor: true, content: password }, hostForm); |
|
|
|
text({ top: n += 4, content: 'Chain (optional, comma-separated) :' }, hostForm); |
|
|
|
textbox({ top: n += 2, name: 'chain', content: chain }, hostForm); |
|
|
|
const actions = flexContainer({ top: n += 4, width: 100 }, hostForm); |
|
|
|
button({ content: 'Cancel' }, undefined, actions) |
|
|
|
.on('press', () => callback({ action: 'cancel' })); |
|
|
@ -281,7 +283,7 @@ const getViews = screen => { |
|
|
|
{ color: 'red' }, |
|
|
|
hostForm |
|
|
|
); |
|
|
|
hostForm.on('submit', ({ name, address, port, username, password }) => { |
|
|
|
hostForm.on('submit', ({ name, address, port, username, password, chain }) => { |
|
|
|
port = parseInt(port); |
|
|
|
if(action === 'test'){ |
|
|
|
successText.hide(); |
|
|
@ -292,7 +294,7 @@ const getViews = screen => { |
|
|
|
// noinspection JSUnusedGlobalSymbols
|
|
|
|
callback({ |
|
|
|
action, |
|
|
|
host: { name, address, port, username, password }, |
|
|
|
host: { name, address, port, username, password, chain }, |
|
|
|
res: res => { |
|
|
|
if(action === 'test'){ |
|
|
|
testButton.setContent('Test'); |
|
|
@ -304,7 +306,8 @@ const getViews = screen => { |
|
|
|
successText.hide(); |
|
|
|
const error = ({ |
|
|
|
WRONG_CREDENTIALS: 'wrong username or password', |
|
|
|
WRONG_DESTINATION: 'wrong address or port' |
|
|
|
WRONG_DESTINATION: 'wrong address or port', |
|
|
|
INVALID_CHAIN: 'invalid hosts chain' |
|
|
|
})[res]; |
|
|
|
errorText.setContent(`SSH connection failed : ${error || `unknown error (${res})`}`); |
|
|
|
errorText.show(); |
|
|
@ -513,9 +516,16 @@ const getControllers = (stream, end) => { |
|
|
|
switch(action2){ |
|
|
|
case 'cancel': return _controllers.main(user); |
|
|
|
case 'test': { |
|
|
|
const { address, port, username, password } = host2; |
|
|
|
const |
|
|
|
{ address, port, username, password, chain } = host2, |
|
|
|
hosts = user.getHosts(), |
|
|
|
hostsChain = [ |
|
|
|
...(chain ? chain.split(',').map(name => hosts.find(host => host.name === name)) : []), |
|
|
|
{ address, port, username, password } |
|
|
|
]; |
|
|
|
if(hostsChain.includes(undefined)) return res('INVALID_CHAIN'); |
|
|
|
ssh.chainedSession( |
|
|
|
[{ address, port, username, password }], |
|
|
|
hostsChain, |
|
|
|
() => res(true), |
|
|
|
undefined, |
|
|
|
({ level: error }) => { |
|
|
@ -551,7 +561,13 @@ const getControllers = (stream, end) => { |
|
|
|
return _controllers.main(user); |
|
|
|
} |
|
|
|
case 'connect': { |
|
|
|
return ssh.chainedSession([host], clientStream => { |
|
|
|
const |
|
|
|
{ chain } = host, |
|
|
|
hosts = user.getHosts(); |
|
|
|
return ssh.chainedSession([ |
|
|
|
...(chain ? chain.split(',').map(name => hosts.find(host => host.name === name)) : []), |
|
|
|
host |
|
|
|
], clientStream => { |
|
|
|
screen.destroy(); |
|
|
|
clientStream.stdout.pipe(stream.stdin); |
|
|
|
stream.stdin.pipe(clientStream.stdout); |
|
|
|