From f25073091bb46a209d6875d12b2821d359fa3bd0 Mon Sep 17 00:00:00 2001 From: Alex Howells Date: Mon, 16 Mar 2026 03:42:29 -0700 Subject: [PATCH] fix(ui): add warning when SSH public key is empty in developer mode (#1280) The SSH public key field in Settings > Advanced has no indication that a key is required for SSH to work. Users enable developer mode, skip the key field, and then cannot connect via SSH. The existing helper text only mentions the default user is root. Add an amber warning below the SSH key field that appears when the field is empty: "A public key is required for SSH access. Without one, you will not be able to connect." Uses the same text-amber-600 style as the developer mode warning icon on the same page. The warning disappears once a key is entered. The save button remains enabled with an empty key so users can intentionally clear their key to revoke SSH access. Translations added for all 13 supported languages: da, de, en, es, fr, it, ja, nb, pt, ru, sv, zh, zh-tw. Fixes #1051 --- ui/localization/messages/da.json | 1 + ui/localization/messages/de.json | 1 + ui/localization/messages/en.json | 1 + ui/localization/messages/es.json | 1 + ui/localization/messages/fr.json | 1 + ui/localization/messages/it.json | 1 + ui/localization/messages/ja.json | 1 + ui/localization/messages/nb.json | 1 + ui/localization/messages/pt.json | 1 + ui/localization/messages/ru.json | 1 + ui/localization/messages/sv.json | 1 + ui/localization/messages/zh-tw.json | 1 + ui/localization/messages/zh.json | 1 + ui/src/routes/devices.$id.settings.advanced.tsx | 5 +++++ 14 files changed, 18 insertions(+) diff --git a/ui/localization/messages/da.json b/ui/localization/messages/da.json index b32e7a8a..b246477e 100644 --- a/ui/localization/messages/da.json +++ b/ui/localization/messages/da.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "Standard SSH-brugeren er", "advanced_ssh_public_key_label": "Offentlig SSH-nøgle", "advanced_ssh_public_key_placeholder": "Indtast din offentlige SSH-nøgle", + "advanced_ssh_key_required_warning": "En offentlig nøgle er påkrævet for SSH-adgang. Uden en vil du ikke kunne oprette forbindelse.", "advanced_success_loopback_disabled": "Kun loopback-tilstand er deaktiveret. Genstart din enhed for at anvende den.", "advanced_success_loopback_enabled": "Kun loopback-tilstand aktiveret. Genstart din enhed for at anvende den.", "advanced_success_reset_config": "Konfigurationen er nulstillet til standard", diff --git a/ui/localization/messages/de.json b/ui/localization/messages/de.json index 16f56683..4ba701cc 100644 --- a/ui/localization/messages/de.json +++ b/ui/localization/messages/de.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "Der Standard-SSH-Benutzer ist", "advanced_ssh_public_key_label": "Öffentlicher SSH-Schlüssel", "advanced_ssh_public_key_placeholder": "Geben Sie Ihren öffentlichen SSH-Schlüssel ein", + "advanced_ssh_key_required_warning": "Ein öffentlicher Schlüssel ist für den SSH-Zugang erforderlich. Ohne diesen können Sie keine Verbindung herstellen.", "advanced_success_loopback_disabled": "Nur-Loopback-Modus deaktiviert. Starten Sie Ihr Gerät neu, um die Funktion anzuwenden.", "advanced_success_loopback_enabled": "Nur-Loopback-Modus aktiviert. Starten Sie Ihr Gerät neu, um die Funktion anzuwenden.", "advanced_success_reset_config": "Konfiguration erfolgreich auf Standard zurückgesetzt", diff --git a/ui/localization/messages/en.json b/ui/localization/messages/en.json index 7645beeb..5dc6fa7a 100644 --- a/ui/localization/messages/en.json +++ b/ui/localization/messages/en.json @@ -95,6 +95,7 @@ "advanced_ssh_default_user": "The default SSH user is", "advanced_ssh_public_key_label": "SSH Public Key", "advanced_ssh_public_key_placeholder": "Enter your SSH public key", + "advanced_ssh_key_required_warning": "A public key is required for SSH access. Without one, you will not be able to connect.", "advanced_success_download_diagnostics": "Diagnostics downloaded successfully", "advanced_success_loopback_disabled": "Loopback-only mode disabled. Restart your device to apply.", "advanced_success_loopback_enabled": "Loopback-only mode enabled. Restart your device to apply.", diff --git a/ui/localization/messages/es.json b/ui/localization/messages/es.json index eb4c8d25..fddf7684 100644 --- a/ui/localization/messages/es.json +++ b/ui/localization/messages/es.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "El usuario SSH predeterminado es", "advanced_ssh_public_key_label": "Clave pública SSH", "advanced_ssh_public_key_placeholder": "Ingrese su clave pública SSH", + "advanced_ssh_key_required_warning": "Se requiere una clave pública para el acceso SSH. Sin ella, no podrá conectarse.", "advanced_success_loopback_disabled": "El modo de solo bucle invertido está deshabilitado. Reinicie el dispositivo para aplicarlo.", "advanced_success_loopback_enabled": "Modo de solo bucle invertido habilitado. Reinicie el dispositivo para aplicarlo.", "advanced_success_reset_config": "La configuración se restableció a los valores predeterminados correctamente", diff --git a/ui/localization/messages/fr.json b/ui/localization/messages/fr.json index a9a67c91..75a8b2f3 100644 --- a/ui/localization/messages/fr.json +++ b/ui/localization/messages/fr.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "L'utilisateur SSH par défaut est", "advanced_ssh_public_key_label": "Clé publique SSH", "advanced_ssh_public_key_placeholder": "Entrez votre clé publique SSH", + "advanced_ssh_key_required_warning": "Une clé publique est requise pour l'accès SSH. Sans celle-ci, vous ne pourrez pas vous connecter.", "advanced_success_loopback_disabled": "Mode de bouclage désactivé. Redémarrez votre appareil pour appliquer le mode de bouclage.", "advanced_success_loopback_enabled": "Mode de bouclage activé. Redémarrez votre appareil pour appliquer la fonction.", "advanced_success_reset_config": "La configuration par défaut a été réinitialisée avec succès", diff --git a/ui/localization/messages/it.json b/ui/localization/messages/it.json index d5460edf..dda7b5bc 100644 --- a/ui/localization/messages/it.json +++ b/ui/localization/messages/it.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "L'utente SSH predefinito è", "advanced_ssh_public_key_label": "Chiave pubblica SSH", "advanced_ssh_public_key_placeholder": "Inserisci la tua chiave pubblica SSH", + "advanced_ssh_key_required_warning": "Una chiave pubblica è necessaria per l'accesso SSH. Senza di essa, non sarà possibile connettersi.", "advanced_success_loopback_disabled": "Modalità loopback-only disattivata. Riavvia il dispositivo per applicare la modifica.", "advanced_success_loopback_enabled": "Modalità loopback abilitata. Riavvia il dispositivo per applicare la modifica.", "advanced_success_reset_config": "Configurazione ripristinata ai valori predefiniti con successo", diff --git a/ui/localization/messages/ja.json b/ui/localization/messages/ja.json index 2ccf5bb0..05f4410d 100644 --- a/ui/localization/messages/ja.json +++ b/ui/localization/messages/ja.json @@ -95,6 +95,7 @@ "advanced_ssh_default_user": "デフォルトのSSHユーザーは", "advanced_ssh_public_key_label": "SSH公開鍵", "advanced_ssh_public_key_placeholder": "SSH公開鍵を入力してください", + "advanced_ssh_key_required_warning": "SSHアクセスには公開鍵が必要です。公開鍵がないと接続できません。", "advanced_success_download_diagnostics": "診断データが正常にダウンロードされました", "advanced_success_loopback_disabled": "ループバック専用モードが無効になりました。適用するにはデバイスを再起動してください。", "advanced_success_loopback_enabled": "ループバック専用モードが有効になりました。適用するにはデバイスを再起動してください。", diff --git a/ui/localization/messages/nb.json b/ui/localization/messages/nb.json index 16345fc3..f676e805 100644 --- a/ui/localization/messages/nb.json +++ b/ui/localization/messages/nb.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "Standard SSH-brukeren er", "advanced_ssh_public_key_label": "SSH offentlig nøkkel", "advanced_ssh_public_key_placeholder": "Skriv inn din offentlige SSH-nøkkel", + "advanced_ssh_key_required_warning": "En offentlig nøkkel er påkrevd for SSH-tilgang. Uten en vil du ikke kunne koble til.", "advanced_success_loopback_disabled": "Kun tilbakekoblingsmodus deaktivert. Start enheten på nytt for å bruke den.", "advanced_success_loopback_enabled": "Kun tilbakekoblingsmodus aktivert. Start enheten på nytt for å bruke den.", "advanced_success_reset_config": "Konfigurasjonen ble tilbakestilt til standard", diff --git a/ui/localization/messages/pt.json b/ui/localization/messages/pt.json index ea3f6ef0..9efd1724 100644 --- a/ui/localization/messages/pt.json +++ b/ui/localization/messages/pt.json @@ -95,6 +95,7 @@ "advanced_ssh_default_user": "O usuário SSH padrão é", "advanced_ssh_public_key_label": "Chave Pública SSH", "advanced_ssh_public_key_placeholder": "Digite sua chave pública SSH", + "advanced_ssh_key_required_warning": "Uma chave pública é necessária para acesso SSH. Sem ela, você não conseguirá se conectar.", "advanced_success_download_diagnostics": "Diagnósticos baixados com sucesso", "advanced_success_loopback_disabled": "Modo somente loopback desativado. Reinicie seu dispositivo para aplicar.", "advanced_success_loopback_enabled": "Modo somente loopback ativado. Reinicie seu dispositivo para aplicar.", diff --git a/ui/localization/messages/ru.json b/ui/localization/messages/ru.json index 597d9535..1148cacd 100644 --- a/ui/localization/messages/ru.json +++ b/ui/localization/messages/ru.json @@ -95,6 +95,7 @@ "advanced_ssh_default_user": "Пользователь по умолчанию для SSH:", "advanced_ssh_public_key_label": "Публичный SSH-ключ", "advanced_ssh_public_key_placeholder": "Введите ваш публичный SSH-ключ", + "advanced_ssh_key_required_warning": "Для SSH-доступа необходим публичный ключ. Без него подключение будет невозможно.", "advanced_success_download_diagnostics": "Диагностика успешно скачана", "advanced_success_loopback_disabled": "Режим только loopback отключён. Перезапустите устройство для применения.", "advanced_success_loopback_enabled": "Режим только loopback включён. Перезапустите устройство для применения.", diff --git a/ui/localization/messages/sv.json b/ui/localization/messages/sv.json index 8a0d2ace..aafc2a1d 100644 --- a/ui/localization/messages/sv.json +++ b/ui/localization/messages/sv.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "Standard SSH-användaren är", "advanced_ssh_public_key_label": "SSH-publik nyckel", "advanced_ssh_public_key_placeholder": "Ange din offentliga SSH-nyckel", + "advanced_ssh_key_required_warning": "En offentlig nyckel krävs för SSH-åtkomst. Utan en kommer du inte att kunna ansluta.", "advanced_success_loopback_disabled": "Endast loopback-läge inaktiverat. Starta om enheten för att tillämpa det.", "advanced_success_loopback_enabled": "Endast loopback-läge aktiverat. Starta om enheten för att tillämpa.", "advanced_success_reset_config": "Konfigurationen återställdes till standardinställningarna", diff --git a/ui/localization/messages/zh-tw.json b/ui/localization/messages/zh-tw.json index d763a68e..7f551694 100644 --- a/ui/localization/messages/zh-tw.json +++ b/ui/localization/messages/zh-tw.json @@ -95,6 +95,7 @@ "advanced_ssh_default_user": "預設 SSH 使用者為", "advanced_ssh_public_key_label": "SSH 公鑰", "advanced_ssh_public_key_placeholder": "輸入您的 SSH 公鑰", + "advanced_ssh_key_required_warning": "SSH 存取需要公鑰。沒有公鑰將無法連線。", "advanced_success_download_diagnostics": "診斷資料下載成功", "advanced_success_loopback_disabled": "單機回送模式已停用。請重新啟動您的裝置以套用。", "advanced_success_loopback_enabled": "單機回送模式已啟用。請重新啟動您的裝置以套用。", diff --git a/ui/localization/messages/zh.json b/ui/localization/messages/zh.json index 36981737..1570a9e0 100644 --- a/ui/localization/messages/zh.json +++ b/ui/localization/messages/zh.json @@ -91,6 +91,7 @@ "advanced_ssh_default_user": "默认 SSH 用户为", "advanced_ssh_public_key_label": "SSH 公钥", "advanced_ssh_public_key_placeholder": "请输入您的 SSH 公钥", + "advanced_ssh_key_required_warning": "SSH 访问需要公钥。没有公钥将无法连接。", "advanced_success_loopback_disabled": "环回模式已禁用。请重启设备以应用更改。", "advanced_success_loopback_enabled": "环回模式已启用。请重启设备以应用更改。", "advanced_success_reset_config": "配置已成功恢复为默认设置。", diff --git a/ui/src/routes/devices.$id.settings.advanced.tsx b/ui/src/routes/devices.$id.settings.advanced.tsx index b52ebf8d..345357e1 100644 --- a/ui/src/routes/devices.$id.settings.advanced.tsx +++ b/ui/src/routes/devices.$id.settings.advanced.tsx @@ -331,6 +331,11 @@ export default function SettingsAdvancedRoute() { {m.advanced_ssh_default_user()} root.

+ {!sshKey?.trim() && ( +

+ {m.advanced_ssh_key_required_warning()} +

+ )}