android add settings ['Deny LAN Discovery', 'Use IP Whitelisting']
This commit is contained in:
parent
95f7677d2b
commit
dac01b416e
flutter/lib
@ -130,9 +130,10 @@ class MyTheme {
|
|||||||
backgroundColor: Color(0xFFFFFFFF),
|
backgroundColor: Color(0xFFFFFFFF),
|
||||||
scaffoldBackgroundColor: Color(0xFFEEEEEE),
|
scaffoldBackgroundColor: Color(0xFFEEEEEE),
|
||||||
textTheme: const TextTheme(
|
textTheme: const TextTheme(
|
||||||
titleLarge: TextStyle(fontSize: 19, color: Colors.black87),
|
titleLarge: TextStyle(fontSize: 19, color: Colors.black87),
|
||||||
bodySmall:
|
bodySmall: TextStyle(fontSize: 12, color: Colors.black54, height: 1.25),
|
||||||
TextStyle(fontSize: 12, color: Colors.black54, height: 1.25)),
|
bodyMedium: TextStyle(fontSize: 14, color: Colors.black54, height: 1.25),
|
||||||
|
),
|
||||||
hintColor: Color(0xFFAAAAAA),
|
hintColor: Color(0xFFAAAAAA),
|
||||||
primarySwatch: Colors.blue,
|
primarySwatch: Colors.blue,
|
||||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||||
@ -159,7 +160,8 @@ class MyTheme {
|
|||||||
scaffoldBackgroundColor: Color(0xFF141414),
|
scaffoldBackgroundColor: Color(0xFF141414),
|
||||||
textTheme: const TextTheme(
|
textTheme: const TextTheme(
|
||||||
titleLarge: TextStyle(fontSize: 19),
|
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),
|
cardColor: Color(0xFF252525),
|
||||||
primarySwatch: Colors.blue,
|
primarySwatch: Colors.blue,
|
||||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||||
|
@ -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,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -1320,91 +1320,6 @@ void changeServer() async {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void changeWhiteList({Function()? callback}) async {
|
|
||||||
Map<String, dynamic> 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 {
|
void changeSocks5Proxy() async {
|
||||||
var socks = await bind.mainGetSocks();
|
var socks = await bind.mainGetSocks();
|
||||||
|
|
||||||
|
@ -412,7 +412,9 @@ class ConnectionManager extends StatelessWidget {
|
|||||||
? const SizedBox.shrink()
|
? const SizedBox.shrink()
|
||||||
: Text(
|
: Text(
|
||||||
translate("android_new_connection_tip"),
|
translate("android_new_connection_tip"),
|
||||||
style: const TextStyle(color: Colors.black54),
|
style: Theme.of(globalKey.currentContext!)
|
||||||
|
.textTheme
|
||||||
|
.bodyMedium,
|
||||||
),
|
),
|
||||||
client.authorized
|
client.authorized
|
||||||
? ElevatedButton.icon(
|
? ElevatedButton.icon(
|
||||||
|
@ -2,12 +2,14 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:settings_ui/settings_ui.dart';
|
import 'package:settings_ui/settings_ui.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
import '../../common.dart';
|
import '../../common.dart';
|
||||||
|
import '../../common/widgets/dialog.dart';
|
||||||
import '../../models/model.dart';
|
import '../../models/model.dart';
|
||||||
import '../../models/platform_model.dart';
|
import '../../models/platform_model.dart';
|
||||||
import '../widgets/dialog.dart';
|
import '../widgets/dialog.dart';
|
||||||
@ -32,6 +34,8 @@ const url = 'https://rustdesk.com/';
|
|||||||
final _hasIgnoreBattery = androidVersion >= 26;
|
final _hasIgnoreBattery = androidVersion >= 26;
|
||||||
var _ignoreBatteryOpt = false;
|
var _ignoreBatteryOpt = false;
|
||||||
var _enableAbr = false;
|
var _enableAbr = false;
|
||||||
|
var _denyLANDiscovery = false;
|
||||||
|
var _onlyWhiteList = false;
|
||||||
|
|
||||||
class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
||||||
String? username;
|
String? username;
|
||||||
@ -59,6 +63,20 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
_enableAbr = enableAbrRes;
|
_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) {
|
if (update) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
@ -99,14 +117,55 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
SettingsTile.switchTile(
|
SettingsTile.switchTile(
|
||||||
title: Text('${translate('Adaptive Bitrate')} (beta)'),
|
title: Text('${translate('Adaptive Bitrate')} (beta)'),
|
||||||
initialValue: _enableAbr,
|
initialValue: _enableAbr,
|
||||||
onToggle: (v) {
|
onToggle: (v) async {
|
||||||
bind.mainSetOption(key: "enable-abr", value: v ? "" : "N");
|
await bind.mainSetOption(key: "enable-abr", value: v ? "" : "N");
|
||||||
|
final newValue = await bind.mainGetOption(key: "enable-abr") != "N";
|
||||||
setState(() {
|
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) {
|
if (_hasIgnoreBattery) {
|
||||||
enhancementsTiles.insert(
|
enhancementsTiles.insert(
|
||||||
0,
|
0,
|
||||||
@ -182,6 +241,10 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
|
SettingsSection(
|
||||||
|
title: Text(translate("Share Screen")),
|
||||||
|
tiles: shareScreenTiles,
|
||||||
|
),
|
||||||
SettingsSection(
|
SettingsSection(
|
||||||
title: Text(translate("Enhancements")),
|
title: Text(translate("Enhancements")),
|
||||||
tiles: enhancementsTiles,
|
tiles: enhancementsTiles,
|
||||||
|
@ -436,7 +436,7 @@ class ServerModel with ChangeNotifier {
|
|||||||
clientInfo(client),
|
clientInfo(client),
|
||||||
Text(
|
Text(
|
||||||
translate("android_new_connection_tip"),
|
translate("android_new_connection_tip"),
|
||||||
style: const TextStyle(color: Colors.black54),
|
style: Theme.of(globalKey.currentContext!).textTheme.bodyMedium,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user