Compare commits

..

13 Commits

Author SHA1 Message Date
allcontributors[bot]
24b4c34e97 update README.id-ID.md [skip ci] 2025-02-03 09:12:36 +00:00
allcontributors[bot]
b805d90be7 update README.de-DE.md [skip ci] 2025-02-03 09:12:35 +00:00
allcontributors[bot]
d53d70a56b update README.it-IT.md [skip ci] 2025-02-03 09:12:34 +00:00
allcontributors[bot]
ef66219baf update README.ko-KR.md [skip ci] 2025-02-03 09:12:33 +00:00
allcontributors[bot]
3a21d1ed10 update README.ru-RU.md [skip ci] 2025-02-03 09:12:32 +00:00
allcontributors[bot]
e46348a8a5 update README.zh-CN.md [skip ci] 2025-02-03 09:12:31 +00:00
allcontributors[bot]
11eb6b3a3a update README.md [skip ci] 2025-02-03 09:12:30 +00:00
allcontributors[bot]
3f21835308 update README.de-DE.md [skip ci] 2025-02-03 09:06:40 +00:00
allcontributors[bot]
c76f6293c1 update README.it-IT.md [skip ci] 2025-02-03 09:06:39 +00:00
allcontributors[bot]
3f91273d32 update README.ko-KR.md [skip ci] 2025-02-03 09:06:38 +00:00
allcontributors[bot]
28a19adfc1 update README.ru-RU.md [skip ci] 2025-02-03 09:06:37 +00:00
allcontributors[bot]
d2bd00453b update README.zh-CN.md [skip ci] 2025-02-03 09:06:36 +00:00
allcontributors[bot]
4958708cc4 update README.md [skip ci] 2025-02-03 09:06:35 +00:00
12 changed files with 24 additions and 52 deletions

View File

@@ -258,7 +258,7 @@ jobs:
repo: 'eugeny/tabby'
dir: 'dist'
rpmvers: 'el/9 el/8 ol/6 ol/7'
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble ubuntu/oracular debian/jessie debian/stretch debian/buster debian/bullseye debian/bookworm debian/trixie'
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble ubuntu/oracular debian/jessie debian/stretch debian/buster'
- uses: actions/upload-artifact@master
name: Upload AppImage (${{matrix.arch}})

View File

@@ -347,7 +347,7 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ianaflous"><img src="https://avatars.githubusercontent.com/u/42301579?v=4?s=100" width="100px;" alt="ianaflous"/><br /><sub><b>ianaflous</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ianaflous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -346,7 +346,7 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ianaflous"><img src="https://avatars.githubusercontent.com/u/42301579?v=4?s=100" width="100px;" alt="ianaflous"/><br /><sub><b>ianaflous</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ianaflous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -342,6 +342,7 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -341,7 +341,7 @@ Pull requests and plugins are welcome!
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ianaflous"><img src="https://avatars.githubusercontent.com/u/42301579?v=4?s=100" width="100px;" alt="ianaflous"/><br /><sub><b>ianaflous</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ianaflous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -365,7 +365,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ianaflous"><img src="https://avatars.githubusercontent.com/u/42301579?v=4?s=100" width="100px;" alt="ianaflous"/><br /><sub><b>ianaflous</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ianaflous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -342,7 +342,7 @@ Pull-запросы и плагины приветствуются!
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ianaflous"><img src="https://avatars.githubusercontent.com/u/42301579?v=4?s=100" width="100px;" alt="ianaflous"/><br /><sub><b>ianaflous</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ianaflous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -341,7 +341,7 @@
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ianaflous"><img src="https://avatars.githubusercontent.com/u/42301579?v=4?s=100" width="100px;" alt="ianaflous"/><br /><sub><b>ianaflous</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=ianaflous" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://aminelch.github.io"><img src="https://avatars.githubusercontent.com/u/32558537?v=4?s=100" width="100px;" alt="aminelch"/><br /><sub><b>aminelch</b></sub></a><br /><a href="#design-aminelch" title="Design">🎨</a></td>
</tr>
</tbody>
</table>

View File

@@ -30,7 +30,7 @@
"native-process-working-directory": "^1.0.2",
"npm": "6",
"rxjs": "^7.5.7",
"russh": "0.1.21",
"russh": "0.1.19",
"source-map-support": "^0.5.20",
"v8-compile-cache": "^2.3.0",
"yargs": "^17.7.2"

View File

@@ -3628,10 +3628,10 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
russh@0.1.21:
version "0.1.21"
resolved "https://registry.yarnpkg.com/russh/-/russh-0.1.21.tgz#857b20c298a50a6657d1f1653ce9d149c68d6b5b"
integrity sha512-2zjOHTTDqaa3/pHUU+VCkoEqOXLpIpk9WATUaudtLGqy3n8Duz3WlhvyJzEmd+S+9eVGnQvyktpjtZziXLVHRA==
russh@0.1.19:
version "0.1.19"
resolved "https://registry.yarnpkg.com/russh/-/russh-0.1.19.tgz#b1e9edeef5bb8502ff083638bf93512dc084c39e"
integrity sha512-gfLiz+OyGDcFhm5NE0Y6V1byPSgFNLr+71PFlMMz48oZPXl+WQavdCcyfdy9T/1afip9Vw5lkb6SxZ6/RVj2Lw==
dependencies:
"@napi-rs/cli" "^2.18.3"

View File

@@ -195,13 +195,7 @@ export class VaultService {
if (!vault) {
return null
}
let vaultSecret = vault.secrets.find(s => s.type === type && this.keyMatches(key, s))
if (!vaultSecret) {
// search for secret without host in vault (like a default user/password used in multiple servers)
key['host'] = null
vaultSecret = vault.secrets.find(s => s.type === type && this.keyMatches(key, s))
}
return vaultSecret ?? null
return vault.secrets.find(s => s.type === type && this.keyMatches(key, s)) ?? null
}
async addSecret (secret: VaultSecret): Promise<void> {

View File

@@ -1,8 +1,7 @@
import * as fs from 'fs/promises'
import * as crypto from 'crypto'
// import * as fs from 'fs/promises'
import * as tmp from 'tmp-promise'
import { Injectable } from '@angular/core'
import { ConfigService, FileProvidersService, HostAppService, Platform, PlatformService } from 'tabby-core'
import { ConfigService, HostAppService, Platform, PlatformService } from 'tabby-core'
import { SSHSession } from '../session/ssh'
import { SSHProfile } from '../api'
import { PasswordStorageService } from './passwordStorage.service'
@@ -16,7 +15,6 @@ export class SSHService {
private config: ConfigService,
hostApp: HostAppService,
private platform: PlatformService,
private fileProviders: FileProvidersService,
) {
if (hostApp.platform === Platform.Windows) {
this.detectedWinSCPPath = platform.getWinSCPPath()
@@ -49,35 +47,14 @@ export class SSHService {
const args = [await this.getWinSCPURI(session.profile, undefined, session.authUsername ?? undefined)]
let tmpFile: tmp.FileResult|null = null
try {
if (session.activePrivateKey && session.profile.options.privateKeys && session.profile.options.privateKeys.length > 0) {
tmpFile = await tmp.file()
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'
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}`)
if (passphrase != null) {
args.push(`/passphrase=${passphrase}`)
}
}
await this.platform.exec(path, args)
} finally {
tmpFile?.cleanup()
if (session.activePrivateKey) {
tmpFile = await tmp.file()
// await fs.writeFile(tmpFile.path, session.activePrivateKey)
const winSCPcom = path.slice(0, -3) + 'com'
await this.platform.exec(winSCPcom, ['/keygen', tmpFile.path, `/output=${tmpFile.path}`])
args.push(`/privatekey=${tmpFile.path}`)
}
await this.platform.exec(path, args)
tmpFile?.cleanup()
}
}