adguard-home-manager/lib/providers/servers_provider.dart

473 lines
12 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
2022-10-07 20:48:05 +02:00
import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/models/dhcp.dart';
2022-10-19 20:26:40 +02:00
import 'package:adguard_home_manager/models/dns_info.dart';
2022-10-15 14:47:32 +02:00
import 'package:adguard_home_manager/models/rewrite_rules.dart';
import 'package:adguard_home_manager/models/filtering_status.dart';
import 'package:adguard_home_manager/models/clients_allowed_blocked.dart';
2022-09-28 15:47:43 +02:00
import 'package:adguard_home_manager/models/clients.dart';
2022-09-27 14:29:36 +02:00
import 'package:adguard_home_manager/models/server_status.dart';
import 'package:adguard_home_manager/models/server.dart';
2022-10-22 23:06:27 +02:00
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/functions/conversions.dart';
class ServersProvider with ChangeNotifier {
Database? _dbInstance;
List<Server> _serversList = [];
Server? _selectedServer;
2022-09-27 14:29:36 +02:00
final ServerStatus _serverStatus = ServerStatus(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
); // serverStatus != null means server is connected
List<String> _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled
2022-09-28 15:47:43 +02:00
final Clients _clients = Clients(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
2022-10-07 20:48:05 +02:00
final Filtering _filtering = Filtering(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
final DhcpModel _dhcp = DhcpModel(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
2022-10-15 14:47:32 +02:00
final RewriteRules _rewriteRules = RewriteRules(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
2022-10-19 20:26:40 +02:00
final DnsInfo _dnsInfo = DnsInfo(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null
);
FilteringStatus? _filteringStatus;
List<Server> get serversList {
return _serversList;
}
Server? get selectedServer {
return _selectedServer;
}
2022-09-27 14:29:36 +02:00
ServerStatus get serverStatus {
2022-09-27 12:43:25 +02:00
return _serverStatus;
}
List<String> get protectionsManagementProcess {
return _protectionsManagementProcess;
}
2022-09-28 15:47:43 +02:00
Clients get clients {
return _clients;
}
FilteringStatus? get filteringStatus {
return _filteringStatus;
}
2022-10-07 20:48:05 +02:00
Filtering get filtering {
return _filtering;
}
DhcpModel get dhcp {
return _dhcp;
}
2022-10-15 14:47:32 +02:00
RewriteRules get rewriteRules {
return _rewriteRules;
}
2022-10-19 20:26:40 +02:00
DnsInfo get dnsInfo {
return _dnsInfo;
}
void setDbInstance(Database db) {
_dbInstance = db;
}
void addServer(Server server) {
_serversList.add(server);
notifyListeners();
}
2022-09-26 22:43:30 +02:00
void setSelectedServer(Server server) {
_selectedServer = server;
notifyListeners();
}
2022-09-27 14:29:36 +02:00
void setServerStatusData(ServerStatusData data) {
_serverStatus.data = data;
2022-09-26 22:43:30 +02:00
notifyListeners();
}
2022-09-27 14:29:36 +02:00
void setServerStatusLoad(int status) {
_serverStatus.loadStatus = status;
notifyListeners();
}
2022-09-28 15:47:43 +02:00
void setClientsLoadStatus(int status, bool notify) {
_clients.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
void setClientsData(ClientsData data) {
_clients.data = data;
notifyListeners();
}
void setAllowedDisallowedClientsBlockedDomains(ClientsAllowedBlocked data) {
_clients.data?.clientsAllowedBlocked = data;
notifyListeners();
}
void setFilteringStatus(FilteringStatus status) {
_filteringStatus = status;
notifyListeners();
}
2022-10-07 20:48:05 +02:00
void setFilteringData(FilteringData data) {
_filtering.data = data;
notifyListeners();
}
void setFilteringLoadStatus(int loadStatus, bool notify) {
_filtering.loadStatus = loadStatus;
if (notify == true) {
notifyListeners();
}
}
void setFilteringProtectionStatus(bool status) {
_serverStatus.data!.filteringEnabled = status;
2022-10-10 14:57:42 +02:00
_filtering.data!.enabled = status;
notifyListeners();
}
void setFiltersUpdateFrequency(int frequency) {
_filtering.data!.interval = frequency;
notifyListeners();
}
2022-10-10 15:57:47 +02:00
void setBlockedServices(List<String> blockedServices) {
_filtering.data!.blockedServices = blockedServices;
notifyListeners();
}
void setDhcpData(DhcpData data) {
_dhcp.data = data;
notifyListeners();
}
void setDhcpLoadStatus(int status, bool notify) {
_dhcp.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
2022-10-15 14:47:32 +02:00
void setRewriteRulesData(List<RewriteRulesData> data) {
_rewriteRules.data = data;
notifyListeners();
}
void setRewriteRulesLoadStatus(int status, bool notify) {
_rewriteRules.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
2022-10-19 20:26:40 +02:00
void setDnsInfoData(DnsInfoData data) {
_dnsInfo.data = data;
notifyListeners();
}
void setDnsInfoLoadStatus(int status, bool notify) {
_dnsInfo.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> createServer(Server server) async {
2022-09-26 18:49:41 +02:00
final saved = await saveServerIntoDb(server);
2022-11-01 19:41:41 +01:00
if (saved == null) {
2022-09-26 18:49:41 +02:00
if (server.defaultServer == true) {
final defaultServer = await setDefaultServer(server);
2022-11-01 19:41:41 +01:00
if (defaultServer == null) {
2022-09-26 18:49:41 +02:00
_serversList.add(server);
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
}
else {
2022-11-01 19:41:41 +01:00
return defaultServer;
2022-09-26 18:49:41 +02:00
}
}
else {
_serversList.add(server);
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
}
}
else {
2022-11-01 19:41:41 +01:00
return saved;
2022-09-26 18:49:41 +02:00
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> setDefaultServer(Server server) async {
2022-09-26 18:49:41 +02:00
final updated = await setDefaultServerDb(server.id);
2022-11-01 19:41:41 +01:00
if (updated == null) {
2022-09-26 18:49:41 +02:00
List<Server> newServers = _serversList.map((s) {
if (s.id == server.id) {
s.defaultServer = true;
return s;
}
else {
s.defaultServer = false;
return s;
}
}).toList();
_serversList = newServers;
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
}
else {
2022-11-01 19:41:41 +01:00
return updated;
2022-09-26 18:49:41 +02:00
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> editServer(Server server) async {
2022-09-26 22:43:30 +02:00
final result = await editServerDb(server);
2022-11-01 19:41:41 +01:00
if (result == null) {
2022-09-26 22:43:30 +02:00
List<Server> newServers = _serversList.map((s) {
if (s.id == server.id) {
return server;
}
else {
return s;
}
}).toList();
_serversList = newServers;
notifyListeners();
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 22:43:30 +02:00
}
else {
2022-11-01 19:41:41 +01:00
return result;
2022-09-26 22:43:30 +02:00
}
}
Future<bool> removeServer(Server server) async {
final result = await removeFromDb(server.id);
if (result == true) {
_selectedServer = null;
List<Server> newServers = _serversList.where((s) => s.id != server.id).toList();
_serversList = newServers;
notifyListeners();
return true;
}
else {
return false;
}
}
2022-10-03 22:41:19 +02:00
Future<dynamic> updateBlocking(Server server, String block, bool newStatus) async {
2022-09-27 22:49:58 +02:00
switch (block) {
case 'general':
_protectionsManagementProcess.add('general');
notifyListeners();
2022-09-27 22:49:58 +02:00
final result = await updateGeneralProtection(server, newStatus);
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList();
2022-09-27 22:49:58 +02:00
if (result['result'] == 'success') {
_serverStatus.data!.generalEnabled = newStatus;
notifyListeners();
2022-10-03 23:05:25 +02:00
return null;
2022-09-27 22:49:58 +02:00
}
else {
notifyListeners();
2022-10-03 22:41:19 +02:00
return result['log'];
2022-09-27 22:49:58 +02:00
}
case 'filtering':
_protectionsManagementProcess.add('filtering');
notifyListeners();
2022-09-27 22:49:58 +02:00
final result = await updateFiltering(server, newStatus);
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'filtering').toList();
2022-09-27 22:49:58 +02:00
if (result['result'] == 'success') {
_serverStatus.data!.filteringEnabled = newStatus;
notifyListeners();
2022-10-03 23:05:25 +02:00
return null;
2022-09-27 22:49:58 +02:00
}
else {
2022-10-03 22:41:19 +02:00
notifyListeners();
2022-10-03 22:41:19 +02:00
return result['log'];
2022-09-27 22:49:58 +02:00
}
case 'safeSearch':
_protectionsManagementProcess.add('safeSearch');
notifyListeners();
2022-09-27 22:49:58 +02:00
final result = await updateSafeSearch(server, newStatus);
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeSearch').toList();
2022-09-27 22:49:58 +02:00
if (result['result'] == 'success') {
_serverStatus.data!.safeSearchEnabled = newStatus;
notifyListeners();
2022-10-03 23:05:25 +02:00
return null;
2022-09-27 22:49:58 +02:00
}
else {
notifyListeners();
2022-10-03 22:41:19 +02:00
return result['log'];
2022-09-27 22:49:58 +02:00
}
case 'safeBrowsing':
_protectionsManagementProcess.add('safeBrowsing');
notifyListeners();
2022-09-27 22:49:58 +02:00
final result = await updateSafeBrowsing(server, newStatus);
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeBrowsing').toList();
2022-09-27 22:49:58 +02:00
if (result['result'] == 'success') {
_serverStatus.data!.safeBrowsingEnabled = newStatus;
notifyListeners();
2022-10-03 23:05:25 +02:00
return null;
2022-09-27 22:49:58 +02:00
}
else {
notifyListeners();
2022-10-03 22:41:19 +02:00
return result['log'];
2022-09-27 22:49:58 +02:00
}
case 'parentalControl':
_protectionsManagementProcess.add('parentalControl');
notifyListeners();
2022-09-27 22:49:58 +02:00
final result = await updateParentalControl(server, newStatus);
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'parentalControl').toList();
2022-09-27 22:49:58 +02:00
if (result['result'] == 'success') {
_serverStatus.data!.parentalControlEnabled = newStatus;
notifyListeners();
2022-10-03 23:05:25 +02:00
return null;
2022-09-27 22:49:58 +02:00
}
else {
notifyListeners();
2022-10-03 22:41:19 +02:00
return result['log'];
2022-09-27 22:49:58 +02:00
}
default:
return false;
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> saveServerIntoDb(Server server) async {
2022-09-26 18:49:41 +02:00
try {
return await _dbInstance!.transaction((txn) async {
await txn.rawInsert(
2022-11-04 10:56:14 +01:00
'INSERT INTO servers (id, name, connectionMethod, domain, path, port, user, password, defaultServer, authToken, runningOnHa) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[server.id, server.name, server.connectionMethod, server.domain, server.path, server.port, server.user, server.password, server.defaultServer, server.authToken, convertFromBoolToInt(server.runningOnHa)]
2022-09-26 22:43:30 +02:00
);
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 22:43:30 +02:00
});
} catch (e) {
2022-11-01 19:41:41 +01:00
return e;
2022-09-26 22:43:30 +02:00
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> editServerDb(Server server) async {
2022-09-26 22:43:30 +02:00
try {
return await _dbInstance!.transaction((txn) async {
await txn.rawUpdate(
2022-11-04 10:56:14 +01:00
'UPDATE servers SET name = ?, connectionMethod = ?, domain = ?, path = ?, port = ?, user = ?, password = ?, authToken = ?, runningOnHa = ? WHERE id = "${server.id}"',
[server.name, server.connectionMethod, server.domain, server.path, server.port, server.user, server.password, server.authToken, server.runningOnHa]
2022-09-26 22:43:30 +02:00
);
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 22:43:30 +02:00
});
} catch (e) {
2022-11-01 19:41:41 +01:00
return e;
2022-09-26 22:43:30 +02:00
}
}
Future<bool> removeFromDb(String id) async {
try {
return await _dbInstance!.transaction((txn) async {
await txn.rawDelete(
'DELETE FROM servers WHERE id = "$id"',
2022-09-26 18:49:41 +02:00
);
return true;
});
} catch (e) {
return false;
}
}
2022-11-01 19:41:41 +01:00
Future<dynamic> setDefaultServerDb(String id) async {
2022-09-26 18:49:41 +02:00
try {
return await _dbInstance!.transaction((txn) async {
await txn.rawUpdate(
'UPDATE servers SET defaultServer = 0 WHERE defaultServer = 1',
);
await txn.rawUpdate(
'UPDATE servers SET defaultServer = 1 WHERE id = "$id"',
);
2022-11-01 19:41:41 +01:00
return null;
2022-09-26 18:49:41 +02:00
});
} catch (e) {
2022-11-01 19:41:41 +01:00
return e;
2022-09-26 18:49:41 +02:00
}
}
void saveFromDb(List<Map<String, dynamic>>? data) async {
if (data != null) {
for (var server in data) {
final Server serverObj = Server(
2022-09-26 18:49:41 +02:00
id: server['id'],
name: server['name'],
connectionMethod: server['connectionMethod'],
domain: server['domain'],
path: server['path'],
port: server['port'],
user: server['user'],
password: server['password'],
2022-09-26 18:49:41 +02:00
defaultServer: convertFromIntToBool(server['defaultServer'])!,
authToken: server['authToken'],
runningOnHa: convertFromIntToBool(server['runningOnHa'])!,
);
_serversList.add(serverObj);
2022-09-26 18:49:41 +02:00
if (convertFromIntToBool(server['defaultServer']) == true) {
_selectedServer = serverObj;
2022-09-27 14:29:36 +02:00
_serverStatus.loadStatus = 0;
2022-09-27 12:43:25 +02:00
final serverStatus = await getServerStatus(serverObj);
if (serverStatus['result'] == 'success') {
2022-09-27 14:29:36 +02:00
_serverStatus.data = serverStatus['data'];
_serverStatus.loadStatus = 1;
}
else {
2022-09-27 14:29:36 +02:00
_serverStatus.loadStatus = 2;
}
}
}
}
notifyListeners();
}
}