From dac01b416e86d94d35630de6fcf1dd3f2b315545 Mon Sep 17 00:00:00 2001 From: csf Date: Mon, 26 Sep 2022 11:21:40 +0800 Subject: [PATCH] android add settings ['Deny LAN Discovery', 'Use IP Whitelisting'] --- flutter/lib/common.dart | 10 ++- flutter/lib/common/widgets/dialog.dart | 83 ++++++++++++++++++ .../desktop/pages/desktop_setting_page.dart | 85 ------------------- flutter/lib/mobile/pages/server_page.dart | 4 +- flutter/lib/mobile/pages/settings_page.dart | 69 ++++++++++++++- flutter/lib/models/server_model.dart | 2 +- 6 files changed, 159 insertions(+), 94 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index dcdc191ff..aee5a73af 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -130,9 +130,10 @@ class MyTheme { backgroundColor: Color(0xFFFFFFFF), scaffoldBackgroundColor: Color(0xFFEEEEEE), textTheme: const TextTheme( - titleLarge: TextStyle(fontSize: 19, color: Colors.black87), - bodySmall: - TextStyle(fontSize: 12, color: Colors.black54, height: 1.25)), + titleLarge: TextStyle(fontSize: 19, color: Colors.black87), + bodySmall: TextStyle(fontSize: 12, color: Colors.black54, height: 1.25), + bodyMedium: TextStyle(fontSize: 14, color: Colors.black54, height: 1.25), + ), hintColor: Color(0xFFAAAAAA), primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, @@ -159,7 +160,8 @@ class MyTheme { scaffoldBackgroundColor: Color(0xFF141414), textTheme: const TextTheme( titleLarge: TextStyle(fontSize: 19), - bodySmall: TextStyle(fontSize: 12, height: 1.25)), + bodySmall: TextStyle(fontSize: 12, height: 1.25), + bodyMedium: TextStyle(fontSize: 14, height: 1.25)), cardColor: Color(0xFF252525), primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, diff --git a/flutter/lib/common/widgets/dialog.dart b/flutter/lib/common/widgets/dialog.dart index 82e4fb5cc..cfb57a4cb 100644 --- a/flutter/lib/common/widgets/dialog.dart +++ b/flutter/lib/common/widgets/dialog.dart @@ -72,3 +72,86 @@ void changeIdDialog() { ); }); } + +void changeWhiteList({Function()? callback}) async { + var newWhiteList = (await bind.mainGetOption(key: 'whitelist')).split(','); + var newWhiteListField = newWhiteList.join('\n'); + var controller = TextEditingController(text: newWhiteListField); + var msg = ""; + var isInProgress = false; + gFFI.dialogManager.show((setState, close) { + return CustomAlertDialog( + title: Text(translate("IP Whitelisting")), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(translate("whitelist_sep")), + const SizedBox( + height: 8.0, + ), + Row( + children: [ + Expanded( + child: TextField( + maxLines: null, + decoration: InputDecoration( + border: const OutlineInputBorder(), + errorText: msg.isEmpty ? null : translate(msg), + ), + controller: controller, + focusNode: FocusNode()..requestFocus()), + ), + ], + ), + const SizedBox( + height: 4.0, + ), + Offstage( + offstage: !isInProgress, child: const LinearProgressIndicator()) + ], + ), + actions: [ + TextButton(onPressed: close, child: Text(translate("Cancel"))), + TextButton( + onPressed: () async { + await bind.mainSetOption(key: 'whitelist', value: ''); + callback?.call(); + close(); + }, + child: Text(translate("Clear"))), + TextButton( + onPressed: () async { + setState(() { + msg = ""; + isInProgress = true; + }); + newWhiteListField = controller.text.trim(); + var newWhiteList = ""; + if (newWhiteListField.isEmpty) { + // pass + } else { + final ips = + newWhiteListField.trim().split(RegExp(r"[\s,;\n]+")); + // test ip + final ipMatch = RegExp(r"^\d+\.\d+\.\d+\.\d+$"); + for (final ip in ips) { + if (!ipMatch.hasMatch(ip)) { + msg = "${translate("Invalid IP")} $ip"; + setState(() { + isInProgress = false; + }); + return; + } + } + newWhiteList = ips.join(','); + } + await bind.mainSetOption(key: 'whitelist', value: newWhiteList); + callback?.call(); + close(); + }, + child: Text(translate("OK"))), + ], + onCancel: close, + ); + }); +} diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 10044d8f0..1f11a6fc5 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -1320,91 +1320,6 @@ void changeServer() async { }); } -void changeWhiteList({Function()? callback}) async { - Map oldOptions = jsonDecode(await bind.mainGetOptions()); - var newWhiteList = ((oldOptions['whitelist'] ?? "") as String).split(','); - var newWhiteListField = newWhiteList.join('\n'); - var controller = TextEditingController(text: newWhiteListField); - var msg = ""; - var isInProgress = false; - gFFI.dialogManager.show((setState, close) { - return CustomAlertDialog( - title: Text(translate("IP Whitelisting")), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(translate("whitelist_sep")), - const SizedBox( - height: 8.0, - ), - Row( - children: [ - Expanded( - child: TextField( - maxLines: null, - decoration: InputDecoration( - border: const OutlineInputBorder(), - errorText: msg.isEmpty ? null : translate(msg), - ), - controller: controller, - focusNode: FocusNode()..requestFocus()), - ), - ], - ), - const SizedBox( - height: 4.0, - ), - Offstage( - offstage: !isInProgress, child: const LinearProgressIndicator()) - ], - ), - actions: [ - TextButton(onPressed: close, child: Text(translate("Cancel"))), - TextButton( - onPressed: () async { - await bind.mainSetOption(key: 'whitelist', value: ''); - callback?.call(); - close(); - }, - child: Text(translate("Clear"))), - TextButton( - onPressed: () async { - setState(() { - msg = ""; - isInProgress = true; - }); - newWhiteListField = controller.text.trim(); - var newWhiteList = ""; - if (newWhiteListField.isEmpty) { - // pass - } else { - final ips = - newWhiteListField.trim().split(RegExp(r"[\s,;\n]+")); - // test ip - final ipMatch = RegExp(r"^\d+\.\d+\.\d+\.\d+$"); - for (final ip in ips) { - if (!ipMatch.hasMatch(ip)) { - msg = "${translate("Invalid IP")} $ip"; - setState(() { - isInProgress = false; - }); - return; - } - } - newWhiteList = ips.join(','); - } - oldOptions['whitelist'] = newWhiteList; - await bind.mainSetOptions(json: jsonEncode(oldOptions)); - callback?.call(); - close(); - }, - child: Text(translate("OK"))), - ], - onCancel: close, - ); - }); -} - void changeSocks5Proxy() async { var socks = await bind.mainGetSocks(); diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index cf2addf4a..52b378681 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -412,7 +412,9 @@ class ConnectionManager extends StatelessWidget { ? const SizedBox.shrink() : Text( translate("android_new_connection_tip"), - style: const TextStyle(color: Colors.black54), + style: Theme.of(globalKey.currentContext!) + .textTheme + .bodyMedium, ), client.authorized ? ElevatedButton.icon( diff --git a/flutter/lib/mobile/pages/settings_page.dart b/flutter/lib/mobile/pages/settings_page.dart index 985fe2df0..2c16a7991 100644 --- a/flutter/lib/mobile/pages/settings_page.dart +++ b/flutter/lib/mobile/pages/settings_page.dart @@ -2,12 +2,14 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:provider/provider.dart'; import 'package:settings_ui/settings_ui.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../common.dart'; +import '../../common/widgets/dialog.dart'; import '../../models/model.dart'; import '../../models/platform_model.dart'; import '../widgets/dialog.dart'; @@ -32,6 +34,8 @@ const url = 'https://rustdesk.com/'; final _hasIgnoreBattery = androidVersion >= 26; var _ignoreBatteryOpt = false; var _enableAbr = false; +var _denyLANDiscovery = false; +var _onlyWhiteList = false; class _SettingsState extends State with WidgetsBindingObserver { String? username; @@ -59,6 +63,20 @@ class _SettingsState extends State with WidgetsBindingObserver { _enableAbr = enableAbrRes; } + final denyLanDiscovery = !option2bool('enable-lan-discovery', + await bind.mainGetOption(key: 'enable-lan-discovery')); + if (denyLanDiscovery != _denyLANDiscovery) { + update = true; + _denyLANDiscovery = denyLanDiscovery; + } + + final onlyWhiteList = + (await bind.mainGetOption(key: 'whitelist')).isNotEmpty; + if (onlyWhiteList != _onlyWhiteList) { + update = true; + _onlyWhiteList = onlyWhiteList; + } + if (update) { setState(() {}); } @@ -99,14 +117,55 @@ class _SettingsState extends State with WidgetsBindingObserver { SettingsTile.switchTile( title: Text('${translate('Adaptive Bitrate')} (beta)'), initialValue: _enableAbr, - onToggle: (v) { - bind.mainSetOption(key: "enable-abr", value: v ? "" : "N"); + onToggle: (v) async { + await bind.mainSetOption(key: "enable-abr", value: v ? "" : "N"); + final newValue = await bind.mainGetOption(key: "enable-abr") != "N"; setState(() { - _enableAbr = !_enableAbr; + _enableAbr = newValue; }); }, ) ]; + final shareScreenTiles = [ + SettingsTile.switchTile( + title: Text(translate('Deny LAN Discovery')), + initialValue: _denyLANDiscovery, + onToggle: (v) async { + await bind.mainSetOption( + key: "enable-lan-discovery", + value: bool2option("enable-lan-discovery", !v)); + final newValue = !option2bool('enable-lan-discovery', + await bind.mainGetOption(key: 'enable-lan-discovery')); + setState(() { + _denyLANDiscovery = newValue; + }); + }, + ), + SettingsTile.switchTile( + title: Row(children: [ + Text(translate('Use IP Whitelisting')), + Offstage( + offstage: !_onlyWhiteList, + child: const Icon(Icons.warning_amber_rounded, + color: Color.fromARGB(255, 255, 204, 0))) + .marginOnly(left: 5) + ]), + initialValue: _onlyWhiteList, + onToggle: (_) async { + update() async { + final onlyWhiteList = + (await bind.mainGetOption(key: 'whitelist')).isNotEmpty; + if (onlyWhiteList != _onlyWhiteList) { + setState(() { + _onlyWhiteList = onlyWhiteList; + }); + } + } + + changeWhiteList(callback: update); + }, + ) + ]; if (_hasIgnoreBattery) { enhancementsTiles.insert( 0, @@ -182,6 +241,10 @@ class _SettingsState extends State with WidgetsBindingObserver { }, ) ]), + SettingsSection( + title: Text(translate("Share Screen")), + tiles: shareScreenTiles, + ), SettingsSection( title: Text(translate("Enhancements")), tiles: enhancementsTiles, diff --git a/flutter/lib/models/server_model.dart b/flutter/lib/models/server_model.dart index a26fe5062..5e3fb755e 100644 --- a/flutter/lib/models/server_model.dart +++ b/flutter/lib/models/server_model.dart @@ -436,7 +436,7 @@ class ServerModel with ChangeNotifier { clientInfo(client), Text( translate("android_new_connection_tip"), - style: const TextStyle(color: Colors.black54), + style: Theme.of(globalKey.currentContext!).textTheme.bodyMedium, ), ], ),