From 20c859b0a11ca3851f264feb2111de3bead1a2bd Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Mon, 7 Aug 2023 17:41:35 +0800 Subject: [PATCH] #109 fix: path sep on win --- lib/core/update.dart | 1 - lib/core/utils/misc.dart | 11 +------- lib/core/utils/platform.dart | 30 ++++++++++++++++++++- lib/data/model/app/path_with_prefix.dart | 2 +- lib/view/page/private_key/list.dart | 1 - lib/view/page/server/tab.dart | 33 +++++++++++++++--------- 6 files changed, 52 insertions(+), 26 deletions(-) diff --git a/lib/core/update.dart b/lib/core/update.dart index 8a62726e..96955a67 100644 --- a/lib/core/update.dart +++ b/lib/core/update.dart @@ -6,7 +6,6 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:logging/logging.dart'; import 'package:r_upgrade/r_upgrade.dart'; import 'package:toolbox/core/extension/navigator.dart'; -import 'package:toolbox/core/utils/misc.dart'; import 'package:toolbox/data/res/path.dart'; import '../data/provider/app.dart'; diff --git a/lib/core/utils/misc.dart b/lib/core/utils/misc.dart index ba3dc00d..3784eebb 100644 --- a/lib/core/utils/misc.dart +++ b/lib/core/utils/misc.dart @@ -73,16 +73,7 @@ String getTime(int? unixMill) { .replaceFirst('.000', ''); } +/// Join two path with `/` String pathJoin(String path1, String path2) { return path1 + (path1.endsWith('/') ? '' : '/') + path2; } - -String? getHomeDir() { - final envVars = Platform.environment; - if (isMacOS || isLinux) { - return envVars['HOME']; - } else if (isWindows) { - return envVars['UserProfile']; - } - return null; -} diff --git a/lib/core/utils/platform.dart b/lib/core/utils/platform.dart index 7f5a23f4..88e79004 100644 --- a/lib/core/utils/platform.dart +++ b/lib/core/utils/platform.dart @@ -10,7 +10,7 @@ enum PlatformType { windows, web, fuchsia, - unknown, + unknown; } final _p = () { @@ -38,7 +38,15 @@ final _p = () { return PlatformType.unknown; }(); +final _pathSep = () { + if (Platform.isWindows) { + return '\\'; + } + return '/'; +}(); + PlatformType get platform => _p; +String get pathSeparator => _pathSep; bool get isAndroid => _p == PlatformType.android; bool get isIOS => _p == PlatformType.ios; @@ -51,3 +59,23 @@ bool get isDesktop => _p == PlatformType.linux || _p == PlatformType.macos || _p == PlatformType.windows; + +/// Available only on desktop, +/// return null on mobile +String? getHomeDir() { + final envVars = Platform.environment; + if (isMacOS || isLinux) { + return envVars['HOME']; + } else if (isWindows) { + return envVars['UserProfile']; + } + return null; +} + +/// Join two paths with platform specific separator +String pathJoin(String path1, String path2) { + if (isWindows) { + return path1 + (path1.endsWith('\\') ? '' : '\\') + path2; + } + return path1 + (path1.endsWith('/') ? '' : '/') + path2; +} diff --git a/lib/data/model/app/path_with_prefix.dart b/lib/data/model/app/path_with_prefix.dart index acab1deb..6f195eba 100644 --- a/lib/data/model/app/path_with_prefix.dart +++ b/lib/data/model/app/path_with_prefix.dart @@ -1,4 +1,4 @@ -import 'package:toolbox/core/utils/misc.dart'; +import '../../../core/utils/platform.dart'; class PathWithPrefix { final String _prefixPath; diff --git a/lib/view/page/private_key/list.dart b/lib/view/page/private_key/list.dart index 420391be..e12e33b8 100644 --- a/lib/view/page/private_key/list.dart +++ b/lib/view/page/private_key/list.dart @@ -9,7 +9,6 @@ import 'package:toolbox/data/store/private_key.dart'; import 'package:toolbox/locator.dart'; import '../../../core/route.dart'; -import '../../../core/utils/misc.dart'; import '../../../core/utils/platform.dart'; import '../../../data/model/server/private_key_info.dart'; import '../../../data/provider/private_key.dart'; diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 68a45646..8381fddf 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -1,4 +1,4 @@ -import 'dart:io' show File, Platform, Process; +import 'dart:io' show Directory, File, Platform, Process; import 'package:after_layout/after_layout.dart'; import 'package:circle_chart/circle_chart.dart'; @@ -8,7 +8,6 @@ import 'package:get_it/get_it.dart'; import 'package:nil/nil.dart'; import 'package:provider/provider.dart'; import 'package:toolbox/core/extension/order.dart'; -import 'package:toolbox/core/utils/misc.dart'; import 'package:toolbox/data/model/app/net_view.dart'; import 'package:toolbox/data/model/server/snippet.dart'; import 'package:toolbox/data/provider/snippet.dart'; @@ -17,6 +16,7 @@ import 'package:toolbox/view/widget/tag/picker.dart'; import 'package:toolbox/view/widget/tag/switcher.dart'; import '../../../core/route.dart'; +import '../../../core/utils/misc.dart' hide pathJoin; import '../../../core/utils/platform.dart'; import '../../../core/utils/server.dart'; import '../../../core/utils/ui.dart'; @@ -453,17 +453,24 @@ class _ServerPageState extends State AppRoute(SSHPage(spi: spi), 'ssh page').go(context); return; } - List extarArgs = []; - - final path = "/tmp/.serverbox_pk_${spi.pubKeyId}"; - final file = File(path); - if (spi.pubKeyId != null) { - await file.delete(); - await file.writeAsString(getPrivateKey(spi.pubKeyId!)); - extarArgs += ["-i", path]; + final extraArgs = []; + if (spi.port != 22) { + extraArgs.addAll(['-p', '${spi.port}']); } - List sshCommand = ["ssh", "${spi.user}@${spi.ip}"] + extarArgs; + final path = () { + final tempKeyFileName = 'srvbox_pk_${spi.pubKeyId}'; + return pathJoin(Directory.systemTemp.path, tempKeyFileName); + }(); + final file = File(path); + final shouldGenKey = spi.pubKeyId != null; + if (shouldGenKey) { + await file.delete(); + await file.writeAsString(getPrivateKey(spi.pubKeyId!)); + extraArgs.addAll(["-i", path]); + } + + List sshCommand = ["ssh", "${spi.user}@${spi.ip}"] + extraArgs; final system = Platform.operatingSystem; switch (system) { case "windows": @@ -482,7 +489,9 @@ class _ServerPageState extends State showSnackBar(context, Text('Mismatch system: $system')); } // For security reason, delete the private key file after use - await file.delete(); + if (shouldGenKey) { + await Future.delayed(const Duration(seconds: 2), file.delete); + } } @override