Added save dns settings

This commit is contained in:
Juan Gilsanz Polo 2022-10-19 22:47:34 +02:00
parent bfe2572e04
commit 5e955c5bb7
8 changed files with 365 additions and 10 deletions

View file

@ -469,5 +469,9 @@
"blockingIpv4Description": "IP address to be returned for a blocked A request", "blockingIpv4Description": "IP address to be returned for a blocked A request",
"blockingIpv6": "Blocking IPv6", "blockingIpv6": "Blocking IPv6",
"blockingIpv6Description": "IP address to be returned for a blocked AAAA request", "blockingIpv6Description": "IP address to be returned for a blocked AAAA request",
"invalidIp": "Invalid IP address" "invalidIp": "Invalid IP address",
"dnsConfigSaved": "DNS server configuration saved successfully",
"dnsConfigNotSaved": "The DNS server configuration could not be saved",
"savingConfig": "Saving configuration...",
"someValueNotValid": "Some value is not valid"
} }

View file

@ -469,5 +469,9 @@
"blockingIpv4Description": "Dirección IP devolverá una petición A bloqueada", "blockingIpv4Description": "Dirección IP devolverá una petición A bloqueada",
"blockingIpv6": "Bloqueo de IPv6", "blockingIpv6": "Bloqueo de IPv6",
"blockingIpv6Description": "Dirección IP devolverá una petición AAAA bloqueada", "blockingIpv6Description": "Dirección IP devolverá una petición AAAA bloqueada",
"invalidIp": "Dirección IP no válida" "invalidIp": "Dirección IP no válida",
"dnsConfigSaved": "La configuración del servidor DNS se ha guardado correctamente",
"dnsConfigNotSaved": "La configuración del servidor DNS no ha podido ser guardada",
"savingConfig": "Guardando configuración...",
"someValueNotValid": "Algún valor no es válido"
} }

View file

@ -1,7 +1,15 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
class BootstrapDnsScreen extends StatefulWidget { class BootstrapDnsScreen extends StatefulWidget {
final ServersProvider serversProvider; final ServersProvider serversProvider;
@ -60,13 +68,60 @@ class _BootstrapDnsScreenState extends State<BootstrapDnsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
void saveData() async {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingConfig);
final result = await setDnsConfig(server: serversProvider.selectedServer!, data: {
"bootstrap_dns": bootstrapControllers.map((e) => e['controller'].text).toList(),
});
processModal.close();
if (result['result'] == 'success') {
DnsInfoData data = serversProvider.dnsInfo.data!;
data.bootstrapDns = List<String>.from(bootstrapControllers.map((e) => e['controller'].text));
serversProvider.setDnsInfoData(data);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigSaved,
color: Colors.green
);
}
else if (result['log'] != null && result['log'].statusCode == '400') {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.someValueNotValid,
color: Colors.red
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,
color: Colors.red
);
}
}
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(AppLocalizations.of(context)!.bootstrapDns), title: Text(AppLocalizations.of(context)!.bootstrapDns),
actions: [ actions: [
IconButton( IconButton(
onPressed: validValues == true onPressed: validValues == true
? () => {} ? () => saveData()
: null, : null,
icon: const Icon(Icons.save_rounded), icon: const Icon(Icons.save_rounded),
tooltip: AppLocalizations.of(context)!.save, tooltip: AppLocalizations.of(context)!.save,
@ -164,6 +219,7 @@ class _BootstrapDnsScreenState extends State<BootstrapDnsScreen> {
), ),
], ],
), ),
const SizedBox(height: 20)
], ],
), ),
); );

View file

@ -1,10 +1,19 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart'; import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
class CacheConfigDnsScreen extends StatefulWidget { class CacheConfigDnsScreen extends StatefulWidget {
final ServersProvider serversProvider; final ServersProvider serversProvider;
@ -59,7 +68,58 @@ class _CacheConfigDnsScreenState extends State<CacheConfigDnsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
void saveData() async {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingConfig);
final result = await setDnsConfig(server: serversProvider.selectedServer!, data: {
"cache_size": int.parse(cacheSizeController.text),
"cache_ttl_min": int.parse(overrideMinTtlController.text),
"cache_ttl_max": int.parse(overrideMaxTtlController.text),
"cache_optimistic": optimisticCache
});
processModal.close();
if (result['result'] == 'success') {
DnsInfoData data = serversProvider.dnsInfo.data!;
data.cacheSize = int.parse(cacheSizeController.text);
data.cacheTtlMin = int.parse(overrideMinTtlController.text);
data.cacheTtlMax = int.parse(overrideMaxTtlController.text);
data.cacheOptimistic = optimisticCache;
serversProvider.setDnsInfoData(data);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigSaved,
color: Colors.green
);
}
else if (result['log'] != null && result['log'].statusCode == '400') {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.someValueNotValid,
color: Colors.red
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,
color: Colors.red
);
}
}
Widget numericField({ Widget numericField({
required TextEditingController controller, required TextEditingController controller,
required String label, required String label,
@ -95,7 +155,7 @@ class _CacheConfigDnsScreenState extends State<CacheConfigDnsScreen> {
actions: [ actions: [
IconButton( IconButton(
onPressed: validData == true onPressed: validData == true
? () => {} ? () => saveData()
: null, : null,
icon: const Icon(Icons.save_rounded), icon: const Icon(Icons.save_rounded),
tooltip: AppLocalizations.of(context)!.save, tooltip: AppLocalizations.of(context)!.save,

View file

@ -1,4 +1,7 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/widgets/custom_radio_list_tile.dart'; import 'package:adguard_home_manager/widgets/custom_radio_list_tile.dart';
@ -6,6 +9,11 @@ import 'package:adguard_home_manager/screens/settings/section_label.dart';
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart'; import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
class DnsServerSettingsScreen extends StatefulWidget { class DnsServerSettingsScreen extends StatefulWidget {
final ServersProvider serversProvider; final ServersProvider serversProvider;
@ -94,6 +102,62 @@ class _DnsServerSettingsScreenState extends State<DnsServerSettingsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
void saveData() async {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingConfig);
final result = await setDnsConfig(server: serversProvider.selectedServer!, data: {
"ratelimit": int.parse(limitRequestsController.text),
"edns_cs_enabled": enableEdns,
"dnssec_enabled": enableDnssec,
"disable_ipv6": disableIpv6Resolving,
"blocking_mode": blockingMode
});
processModal.close();
if (result['result'] == 'success') {
DnsInfoData data = serversProvider.dnsInfo.data!;
data.ratelimit = int.parse(limitRequestsController.text);
data.ednsCsEnabled = enableEdns;
data.dnssecEnabled = enableDnssec;
data.disableIpv6 = disableIpv6Resolving;
data.blockingMode = blockingMode;
data.blockingIpv4 = ipv4controller.text;
data.blockingIpv6 = ipv6controller.text;
serversProvider.setDnsInfoData(data);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigSaved,
color: Colors.green
);
}
else if (result['log'] != null && result['log'].statusCode == '400') {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.someValueNotValid,
color: Colors.red
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,
color: Colors.red
);
}
}
void updateBlockingMode(String mode) { void updateBlockingMode(String mode) {
if (mode != 'custom_ip') { if (mode != 'custom_ip') {
@ -112,7 +176,7 @@ class _DnsServerSettingsScreenState extends State<DnsServerSettingsScreen> {
actions: [ actions: [
IconButton( IconButton(
onPressed: isDataValid == true onPressed: isDataValid == true
? () => {} ? () => saveData()
: null, : null,
icon: const Icon(Icons.save_rounded), icon: const Icon(Icons.save_rounded),
tooltip: AppLocalizations.of(context)!.save, tooltip: AppLocalizations.of(context)!.save,

View file

@ -1,9 +1,17 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart'; import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
class PrivateReverseDnsServersScreen extends StatefulWidget { class PrivateReverseDnsServersScreen extends StatefulWidget {
final ServersProvider serversProvider; final ServersProvider serversProvider;
@ -48,7 +56,6 @@ class _PrivateReverseDnsServersScreenState extends State<PrivateReverseDnsServer
if ( if (
( (
editReverseResolvers == true && editReverseResolvers == true &&
reverseResolversControllers.isNotEmpty &&
reverseResolversControllers.every((element) => element['controller'].text != '') && reverseResolversControllers.every((element) => element['controller'].text != '') &&
reverseResolversControllers.every((element) => element['error'] == null) reverseResolversControllers.every((element) => element['error'] == null)
) == true ) == true
@ -68,10 +75,10 @@ class _PrivateReverseDnsServersScreenState extends State<PrivateReverseDnsServer
for (var item in widget.serversProvider.dnsInfo.data!.localPtrUpstreams) { for (var item in widget.serversProvider.dnsInfo.data!.localPtrUpstreams) {
final controller = TextEditingController(); final controller = TextEditingController();
controller.text = item; controller.text = item;
reverseResolversControllers.add({ reverseResolversControllers = [{
'controller': controller, 'controller': controller,
'error': null 'error': null
}); }];
} }
if (widget.serversProvider.dnsInfo.data!.localPtrUpstreams.isNotEmpty) { if (widget.serversProvider.dnsInfo.data!.localPtrUpstreams.isNotEmpty) {
editReverseResolvers = true; editReverseResolvers = true;
@ -84,13 +91,70 @@ class _PrivateReverseDnsServersScreenState extends State<PrivateReverseDnsServer
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
void saveData() async {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingConfig);
final result = await setDnsConfig(server: serversProvider.selectedServer!, data: editReverseResolvers == true
? {
"local_ptr_upstreams": List<String>.from(reverseResolversControllers.map((e) => e['controller'].text)),
"use_private_ptr_resolvers": usePrivateReverseDnsResolvers,
"resolve_clients": enableReverseResolve
} : {
"use_private_ptr_resolvers": usePrivateReverseDnsResolvers,
"resolve_clients": enableReverseResolve
});
processModal.close();
if (result['result'] == 'success') {
DnsInfoData data = serversProvider.dnsInfo.data!;
if (editReverseResolvers == true) {
data.localPtrUpstreams = List<String>.from(reverseResolversControllers.map((e) => e['controller'].text));
}
data.usePrivatePtrResolvers = usePrivateReverseDnsResolvers;
data.resolveClients = enableReverseResolve;
serversProvider.setDnsInfoData(data);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigSaved,
color: Colors.green
);
}
else if (result['log'] != null && result['log'].statusCode == '400') {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.someValueNotValid,
color: Colors.red
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,
color: Colors.red
);
}
}
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(AppLocalizations.of(context)!.privateReverseDnsServers), title: Text(AppLocalizations.of(context)!.privateReverseDnsServers),
actions: [ actions: [
IconButton( IconButton(
onPressed: validValues == true onPressed: validValues == true
? () => {} ? () => saveData()
: null, : null,
icon: const Icon(Icons.save_rounded), icon: const Icon(Icons.save_rounded),
tooltip: AppLocalizations.of(context)!.save, tooltip: AppLocalizations.of(context)!.save,

View file

@ -1,9 +1,17 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/settings/section_label.dart'; import 'package:adguard_home_manager/screens/settings/section_label.dart';
import 'package:adguard_home_manager/widgets/custom_radio_list_tile.dart'; import 'package:adguard_home_manager/widgets/custom_radio_list_tile.dart';
import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
class UpstreamDnsScreen extends StatefulWidget { class UpstreamDnsScreen extends StatefulWidget {
@ -51,13 +59,62 @@ class _UpstreamDnsScreenState extends State<UpstreamDnsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
void saveData() async {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingConfig);
final result = await setDnsConfig(server: serversProvider.selectedServer!, data: {
"upstream_dns": upstreamControllers.map((e) => e.text).toList(),
"upstream_mode": upstreamMode
});
processModal.close();
if (result['result'] == 'success') {
DnsInfoData data = serversProvider.dnsInfo.data!;
data.upstreamDns = upstreamControllers.map((e) => e.text).toList();
data.upstreamMode = upstreamMode;
serversProvider.setDnsInfoData(data);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigSaved,
color: Colors.green
);
}
else if (result['log'] != null && result['log'].statusCode == '400') {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.someValueNotValid,
color: Colors.red
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
context: context,
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,
color: Colors.red
);
}
}
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(AppLocalizations.of(context)!.upstreamDns), title: Text(AppLocalizations.of(context)!.upstreamDns),
actions: [ actions: [
IconButton( IconButton(
onPressed: validValues == true onPressed: validValues == true
? () => {} ? () => saveData()
: null, : null,
icon: const Icon(Icons.save_rounded), icon: const Icon(Icons.save_rounded),
tooltip: AppLocalizations.of(context)!.save, tooltip: AppLocalizations.of(context)!.save,

View file

@ -1654,4 +1654,50 @@ Future getDnsInfo({
else { else {
return result; return result;
} }
}
Future setDnsConfig({
required Server server,
required Map<String, dynamic> data,
}) async {
final result = await apiRequest(
urlPath: '/dns_config',
method: 'post',
server: server,
body: data,
type: 'set_dns_config'
);
if (result['hasResponse'] == true) {
if (result['statusCode'] == 200) {
return { 'result': 'success' };
}
if (result['statusCode'] == 400) {
return {
'result': 'error',
'log': AppLog(
type: 'set_dns_config',
dateTime: DateTime.now(),
message: 'data_not_valid',
statusCode: result['statusCode'].toString(),
resBody: result['body'],
)
};
}
else {
return {
'result': 'error',
'log': AppLog(
type: 'set_dns_config',
dateTime: DateTime.now(),
message: 'error_code_not_expected',
statusCode: result['statusCode'].toString(),
resBody: result['body'],
)
};
}
}
else {
return result;
}
} }