feat: 🎸 Prevent automatically sending SSH command on windows (#1906)

✅ Closes: ICU-11109
This commit is contained in:
Zhihe Li committed 2023-09-22 18:58:14 -04:00
1 parent f3c72b0100
commit 2a8ebe88de
2 files changed
+28 -7

No files matched your search

@@ -1,5 +1,6 @@
import Component from '@glimmer/component';
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
import { Terminal } from 'xterm';
import { FitAddon } from 'xterm-addon-fit';
import { v4 as uuidv4 } from 'uuid';
@@ -10,6 +11,10 @@ const terminalOptions = {
};
export default class SessionTerminalTabsComponent extends Component {
// =services
@service ipc;
// =attributes
id;
@@ -19,7 +24,7 @@ export default class SessionTerminalTabsComponent extends Component {
// =actions
@action
openTerminal() {
async openTerminal() {
// Don't re-initialize the terminal if it's already been opened
if (this.terminal) {
return;
@@ -39,8 +44,11 @@ export default class SessionTerminalTabsComponent extends Component {
this.id = uuidv4();
this.#setupTerminal(fitAddon, xterm);
const { isWindows } = await this.ipc.invoke('checkOS');
const { model } = this.args;
if (model.target?.isSSH) {
// Don't send the command on windows as most users won't have an openSSH client installed
if (model.target?.isSSH && !isWindows) {
const { proxy_address, proxy_port } = model;
// Send an SSH command immediately
@@ -69,13 +77,14 @@ export default class SessionTerminalTabsComponent extends Component {
// Terminal is exposed by contextBridge within the preload script
window.terminal.create({ id: this.id, cols: xterm.cols, rows: xterm.rows });
xterm.onData((data) => window.terminal.send(data, this.id));
// Save the handler to cleanup the listener on the renderer process later
this.removeListener = window.terminal.receive((event, value) => {
xterm.write(value);
}, this.id);
// Handle resizing terminal windows. We debounce the resizing as we
// don't want to resize xterm and the pty process before the previous
// one has finished
// Handle resizing terminal windows. We debounce the resizing as we don't want
// to resize xterm and the pty process before the previous one has finished
const debouncedFit = debounce(() => {
fitAddon.fit();
}, 150);
+14 -2
View File
@@ -10,7 +10,7 @@ const boundaryCli = require('../cli/index.js');
const sessionManager = require('../services/session-manager.js');
const runtimeSettings = require('../services/runtime-settings.js');
const sanitizer = require('../utils/sanitizer.js');
const { isMac } = require('../helpers/platform.js');
const { isLinux, isMac, isWindows } = require('../helpers/platform.js');
const os = require('node:os');
const pty = require('node-pty');
@@ -111,6 +111,15 @@ handle('toggleFullscreenWindow', () => {
*/
handle('closeWindow', () => app.quit());
/**
* Return an object containing helper fields for determining what OS we're running on
*/
handle('checkOS', () => ({
isLinux: isLinux(),
isMac: isMac(),
isWindows: isWindows(),
}));
/**
* Handler to help create terminal windows. We don't use the helper `handle` method
* as we need access to the event and don't need to be using `ipcMain.handle`.
@@ -119,7 +128,9 @@ ipcMain.on('createTerminal', (event, payload) => {
const { id, cols, rows } = payload;
const { sender } = event;
const terminalShell =
os.platform() === 'win32' ? 'powershell.exe' : process.env.SHELL || '/bin/bash';
os.platform() === 'win32'
? 'powershell.exe'
: process.env.SHELL || '/bin/bash';
const ptyProcess = pty.spawn(terminalShell, [], {
name: 'xterm-color',
cols,
@@ -152,6 +163,7 @@ ipcMain.on('createTerminal', (event, payload) => {
ipcMain.once(removeChannel, () => {
// Just let the error bubble up since we can't do anything
try {
// TODO: Should we be killing entire process tree in windows with its pid?
ptyProcess.kill();
} finally {
// Remove listeners