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:
Junyuan Feng
2022-05-24 12:44:12 +08:00
parent f60b09abe4
commit cb5aed8e79
12 changed files with 79 additions and 70 deletions

View File

@@ -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";

View File

@@ -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;
} }

View File

@@ -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,

View File

@@ -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;

View File

@@ -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]));
} }

View File

@@ -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;
} }

View File

@@ -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":

View File

@@ -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: [],

View File

@@ -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",

View File

@@ -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(
height: _media.size.height * 0.4,
child: Padding(
padding: EdgeInsets.all(17),
child: RoundRectCard(
SingleChildScrollView(
padding: EdgeInsets.all(17),
child: Text(
apt.error!, apt.error!,
textAlign: TextAlign.center, textAlign: TextAlign.center,
)),
),
),
), ),
], ],
); );

View File

@@ -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;

View File

@@ -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;