diff --git a/lib/core/extension/context/dialog.dart b/lib/core/extension/context/dialog.dart index 7e09eb2d..a88129a0 100644 --- a/lib/core/extension/context/dialog.dart +++ b/lib/core/extension/context/dialog.dart @@ -4,6 +4,7 @@ import 'package:choice/choice.dart'; import 'package:flutter/material.dart'; import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/context/locale.dart'; +import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/choice_chip.dart'; import 'package:toolbox/view/widget/tag.dart'; @@ -57,17 +58,27 @@ extension DialogX on BuildContext { } } - Future showPwdDialog( + static final _recoredPwd = {}; + + Future showPwdDialog({ String? user, - ) async { + required String hostId, + void Function()? onCorrectPwd, + }) async { if (!mounted) return null; return await showRoundDialog( title: Text(user ?? l10n.pwd), child: Input( + controller: TextEditingController(text: _recoredPwd[hostId]), autoFocus: true, type: TextInputType.visiblePassword, obscureText: true, - onSubmitted: (val) => pop(val.trim()), + onSubmitted: (val) { + pop(val); + if (Stores.setting.rememberPwdInMem.fetch()) { + _recoredPwd[hostId] = val; + } + }, label: l10n.pwd, ), ); diff --git a/lib/core/extension/ssh_client.dart b/lib/core/extension/ssh_client.dart index b123d305..55c65e5e 100644 --- a/lib/core/extension/ssh_client.dart +++ b/lib/core/extension/ssh_client.dart @@ -67,6 +67,7 @@ extension SSHClientX on SSHClient { _OnStdout? onStderr, _OnStdin? stdin, bool redirectToBash = false, // not working yet. do not use + required String id, }) async { var isRequestingPwd = false; final session = await exec( @@ -80,7 +81,7 @@ extension SSHClientX on SSHClient { isRequestingPwd = true; final user = Miscs.pwdRequestWithUserReg.firstMatch(data)?.group(1); if (context == null) return; - final pwd = await context.showPwdDialog(user); + final pwd = await context.showPwdDialog(user: user, hostId: id); if (pwd == null || pwd.isEmpty) { session.kill(SSHSignal.INT); } else { diff --git a/lib/data/provider/container.dart b/lib/data/provider/container.dart index 3548a496..d5cae325 100644 --- a/lib/data/provider/container.dart +++ b/lib/data/provider/container.dart @@ -28,6 +28,7 @@ class ContainerProvider extends ChangeNotifier { ContainerErr? error; String? runLog; ContainerType type; + bool sudo = false; ContainerProvider({ required this.client, @@ -71,8 +72,7 @@ class ContainerProvider extends ChangeNotifier { } Future refresh({bool isAuto = false}) async { - final sudo = - await _requiresSudo() && Stores.setting.containerTrySudo.fetch(); + sudo = await _requiresSudo() && Stores.setting.containerTrySudo.fetch(); /// If sudo is required and auto refresh is enabled, skip the refresh. /// Or this will ask for pwd again and again. @@ -88,6 +88,7 @@ class ContainerProvider extends ChangeNotifier { )), context: context, onStdout: (data, _) => raw = '$raw$data', + id: hostId, ); /// Code 127 means command not found @@ -204,13 +205,14 @@ class ContainerProvider extends ChangeNotifier { runLog = ''; final errs = []; final code = await client?.execWithPwd( - _wrap(cmd), + _wrap(sudo ? 'sudo -S $cmd' : cmd), context: context, onStdout: (data, _) { runLog = '$runLog$data'; notifyListeners(); }, onStderr: (data, _) => errs.add(data), + id: hostId, ); runLog = null; notifyListeners(); diff --git a/lib/data/store/setting.dart b/lib/data/store/setting.dart index b47adbd5..912ffd67 100644 --- a/lib/data/store/setting.dart +++ b/lib/data/store/setting.dart @@ -255,6 +255,10 @@ class SettingStore extends PersistentStore { late final termCursor = property('termCursor', TerminalCursorType.block.index); + /// Remerber pwd in memory + /// Used for [DialogX.showPwdDialog] + late final rememberPwdInMem = property('rememberPwdInMem', true); + // Never show these settings for users // // ------BEGIN------ diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 3187aa0c..19057d6a 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -193,6 +193,8 @@ "pwd": "Passwort", "read": "Lesen", "reboot": "Neustart", + "rememberPwdInMem": "Passwort im Speicher behalten", + "rememberPwdInMemTip": "Für Container, Aufhängen usw.", "remotePath": "Entfernte Pfade", "rename": "Umbenennen", "reportBugsOnGithubIssue": "Bitte Bugs auf {url} melden", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 85be7344..25026eab 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -193,6 +193,8 @@ "pwd": "Password", "read": "Read", "reboot": "Reboot", + "rememberPwdInMem": "Remember password in memory", + "rememberPwdInMemTip": "Used for containers, suspending, etc.", "remotePath": "Remote path", "rename": "Rename", "reportBugsOnGithubIssue": "Please report bugs on {url}", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index e9b7e560..e422d168 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -193,6 +193,8 @@ "pwd": "Contraseña", "read": "Leer", "reboot": "Reiniciar", + "rememberPwdInMem": "Recordar contraseña en la memoria", + "rememberPwdInMemTip": "Utilizado para contenedores, suspensión, etc.", "remotePath": "Ruta remota", "rename": "Renombrar", "reportBugsOnGithubIssue": "Por favor, informa los problemas en {url}", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 134efcd1..6a0c3bc7 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -193,6 +193,8 @@ "pwd": "Mot de passe", "read": "Lire", "reboot": "Redémarrer", + "rememberPwdInMem": "Mémoriser le mot de passe en mémoire", + "rememberPwdInMemTip": "Utilisé pour les conteneurs, la suspension, etc.", "remotePath": "Chemin distant", "rename": "Renommer", "reportBugsOnGithubIssue": "Veuillez signaler les bogues sur {url}", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 119726b6..71407e8c 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -193,6 +193,8 @@ "pwd": "Kata sandi", "read": "Baca", "reboot": "Reboot", + "rememberPwdInMem": "Ingat kata sandi di dalam memori", + "rememberPwdInMemTip": "Digunakan untuk kontainer, menangguhkan, dll.", "remotePath": "Jalur jarak jauh", "rename": "Ganti nama", "reportBugsOnGithubIssue": "Harap laporkan bug di {url}", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 58ddc0c5..dc68a85e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -193,6 +193,8 @@ "pwd": "パスワード", "read": "読み取り", "reboot": "再起動", + "rememberPwdInMem": "メモリにパスワードを記憶する", + "rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。", "remotePath": "リモートパス", "rename": "名前を変更", "reportBugsOnGithubIssue": "{url}で問題を報告してください", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 9ac3c929..09179a29 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -193,6 +193,8 @@ "pwd": "Senha", "read": "Leitura", "reboot": "Reiniciar", + "rememberPwdInMem": "Lembrar senha na memória", + "rememberPwdInMemTip": "Usado para contêineres, suspensão, etc.", "remotePath": "Caminho remoto", "rename": "Renomear", "reportBugsOnGithubIssue": "Por favor, reporte problemas em {url}", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 70a843de..42ba6551 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -193,6 +193,8 @@ "pwd": "пароль", "read": "чтение", "reboot": "перезагрузка", + "rememberPwdInMem": "Запомнить пароль в памяти", + "rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.", "remotePath": "удаленный путь", "rename": "переименовать", "reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 69e7969a..4188fee2 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -193,6 +193,8 @@ "pwd": "密码", "read": "读", "reboot": "重启", + "rememberPwdInMem": "在内存中记住密码", + "rememberPwdInMemTip": "用于容器、挂起等", "remotePath": "远端路径", "rename": "重命名", "reportBugsOnGithubIssue": "请到 {url} 提交问题", diff --git a/lib/l10n/app_zh_tw.arb b/lib/l10n/app_zh_tw.arb index 8e0b2edb..ea0dc329 100644 --- a/lib/l10n/app_zh_tw.arb +++ b/lib/l10n/app_zh_tw.arb @@ -193,6 +193,8 @@ "pwd": "密碼", "read": "读", "reboot": "重启", + "rememberPwdInMem": "在記憶體中記住密碼", + "rememberPwdInMemTip": "用於容器、暫停等", "remotePath": "遠端路徑", "rename": "重命名", "reportBugsOnGithubIssue": "請到 {url} 提交問題", diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 2d01485e..145ecdeb 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -261,6 +261,7 @@ class _ServerPageState extends State srv.client?.execWithPwd( ShellFunc.suspend.exec, context: context, + id: srv.id, ); }, typ: l10n.suspend, @@ -274,6 +275,7 @@ class _ServerPageState extends State func: () => srv.client?.execWithPwd( ShellFunc.shutdown.exec, context: context, + id: srv.id, ), typ: l10n.shutdown, name: srv.spi.name, @@ -286,6 +288,7 @@ class _ServerPageState extends State func: () => srv.client?.execWithPwd( ShellFunc.reboot.exec, context: context, + id: srv.id, ), typ: l10n.reboot, name: srv.spi.name, diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 834405ac..8dab621e 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -1048,6 +1048,7 @@ class _SettingPageState extends State { return ExpandTile( title: Text(l10n.more), children: [ + _buildRememberPwdInMem(), _buildTextScaler(), _buildPreferTemperatureDeviceList(), _buildKeepStatusWhenErr(), @@ -1081,4 +1082,12 @@ class _SettingPageState extends State { }, ); } + + Widget _buildRememberPwdInMem() { + return ListTile( + title: Text(l10n.rememberPwdInMem), + subtitle: Text(l10n.rememberPwdInMemTip, style: UIs.textGrey), + trailing: StoreSwitch(prop: _setting.rememberPwdInMem), + ); + } } diff --git a/lib/view/widget/server_func_btns.dart b/lib/view/widget/server_func_btns.dart index 395d9385..7864eb8d 100644 --- a/lib/view/widget/server_func_btns.dart +++ b/lib/view/widget/server_func_btns.dart @@ -245,7 +245,11 @@ Future _onPkg(BuildContext context, ServerPrivateInfo spi) async { fn: () async { final updateCmd = pkg.update; if (updateCmd != null) { - await client.execWithPwd(updateCmd, context: context); + await client.execWithPwd( + updateCmd, + context: context, + id: spi.id, + ); } }, barrierDismiss: true,