diff --git a/lib/app.dart b/lib/app.dart index 5ae24152..a01640cb 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:toolbox/core/extension/context/common.dart'; import 'package:toolbox/core/extension/locale.dart'; -import 'package:toolbox/core/utils/rebuild.dart'; +import 'package:toolbox/data/res/rebuild.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/value_notifier.dart'; diff --git a/lib/core/utils/server.dart b/lib/core/utils/server.dart index 77ad1977..41aa8ff9 100644 --- a/lib/core/utils/server.dart +++ b/lib/core/utils/server.dart @@ -80,8 +80,11 @@ Future genClient( timeout: timeout, ); // Use `0.0.0.0` as localhost to use all interfaces. - return await jumpClient.forwardLocal(spi.ip, spi.port, - localHost: '0.0.0.0'); + return await jumpClient.forwardLocal( + spi.ip, + spi.port, + localHost: '0.0.0.0', + ); } }(); diff --git a/lib/core/utils/rebuild.dart b/lib/data/model/app/rebuild.dart similarity index 71% rename from lib/core/utils/rebuild.dart rename to lib/data/model/app/rebuild.dart index f708cba6..67997775 100644 --- a/lib/core/utils/rebuild.dart +++ b/lib/data/model/app/rebuild.dart @@ -1,10 +1,10 @@ import 'package:flutter/foundation.dart'; // ignore: prefer_void_to_null -class _RebuildNode implements ValueListenable { +class RebuildNode implements ValueListenable { final List _listeners = []; - _RebuildNode(); + RebuildNode(); @override void addListener(VoidCallback listener) { @@ -25,9 +25,3 @@ class _RebuildNode implements ValueListenable { @override Null get value => null; } - -class RebuildNodes { - const RebuildNodes._(); - - static final _RebuildNode app = _RebuildNode(); -} diff --git a/lib/data/model/server/server.dart b/lib/data/model/server/server.dart index 452ab204..ef7b2de4 100644 --- a/lib/data/model/server/server.dart +++ b/lib/data/model/server/server.dart @@ -10,6 +10,10 @@ class Server implements TagPickable { SSHClient? client; ServerState state; + /// Whether is generating client. + /// Use this to avoid reconnecting if last connect try not finished. + bool isGenerating = false; + Server(this.spi, this.status, this.client, this.state); @override diff --git a/lib/data/provider/server.dart b/lib/data/provider/server.dart index 52ffb39a..99e3b44d 100644 --- a/lib/data/provider/server.dart +++ b/lib/data/provider/server.dart @@ -267,7 +267,9 @@ class ServerProvider extends ChangeNotifier { final time1 = DateTime.now(); - try { + try { + if (s.isGenerating) return; + s.isGenerating = true; s.client = await genClient( spi, timeout: Stores.setting.timeoutD, @@ -282,6 +284,8 @@ class ServerProvider extends ChangeNotifier { /// In order to keep privacy, print [spi.name] instead of [spi.id] Loggers.app.warning('Connect to ${spi.name} failed', e); return; + } finally { + s.isGenerating = false; } final time2 = DateTime.now(); diff --git a/lib/data/res/rebuild.dart b/lib/data/res/rebuild.dart new file mode 100644 index 00000000..8baf24b5 --- /dev/null +++ b/lib/data/res/rebuild.dart @@ -0,0 +1,7 @@ +import 'package:toolbox/data/model/app/rebuild.dart'; + +class RebuildNodes { + const RebuildNodes._(); + + static final app = RebuildNode(); +} \ No newline at end of file diff --git a/lib/view/page/backup.dart b/lib/view/page/backup.dart index 575fac34..007ee4f1 100644 --- a/lib/view/page/backup.dart +++ b/lib/view/page/backup.dart @@ -10,11 +10,11 @@ import 'package:toolbox/core/extension/context/snackbar.dart'; import 'package:toolbox/core/persistant_store.dart'; import 'package:toolbox/core/utils/icloud.dart'; import 'package:toolbox/core/utils/platform/base.dart'; -import 'package:toolbox/core/utils/rebuild.dart'; import 'package:toolbox/data/model/app/backup.dart'; import 'package:toolbox/data/res/logger.dart'; import 'package:toolbox/data/res/path.dart'; import 'package:toolbox/data/res/provider.dart'; +import 'package:toolbox/data/res/rebuild.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/expand_tile.dart'; import 'package:toolbox/view/widget/cardx.dart'; diff --git a/lib/view/page/setting/entry.dart b/lib/view/page/setting/entry.dart index 004db553..08c01067 100644 --- a/lib/view/page/setting/entry.dart +++ b/lib/view/page/setting/entry.dart @@ -12,8 +12,8 @@ import 'package:toolbox/core/extension/locale.dart'; import 'package:toolbox/core/extension/context/dialog.dart'; import 'package:toolbox/core/extension/stringx.dart'; import 'package:toolbox/core/utils/platform/base.dart'; -import 'package:toolbox/core/utils/rebuild.dart'; import 'package:toolbox/data/res/provider.dart'; +import 'package:toolbox/data/res/rebuild.dart'; import 'package:toolbox/data/res/store.dart'; import 'package:toolbox/view/widget/expand_tile.dart'; diff --git a/lib/view/widget/server_func_btns.dart b/lib/view/widget/server_func_btns.dart index 2775e58e..dec1846c 100644 --- a/lib/view/widget/server_func_btns.dart +++ b/lib/view/widget/server_func_btns.dart @@ -11,6 +11,7 @@ import 'package:toolbox/core/utils/platform/base.dart'; import 'package:toolbox/core/utils/platform/path.dart'; import 'package:toolbox/data/model/pkg/manager.dart'; import 'package:toolbox/data/model/server/dist.dart'; +import 'package:toolbox/data/res/path.dart'; import 'package:toolbox/data/res/provider.dart'; import '../../core/route.dart'; @@ -149,9 +150,11 @@ Future _gotoSSH( extraArgs.addAll(['-p', '${spi.port}']); } - final path = () { + final path = await () async { final tempKeyFileName = 'srvbox_pk_${spi.pubKeyId}'; - return joinPath(Directory.systemTemp.path, tempKeyFileName); + + /// For security reason, save the private key file to app doc path + return joinPath(await Paths.doc, tempKeyFileName); }(); final file = File(path); final shouldGenKey = spi.pubKeyId != null; @@ -175,7 +178,7 @@ Future _gotoSSH( default: context.showSnackBar('Mismatch system: $system'); } - // For security reason, delete the private key file after use + if (shouldGenKey) { if (!await file.exists()) return; await Future.delayed(const Duration(seconds: 2), file.delete); diff --git a/linux/my_application.cc b/linux/my_application.cc index 85c7e467..6370004f 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -20,7 +20,7 @@ static void my_application_activate(GApplication* application) { GtkWindow* window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - gtk_window_set_default_size(window, 1280, 720); + gtk_window_set_default_size(window, 400, 777); gtk_widget_show(GTK_WIDGET(window)); g_autoptr(FlDartProject) project = fl_dart_project_new(); diff --git a/make.dart b/make.dart index 50bf074c..6ffc59d9 100755 --- a/make.dart +++ b/make.dart @@ -67,7 +67,7 @@ Future getGitModificationCount() async { } Future getFlutterVersion() async { - final result = await Process.run('flutter', ['--version']); + final result = await Process.run('flutter', ['--version'], runInShell: true); final stdout = result.stdout as String; return stdout.split('\n')[0].split('•')[0].split(' ')[1].trim(); } @@ -97,7 +97,7 @@ Future updateBuildData() async { } Future dartFormat() async { - final result = await Process.run('dart', ['format', '.']); + final result = await Process.run('dart', ['format', '.'], runInShell: true); print(result.stdout); if (result.exitCode != 0) { print(result.stderr); @@ -128,7 +128,7 @@ Future flutterBuild(String buildType) async { args.add('--target-platform=android-arm64'); } print('\n[$buildType]\nBuilding with args: ${args.join(' ')}'); - final buildResult = await Process.run('flutter', args); + final buildResult = await Process.run('flutter', args, runInShell: true); final exitCode = buildResult.exitCode; if (exitCode != 0) { diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 4e290d0d..631a7061 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -26,7 +26,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); + Win32Window::Size size(400, 777); if (!window.CreateAndShow(L"ServerBox", origin, size)) { return EXIT_FAILURE; }