mirror of
https://github.com/Eugeny/tabby.git
synced 2025-06-28 07:19:54 +00:00
don't try to load the private key if not selected - fixes #2968
This commit is contained in:
parent
7977c1d644
commit
e6fd31e0b0
@ -22,6 +22,11 @@ try {
|
|||||||
var windowsProcessTreeNative = require('windows-process-tree/build/Release/windows_process_tree.node') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
|
var windowsProcessTreeNative = require('windows-process-tree/build/Release/windows_process_tree.node') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
|
||||||
} catch { }
|
} catch { }
|
||||||
|
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-type-alias
|
||||||
|
export type SSHLogCallback = (message: string) => void
|
||||||
|
|
||||||
|
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
||||||
export class SSHService {
|
export class SSHService {
|
||||||
private logger: Logger
|
private logger: Logger
|
||||||
@ -46,33 +51,24 @@ export class SSHService {
|
|||||||
return session
|
return session
|
||||||
}
|
}
|
||||||
|
|
||||||
async connectSession (session: SSHSession, logCallback?: (s: any) => void): Promise<void> {
|
async loadPrivateKeyForSession (session: SSHSession, logCallback?: SSHLogCallback): Promise<string|null> {
|
||||||
let privateKey: string|null = null
|
let privateKey: string|null = null
|
||||||
let privateKeyPath = session.connection.privateKey
|
let privateKeyPath = session.connection.privateKey
|
||||||
|
|
||||||
if (!logCallback) {
|
|
||||||
logCallback = () => null
|
|
||||||
}
|
|
||||||
|
|
||||||
const log = (s: any) => {
|
|
||||||
logCallback!(s)
|
|
||||||
this.logger.info(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!privateKeyPath) {
|
if (!privateKeyPath) {
|
||||||
const userKeyPath = path.join(process.env.HOME as string, '.ssh', 'id_rsa')
|
const userKeyPath = path.join(process.env.HOME as string, '.ssh', 'id_rsa')
|
||||||
if (await fs.exists(userKeyPath)) {
|
if (await fs.exists(userKeyPath)) {
|
||||||
log('Using user\'s default private key')
|
logCallback?.('Using user\'s default private key')
|
||||||
privateKeyPath = userKeyPath
|
privateKeyPath = userKeyPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (privateKeyPath) {
|
if (privateKeyPath) {
|
||||||
log('Loading private key from ' + colors.bgWhite.blackBright(' ' + privateKeyPath + ' '))
|
logCallback?.('Loading private key from ' + colors.bgWhite.blackBright(' ' + privateKeyPath + ' '))
|
||||||
try {
|
try {
|
||||||
privateKey = (await fs.readFile(privateKeyPath)).toString()
|
privateKey = (await fs.readFile(privateKeyPath)).toString()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log(colors.bgRed.black(' X ') + 'Could not read the private key file')
|
logCallback?.(colors.bgRed.black(' X ') + 'Could not read the private key file')
|
||||||
this.toastr.error('Could not read the private key file')
|
this.toastr.error('Could not read the private key file')
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +79,7 @@ export class SSHService {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof sshpk.KeyEncryptedError) {
|
if (e instanceof sshpk.KeyEncryptedError) {
|
||||||
const modal = this.ngbModal.open(PromptModalComponent)
|
const modal = this.ngbModal.open(PromptModalComponent)
|
||||||
log(colors.bgYellow.yellow.black(' ! ') + ' Key requires passphrase')
|
logCallback?.(colors.bgYellow.yellow.black(' ! ') + ' Key requires passphrase')
|
||||||
modal.componentInstance.prompt = 'Private key passphrase'
|
modal.componentInstance.prompt = 'Private key passphrase'
|
||||||
modal.componentInstance.password = true
|
modal.componentInstance.password = true
|
||||||
let passphrase = ''
|
let passphrase = ''
|
||||||
@ -131,6 +127,20 @@ export class SSHService {
|
|||||||
fs.unlink(temp.path)
|
fs.unlink(temp.path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return privateKey
|
||||||
|
}
|
||||||
|
|
||||||
|
async connectSession (session: SSHSession, logCallback?: SSHLogCallback): Promise<void> {
|
||||||
|
if (!logCallback) {
|
||||||
|
logCallback = () => null
|
||||||
|
}
|
||||||
|
|
||||||
|
const log = (s: any) => {
|
||||||
|
logCallback!(s)
|
||||||
|
this.logger.info(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
let privateKey: string|null = null
|
||||||
|
|
||||||
const ssh = new Client()
|
const ssh = new Client()
|
||||||
session.ssh = ssh
|
session.ssh = ssh
|
||||||
@ -213,6 +223,7 @@ export class SSHService {
|
|||||||
|
|
||||||
const authMethodsLeft = ['none']
|
const authMethodsLeft = ['none']
|
||||||
if (!session.connection.auth || session.connection.auth === 'publicKey') {
|
if (!session.connection.auth || session.connection.auth === 'publicKey') {
|
||||||
|
privateKey = await this.loadPrivateKeyForSession(session, log)
|
||||||
if (!privateKey) {
|
if (!privateKey) {
|
||||||
log('\r\nPrivate key auth selected, but no key is loaded\r\n')
|
log('\r\nPrivate key auth selected, but no key is loaded\r\n')
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user