diff --git a/ui/desktop/app/components/session/tabs/index.js b/ui/desktop/app/components/session/tabs/index.js index 7ef617fbc..c1334a728 100644 --- a/ui/desktop/app/components/session/tabs/index.js +++ b/ui/desktop/app/components/session/tabs/index.js @@ -66,17 +66,17 @@ export default class SessionTerminalTabsComponent extends Component { this.id = uuidv4(); this.#setupTerminal(fitAddon, xterm, termContainer); - const { isWindows } = await this.ipc.invoke('checkOS'); + const isSSHCommandAvailable = await this.ipc.invoke('checkCommand', 'ssh'); const { model } = this.args; const { proxy_address, proxy_port, started_desktop_client, target } = model; - // Only send the command on certain scenarios: + // Only send the command in certain scenarios: // 1. Only for SSH targets - // 2. Don't connect for windows as most users won't have an openSSH client installed - // 3. Don't connect if the session wasn't initiated in the desktop client + // 2. Don't connect if the session wasn't initiated in the desktop client // which means we won't have proxy information - if (target?.isSSH && started_desktop_client && !isWindows) { + // 3. Only connect if the user has an SSH client available in their path + if (target?.isSSH && started_desktop_client && isSSHCommandAvailable) { // Send an SSH command immediately window.terminal.send( `ssh ${proxy_address} -p ${proxy_port} -o NoHostAuthenticationForLocalhost=yes\r`, diff --git a/ui/desktop/electron-app/package.json b/ui/desktop/electron-app/package.json index 34575e6c0..d62f7daed 100644 --- a/ui/desktop/electron-app/package.json +++ b/ui/desktop/electron-app/package.json @@ -30,7 +30,8 @@ "semver": "^7.5.3", "shell-env": "^3.0.1", "shell-quote": "^1.7.3", - "tree-kill": "^1.2.2" + "tree-kill": "^1.2.2", + "which": "^4.0.0" }, "devDependencies": { "@electron-forge/cli": "^6.1.1", diff --git a/ui/desktop/electron-app/src/ipc/handlers.js b/ui/desktop/electron-app/src/ipc/handlers.js index 68a729be2..943db257b 100644 --- a/ui/desktop/electron-app/src/ipc/handlers.js +++ b/ui/desktop/electron-app/src/ipc/handlers.js @@ -13,6 +13,7 @@ const sanitizer = require('../utils/sanitizer.js'); const { isLinux, isMac, isWindows } = require('../helpers/platform.js'); const os = require('node:os'); const pty = require('node-pty'); +const which = require('which'); /** * Returns the current runtime clusterUrl, which is used by the main thread to @@ -112,13 +113,9 @@ handle('toggleFullscreenWindow', () => { handle('closeWindow', () => app.quit()); /** - * Return an object containing helper fields for determining what OS we're running on + * Return the location of where a user's binary for a command is. If it isn't found, return null. */ -handle('checkOS', () => ({ - isLinux: isLinux(), - isMac: isMac(), - isWindows: isWindows(), -})); +handle('checkCommand', async (command) => which(command, { nothrow: true })); /** * Handler to help create terminal windows. We don't use the helper `handle` method diff --git a/ui/desktop/electron-app/yarn.lock b/ui/desktop/electron-app/yarn.lock index e14c6cdb5..9b7f3cf01 100644 --- a/ui/desktop/electron-app/yarn.lock +++ b/ui/desktop/electron-app/yarn.lock @@ -1962,6 +1962,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + jackspeak@^2.0.3: version "2.3.3" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.3.tgz#95e4cbcc03b3eb357bf6bcce14a903fb3d1151e1" @@ -3513,6 +3518,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"