mirror of
https://github.com/Eugeny/tabby.git
synced 2025-09-06 16:41:49 +00:00
Compare commits
2 Commits
all-contri
...
bump-elect
Author | SHA1 | Date | |
---|---|---|---|
![]() |
48e510b7f7 | ||
![]() |
ed1384750a |
@@ -1355,15 +1355,6 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"login": "yyjdelete",
|
|
||||||
"name": "SilverFox",
|
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/1819074?v=4",
|
|
||||||
"profile": "https://github.com/yyjdelete",
|
|
||||||
"contributions": [
|
|
||||||
"code"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2017 Tabby Developers
|
Copyright (c) 2017 Eugene Pankov
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@@ -349,7 +349,6 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -351,7 +351,6 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -347,7 +347,6 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -343,7 +343,6 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -358,7 +358,6 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -342,7 +342,6 @@ Pull requests and plugins are welcome!
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -366,7 +366,6 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -351,7 +351,6 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -343,7 +343,6 @@ Pull-запросы и плагины приветствуются!
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -342,7 +342,6 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<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/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/yyjdelete"><img src="https://avatars.githubusercontent.com/u/1819074?v=4?s=100" width="100px;" alt="SilverFox"/><br /><sub><b>SilverFox</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=yyjdelete" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"repository": "https://github.com/Eugeny/tabby",
|
"repository": "https://github.com/Eugeny/tabby",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Tabby Developers",
|
"name": "Eugene Pankov",
|
||||||
"email": "e@ajenti.org"
|
"email": "e@ajenti.org"
|
||||||
},
|
},
|
||||||
"main": "dist/main.js",
|
"main": "dist/main.js",
|
||||||
|
@@ -6,6 +6,4 @@ export const PLUGIN_BLACKLIST = [
|
|||||||
'terminus-clickable-ips', // broken, functionality now bundled with Tabby
|
'terminus-clickable-ips', // broken, functionality now bundled with Tabby
|
||||||
'terminus-elastic-quick-commands', // broken and abandoned, fork of quick-commands
|
'terminus-elastic-quick-commands', // broken and abandoned, fork of quick-commands
|
||||||
'terminus-elastic-quick-cmds', // broken and abandoned, fork of quick-commands
|
'terminus-elastic-quick-cmds', // broken and abandoned, fork of quick-commands
|
||||||
'tabby-fig', // abandoned,
|
|
||||||
'tabby-plugin-fig-integration', // abandoned,
|
|
||||||
]
|
]
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.device.audio-input</key>
|
<key>com.apple.security.device.microphone</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.device.camera</key>
|
<key>com.apple.security.device.camera</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
@@ -31,7 +31,6 @@ export const builtinPlugins = [
|
|||||||
'tabby-electron',
|
'tabby-electron',
|
||||||
'tabby-plugin-manager',
|
'tabby-plugin-manager',
|
||||||
'tabby-linkifier',
|
'tabby-linkifier',
|
||||||
'tabby-auto-sudo-password',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export const packagesWithDocs = [
|
export const packagesWithDocs = [
|
||||||
|
@@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "tabby-auto-sudo-password",
|
|
||||||
"version": "1.0.197-nightly.1",
|
|
||||||
"description": "Offers to automatically paste saved sudo password in SSH sessions",
|
|
||||||
"keywords": [
|
|
||||||
"tabby-builtin-plugin"
|
|
||||||
],
|
|
||||||
"main": "dist/index.js",
|
|
||||||
"typings": "typings/index.d.ts",
|
|
||||||
"scripts": {
|
|
||||||
"build": "webpack --progress --color --display-modules",
|
|
||||||
"watch": "webpack --progress --color --watch"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist",
|
|
||||||
"typings"
|
|
||||||
],
|
|
||||||
"devDependencies": {
|
|
||||||
"ansi-colors": "^4.1.1"
|
|
||||||
},
|
|
||||||
"author": "Tabby Developers",
|
|
||||||
"license": "MIT"
|
|
||||||
}
|
|
@@ -1,89 +0,0 @@
|
|||||||
import colors from 'ansi-colors'
|
|
||||||
import { Injectable } from '@angular/core'
|
|
||||||
import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend, SessionMiddleware } from 'tabby-terminal'
|
|
||||||
import { SSHProfile, SSHTabComponent, PasswordStorageService } from 'tabby-ssh'
|
|
||||||
|
|
||||||
const SUDO_PROMPT_REGEX = /^\[sudo\] password for ([^:]+):\s*$/im
|
|
||||||
|
|
||||||
export class AutoSudoPasswordMiddleware extends SessionMiddleware {
|
|
||||||
private pendingPasswordToPaste: string | null = null
|
|
||||||
private pasteHint = `${colors.black.bgBlackBright(' Tabby ')} ${colors.gray('Press Enter to paste saved password')}`
|
|
||||||
private pasteHintLength = colors.stripColor(this.pasteHint).length
|
|
||||||
|
|
||||||
constructor (
|
|
||||||
private profile: SSHProfile,
|
|
||||||
private ps: PasswordStorageService,
|
|
||||||
) { super() }
|
|
||||||
|
|
||||||
feedFromSession (data: Buffer): void {
|
|
||||||
const text = data.toString('utf-8')
|
|
||||||
const match = SUDO_PROMPT_REGEX.exec(text)
|
|
||||||
if (match) {
|
|
||||||
const username = match[1]
|
|
||||||
this.handlePrompt(username)
|
|
||||||
}
|
|
||||||
this.outputToTerminal.next(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
feedFromTerminal (data: Buffer): void {
|
|
||||||
if (this.pendingPasswordToPaste) {
|
|
||||||
const backspaces = Buffer.alloc(this.pasteHintLength, 8) // backspace
|
|
||||||
const spaces = Buffer.alloc(this.pasteHintLength, 32) // space
|
|
||||||
const clear = Buffer.concat([backspaces, spaces, backspaces])
|
|
||||||
this.outputToTerminal.next(clear)
|
|
||||||
if (data.length === 1 && data[0] === 13) { // Enter key
|
|
||||||
this.outputToSession.next(Buffer.from(this.pendingPasswordToPaste + '\n'))
|
|
||||||
this.pendingPasswordToPaste = null
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
this.pendingPasswordToPaste = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.outputToSession.next(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
async handlePrompt (username: string): Promise<void> {
|
|
||||||
console.log(`Detected sudo prompt for user: ${username}`)
|
|
||||||
const pw = await this.ps.loadPassword(this.profile)
|
|
||||||
if (pw) {
|
|
||||||
this.outputToTerminal.next(Buffer.from(this.pasteHint))
|
|
||||||
this.pendingPasswordToPaste = pw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async loadPassword (username: string): Promise<string| null> {
|
|
||||||
if (this.profile.options.user !== username) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return this.ps.loadPassword(this.profile)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class AutoSudoPasswordDecorator extends TerminalDecorator {
|
|
||||||
constructor (
|
|
||||||
private ps: PasswordStorageService,
|
|
||||||
) {
|
|
||||||
super()
|
|
||||||
}
|
|
||||||
|
|
||||||
private attachToSession (tab: SSHTabComponent) {
|
|
||||||
if (!tab.session) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
tab.session.middleware.unshift(new AutoSudoPasswordMiddleware(tab.profile, this.ps))
|
|
||||||
}
|
|
||||||
|
|
||||||
attach (tab: BaseTerminalTabComponent<any>): void {
|
|
||||||
if (!(tab.frontend instanceof XTermFrontend) || !(tab instanceof SSHTabComponent)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.attachToSession(tab)
|
|
||||||
this.subscribeUntilDetached(tab, tab.sessionChanged$.subscribe(() => {
|
|
||||||
this.attachToSession(tab)
|
|
||||||
}))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,16 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-extraneous-class */
|
|
||||||
import { NgModule } from '@angular/core'
|
|
||||||
import { ToastrModule } from 'ngx-toastr'
|
|
||||||
import { TerminalDecorator } from 'tabby-terminal'
|
|
||||||
|
|
||||||
import { AutoSudoPasswordDecorator } from './decorator'
|
|
||||||
|
|
||||||
@NgModule({
|
|
||||||
imports: [
|
|
||||||
ToastrModule,
|
|
||||||
],
|
|
||||||
providers: [
|
|
||||||
{ provide: TerminalDecorator, useClass: AutoSudoPasswordDecorator, multi: true },
|
|
||||||
],
|
|
||||||
})
|
|
||||||
export default class AutoSudoPasswordModule { }
|
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../tsconfig.json",
|
|
||||||
"exclude": ["node_modules", "dist"],
|
|
||||||
"compilerOptions": {
|
|
||||||
"baseUrl": "src",
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../tsconfig.json",
|
|
||||||
"exclude": ["node_modules", "dist", "typings"],
|
|
||||||
"compilerOptions": {
|
|
||||||
"baseUrl": "src",
|
|
||||||
"emitDeclarationOnly": true,
|
|
||||||
"declaration": true,
|
|
||||||
"declarationDir": "./typings",
|
|
||||||
"paths": {
|
|
||||||
"tabby-*": ["../../tabby-*"],
|
|
||||||
"*": ["../../app/node_modules/*"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,10 +0,0 @@
|
|||||||
import * as path from 'path'
|
|
||||||
import * as url from 'url'
|
|
||||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
|
|
||||||
|
|
||||||
import config from '../webpack.plugin.config.mjs'
|
|
||||||
|
|
||||||
export default () => config({
|
|
||||||
name: 'auto-sudo-password',
|
|
||||||
dirname: __dirname,
|
|
||||||
})
|
|
@@ -1,8 +0,0 @@
|
|||||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
||||||
# yarn lockfile v1
|
|
||||||
|
|
||||||
|
|
||||||
ansi-colors@^4.1.1:
|
|
||||||
version "4.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
|
|
||||||
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
|
|
@@ -14,7 +14,7 @@
|
|||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^15",
|
"@angular/core": "^15",
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bootstrap": "^5.3.0-alpha.1",
|
"bootstrap": "^5.3.0-alpha.1",
|
||||||
|
@@ -35,8 +35,7 @@ title-bar(
|
|||||||
[@animateTab]='{value: "in", params: {size: targetTabSize}}',
|
[@animateTab]='{value: "in", params: {size: targetTabSize}}',
|
||||||
[@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
|
[@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
|
||||||
(click)='app.selectTab(tab)',
|
(click)='app.selectTab(tab)',
|
||||||
[class.fully-draggable]='hostApp.platform !== Platform.macOS',
|
[class.fully-draggable]='hostApp.platform !== Platform.macOS'
|
||||||
[ngbTooltip]='tab.customTitle || tab.title'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
.btn-group.background
|
.btn-group.background
|
||||||
@@ -44,7 +43,7 @@ title-bar(
|
|||||||
*ngFor='let button of leftToolbarButtons'
|
*ngFor='let button of leftToolbarButtons'
|
||||||
)
|
)
|
||||||
button.btn.btn-secondary.btn-tab-bar(
|
button.btn.btn-secondary.btn-tab-bar(
|
||||||
[ngbTooltip]='button.label',
|
[title]='button.label',
|
||||||
(click)='button.run && button.run()',
|
(click)='button.run && button.run()',
|
||||||
[fastHtmlBind]='button.icon'
|
[fastHtmlBind]='button.icon'
|
||||||
)
|
)
|
||||||
@@ -56,7 +55,7 @@ title-bar(
|
|||||||
)
|
)
|
||||||
button.btn.btn-secondary.btn-tab-bar(
|
button.btn.btn-secondary.btn-tab-bar(
|
||||||
[hidden]='activeTransfers.length == 0',
|
[hidden]='activeTransfers.length == 0',
|
||||||
[ngbTooltip]='"File transfers"|translate',
|
title='File transfers',
|
||||||
ngbDropdownToggle
|
ngbDropdownToggle
|
||||||
) !{require('../icons/transfers.svg')}
|
) !{require('../icons/transfers.svg')}
|
||||||
transfers-menu(
|
transfers-menu(
|
||||||
@@ -76,14 +75,14 @@ title-bar(
|
|||||||
*ngFor='let button of rightToolbarButtons'
|
*ngFor='let button of rightToolbarButtons'
|
||||||
)
|
)
|
||||||
button.btn.btn-secondary.btn-tab-bar(
|
button.btn.btn-secondary.btn-tab-bar(
|
||||||
[ngbTooltip]='button.label',
|
[title]='button.label',
|
||||||
(click)='button.run && button.run()',
|
(click)='button.run && button.run()',
|
||||||
[fastHtmlBind]='button.icon'
|
[fastHtmlBind]='button.icon'
|
||||||
)
|
)
|
||||||
|
|
||||||
button.btn.btn-secondary.btn-tab-bar.btn-update(
|
button.btn.btn-secondary.btn-tab-bar.btn-update(
|
||||||
*ngIf='updatesAvailable',
|
*ngIf='updatesAvailable',
|
||||||
[ngbTooltip]='"Update available - Click to install"|translate',
|
title='Update available - Click to install',
|
||||||
(click)='updater.update()'
|
(click)='updater.update()'
|
||||||
) !{require('../icons/gift.svg')}
|
) !{require('../icons/gift.svg')}
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@ profile-icon(
|
|||||||
)
|
)
|
||||||
|
|
||||||
.name(
|
.name(
|
||||||
|
[title]='tab.customTitle || tab.title',
|
||||||
[class.no-hover]='config.store.terminal.hideCloseButton && config.store.terminal.hideTabOptionsButton'
|
[class.no-hover]='config.store.terminal.hideCloseButton && config.store.terminal.hideTabOptionsButton'
|
||||||
cdkDrag,
|
cdkDrag,
|
||||||
cdkDragRootElement='tab-header',
|
cdkDragRootElement='tab-header',
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
.icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')}
|
.icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')}
|
||||||
.icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')}
|
.icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')}
|
||||||
.main
|
.main
|
||||||
label.no-wrap([ngbTooltip]='transfer.getName()') {{transfer.getName()}}
|
label.no-wrap([title]='transfer.getName()') {{transfer.getName()}}
|
||||||
ngb-progressbar([type]='transfer.isComplete() ? "success" : transfer.isCancelled() ? "danger" : "info"', [value]='getProgress(transfer)')
|
ngb-progressbar([type]='transfer.isComplete() ? "success" : transfer.isCancelled() ? "danger" : "info"', [value]='getProgress(transfer)')
|
||||||
.metadata
|
.metadata
|
||||||
.size {{transfer.getSize()|filesize}}
|
.size {{transfer.getSize()|filesize}}
|
||||||
|
@@ -2,7 +2,7 @@ import { NgModule, ModuleWithProviders, LOCALE_ID } from '@angular/core'
|
|||||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
|
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
|
||||||
import { CommonModule } from '@angular/common'
|
import { CommonModule } from '@angular/common'
|
||||||
import { FormsModule } from '@angular/forms'
|
import { FormsModule } from '@angular/forms'
|
||||||
import { NgbModule, NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { NgxFilesizeModule } from 'ngx-filesize'
|
import { NgxFilesizeModule } from 'ngx-filesize'
|
||||||
import { DragDropModule } from '@angular/cdk/drag-drop'
|
import { DragDropModule } from '@angular/cdk/drag-drop'
|
||||||
import { TranslateModule, TranslateCompiler, TranslateService, MissingTranslationHandler } from '@ngx-translate/core'
|
import { TranslateModule, TranslateCompiler, TranslateService, MissingTranslationHandler } from '@ngx-translate/core'
|
||||||
@@ -155,7 +155,6 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
|
|||||||
platform: PlatformService,
|
platform: PlatformService,
|
||||||
hotkeys: HotkeysService,
|
hotkeys: HotkeysService,
|
||||||
commands: CommandService,
|
commands: CommandService,
|
||||||
ngbTooltipConfig: NgbTooltipConfig,
|
|
||||||
public locale: LocaleService,
|
public locale: LocaleService,
|
||||||
private translate: TranslateService,
|
private translate: TranslateService,
|
||||||
private profilesService: ProfilesService,
|
private profilesService: ProfilesService,
|
||||||
@@ -202,10 +201,6 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
|
|||||||
commands.run('core:profile-selector', {})
|
commands.run('core:profile-selector', {})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
ngbTooltipConfig.openDelay = 750
|
|
||||||
ngbTooltipConfig.placement = 'top bottom auto'
|
|
||||||
ngbTooltipConfig.container = 'body'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async showSelector (provider: ProfileProvider<Profile>): Promise<void> {
|
async showSelector (provider: ProfileProvider<Profile>): Promise<void> {
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^15",
|
"@angular/core": "^15",
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@xterm/addon-web-links": "^0.10.0",
|
"@xterm/addon-web-links": "^0.10.0",
|
||||||
|
@@ -13,12 +13,4 @@ export abstract class LinkHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract handle (uri: string, tab?: BaseTerminalTabComponent<any>): void
|
abstract handle (uri: string, tab?: BaseTerminalTabComponent<any>): void
|
||||||
|
|
||||||
private _fullMatchRegex: RegExp | null = null
|
|
||||||
get fullMatchRegex (): RegExp {
|
|
||||||
if (!this._fullMatchRegex) {
|
|
||||||
this._fullMatchRegex = new RegExp(`^${this.regex.source}$`)
|
|
||||||
}
|
|
||||||
return this._fullMatchRegex
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,7 @@ export class LinkHighlighterDecorator extends TerminalDecorator {
|
|||||||
|
|
||||||
const openLink = async uri => {
|
const openLink = async uri => {
|
||||||
for (const handler of this.handlers) {
|
for (const handler of this.handlers) {
|
||||||
if (!handler.fullMatchRegex.test(uri)) {
|
if (!handler.regex.test(uri)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (!await handler.verify(await handler.convert(uri, tab), tab)) {
|
if (!await handler.verify(await handler.convert(uri, tab), tab)) {
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"ansi-colors": "^4.1.1",
|
"ansi-colors": "^4.1.1",
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/semver": "^7.1.0",
|
"@types/semver": "^7.1.0",
|
||||||
|
@@ -100,7 +100,6 @@ export class PluginsSettingsTabComponent {
|
|||||||
this.busy.delete(plugin.name)
|
this.busy.delete(plugin.name)
|
||||||
this.config.requestRestart()
|
this.config.requestRestart()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error installing plugin', plugin.name, err)
|
|
||||||
this.erroredPlugin = plugin.name
|
this.erroredPlugin = plugin.name
|
||||||
this.errorMessage = err
|
this.errorMessage = err
|
||||||
this.busy.delete(plugin.name)
|
this.busy.delete(plugin.name)
|
||||||
@@ -115,7 +114,6 @@ export class PluginsSettingsTabComponent {
|
|||||||
this.busy.delete(plugin.name)
|
this.busy.delete(plugin.name)
|
||||||
this.config.requestRestart()
|
this.config.requestRestart()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Error uninstalling plugin', plugin.name, err)
|
|
||||||
this.erroredPlugin = plugin.name
|
this.erroredPlugin = plugin.name
|
||||||
this.errorMessage = err
|
this.errorMessage = err
|
||||||
this.busy.delete(plugin.name)
|
this.busy.delete(plugin.name)
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "14.14.14",
|
"@types/node": "14.14.14",
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/marked": "^5.0.1",
|
"@types/marked": "^5.0.1",
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "20.3.1",
|
"@types/node": "20.3.1",
|
||||||
|
@@ -6,7 +6,6 @@ export const supportedAlgorithms = {
|
|||||||
[SSHAlgorithmType.HOSTKEY]: russh.getSupportedKeyTypes().filter(x => x !== 'none'),
|
[SSHAlgorithmType.HOSTKEY]: russh.getSupportedKeyTypes().filter(x => x !== 'none'),
|
||||||
[SSHAlgorithmType.CIPHER]: russh.getSupportedCiphers().filter(x => x !== 'clear'),
|
[SSHAlgorithmType.CIPHER]: russh.getSupportedCiphers().filter(x => x !== 'clear'),
|
||||||
[SSHAlgorithmType.HMAC]: russh.getSupportedMACs().filter(x => x !== 'none'),
|
[SSHAlgorithmType.HMAC]: russh.getSupportedMACs().filter(x => x !== 'none'),
|
||||||
[SSHAlgorithmType.COMPRESSION]: russh.getSupportedCompressionAlgorithms().reverse(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultAlgorithms = {
|
export const defaultAlgorithms = {
|
||||||
@@ -43,9 +42,4 @@ export const defaultAlgorithms = {
|
|||||||
'hmac-sha1-etm@openssh.com',
|
'hmac-sha1-etm@openssh.com',
|
||||||
'hmac-sha1',
|
'hmac-sha1',
|
||||||
],
|
],
|
||||||
[SSHAlgorithmType.COMPRESSION]: [
|
|
||||||
'zlib@openssh.com',
|
|
||||||
'zlib',
|
|
||||||
'none',
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
@@ -5,8 +5,6 @@ export enum SSHAlgorithmType {
|
|||||||
KEX = 'kex',
|
KEX = 'kex',
|
||||||
CIPHER = 'cipher',
|
CIPHER = 'cipher',
|
||||||
HOSTKEY = 'serverHostKey',
|
HOSTKEY = 'serverHostKey',
|
||||||
COMPRESSION = 'compression',
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SSHProfile extends ConnectableTerminalProfile {
|
export interface SSHProfile extends ConnectableTerminalProfile {
|
||||||
|
@@ -285,13 +285,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
|
|||||||
.w-75
|
.w-75
|
||||||
div(*ngFor='let alg of supportedAlgorithms.serverHostKey')
|
div(*ngFor='let alg of supportedAlgorithms.serverHostKey')
|
||||||
checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]')
|
checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]')
|
||||||
|
|
||||||
.form-line.align-items-start
|
|
||||||
.header
|
|
||||||
.title Compression
|
|
||||||
.w-75
|
|
||||||
div(*ngFor='let alg of supportedAlgorithms.compression')
|
|
||||||
checkbox([text]='alg', [(ngModel)]='algorithms.compression[alg]')
|
|
||||||
li(ngbNavItem)
|
li(ngbNavItem)
|
||||||
a(ngbNavLink, translate) Colors
|
a(ngbNavLink, translate) Colors
|
||||||
ng-template(ngbNavContent)
|
ng-template(ngbNavContent)
|
||||||
|
@@ -107,7 +107,7 @@ export class SSHProfileSettingsComponent {
|
|||||||
this.profile.options.algorithms![k] = Object.entries(this.algorithms[k])
|
this.profile.options.algorithms![k] = Object.entries(this.algorithms[k])
|
||||||
.filter(([_, v]) => !!v)
|
.filter(([_, v]) => !!v)
|
||||||
.map(([key, _]) => key)
|
.map(([key, _]) => key)
|
||||||
if(k !== SSHAlgorithmType.COMPRESSION) { this.profile.options.algorithms![k].sort() }
|
this.profile.options.algorithms![k].sort()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.connectionMode !== 'jumpHost') {
|
if (this.connectionMode !== 'jumpHost') {
|
||||||
|
@@ -179,7 +179,6 @@ export class SSHTabComponent extends ConnectableTerminalTabComponent<SSHProfile>
|
|||||||
try {
|
try {
|
||||||
await this.initializeSessionMaybeMultiplex(false)
|
await this.initializeSessionMaybeMultiplex(false)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('SSH session initialization failed', e)
|
|
||||||
this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n')
|
this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@@ -66,5 +66,4 @@ export default class SSHModule { }
|
|||||||
|
|
||||||
export * from './api'
|
export * from './api'
|
||||||
export { SFTPFile, SFTPSession } from './session/sftp'
|
export { SFTPFile, SFTPSession } from './session/sftp'
|
||||||
export { SFTPPanelComponent, SSHTabComponent }
|
export { SFTPPanelComponent }
|
||||||
export { PasswordStorageService } from './services/passwordStorage.service'
|
|
||||||
|
@@ -55,7 +55,7 @@ export class SSHProfilesService extends QuickConnectProfileProvider<SSHProfile>
|
|||||||
super()
|
super()
|
||||||
for (const k of Object.values(SSHAlgorithmType)) {
|
for (const k of Object.values(SSHAlgorithmType)) {
|
||||||
this.configDefaults.options.algorithms[k] = [...defaultAlgorithms[k]]
|
this.configDefaults.options.algorithms[k] = [...defaultAlgorithms[k]]
|
||||||
if (k !== SSHAlgorithmType.COMPRESSION) { this.configDefaults.options.algorithms[k].sort() }
|
this.configDefaults.options.algorithms[k].sort()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -315,7 +315,6 @@ export class SSHSession {
|
|||||||
kex: this.profile.options.algorithms?.[SSHAlgorithmType.KEX]?.filter(x => supportedAlgorithms[SSHAlgorithmType.KEX].includes(x)),
|
kex: this.profile.options.algorithms?.[SSHAlgorithmType.KEX]?.filter(x => supportedAlgorithms[SSHAlgorithmType.KEX].includes(x)),
|
||||||
mac: this.profile.options.algorithms?.[SSHAlgorithmType.HMAC]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HMAC].includes(x)),
|
mac: this.profile.options.algorithms?.[SSHAlgorithmType.HMAC]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HMAC].includes(x)),
|
||||||
key: this.profile.options.algorithms?.[SSHAlgorithmType.HOSTKEY]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HOSTKEY].includes(x)),
|
key: this.profile.options.algorithms?.[SSHAlgorithmType.HOSTKEY]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HOSTKEY].includes(x)),
|
||||||
compression: this.profile.options.algorithms?.[SSHAlgorithmType.COMPRESSION]?.filter(x => supportedAlgorithms[SSHAlgorithmType.COMPRESSION].includes(x)),
|
|
||||||
},
|
},
|
||||||
keepaliveIntervalSeconds: Math.round((this.profile.options.keepaliveInterval ?? 15000) / 1000),
|
keepaliveIntervalSeconds: Math.round((this.profile.options.keepaliveInterval ?? 15000) / 1000),
|
||||||
keepaliveCountMax: this.profile.options.keepaliveCountMax,
|
keepaliveCountMax: this.profile.options.keepaliveCountMax,
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"ansi-colors": "^4.1.1",
|
"ansi-colors": "^4.1.1",
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@xterm/addon-canvas": "^0.6.0",
|
"@xterm/addon-canvas": "^0.6.0",
|
||||||
|
@@ -17,8 +17,6 @@ import { getTerminalBackgroundColor } from '../helpers'
|
|||||||
|
|
||||||
|
|
||||||
const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30
|
const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30
|
||||||
const OSC_FOCUS_IN = Buffer.from('\x1b[I')
|
|
||||||
const OSC_FOCUS_OUT = Buffer.from('\x1b[O')
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to base your custom terminal tabs on
|
* A class to base your custom terminal tabs on
|
||||||
@@ -496,7 +494,7 @@ export class BaseTerminalTabComponent<P extends BaseTerminalProfile> extends Bas
|
|||||||
data = Buffer.from(data, 'utf-8')
|
data = Buffer.from(data, 'utf-8')
|
||||||
}
|
}
|
||||||
this.session?.feedFromTerminal(data)
|
this.session?.feedFromTerminal(data)
|
||||||
if (this.config.store.terminal.scrollOnInput && !data.equals(OSC_FOCUS_IN) && !data.equals(OSC_FOCUS_OUT)) {
|
if (this.config.store.terminal.scrollOnInput) {
|
||||||
this.frontend?.scrollToBottom()
|
this.frontend?.scrollToBottom()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -544,7 +542,7 @@ export class BaseTerminalTabComponent<P extends BaseTerminalProfile> extends Bas
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!this.alternateScreenActive) {
|
if (!this.alternateScreenActive) {
|
||||||
if ((data.includes('\r') || data.includes('\n')) && this.config.store.terminal.warnOnMultilinePaste) {
|
if (data.includes('\r') && this.config.store.terminal.warnOnMultilinePaste) {
|
||||||
const buttons = [
|
const buttons = [
|
||||||
this.translate.instant('Paste'),
|
this.translate.instant('Paste'),
|
||||||
this.translate.instant('Cancel'),
|
this.translate.instant('Cancel'),
|
||||||
|
@@ -16,14 +16,14 @@
|
|||||||
ng-container(*ngIf='state.resultCount > 0')
|
ng-container(*ngIf='state.resultCount > 0')
|
||||||
button.btn.btn-link(
|
button.btn.btn-link(
|
||||||
(click)='findPrevious()',
|
(click)='findPrevious()',
|
||||||
[ngbTooltip]='"Search up"|translate',
|
ngbTooltip='Search up',
|
||||||
placement='bottom',
|
placement='bottom',
|
||||||
[fastHtmlBind]='icons.arrowUp'
|
[fastHtmlBind]='icons.arrowUp'
|
||||||
)
|
)
|
||||||
|
|
||||||
button.btn.btn-link(
|
button.btn.btn-link(
|
||||||
(click)='findNext()',
|
(click)='findNext()',
|
||||||
[ngbTooltip]='"Search down"|translate',
|
ngbTooltip='Search down',
|
||||||
placement='bottom',
|
placement='bottom',
|
||||||
[fastHtmlBind]='icons.arrowDown'
|
[fastHtmlBind]='icons.arrowDown'
|
||||||
)
|
)
|
||||||
@@ -34,7 +34,7 @@ button.btn(
|
|||||||
(click)='options.caseSensitive = !options.caseSensitive; saveSearchOptions()',
|
(click)='options.caseSensitive = !options.caseSensitive; saveSearchOptions()',
|
||||||
[class.btn-link]='!options.caseSensitive',
|
[class.btn-link]='!options.caseSensitive',
|
||||||
[class.btn-info]='options.caseSensitive',
|
[class.btn-info]='options.caseSensitive',
|
||||||
[ngbTooltip]='"Case sensitivity"|translate',
|
ngbTooltip='Case sensitivity',
|
||||||
placement='bottom',
|
placement='bottom',
|
||||||
[fastHtmlBind]='icons.case'
|
[fastHtmlBind]='icons.case'
|
||||||
)
|
)
|
||||||
@@ -43,7 +43,7 @@ button.btn(
|
|||||||
(click)='options.regex = !options.regex; saveSearchOptions()',
|
(click)='options.regex = !options.regex; saveSearchOptions()',
|
||||||
[class.btn-link]='!options.regex',
|
[class.btn-link]='!options.regex',
|
||||||
[class.btn-info]='options.regex',
|
[class.btn-info]='options.regex',
|
||||||
[ngbTooltip]='"Regular expression"|translate',
|
ngbTooltip='Regular expression',
|
||||||
placement='bottom',
|
placement='bottom',
|
||||||
[fastHtmlBind]='icons.regexp'
|
[fastHtmlBind]='icons.regexp'
|
||||||
)
|
)
|
||||||
@@ -52,7 +52,7 @@ button.btn(
|
|||||||
(click)='options.wholeWord = !options.wholeWord; saveSearchOptions()',
|
(click)='options.wholeWord = !options.wholeWord; saveSearchOptions()',
|
||||||
[class.btn-link]='!options.wholeWord',
|
[class.btn-link]='!options.wholeWord',
|
||||||
[class.btn-info]='options.wholeWord',
|
[class.btn-info]='options.wholeWord',
|
||||||
[ngbTooltip]='"Whole word"|translate',
|
ngbTooltip='Whole word',
|
||||||
placement='bottom',
|
placement='bottom',
|
||||||
[fastHtmlBind]='icons.wholeWord'
|
[fastHtmlBind]='icons.wholeWord'
|
||||||
)
|
)
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
"data",
|
"data",
|
||||||
"dist"
|
"dist"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/webpack-env": "^1.16.0"
|
"@types/webpack-env": "^1.16.0"
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"typings"
|
"typings"
|
||||||
],
|
],
|
||||||
"author": "Tabby Developers",
|
"author": "Eugene Pankov",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/core": "^15"
|
"@angular/core": "^15"
|
||||||
|
Reference in New Issue
Block a user