From ee5516bb91b886cdcdf00ac60d5ecdc89e722833 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Fri, 20 Sep 2024 00:15:25 -0600 Subject: [PATCH] refactor(server): throw error when authentication fails --- .../dokploy/server/utils/process/execAsync.ts | 70 ++++++++++--------- .../server/utils/servers/setup-server.ts | 18 +++++ 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/apps/dokploy/server/utils/process/execAsync.ts b/apps/dokploy/server/utils/process/execAsync.ts index 87e278d6..1bd16449 100644 --- a/apps/dokploy/server/utils/process/execAsync.ts +++ b/apps/dokploy/server/utils/process/execAsync.ts @@ -24,41 +24,43 @@ export const execAsyncRemote = async ( conn .once("ready", () => { console.log("Client :: ready"); - conn - .exec(command, (err, stream) => { - if (err) throw err; - stream - .on("close", (code: number, signal: string) => { - console.log( - `Stream :: close :: code: ${code}, signal: ${signal}`, + conn.exec(command, (err, stream) => { + if (err) throw err; + stream + .on("close", (code: number, signal: string) => { + console.log( + `Stream :: close :: code: ${code}, signal: ${signal}`, + ); + conn.end(); + if (code === 0) { + resolve({ stdout, stderr }); + } else { + reject( + new Error( + `Command exited with code ${code}. Stderr: ${stderr}, command: ${command}`, + ), ); - conn.end(); - if (code === 0) { - resolve({ stdout, stderr }); - } else { - reject( - new Error( - `Command exited with code ${code}. Stderr: ${stderr}, command: ${command}`, - ), - ); - } - }) - .on("data", (data: string) => { - stdout += data.toString(); - }) - .stderr.on("data", (data) => { - stderr += data.toString(); - }); - }) - .on("keyboard-interactive", () => { - console.log("Warning: Keyboard interactive, closing connection"); - conn.end(); - reject( - new Error( - "Password requested. Invalid SSH key or authentication issue.", - ), - ); - }); + } + }) + .on("data", (data: string) => { + stdout += data.toString(); + }) + .stderr.on("data", (data) => { + stderr += data.toString(); + }); + }); + }) + .on("error", (err) => { + conn.end(); + if (err.level === "client-authentication") { + reject( + new Error( + `Authentication failed: Invalid SSH private key. ❌ Error: ${err.message} ${err.level}`, + ), + ); + } else { + reject(new Error(`SSH connection error: ${err.message}`)); + } }) .connect({ host: server.ipAddress, diff --git a/apps/dokploy/server/utils/servers/setup-server.ts b/apps/dokploy/server/utils/servers/setup-server.ts index 72d5c61a..6dfd517e 100644 --- a/apps/dokploy/server/utils/servers/setup-server.ts +++ b/apps/dokploy/server/utils/servers/setup-server.ts @@ -107,6 +107,24 @@ const connectToServer = async (serverId: string, logPath: string) => { }); }); }) + .on("error", (err) => { + client.end(); + if (err.level === "client-authentication") { + writeStream.write( + `Authentication failed: Invalid SSH private key. ❌ Error: ${err.message} ${err.level}`, + ); + reject( + new Error( + `Authentication failed: Invalid SSH private key. ❌ Error: ${err.message} ${err.level}`, + ), + ); + } else { + writeStream.write( + `SSH connection error: ${err.message} ${err.level}`, + ); + reject(new Error(`SSH connection error: ${err.message}`)); + } + }) .connect({ host: server.ipAddress, port: server.port,