mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
#78 new: alter host
This commit is contained in:
@@ -144,6 +144,12 @@ abstract class S {
|
|||||||
/// **'Already in last directory.'**
|
/// **'Already in last directory.'**
|
||||||
String get alreadyLastDir;
|
String get alreadyLastDir;
|
||||||
|
|
||||||
|
/// No description provided for @alterHost.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Alter host'**
|
||||||
|
String get alterHost;
|
||||||
|
|
||||||
/// No description provided for @attention.
|
/// No description provided for @attention.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ class SDe extends S {
|
|||||||
@override
|
@override
|
||||||
String get alreadyLastDir => 'Bereits im letzten Verzeichnis.';
|
String get alreadyLastDir => 'Bereits im letzten Verzeichnis.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get alterHost => 'Alternative Gastgeber';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get attention => 'Achtung';
|
String get attention => 'Achtung';
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ class SEn extends S {
|
|||||||
@override
|
@override
|
||||||
String get alreadyLastDir => 'Already in last directory.';
|
String get alreadyLastDir => 'Already in last directory.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get alterHost => 'Alter host';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get attention => 'Attention';
|
String get attention => 'Attention';
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ class SZh extends S {
|
|||||||
@override
|
@override
|
||||||
String get alreadyLastDir => '已经是最上层目录了';
|
String get alreadyLastDir => '已经是最上层目录了';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get alterHost => '备选主机';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get attention => '注意';
|
String get attention => '注意';
|
||||||
|
|
||||||
@@ -701,6 +704,9 @@ class SZhTw extends SZh {
|
|||||||
@override
|
@override
|
||||||
String get alreadyLastDir => '已經是最上層目錄了';
|
String get alreadyLastDir => '已經是最上層目錄了';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get alterHost => '備選主機';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get attention => '注意';
|
String get attention => '注意';
|
||||||
|
|
||||||
|
|||||||
@@ -470,7 +470,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||||
@@ -478,7 +478,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
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";
|
||||||
@@ -602,7 +602,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||||
@@ -610,7 +610,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
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";
|
||||||
@@ -628,7 +628,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||||
@@ -636,7 +636,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
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";
|
||||||
@@ -657,7 +657,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -670,7 +670,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||||
@@ -696,7 +696,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -709,7 +709,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -732,7 +732,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -745,7 +745,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
|||||||
@@ -35,15 +35,31 @@ Future<SSHClient> genClient(
|
|||||||
ServerPrivateInfo spi, {
|
ServerPrivateInfo spi, {
|
||||||
void Function(GenSSHClientStatus)? onStatus,
|
void Function(GenSSHClientStatus)? onStatus,
|
||||||
}) async {
|
}) async {
|
||||||
final onStatus_ = onStatus ?? (_) {};
|
onStatus?.call(GenSSHClientStatus.socket);
|
||||||
onStatus_(GenSSHClientStatus.socket);
|
late SSHSocket socket;
|
||||||
final socket = await SSHSocket.connect(
|
try {
|
||||||
|
socket = await SSHSocket.connect(
|
||||||
spi.ip,
|
spi.ip,
|
||||||
spi.port,
|
spi.port,
|
||||||
timeout: const Duration(seconds: 5),
|
timeout: const Duration(seconds: 5),
|
||||||
);
|
);
|
||||||
|
} catch (e) {
|
||||||
|
try {
|
||||||
|
socket = await SSHSocket.connect(
|
||||||
|
spi.alterHost!,
|
||||||
|
spi.port,
|
||||||
|
timeout: const Duration(seconds: 5),
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
throw SSHErr(
|
||||||
|
type: SSHErrType.connect,
|
||||||
|
message: e.toString(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (spi.pubKeyId == null) {
|
if (spi.pubKeyId == null) {
|
||||||
onStatus_(GenSSHClientStatus.pwd);
|
onStatus?.call(GenSSHClientStatus.pwd);
|
||||||
return SSHClient(
|
return SSHClient(
|
||||||
socket,
|
socket,
|
||||||
username: spi.user,
|
username: spi.user,
|
||||||
@@ -57,7 +73,7 @@ Future<SSHClient> genClient(
|
|||||||
message: 'key [${spi.pubKeyId}] not found',
|
message: 'key [${spi.pubKeyId}] not found',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
onStatus_(GenSSHClientStatus.key);
|
onStatus?.call(GenSSHClientStatus.key);
|
||||||
return SSHClient(
|
return SSHClient(
|
||||||
socket,
|
socket,
|
||||||
username: spi.user,
|
username: spi.user,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ abstract class Err<T> {
|
|||||||
|
|
||||||
enum SSHErrType {
|
enum SSHErrType {
|
||||||
unknown,
|
unknown,
|
||||||
|
connect,
|
||||||
noPrivateKey;
|
noPrivateKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ class ServerPrivateInfo {
|
|||||||
String? pubKeyId;
|
String? pubKeyId;
|
||||||
@HiveField(6)
|
@HiveField(6)
|
||||||
List<String>? tags;
|
List<String>? tags;
|
||||||
|
@HiveField(7)
|
||||||
|
String? alterHost;
|
||||||
|
|
||||||
late String id;
|
late String id;
|
||||||
|
|
||||||
@@ -29,6 +31,7 @@ class ServerPrivateInfo {
|
|||||||
required this.pwd,
|
required this.pwd,
|
||||||
this.pubKeyId,
|
this.pubKeyId,
|
||||||
this.tags,
|
this.tags,
|
||||||
|
this.alterHost,
|
||||||
}) : id = '$user@$ip:$port';
|
}) : id = '$user@$ip:$port';
|
||||||
|
|
||||||
ServerPrivateInfo.fromJson(Map<String, dynamic> json) {
|
ServerPrivateInfo.fromJson(Map<String, dynamic> json) {
|
||||||
@@ -40,6 +43,7 @@ class ServerPrivateInfo {
|
|||||||
pubKeyId = json["pubKeyId"]?.toString();
|
pubKeyId = json["pubKeyId"]?.toString();
|
||||||
id = '$user@$ip:$port';
|
id = '$user@$ip:$port';
|
||||||
tags = json["tags"]?.cast<String>();
|
tags = json["tags"]?.cast<String>();
|
||||||
|
alterHost = json["alterHost"]?.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
@@ -51,11 +55,15 @@ class ServerPrivateInfo {
|
|||||||
data["authorization"] = pwd;
|
data["authorization"] = pwd;
|
||||||
data["pubKeyId"] = pubKeyId;
|
data["pubKeyId"] = pubKeyId;
|
||||||
data["tags"] = tags;
|
data["tags"] = tags;
|
||||||
|
data["alterHost"] = alterHost;
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shouldReconnect(ServerPrivateInfo old) {
|
bool shouldReconnect(ServerPrivateInfo old) {
|
||||||
return id != old.id || pwd != old.pwd || pubKeyId != old.pubKeyId;
|
return id != old.id ||
|
||||||
|
pwd != old.pwd ||
|
||||||
|
pubKeyId != old.pubKeyId ||
|
||||||
|
alterHost != old.alterHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -24,13 +24,14 @@ class ServerPrivateInfoAdapter extends TypeAdapter<ServerPrivateInfo> {
|
|||||||
pwd: fields[4] as String,
|
pwd: fields[4] as String,
|
||||||
pubKeyId: fields[5] as String?,
|
pubKeyId: fields[5] as String?,
|
||||||
tags: (fields[6] as List?)?.cast<String>(),
|
tags: (fields[6] as List?)?.cast<String>(),
|
||||||
|
alterHost: fields[7] as String?,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void write(BinaryWriter writer, ServerPrivateInfo obj) {
|
void write(BinaryWriter writer, ServerPrivateInfo obj) {
|
||||||
writer
|
writer
|
||||||
..writeByte(7)
|
..writeByte(8)
|
||||||
..writeByte(0)
|
..writeByte(0)
|
||||||
..write(obj.name)
|
..write(obj.name)
|
||||||
..writeByte(1)
|
..writeByte(1)
|
||||||
@@ -44,7 +45,9 @@ class ServerPrivateInfoAdapter extends TypeAdapter<ServerPrivateInfo> {
|
|||||||
..writeByte(5)
|
..writeByte(5)
|
||||||
..write(obj.pubKeyId)
|
..write(obj.pubKeyId)
|
||||||
..writeByte(6)
|
..writeByte(6)
|
||||||
..write(obj.tags);
|
..write(obj.tags)
|
||||||
|
..writeByte(7)
|
||||||
|
..write(obj.alterHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
class BuildData {
|
class BuildData {
|
||||||
static const String name = "ServerBox";
|
static const String name = "ServerBox";
|
||||||
static const int build = 388;
|
static const int build = 389;
|
||||||
static const String engine = "3.10.6";
|
static const String engine = "3.10.6";
|
||||||
static const String buildAt = "2023-07-27 13:03:33.193528";
|
static const String buildAt = "2023-07-28 13:50:35.251988";
|
||||||
static const int modifications = 16;
|
static const int modifications = 17;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,4 +14,5 @@ const thanksMap = {
|
|||||||
'wxdjs': 'https://github.com/wxdjs',
|
'wxdjs': 'https://github.com/wxdjs',
|
||||||
'Aeorq': 'https://github.com/Aeorq',
|
'Aeorq': 'https://github.com/Aeorq',
|
||||||
'jaychoubaby': 'https://github.com/jaychoubaby',
|
'jaychoubaby': 'https://github.com/jaychoubaby',
|
||||||
|
'allonmymind': 'https://github.com/allonmymind',
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"added2List": "Zur Aufgabenliste hinzugefügt",
|
"added2List": "Zur Aufgabenliste hinzugefügt",
|
||||||
"all": "Alle",
|
"all": "Alle",
|
||||||
"alreadyLastDir": "Bereits im letzten Verzeichnis.",
|
"alreadyLastDir": "Bereits im letzten Verzeichnis.",
|
||||||
|
"alterHost": "Alternative Gastgeber",
|
||||||
"attention": "Achtung",
|
"attention": "Achtung",
|
||||||
"auto": "System folgen",
|
"auto": "System folgen",
|
||||||
"autoUpdateHomeWidget": "Home-Widget automatisch aktualisieren",
|
"autoUpdateHomeWidget": "Home-Widget automatisch aktualisieren",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"added2List": "Added to task list",
|
"added2List": "Added to task list",
|
||||||
"all": "All",
|
"all": "All",
|
||||||
"alreadyLastDir": "Already in last directory.",
|
"alreadyLastDir": "Already in last directory.",
|
||||||
|
"alterHost": "Alter host",
|
||||||
"attention": "Attention",
|
"attention": "Attention",
|
||||||
"auto": "Auto",
|
"auto": "Auto",
|
||||||
"autoUpdateHomeWidget": "Auto update home widget",
|
"autoUpdateHomeWidget": "Auto update home widget",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"added2List": "已添加至任务列表",
|
"added2List": "已添加至任务列表",
|
||||||
"all": "所有",
|
"all": "所有",
|
||||||
"alreadyLastDir": "已经是最上层目录了",
|
"alreadyLastDir": "已经是最上层目录了",
|
||||||
|
"alterHost": "备选主机",
|
||||||
"attention": "注意",
|
"attention": "注意",
|
||||||
"auto": "自动",
|
"auto": "自动",
|
||||||
"autoUpdateHomeWidget": "自动更新桌面小部件",
|
"autoUpdateHomeWidget": "自动更新桌面小部件",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"added2List": "已添加至任務列表",
|
"added2List": "已添加至任務列表",
|
||||||
"all": "所有",
|
"all": "所有",
|
||||||
"alreadyLastDir": "已經是最上層目錄了",
|
"alreadyLastDir": "已經是最上層目錄了",
|
||||||
|
"alterHost": "備選主機",
|
||||||
"attention": "注意",
|
"attention": "注意",
|
||||||
"auto": "自動",
|
"auto": "自動",
|
||||||
"autoUpdateHomeWidget": "自動更新桌面小部件",
|
"autoUpdateHomeWidget": "自動更新桌面小部件",
|
||||||
|
|||||||
@@ -30,11 +30,13 @@ class ServerEditPage extends StatefulWidget {
|
|||||||
class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
||||||
final _nameController = TextEditingController();
|
final _nameController = TextEditingController();
|
||||||
final _ipController = TextEditingController();
|
final _ipController = TextEditingController();
|
||||||
|
final _alterHostController = TextEditingController();
|
||||||
final _portController = TextEditingController();
|
final _portController = TextEditingController();
|
||||||
final _usernameController = TextEditingController();
|
final _usernameController = TextEditingController();
|
||||||
final _passwordController = TextEditingController();
|
final _passwordController = TextEditingController();
|
||||||
final _nameFocus = FocusNode();
|
final _nameFocus = FocusNode();
|
||||||
final _ipFocus = FocusNode();
|
final _ipFocus = FocusNode();
|
||||||
|
final _alterHostFocus = FocusNode();
|
||||||
final _portFocus = FocusNode();
|
final _portFocus = FocusNode();
|
||||||
final _usernameFocus = FocusNode();
|
final _usernameFocus = FocusNode();
|
||||||
|
|
||||||
@@ -118,12 +120,20 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
|||||||
Input(
|
Input(
|
||||||
controller: _ipController,
|
controller: _ipController,
|
||||||
type: TextInputType.text,
|
type: TextInputType.text,
|
||||||
onSubmitted: (_) => _focusScope.requestFocus(_portFocus),
|
onSubmitted: (_) => _focusScope.requestFocus(_alterHostFocus),
|
||||||
node: _ipFocus,
|
node: _ipFocus,
|
||||||
label: _s.host,
|
label: _s.host,
|
||||||
icon: Icons.storage,
|
icon: Icons.computer,
|
||||||
hint: 'example.com',
|
hint: 'example.com',
|
||||||
),
|
),
|
||||||
|
Input(
|
||||||
|
controller: _alterHostController,
|
||||||
|
type: TextInputType.text,
|
||||||
|
node: _alterHostFocus,
|
||||||
|
onSubmitted: (_) => _focusScope.requestFocus(_portFocus),
|
||||||
|
label: _s.alterHost,
|
||||||
|
icon: Icons.computer,
|
||||||
|
),
|
||||||
Input(
|
Input(
|
||||||
controller: _portController,
|
controller: _portController,
|
||||||
type: TextInputType.number,
|
type: TextInputType.number,
|
||||||
@@ -280,6 +290,9 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
|||||||
pwd: authorization,
|
pwd: authorization,
|
||||||
pubKeyId: usePublicKey ? _keyInfo!.id : null,
|
pubKeyId: usePublicKey ? _keyInfo!.id : null,
|
||||||
tags: _tags,
|
tags: _tags,
|
||||||
|
alterHost: _alterHostController.text == ''
|
||||||
|
? null
|
||||||
|
: _alterHostController.text,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (widget.spi == null) {
|
if (widget.spi == null) {
|
||||||
@@ -321,6 +334,7 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
|||||||
if (widget.spi?.tags != null) {
|
if (widget.spi?.tags != null) {
|
||||||
_tags = widget.spi!.tags!;
|
_tags = widget.spi!.tags!;
|
||||||
}
|
}
|
||||||
|
_alterHostController.text = widget.spi?.alterHost ?? '';
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -869,7 +869,7 @@ class _SettingPageState extends State<SettingPage> {
|
|||||||
Widget _buildAndroidWidgetSharedPreference() {
|
Widget _buildAndroidWidgetSharedPreference() {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text(_s.homeWidgetUrlConfig),
|
title: Text(_s.homeWidgetUrlConfig),
|
||||||
trailing: const Icon(Icons.arrow_forward_ios, size: 13),
|
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
final data = <String, String>{};
|
final data = <String, String>{};
|
||||||
_sp.getKeys().forEach((key) {
|
_sp.getKeys().forEach((key) {
|
||||||
|
|||||||
@@ -475,9 +475,9 @@
|
|||||||
baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */;
|
baseConfigurationReference = C1C758C41C4E208965A68933 /* Pods-RunnerTests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -490,9 +490,9 @@
|
|||||||
baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */;
|
baseConfigurationReference = 15AF97DF993E8968098D6EBE /* Pods-RunnerTests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -505,9 +505,9 @@
|
|||||||
baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */;
|
baseConfigurationReference = 7CFA7DE7FABA75685DFB6948 /* Pods-RunnerTests.profile.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CURRENT_PROJECT_VERSION = 388;
|
CURRENT_PROJECT_VERSION = 389;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
MARKETING_VERSION = 1.0.388;
|
MARKETING_VERSION = 1.0.389;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
PRODUCT_BUNDLE_IDENTIFIER = tech.lolli.serverBox.RunnerTests;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|||||||
Reference in New Issue
Block a user