From 0ceb6336dd6fa94bd1fd57cfd7f25f2532e9f9ed Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Sun, 30 Mar 2025 07:14:33 +0800 Subject: [PATCH] Console Improvements (#767) --- .../terminal-socket-handler.ts | 17 +++++++++ backend/dockge-server.ts | 6 ++++ backend/terminal.ts | 22 +++--------- backend/util-server.ts | 1 + common/util-common.ts | 11 ------ frontend/src/components/Terminal.vue | 1 - frontend/src/mixins/socket.ts | 1 - frontend/src/pages/Console.vue | 36 ++++++++++--------- package-lock.json | 12 +++---- package.json | 2 +- 10 files changed, 56 insertions(+), 53 deletions(-) diff --git a/backend/agent-socket-handlers/terminal-socket-handler.ts b/backend/agent-socket-handlers/terminal-socket-handler.ts index 6367962..ab8fb5c 100644 --- a/backend/agent-socket-handlers/terminal-socket-handler.ts +++ b/backend/agent-socket-handlers/terminal-socket-handler.ts @@ -38,6 +38,11 @@ export class TerminalSocketHandler extends AgentSocketHandler { try { checkLogin(socket); + // Throw an error if console is not enabled + if (!server.config.enableConsole) { + throw new ValidationError("Console is not enabled."); + } + // TODO: Reset the name here, force one main terminal for now terminalName = "console"; @@ -66,6 +71,18 @@ export class TerminalSocketHandler extends AgentSocketHandler { } }); + // Check if MainTerminal is enabled + agentSocket.on("checkMainTerminal", async (callback) => { + try { + checkLogin(socket); + callbackResult({ + ok: server.config.enableConsole, + }, callback); + } catch (e) { + callbackError(e, callback); + } + }); + // Interactive Terminal for containers agentSocket.on("interactiveTerminal", async (stackName : unknown, serviceName : unknown, shell : unknown, callback) => { try { diff --git a/backend/dockge-server.ts b/backend/dockge-server.ts index 8f734cc..730b69f 100644 --- a/backend/dockge-server.ts +++ b/backend/dockge-server.ts @@ -136,6 +136,11 @@ export class DockgeServer { stacksDir: { type: String, optional: true, + }, + enableConsole: { + type: Boolean, + optional: true, + defaultValue: false, } }); @@ -149,6 +154,7 @@ export class DockgeServer { this.config.hostname = args.hostname || process.env.DOCKGE_HOSTNAME || undefined; this.config.dataDir = args.dataDir || process.env.DOCKGE_DATA_DIR || "./data/"; this.config.stacksDir = args.stacksDir || process.env.DOCKGE_STACKS_DIR || defaultStacksDir; + this.config.enableConsole = args.enableConsole || process.env.DOCKGE_ENABLE_CONSOLE === "true" || false; this.stacksDir = this.config.stacksDir; log.debug("server", this.config); diff --git a/backend/terminal.ts b/backend/terminal.ts index 4a5d6b2..36d26b3 100644 --- a/backend/terminal.ts +++ b/backend/terminal.ts @@ -4,7 +4,6 @@ import * as pty from "@homebridge/node-pty-prebuilt-multiarch"; import { LimitQueue } from "./utils/limit-queue"; import { DockgeSocket } from "./util-server"; import { - allowedCommandList, allowedRawKeys, PROGRESS_TERMINAL_ROWS, TERMINAL_COLS, TERMINAL_ROWS @@ -16,7 +15,6 @@ import { log } from "./log"; * Terminal for running commands, no user interaction */ export class Terminal { - protected static terminalMap : Map = new Map(); protected _ptyProcess? : pty.IPty; @@ -272,6 +270,11 @@ export class MainTerminal extends InteractiveTerminal { constructor(server : DockgeServer, name : string) { let shell; + // Throw an error if console is not enabled + if (!server.config.enableConsole) { + throw new Error("Console is not enabled."); + } + if (os.platform() === "win32") { if (commandExistsSync("pwsh.exe")) { shell = "pwsh.exe"; @@ -285,21 +288,6 @@ export class MainTerminal extends InteractiveTerminal { } public write(input : string) { - // For like Ctrl + C - if (allowedRawKeys.includes(input)) { - super.write(input); - return; - } - - // Check if the command is allowed - const cmdParts = input.split(" "); - const executable = cmdParts[0].trim(); - log.debug("console", "Executable: " + executable); - log.debug("console", "Executable length: " + executable.length); - - if (!allowedCommandList.includes(executable)) { - throw new Error("Command not allowed."); - } super.write(input); } } diff --git a/backend/util-server.ts b/backend/util-server.ts index 227ece0..de4aecd 100644 --- a/backend/util-server.ts +++ b/backend/util-server.ts @@ -30,6 +30,7 @@ export interface Arguments { hostname? : string; dataDir? : string; stacksDir? : string; + enableConsole? : boolean; } // Some config values are required diff --git a/common/util-common.ts b/common/util-common.ts index e067c28..cf141c9 100644 --- a/common/util-common.ts +++ b/common/util-common.ts @@ -107,17 +107,6 @@ export const COMBINED_TERMINAL_ROWS = 20; export const ERROR_TYPE_VALIDATION = 1; -export const allowedCommandList : string[] = [ - "docker", - "ls", - "cd", - "dir", -]; - -export const allowedRawKeys = [ - "\u0003", // Ctrl + C -]; - export const acceptedComposeFileNames = [ "compose.yaml", "docker-compose.yaml", diff --git a/frontend/src/components/Terminal.vue b/frontend/src/components/Terminal.vue index 0f26ecd..d912705 100644 --- a/frontend/src/components/Terminal.vue +++ b/frontend/src/components/Terminal.vue @@ -201,7 +201,6 @@ export default { } else { this.cursorPosition++; this.terminalInputBuffer += e.key; - console.log(this.terminalInputBuffer); this.terminal.write(e.key); } }); diff --git a/frontend/src/mixins/socket.ts b/frontend/src/mixins/socket.ts index a5fbb70..b789ff6 100644 --- a/frontend/src/mixins/socket.ts +++ b/frontend/src/mixins/socket.ts @@ -279,7 +279,6 @@ export default defineComponent({ }); socket.on("agentList", (res) => { - console.log(res); if (res.ok) { this.agentList = res.agentList; } diff --git a/frontend/src/pages/Console.vue b/frontend/src/pages/Console.vue index 7b566fc..25ddb18 100644 --- a/frontend/src/pages/Console.vue +++ b/frontend/src/pages/Console.vue @@ -1,35 +1,36 @@