mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix & opt
- apt/yum if not root, auto try saved pwd - ServerPrivateInfo.authorization: Object => String pwd - fix apt parse: caused by irrelevant output - serverprovider replace _servers[idx] with s
This commit is contained in:
@@ -354,7 +354,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 142;
|
CURRENT_PROJECT_VERSION = 143;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
@@ -362,7 +362,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.142;
|
MARKETING_VERSION = 1.0.143;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
@@ -484,7 +484,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 142;
|
CURRENT_PROJECT_VERSION = 143;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
@@ -492,7 +492,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.142;
|
MARKETING_VERSION = 1.0.143;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
@@ -508,7 +508,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 142;
|
CURRENT_PROJECT_VERSION = 143;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
@@ -516,7 +516,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.142;
|
MARKETING_VERSION = 1.0.143;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class ServerPrivateInfo {
|
|||||||
late String ip;
|
late String ip;
|
||||||
late int port;
|
late int port;
|
||||||
late String user;
|
late String user;
|
||||||
late Object authorization;
|
late String pwd;
|
||||||
String? pubKeyId;
|
String? pubKeyId;
|
||||||
|
|
||||||
ServerPrivateInfo(
|
ServerPrivateInfo(
|
||||||
@@ -25,14 +25,14 @@ class ServerPrivateInfo {
|
|||||||
required this.ip,
|
required this.ip,
|
||||||
required this.port,
|
required this.port,
|
||||||
required this.user,
|
required this.user,
|
||||||
required this.authorization,
|
required this.pwd,
|
||||||
this.pubKeyId});
|
this.pubKeyId});
|
||||||
ServerPrivateInfo.fromJson(Map<String, dynamic> json) {
|
ServerPrivateInfo.fromJson(Map<String, dynamic> json) {
|
||||||
name = json["name"].toString();
|
name = json["name"].toString();
|
||||||
ip = json["ip"].toString();
|
ip = json["ip"].toString();
|
||||||
port = json["port"].toInt();
|
port = json["port"].toInt();
|
||||||
user = json["user"].toString();
|
user = json["user"].toString();
|
||||||
authorization = json["authorization"];
|
pwd = json["authorization"].toString();
|
||||||
pubKeyId = json["pubKeyId"]?.toString();
|
pubKeyId = json["pubKeyId"]?.toString();
|
||||||
}
|
}
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
@@ -41,7 +41,7 @@ class ServerPrivateInfo {
|
|||||||
data["ip"] = ip;
|
data["ip"] = ip;
|
||||||
data["port"] = port;
|
data["port"] = port;
|
||||||
data["user"] = user;
|
data["user"] = user;
|
||||||
data["authorization"] = authorization;
|
data["authorization"] = pwd;
|
||||||
data["pubKeyId"] = pubKeyId;
|
data["pubKeyId"] = pubKeyId;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,8 +58,7 @@ class SftpDownloadWorker {
|
|||||||
SSHClient client;
|
SSHClient client;
|
||||||
if (spi.pubKeyId == null) {
|
if (spi.pubKeyId == null) {
|
||||||
client = SSHClient(socket,
|
client = SSHClient(socket,
|
||||||
username: spi.user,
|
username: spi.user, onPasswordRequest: () => spi.pwd);
|
||||||
onPasswordRequest: () => spi.authorization as String);
|
|
||||||
} else {
|
} else {
|
||||||
client = SSHClient(socket,
|
client = SSHClient(socket,
|
||||||
username: spi.user,
|
username: spi.user,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import 'package:toolbox/data/model/apt/upgrade_pkg_info.dart';
|
|||||||
import 'package:toolbox/data/model/distribution.dart';
|
import 'package:toolbox/data/model/distribution.dart';
|
||||||
|
|
||||||
typedef PwdRequestFunc = Future<String> Function(
|
typedef PwdRequestFunc = Future<String> Function(
|
||||||
bool lastTimes, String? userName);
|
int triedTimes, String? userName);
|
||||||
final pwdRequestWithUserReg = RegExp(r'\[sudo\] password for (.+):');
|
final pwdRequestWithUserReg = RegExp(r'\[sudo\] password for (.+):');
|
||||||
|
|
||||||
class AptProvider extends BusyProvider {
|
class AptProvider extends BusyProvider {
|
||||||
@@ -87,7 +87,12 @@ class AptProvider extends BusyProvider {
|
|||||||
list = list.sublist(0, endLine);
|
list = list.sublist(0, endLine);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
list = list.sublist(4);
|
// avoid other outputs
|
||||||
|
// such as: [Could not chdir to home directory /home/test: No such file or directory, , WARNING: apt does not have a stable CLI interface. Use with caution in scripts., , Listing...]
|
||||||
|
final idx = list.indexWhere((element) => element.contains('[upgradable from:'));
|
||||||
|
if (idx != -1) {
|
||||||
|
list = list.sublist(idx);
|
||||||
|
}
|
||||||
list.removeWhere((element) => element.isEmpty);
|
list.removeWhere((element) => element.isEmpty);
|
||||||
}
|
}
|
||||||
upgradeable = list.map((e) => UpgradePkgInfo(e, dist!)).toList();
|
upgradeable = list.map((e) => UpgradePkgInfo(e, dist!)).toList();
|
||||||
@@ -153,8 +158,8 @@ class AptProvider extends BusyProvider {
|
|||||||
final user = pwdRequestWithUserReg.firstMatch(event)?.group(1);
|
final user = pwdRequestWithUserReg.firstMatch(event)?.group(1);
|
||||||
logger.info('sudo password request for $user');
|
logger.info('sudo password request for $user');
|
||||||
triedTimes++;
|
triedTimes++;
|
||||||
final pwd = await (onPasswordRequest ?? (_, __) async => '')(
|
final pwd =
|
||||||
triedTimes == 3, user);
|
await (onPasswordRequest ?? (_, __) async => '')(triedTimes, user);
|
||||||
if (pwd.isEmpty) {
|
if (pwd.isEmpty) {
|
||||||
logger.info('sudo password request cancelled');
|
logger.info('sudo password request cancelled');
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ const shellCmd = "export LANG=en_US.utf-8 \necho '$seperator' \n"
|
|||||||
const shellPath = '.serverbox.sh';
|
const shellPath = '.serverbox.sh';
|
||||||
const memPrefix = 'Mem:';
|
const memPrefix = 'Mem:';
|
||||||
final cpuTempReg = RegExp('(x86_pkg_temp|cpu_thermal)');
|
final cpuTempReg = RegExp('(x86_pkg_temp|cpu_thermal)');
|
||||||
|
final numReg = RegExp(r'\s{1,}');
|
||||||
|
|
||||||
class ServerProvider extends BusyProvider {
|
class ServerProvider extends BusyProvider {
|
||||||
List<ServerInfo> _servers = [];
|
List<ServerInfo> _servers = [];
|
||||||
@@ -91,8 +92,7 @@ class ServerProvider extends BusyProvider {
|
|||||||
final socket = await SSHSocket.connect(spi.ip, spi.port);
|
final socket = await SSHSocket.connect(spi.ip, spi.port);
|
||||||
if (spi.pubKeyId == null) {
|
if (spi.pubKeyId == null) {
|
||||||
return SSHClient(socket,
|
return SSHClient(socket,
|
||||||
username: spi.user,
|
username: spi.user, onPasswordRequest: () => spi.pwd);
|
||||||
onPasswordRequest: () => spi.authorization as String);
|
|
||||||
}
|
}
|
||||||
final key = locator<PrivateKeyStore>().get(spi.pubKeyId!);
|
final key = locator<PrivateKeyStore>().get(spi.pubKeyId!);
|
||||||
return SSHClient(socket,
|
return SSHClient(socket,
|
||||||
@@ -163,25 +163,23 @@ class ServerProvider extends BusyProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _getData(ServerPrivateInfo spi) async {
|
Future<void> _getData(ServerPrivateInfo spi) async {
|
||||||
final idx = _servers.indexWhere((element) => element.info == spi);
|
final s = _servers.firstWhere((element) => element.info == spi);
|
||||||
final state = _servers[idx].connectionState;
|
final state = s.connectionState;
|
||||||
if (state == ServerConnectionState.failed ||
|
if (state == ServerConnectionState.failed ||
|
||||||
state == ServerConnectionState.disconnected) {
|
state == ServerConnectionState.disconnected) {
|
||||||
_servers[idx].connectionState = ServerConnectionState.connecting;
|
s.connectionState = ServerConnectionState.connecting;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
final time1 = DateTime.now();
|
final time1 = DateTime.now();
|
||||||
try {
|
try {
|
||||||
_servers[idx].client = await genClient(spi);
|
s.client = await genClient(spi);
|
||||||
final time2 = DateTime.now();
|
final time2 = DateTime.now();
|
||||||
logger.info(
|
logger.info(
|
||||||
'Connected to [${spi.name}] in [${time2.difference(time1).toString()}].');
|
'Connected to [${spi.name}] in [${time2.difference(time1).toString()}].');
|
||||||
_servers[idx].connectionState = ServerConnectionState.connected;
|
s.connectionState = ServerConnectionState.connected;
|
||||||
_servers[idx]
|
s.client!.run("echo '$shellCmd' > $shellPath && chmod +x $shellPath");
|
||||||
.client!
|
|
||||||
.run("echo '$shellCmd' > $shellPath && chmod +x $shellPath");
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
_servers[idx].connectionState = ServerConnectionState.failed;
|
s.connectionState = ServerConnectionState.failed;
|
||||||
_servers[idx].status.failedInfo = '$e ## ';
|
s.status.failedInfo = '$e ## ';
|
||||||
logger.warning(e);
|
logger.warning(e);
|
||||||
} finally {
|
} finally {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
@@ -189,12 +187,11 @@ class ServerProvider extends BusyProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if client is null, return
|
// if client is null, return
|
||||||
final si = _servers[idx];
|
if (s.client == null) return;
|
||||||
if (si.client == null) return;
|
final raw = await s.client!.run("sh $shellPath").string;
|
||||||
final raw = await si.client!.run("sh $shellPath").string;
|
|
||||||
if (raw.isEmpty) {
|
if (raw.isEmpty) {
|
||||||
_servers[idx].connectionState = ServerConnectionState.failed;
|
s.connectionState = ServerConnectionState.failed;
|
||||||
_servers[idx].status.failedInfo = 'Empty output';
|
s.status.failedInfo = 'Empty output';
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -210,8 +207,8 @@ class ServerProvider extends BusyProvider {
|
|||||||
_getTcp(spi, lines[4]);
|
_getTcp(spi, lines[4]);
|
||||||
_getNetSpeed(spi, lines[0]);
|
_getNetSpeed(spi, lines[0]);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
_servers[idx].connectionState = ServerConnectionState.failed;
|
s.connectionState = ServerConnectionState.failed;
|
||||||
servers[idx].status.failedInfo = e.toString();
|
s.status.failedInfo = e.toString();
|
||||||
logger.warning(e);
|
logger.warning(e);
|
||||||
rethrow;
|
rethrow;
|
||||||
} finally {
|
} finally {
|
||||||
@@ -307,7 +304,7 @@ class ServerProvider extends BusyProvider {
|
|||||||
final idx = lines.lastWhere((element) => element.startsWith('Tcp:'),
|
final idx = lines.lastWhere((element) => element.startsWith('Tcp:'),
|
||||||
orElse: () => '');
|
orElse: () => '');
|
||||||
if (idx != '') {
|
if (idx != '') {
|
||||||
final vals = idx.split(RegExp(r'\s{1,}'));
|
final vals = idx.split(numReg);
|
||||||
info.status.tcp = TcpStatus(vals[5].i, vals[6].i, vals[7].i, vals[8].i);
|
info.status.tcp = TcpStatus(vals[5].i, vals[6].i, vals[7].i, vals[8].i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -320,7 +317,7 @@ class ServerProvider extends BusyProvider {
|
|||||||
if (items.indexOf(item) == 0 || item.isEmpty) {
|
if (items.indexOf(item) == 0 || item.isEmpty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final vals = item.split(RegExp(r'\s{1,}'));
|
final vals = item.split(numReg);
|
||||||
list.add(DiskInfo(vals[0], vals[5],
|
list.add(DiskInfo(vals[0], vals[5],
|
||||||
int.parse(vals[4].replaceFirst('%', '')), vals[2], vals[1], vals[3]));
|
int.parse(vals[4].replaceFirst('%', '')), vals[2], vals[1], vals[3]));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
class BuildData {
|
class BuildData {
|
||||||
static const String name = "ServerBox";
|
static const String name = "ServerBox";
|
||||||
static const int build = 142;
|
static const int build = 143;
|
||||||
static const String engine =
|
static const String engine =
|
||||||
"Flutter 3.0.1 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision fb57da5f94 (3 days ago) • 2022-05-19 15:50:29 -0700\nEngine • revision caaafc5604\nTools • Dart 2.17.1 • DevTools 2.12.2\n";
|
"Flutter 3.0.1 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision fb57da5f94 (3 days ago) • 2022-05-19 15:50:29 -0700\nEngine • revision caaafc5604\nTools • Dart 2.17.1 • DevTools 2.12.2\n";
|
||||||
static const String buildAt = "2022-05-23 17:46:58.865964";
|
static const String buildAt = "2022-05-23 17:48:09.246927";
|
||||||
static const int modifications = 5;
|
static const int modifications = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"license": MessageLookupByLibrary.simpleMessage("License"),
|
"license": MessageLookupByLibrary.simpleMessage("License"),
|
||||||
"loadingFiles":
|
"loadingFiles":
|
||||||
MessageLookupByLibrary.simpleMessage("Loading files..."),
|
MessageLookupByLibrary.simpleMessage("Loading files..."),
|
||||||
"loss": MessageLookupByLibrary.simpleMessage("Loss"),
|
"loss": MessageLookupByLibrary.simpleMessage("loss"),
|
||||||
"madeWithLove": m8,
|
"madeWithLove": m8,
|
||||||
"max": MessageLookupByLibrary.simpleMessage("max"),
|
"max": MessageLookupByLibrary.simpleMessage("max"),
|
||||||
"min": MessageLookupByLibrary.simpleMessage("min"),
|
"min": MessageLookupByLibrary.simpleMessage("min"),
|
||||||
@@ -203,7 +203,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"stop": MessageLookupByLibrary.simpleMessage("Stop"),
|
"stop": MessageLookupByLibrary.simpleMessage("Stop"),
|
||||||
"sureDelete": m12,
|
"sureDelete": m12,
|
||||||
"sureToDeleteServer": m13,
|
"sureToDeleteServer": m13,
|
||||||
"ttl": MessageLookupByLibrary.simpleMessage("TTL"),
|
"ttl": MessageLookupByLibrary.simpleMessage("ttl"),
|
||||||
"unknown": MessageLookupByLibrary.simpleMessage("unknown"),
|
"unknown": MessageLookupByLibrary.simpleMessage("unknown"),
|
||||||
"unknownError": MessageLookupByLibrary.simpleMessage("Unknown error"),
|
"unknownError": MessageLookupByLibrary.simpleMessage("Unknown error"),
|
||||||
"unkownConvertMode":
|
"unkownConvertMode":
|
||||||
|
|||||||
@@ -330,20 +330,20 @@ class S {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `TTL`
|
/// `ttl`
|
||||||
String get ttl {
|
String get ttl {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'TTL',
|
'ttl',
|
||||||
name: 'ttl',
|
name: 'ttl',
|
||||||
desc: '',
|
desc: '',
|
||||||
args: [],
|
args: [],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Loss`
|
/// `loss`
|
||||||
String get loss {
|
String get loss {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'Loss',
|
'loss',
|
||||||
name: 'loss',
|
name: 'loss',
|
||||||
desc: '',
|
desc: '',
|
||||||
args: [],
|
args: [],
|
||||||
|
|||||||
@@ -27,8 +27,8 @@
|
|||||||
"min": "min",
|
"min": "min",
|
||||||
"max": "max",
|
"max": "max",
|
||||||
"ms": "ms",
|
"ms": "ms",
|
||||||
"ttl": "TTL",
|
"ttl": "ttl",
|
||||||
"loss": "Loss",
|
"loss": "loss",
|
||||||
"noResult": "No result",
|
"noResult": "No result",
|
||||||
"pingInputIP": "Please input a target IP/domain.",
|
"pingInputIP": "Please input a target IP/domain.",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
|
|||||||
@@ -71,11 +71,14 @@ class _AptManagePageState extends State<AptManagePage>
|
|||||||
};
|
};
|
||||||
|
|
||||||
// ignore: prefer_function_declarations_over_variables
|
// ignore: prefer_function_declarations_over_variables
|
||||||
PwdRequestFunc onPwdRequest = (lastTime, user) async {
|
PwdRequestFunc onPwdRequest = (triedTimes, user) async {
|
||||||
if (!mounted) return '';
|
if (!mounted) return '';
|
||||||
|
if (triedTimes == 1) {
|
||||||
|
return widget.spi.pwd;
|
||||||
|
}
|
||||||
await showRoundDialog(
|
await showRoundDialog(
|
||||||
context,
|
context,
|
||||||
lastTime ? s.lastTry : (user ?? s.unknown),
|
triedTimes == 3 ? s.lastTry : (user ?? s.unknown),
|
||||||
TextField(
|
TextField(
|
||||||
controller: textController,
|
controller: textController,
|
||||||
keyboardType: TextInputType.visiblePassword,
|
keyboardType: TextInputType.visiblePassword,
|
||||||
@@ -105,7 +108,7 @@ class _AptManagePageState extends State<AptManagePage>
|
|||||||
() =>
|
() =>
|
||||||
scrollController.jumpTo(scrollController.position.maxScrollExtent),
|
scrollController.jumpTo(scrollController.position.maxScrollExtent),
|
||||||
() => scrollControllerUpdate
|
() => scrollControllerUpdate
|
||||||
.jumpTo(scrollControllerUpdate.position.maxScrollExtent),
|
.jumpTo(scrollControllerUpdate.positions.last.maxScrollExtent),
|
||||||
onPwdRequest);
|
onPwdRequest);
|
||||||
_aptProvider.refreshInstalled();
|
_aptProvider.refreshInstalled();
|
||||||
}
|
}
|
||||||
@@ -130,9 +133,19 @@ class _AptManagePageState extends State<AptManagePage>
|
|||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 37,
|
height: 37,
|
||||||
),
|
),
|
||||||
Text(
|
SizedBox(
|
||||||
apt.error!,
|
height: _media.size.height * 0.4,
|
||||||
textAlign: TextAlign.center,
|
child: Padding(
|
||||||
|
padding: EdgeInsets.all(17),
|
||||||
|
child: RoundRectCard(
|
||||||
|
SingleChildScrollView(
|
||||||
|
padding: EdgeInsets.all(17),
|
||||||
|
child: Text(
|
||||||
|
apt.error!,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -214,18 +214,13 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
|||||||
_keyInfo ??= locator<PrivateKeyStore>().get(widget.spi!.pubKeyId!);
|
_keyInfo ??= locator<PrivateKeyStore>().get(widget.spi!.pubKeyId!);
|
||||||
}
|
}
|
||||||
|
|
||||||
final authorization = usePublicKey
|
final authorization = passwordController.text;
|
||||||
? {
|
|
||||||
"privateKey": _keyInfo!.privateKey,
|
|
||||||
"passphrase": _keyInfo!.password
|
|
||||||
}
|
|
||||||
: passwordController.text;
|
|
||||||
final spi = ServerPrivateInfo(
|
final spi = ServerPrivateInfo(
|
||||||
name: nameController.text,
|
name: nameController.text,
|
||||||
ip: ipController.text,
|
ip: ipController.text,
|
||||||
port: int.parse(portController.text),
|
port: int.parse(portController.text),
|
||||||
user: usernameController.text,
|
user: usernameController.text,
|
||||||
authorization: authorization,
|
pwd: authorization,
|
||||||
pubKeyId: usePublicKey ? _keyInfo!.id : null);
|
pubKeyId: usePublicKey ? _keyInfo!.id : null);
|
||||||
|
|
||||||
if (widget.spi == null) {
|
if (widget.spi == null) {
|
||||||
@@ -260,10 +255,10 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
|||||||
ipController.text = widget.spi?.ip ?? '';
|
ipController.text = widget.spi?.ip ?? '';
|
||||||
portController.text = (widget.spi?.port ?? 22).toString();
|
portController.text = (widget.spi?.port ?? 22).toString();
|
||||||
usernameController.text = widget.spi?.user ?? '';
|
usernameController.text = widget.spi?.user ?? '';
|
||||||
if (widget.spi?.authorization is String) {
|
if (widget.spi?.pwd is String) {
|
||||||
passwordController.text = widget.spi?.authorization as String? ?? '';
|
passwordController.text = widget.spi?.pwd ?? '';
|
||||||
} else {
|
} else {
|
||||||
final auth = widget.spi?.authorization as Map;
|
final auth = widget.spi?.pwd as Map;
|
||||||
passwordController.text = auth['passphrase'];
|
passwordController.text = auth['passphrase'];
|
||||||
keyController.text = auth['privateKey'];
|
keyController.text = auth['privateKey'];
|
||||||
usePublicKey = true;
|
usePublicKey = true;
|
||||||
|
|||||||
@@ -420,14 +420,14 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 142;
|
CURRENT_PROJECT_VERSION = 143;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.142;
|
MARKETING_VERSION = 1.0.143;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -550,14 +550,14 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 142;
|
CURRENT_PROJECT_VERSION = 143;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.142;
|
MARKETING_VERSION = 1.0.143;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@@ -574,14 +574,14 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 142;
|
CURRENT_PROJECT_VERSION = 143;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.142;
|
MARKETING_VERSION = 1.0.143;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|||||||
Reference in New Issue
Block a user