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
14 changed files with 30 additions and 72 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/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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 @@ 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://github.com/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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

@@ -31,7 +31,7 @@
* Встроенный SSH- и Telnet-клиент и менеджер подключений;
* Встроенный последовательный терминал;
* Темы и цветовые схемы;
* Полностью настраиваемые сочетания клавиш;
* Полностью настраеваемые сочетания клавиш;
* Панели;
* Запоминание вкладок;
* Поддержка PowerShell (and PS Core), WSL, Git-Bash, Cygwin, MSYS2, Cmder и CMD;
@@ -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/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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/mannjani"><img src="https://avatars.githubusercontent.com/u/4688839?v=4?s=100" width="100px;" alt="mannjani"/><br /><sub><b>mannjani</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=mannjani" 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.22",
"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.22:
version "0.1.22"
resolved "https://registry.yarnpkg.com/russh/-/russh-0.1.22.tgz#f56e515b1938fa3c1ee7321b2559c17bb7f7f5cc"
integrity sha512-ors+8pqxb9cyyy0tkAgEkrEWoN18kJuw0GtcZsheTQBdqEw/BSulmkKqNva6jjvoOc3wP1GIjbkQ5OdRGqQwmg==
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()
}
}

View File

@@ -162,11 +162,9 @@ export class SSHSession {
this.allAuthMethods = [{ type: 'none' }]
if (!this.profile.options.auth || this.profile.options.auth === 'publicKey') {
if (this.profile.options.privateKeys?.length) {
for (let pk of this.profile.options.privateKeys) {
for (const pk of this.profile.options.privateKeys) {
// eslint-disable-next-line @typescript-eslint/init-declarations
let contents: Buffer
pk = pk.replace('%h', this.profile.options.host)
pk = pk.replace('%r', this.profile.options.user)
try {
contents = await this.fileProviders.retrieveFile(pk)
} catch (error) {

View File

@@ -3,7 +3,7 @@ import { Subject, Observable } from 'rxjs'
import { SessionMiddleware } from '../api/middleware'
const OSCPrefix = Buffer.from('\x1b]')
const OSCSuffixes = [Buffer.from('\x07'), Buffer.from('\x1b\\')]
const OSCSuffix = Buffer.from('\x07')
export class OSCProcessor extends SessionMiddleware {
get cwdReported$ (): Observable<string> { return this.cwdReported }
@@ -14,22 +14,11 @@ export class OSCProcessor extends SessionMiddleware {
feedFromSession (data: Buffer): void {
let startIndex = 0
while (data.includes(OSCPrefix, startIndex)) {
const si = startIndex
if (!OSCSuffixes.some(s => data.includes(s, si))) {
break
}
while (data.includes(OSCPrefix, startIndex) && data.includes(OSCSuffix, startIndex)) {
const params = data.subarray(data.indexOf(OSCPrefix, startIndex) + OSCPrefix.length)
const oscString = params.subarray(0, params.indexOf(OSCSuffix)).toString()
const [closesSuffix, closestSuffixIndex] = OSCSuffixes
.map((suffix): [Buffer, number] => [suffix, params.indexOf(suffix)])
.filter(([_, index]) => index !== -1)
.sort(([_, a], [__, b]) => a - b)[0]
const oscString = params.subarray(0, closestSuffixIndex).toString()
startIndex = data.indexOf(closesSuffix, startIndex) + closesSuffix.length
startIndex = data.indexOf(OSCSuffix, startIndex) + OSCSuffix.length
const [oscCodeString, ...oscParams] = oscString.split(';')
const oscCode = parseInt(oscCodeString)