Compare commits

...

4 Commits

Author SHA1 Message Date
T0liver
fcc10fa28b
Merge 4cde2f3f7c180de5c74ffc597085dc38f756bf98 into 15f4182e0eb03fb1091f19bac12d9033305aff0d 2025-02-19 10:53:06 +01:00
OpaqueGlass
15f4182e0e
Fix: Unable to launch WinSCP for SSH sessions using private key (#10308) 2025-02-19 10:27:59 +01:00
T0liver
4cde2f3f7c
Fix hu-HU.po 2024-12-30 14:16:42 +01:00
T0liver
3f0cfb9984
Create Hungarian translation 2024-12-30 13:35:27 +01:00
2 changed files with 2605 additions and 10 deletions

2572
locale/hu-HU.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,8 @@
// import * as fs from 'fs/promises' import * as fs from 'fs/promises'
import * as crypto from 'crypto'
import * as tmp from 'tmp-promise' import * as tmp from 'tmp-promise'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { ConfigService, HostAppService, Platform, PlatformService } from 'tabby-core' import { ConfigService, FileProvidersService, HostAppService, Platform, PlatformService } from 'tabby-core'
import { SSHSession } from '../session/ssh' import { SSHSession } from '../session/ssh'
import { SSHProfile } from '../api' import { SSHProfile } from '../api'
import { PasswordStorageService } from './passwordStorage.service' import { PasswordStorageService } from './passwordStorage.service'
@ -15,6 +16,7 @@ export class SSHService {
private config: ConfigService, private config: ConfigService,
hostApp: HostAppService, hostApp: HostAppService,
private platform: PlatformService, private platform: PlatformService,
private fileProviders: FileProvidersService,
) { ) {
if (hostApp.platform === Platform.Windows) { if (hostApp.platform === Platform.Windows) {
this.detectedWinSCPPath = platform.getWinSCPPath() this.detectedWinSCPPath = platform.getWinSCPPath()
@ -47,14 +49,35 @@ export class SSHService {
const args = [await this.getWinSCPURI(session.profile, undefined, session.authUsername ?? undefined)] const args = [await this.getWinSCPURI(session.profile, undefined, session.authUsername ?? undefined)]
let tmpFile: tmp.FileResult|null = null let tmpFile: tmp.FileResult|null = null
if (session.activePrivateKey) { try {
if (session.activePrivateKey && session.profile.options.privateKeys && session.profile.options.privateKeys.length > 0) {
tmpFile = await tmp.file() tmpFile = await tmp.file()
// await fs.writeFile(tmpFile.path, session.activePrivateKey) let passphrase: string|null = null
for (const pk of session.profile.options.privateKeys) {
let privateKeyContent: string|null = null
const buffer = await this.fileProviders.retrieveFile(pk)
privateKeyContent = buffer.toString()
await fs.writeFile(tmpFile.path, privateKeyContent)
const keyHash = crypto.createHash('sha512').update(privateKeyContent).digest('hex')
// need to pass an default passphrase, otherwise it might get stuck at the passphrase input
passphrase = await this.passwordStorage.loadPrivateKeyPassword(keyHash) ?? 'tabby'
const winSCPcom = path.slice(0, -3) + 'com' const winSCPcom = path.slice(0, -3) + 'com'
await this.platform.exec(winSCPcom, ['/keygen', tmpFile.path, `/output=${tmpFile.path}`]) try {
await this.platform.exec(winSCPcom, ['/keygen', tmpFile.path, '-o', tmpFile.path, '--old-passphrase', passphrase])
} catch (error) {
console.warn('Could not convert private key ', error)
continue
}
break
}
args.push(`/privatekey=${tmpFile.path}`) args.push(`/privatekey=${tmpFile.path}`)
if (passphrase != null) {
args.push(`/passphrase=${passphrase}`)
}
} }
await this.platform.exec(path, args) await this.platform.exec(path, args)
} finally {
tmpFile?.cleanup() tmpFile?.cleanup()
} }
}
} }