From 8d52bef631b1343de52fee7b40960b3fe62d1a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nunzio=20Marf=C3=A8?= Date: Fri, 5 Dec 2025 18:08:33 +0100 Subject: [PATCH] Feature Sudo password auto-fill; --- src/constants/terminal-themes.ts | 1 + src/locales/de/translation.json | 12 +- src/locales/en/translation.json | 12 +- src/locales/fr/translation.json | 12 +- src/locales/pt-BR/translation.json | 13 +- src/locales/ru/translation.json | 12 +- src/locales/zh/translation.json | 12 +- src/types/index.ts | 15 +- .../apps/host-manager/HostManagerEditor.tsx | 26 +- .../apps/terminal/SudoPasswordPopup.tsx | 82 + src/ui/desktop/apps/terminal/Terminal.tsx | 2810 +++++++++-------- 11 files changed, 1585 insertions(+), 1422 deletions(-) create mode 100644 src/ui/desktop/apps/terminal/SudoPasswordPopup.tsx diff --git a/src/constants/terminal-themes.ts b/src/constants/terminal-themes.ts index 63f55055..393188f8 100644 --- a/src/constants/terminal-themes.ts +++ b/src/constants/terminal-themes.ts @@ -705,6 +705,7 @@ export const DEFAULT_TERMINAL_CONFIG = { startupSnippetId: null as number | null, autoMosh: false, moshCommand: "mosh-server new -s -l LANG=en_US.UTF-8", + sudoPasswordAutoFill: false, }; export type TerminalConfigType = typeof DEFAULT_TERMINAL_CONFIG; diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json index c6cdb3fa..54982342 100644 --- a/src/locales/de/translation.json +++ b/src/locales/de/translation.json @@ -799,7 +799,9 @@ "searchServers": "Server durchsuchen...", "noServerFound": "Kein Server gefunden", "jumpHostsOrder": "Verbindungen werden in dieser Reihenfolge hergestellt: Jump-Host 1 → Jump-Host 2 → ... → Ziel-Server", - "advancedAuthSettings": "Erweiterte Authentifizierungseinstellungen" + "advancedAuthSettings": "Erweiterte Authentifizierungseinstellungen", + "sudoPasswordAutoFill": "Sudo-Passwort automatisch ausfüllen", + "sudoPasswordAutoFillDesc": "Popup anzeigen, um das Passwort bei sudo-Befehlen automatisch einzufügen" }, "terminal": { "title": "Terminal", @@ -833,7 +835,11 @@ "connectionTimeout": "Zeitüberschreitung der Verbindung", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}} : {{path}}", - "runTitle": "Ausführen von {{command}} – {{host}}" + "runTitle": "Ausführen von {{command}} – {{host}}", + "sudoPasswordPopupTitle": "Passwort einfügen?", + "sudoPasswordPopupHint": "Drücken Sie Enter zum Einfügen, Esc zum Abbrechen", + "sudoPasswordPopupConfirm": "Einfügen", + "sudoPasswordPopupDismiss": "Abbrechen" }, "fileManager": { "title": "Dateimanager", @@ -1635,4 +1641,4 @@ "close": "Schließen", "hostManager": "Host-Manager" } -} +} \ No newline at end of file diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 60e2ec3a..c21d4a16 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -908,7 +908,9 @@ "quickActionName": "Action name", "noSnippetFound": "No snippet found", "quickActionsOrder": "Quick action buttons will appear in the order listed above on the Server Stats page", - "advancedAuthSettings": "Advanced Authentication Settings" + "advancedAuthSettings": "Advanced Authentication Settings", + "sudoPasswordAutoFill": "Sudo Password Auto-Fill", + "sudoPasswordAutoFillDesc": "Automatically offer to insert SSH password when sudo prompts for password" }, "terminal": { "title": "Terminal", @@ -946,7 +948,11 @@ "totpRequired": "Two-Factor Authentication Required", "totpCodeLabel": "Verification Code", "totpPlaceholder": "000000", - "totpVerify": "Verify" + "totpVerify": "Verify", + "sudoPasswordPopupTitle": "Insert Password?", + "sudoPasswordPopupHint": "Press Enter to insert, Esc to dismiss", + "sudoPasswordPopupConfirm": "Insert", + "sudoPasswordPopupDismiss": "Dismiss" }, "fileManager": { "title": "File Manager", @@ -1825,4 +1831,4 @@ "close": "Close", "hostManager": "Host Manager" } -} +} \ No newline at end of file diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index 7f111fb8..33370499 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -790,7 +790,9 @@ "searchServers": "Rechercher des serveurs...", "noServerFound": "Aucun serveur trouvé", "jumpHostsOrder": "Les connexions seront établies dans l'ordre : Serveur de rebond 1 → Serveur de rebond 2 → ... → Serveur cible", - "advancedAuthSettings": "Paramètres d'authentification avancés" + "advancedAuthSettings": "Paramètres d'authentification avancés", + "sudoPasswordAutoFill": "Remplissage automatique du mot de passe sudo", + "sudoPasswordAutoFillDesc": "Proposer automatiquement d’insérer le mot de passe SSH lorsque sudo demande un mot de passe" }, "terminal": { "title": "Terminal", @@ -828,7 +830,11 @@ "totpRequired": "Authentification à deux facteurs requise", "totpCodeLabel": "Code de vérification", "totpPlaceholder": "000000", - "totpVerify": "Vérifier" + "totpVerify": "Vérifier", + "sudoPasswordPopupTitle": "Insérer le mot de passe ?", + "sudoPasswordPopupHint": "Appuyez sur Entrée pour insérer, Échap pour annuler", + "sudoPasswordPopupConfirm": "Insérer", + "sudoPasswordPopupDismiss": "Annuler" }, "fileManager": { "title": "Gestionnaire de fichiers", @@ -1606,4 +1612,4 @@ "ram": "Mémoire (RAM)", "notAvailable": "N/D" } -} +} \ No newline at end of file diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index 9e9350e3..fd008b73 100644 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -745,7 +745,9 @@ "searchServers": "Pesquisar servidores...", "noServerFound": "Nenhum servidor encontrado", "jumpHostsOrder": "As conexões serão feitas na ordem: Host de Salto 1 → Host de Salto 2 → ... → Servidor de Destino", - "advancedAuthSettings": "Configurações Avançadas de Autenticação" + "advancedAuthSettings": "Configurações Avançadas de Autenticação", + "sudoPasswordAutoFill": "Preenchimento automático da senha do sudo", + "sudoPasswordAutoFillDesc": "Oferecer automaticamente inserir a senha SSH quando o sudo solicitar uma senha" }, "terminal": { "title": "Terminal", @@ -779,7 +781,11 @@ "connectionTimeout": "Tempo limite de conexão esgotado", "terminalTitle": "Terminal - {{host}}", "terminalWithPath": "Terminal - {{host}}:{{path}}", - "runTitle": "Executando {{command}} - {{host}}" + "runTitle": "Executando {{command}} - {{host}}", + "sudoPasswordPopupTitle": "Inserir Senha?", + "sudoPasswordPopupHint": "Pressione Enter para inserir, Esc para cancelar", + "sudoPasswordPopupConfirm": "Inserir", + "sudoPasswordPopupDismiss": "Cancelar" }, "fileManager": { "title": "Gerenciador de Arquivos", @@ -1034,7 +1040,6 @@ "fileSavedSuccessfully": "Arquivo salvo com sucesso", "autoSaveFailed": "Falha no salvamento automático", "fileAutoSaved": "Arquivo salvo automaticamente", - "moveFileFailed": "Falha ao mover {{name}}", "moveOperationFailed": "Falha na operação de mover", "canOnlyCompareFiles": "Só é possível comparar dois arquivos", @@ -1528,4 +1533,4 @@ "viewMobileAppDocs": "Instalar Aplicativo Móvel", "mobileAppDocumentation": "Documentação do Aplicativo Móvel" } -} +} \ No newline at end of file diff --git a/src/locales/ru/translation.json b/src/locales/ru/translation.json index 0f523deb..68b3deae 100644 --- a/src/locales/ru/translation.json +++ b/src/locales/ru/translation.json @@ -858,7 +858,9 @@ "searchServers": "Поиск серверов...", "noServerFound": "Сервер не найден", "jumpHostsOrder": "Подключения будут выполнены в порядке: Промежуточный хост 1 → Промежуточный хост 2 → ... → Целевой сервер", - "advancedAuthSettings": "Расширенные настройки аутентификации" + "advancedAuthSettings": "Расширенные настройки аутентификации", + "sudoPasswordAutoFill": "Автозаполнение пароля sudo", + "sudoPasswordAutoFillDesc": "Показывать всплывающее окно для автоматического ввода пароля при выполнении команд sudo", }, "terminal": { "title": "Терминал", @@ -896,7 +898,11 @@ "totpRequired": "Требуется двухфакторная аутентификация", "totpCodeLabel": "Код проверки", "totpPlaceholder": "000000", - "totpVerify": "Проверить" + "totpVerify": "Проверить", + "sudoPasswordPopupTitle": "Вставить пароль?", + "sudoPasswordPopupHint": "Нажмите Enter для вставки, Esc для отмены", + "sudoPasswordPopupConfirm": "Вставить", + "sudoPasswordPopupDismiss": "Отмена" }, "fileManager": { "title": "Файловый менеджер", @@ -1722,4 +1728,4 @@ "close": "Закрыть", "hostManager": "Менеджер хостов" } -} +} \ No newline at end of file diff --git a/src/locales/zh/translation.json b/src/locales/zh/translation.json index 3b15347d..73bb39e1 100644 --- a/src/locales/zh/translation.json +++ b/src/locales/zh/translation.json @@ -893,7 +893,9 @@ "searchServers": "搜索服务器...", "noServerFound": "未找到服务器", "jumpHostsOrder": "连接将按顺序进行:跳板主机 1 → 跳板主机 2 → ... → 目标服务器", - "advancedAuthSettings": "高级身份验证设置" + "advancedAuthSettings": "高级身份验证设置", + "sudoPasswordAutoFill": "Sudo 密码自动填充", + "sudoPasswordAutoFillDesc": "在 sudo 命令时显示弹窗以自动输入密码" }, "terminal": { "title": "终端", @@ -931,7 +933,11 @@ "reconnecting": "重新连接中... ({{attempt}}/{{max}})", "reconnected": "重新连接成功", "maxReconnectAttemptsReached": "已达到最大重连尝试次数", - "connectionTimeout": "连接超时" + "connectionTimeout": "连接超时", + "sudoPasswordPopupTitle": "插入密码?", + "sudoPasswordPopupHint": "按 Enter 插入,Esc 取消", + "sudoPasswordPopupConfirm": "插入", + "sudoPasswordPopupDismiss": "取消" }, "fileManager": { "title": "文件管理器", @@ -1686,4 +1692,4 @@ "close": "关闭", "hostManager": "主机管理器" } -} +} \ No newline at end of file diff --git a/src/types/index.ts b/src/types/index.ts index 7adc1ab6..9f91df14 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -307,6 +307,7 @@ export interface TerminalConfig { startupSnippetId: number | null; autoMosh: boolean; moshCommand: string; + sudoPasswordAutoFill: boolean; } // ============================================================================ @@ -316,13 +317,13 @@ export interface TerminalConfig { export interface TabContextTab { id: number; type: - | "home" - | "terminal" - | "ssh_manager" - | "server" - | "admin" - | "file_manager" - | "user_profile"; + | "home" + | "terminal" + | "ssh_manager" + | "server" + | "admin" + | "file_manager" + | "user_profile"; title: string; hostConfig?: SSHHost; terminalRef?: any; diff --git a/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx b/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx index 552d0b23..c1d595d2 100644 --- a/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx +++ b/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx @@ -547,6 +547,7 @@ export function HostManagerEditor({ startupSnippetId: z.number().nullable(), autoMosh: z.boolean(), moshCommand: z.string(), + sudoPasswordAutoFill: z.boolean(), }) .optional(), forceKeyboardInteractive: z.boolean().optional(), @@ -631,7 +632,7 @@ export function HostManagerEditor({ type FormData = z.infer; const form = useForm({ - resolver: zodResolver(formSchema), + resolver: zodResolver(formSchema) as any, defaultValues: { name: "", ip: "", @@ -2443,6 +2444,29 @@ export function HostManagerEditor({ /> )} + ( + +
+ + {t("hosts.sudoPasswordAutoFill")} + + + {t("hosts.sudoPasswordAutoFillDesc")} + +
+ + + +
+ )} + /> +