Adding Comment at the end of the public_key on the host on deploy #440

Merged
SlimGary merged 4 commits from AddCredentialNameInComment into dev-1.10.0 2025-12-08 05:03:41 +00:00
4 changed files with 38 additions and 15 deletions

View File

@@ -1,8 +1,8 @@
cask "termix" do cask "termix" do
version "VERSION_PLACEHOLDER" version "1.9.0"
sha256 "CHECKSUM_PLACEHOLDER" sha256 "8fedd242b3cae1ebfd0c391a36f1c246a26ecac258b02478ee8dea2f33cd6d96"
url "https://github.com/Termix-SSH/Termix/releases/download/release-#{version}-tag/termix_macos_universal_#{version}_dmg.dmg" url "https://github.com/Termix-SSH/Termix/releases/download/release-#{version}-tag/termix_macos_universal_dmg.dmg"
name "Termix" name "Termix"
desc "Web-based server management platform with SSH terminal, tunneling, and file editing" desc "Web-based server management platform with SSH terminal, tunneling, and file editing"
homepage "https://github.com/Termix-SSH/Termix" homepage "https://github.com/Termix-SSH/Termix"

View File

@@ -80,16 +80,16 @@ Supported Devices:
- Windows (x64/ia32) - Windows (x64/ia32)
- Portable - Portable
- MSI Installer - MSI Installer
- Chocolatey Package Manager (coming soon) - Chocolatey Package Manager
- Linux (x64/ia32) - Linux (x64/ia32)
- Portable - Portable
- AppImage - AppImage
- Deb - Deb
- Flatpak (coming soon) - Flatpak
- macOS (x64/ia32 on v12.0+) - macOS (x64/ia32 on v12.0+)
- Apple App Store (coming soon) - Apple App Store
- DMG - DMG
- Homebrew (coming soon) - Homebrew
- iOS/iPadOS (v15.1+) - iOS/iPadOS (v15.1+)
- Apple App Store - Apple App Store
- ISO - ISO

View File

@@ -1,4 +1,7 @@
import type { AuthenticatedRequest } from "../../../types/index.js"; import type {
AuthenticatedRequest,
CredentialBackend,
} from "../../../types/index.js";
import express from "express"; import express from "express";
import { db } from "../db/index.js"; import { db } from "../db/index.js";
import { sshCredentials, sshCredentialUsage, sshData } from "../db/schema.js"; import { sshCredentials, sshCredentialUsage, sshData } from "../db/schema.js";
@@ -1124,10 +1127,9 @@ router.post(
async function deploySSHKeyToHost( async function deploySSHKeyToHost(
hostConfig: Record<string, unknown>, hostConfig: Record<string, unknown>,
publicKey: string, credData: CredentialBackend,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_credentialData: Record<string, unknown>,
): Promise<{ success: boolean; message?: string; error?: string }> { ): Promise<{ success: boolean; message?: string; error?: string }> {
const publicKey = credData.public_key as string;
return new Promise((resolve) => { return new Promise((resolve) => {
const conn = new Client(); const conn = new Client();
@@ -1248,7 +1250,7 @@ async function deploySSHKeyToHost(
.replace(/'/g, "'\\''"); .replace(/'/g, "'\\''");
conn.exec( conn.exec(
`printf '%s\\n' '${escapedKey}' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`, `printf '%s\\n' '${escapedKey} ${credData.name}@Termix' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys`,
(err, stream) => { (err, stream) => {
if (err) { if (err) {
clearTimeout(addTimeout); clearTimeout(addTimeout);
@@ -1510,7 +1512,7 @@ router.post(
}); });
} }
const credData = credential[0]; const credData = credential[0] as unknown as CredentialBackend;
if (credData.authType !== "key") { if (credData.authType !== "key") {
return res.status(400).json({ return res.status(400).json({
@@ -1519,7 +1521,7 @@ router.post(
}); });
} }
const publicKey = credData.public_key || credData.publicKey; const publicKey = credData.public_key;
if (!publicKey) { if (!publicKey) {
return res.status(400).json({ return res.status(400).json({
success: false, success: false,
@@ -1601,7 +1603,6 @@ router.post(
const deployResult = await deploySSHKeyToHost( const deployResult = await deploySSHKeyToHost(
hostConfig, hostConfig,
publicKey as string,
credData, credData,
); );

View File

@@ -119,6 +119,28 @@ export interface Credential {
updatedAt: string; updatedAt: string;
} }
export interface CredentialBackend {
id: number;
userId: string;
name: string;
description: string | null;
folder: string | null;
tags: string;
authType: "password" | "key";
username: string;
password: string | null;
key: string;
private_key?: string;
public_key?: string;
key_password: string | null;
keyType?: string;
detectedKeyType: string;
usageCount: number;
lastUsed: string | null;
createdAt: string;
updatedAt: string;
}
export interface CredentialData { export interface CredentialData {
name: string; name: string;
description?: string; description?: string;