2022-09-26 16:08:56 +02:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:sqflite/sqflite.dart';
|
|
|
|
|
2022-10-01 03:13:50 +02:00
|
|
|
import 'package:adguard_home_manager/models/filtering_status.dart';
|
2022-09-29 21:26:18 +02:00
|
|
|
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/services/http_requests.dart';
|
|
|
|
import 'package:adguard_home_manager/models/server_status.dart';
|
2022-09-26 16:08:56 +02:00
|
|
|
import 'package:adguard_home_manager/functions/conversions.dart';
|
|
|
|
import 'package:adguard_home_manager/models/server.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
|
2022-09-28 01:43:29 +02:00
|
|
|
List<String> _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled
|
2022-09-26 16:08:56 +02:00
|
|
|
|
2022-09-28 15:47:43 +02:00
|
|
|
final Clients _clients = Clients(
|
|
|
|
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
|
|
|
|
data: null
|
|
|
|
);
|
|
|
|
|
2022-10-01 03:13:50 +02:00
|
|
|
FilteringStatus? _filteringStatus;
|
|
|
|
|
2022-09-26 16:08:56 +02:00
|
|
|
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;
|
2022-09-27 02:38:59 +02:00
|
|
|
}
|
|
|
|
|
2022-09-28 01:43:29 +02:00
|
|
|
List<String> get protectionsManagementProcess {
|
|
|
|
return _protectionsManagementProcess;
|
|
|
|
}
|
|
|
|
|
2022-09-28 15:47:43 +02:00
|
|
|
Clients get clients {
|
|
|
|
return _clients;
|
|
|
|
}
|
|
|
|
|
2022-10-01 03:13:50 +02:00
|
|
|
FilteringStatus? get filteringStatus {
|
|
|
|
return _filteringStatus;
|
|
|
|
}
|
|
|
|
|
2022-09-26 16:08:56 +02:00
|
|
|
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;
|
2022-09-27 02:38:59 +02:00
|
|
|
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();
|
|
|
|
}
|
2022-09-29 21:26:18 +02:00
|
|
|
|
|
|
|
void setAllowedDisallowedClientsBlockedDomains(ClientsAllowedBlocked data) {
|
|
|
|
_clients.data?.clientsAllowedBlocked = data;
|
|
|
|
notifyListeners();
|
|
|
|
}
|
2022-10-01 03:13:50 +02:00
|
|
|
|
|
|
|
void setFilteringStatus(FilteringStatus status) {
|
|
|
|
_filteringStatus = status;
|
|
|
|
notifyListeners();
|
|
|
|
}
|
2022-09-27 02:38:59 +02:00
|
|
|
|
2022-09-26 18:49:41 +02:00
|
|
|
Future<bool> createServer(Server server) async {
|
|
|
|
final saved = await saveServerIntoDb(server);
|
|
|
|
if (saved == true) {
|
|
|
|
if (server.defaultServer == true) {
|
|
|
|
final defaultServer = await setDefaultServer(server);
|
|
|
|
if (defaultServer == true) {
|
|
|
|
_serversList.add(server);
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
_serversList.add(server);
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<bool> setDefaultServer(Server server) async {
|
|
|
|
final updated = await setDefaultServerDb(server.id);
|
|
|
|
if (updated == true) {
|
|
|
|
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();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-26 22:43:30 +02:00
|
|
|
Future<bool> editServer(Server server) async {
|
|
|
|
final result = await editServerDb(server);
|
|
|
|
if (result == true) {
|
|
|
|
List<Server> newServers = _serversList.map((s) {
|
|
|
|
if (s.id == server.id) {
|
|
|
|
return server;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
}).toList();
|
|
|
|
_serversList = newServers;
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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':
|
2022-09-28 01:43:29 +02:00
|
|
|
_protectionsManagementProcess.add('general');
|
|
|
|
notifyListeners();
|
|
|
|
|
2022-09-27 22:49:58 +02:00
|
|
|
final result = await updateGeneralProtection(server, newStatus);
|
2022-09-28 01:43:29 +02:00
|
|
|
|
|
|
|
_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 {
|
2022-09-28 01:43:29 +02:00
|
|
|
notifyListeners();
|
2022-10-03 22:41:19 +02:00
|
|
|
return result['log'];
|
2022-09-27 22:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
case 'filtering':
|
2022-09-28 01:43:29 +02:00
|
|
|
_protectionsManagementProcess.add('filtering');
|
|
|
|
notifyListeners();
|
|
|
|
|
2022-09-27 22:49:58 +02:00
|
|
|
final result = await updateFiltering(server, newStatus);
|
2022-09-28 01:43:29 +02:00
|
|
|
|
|
|
|
_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
|
|
|
|
2022-09-28 01:43:29 +02:00
|
|
|
notifyListeners();
|
2022-10-03 22:41:19 +02:00
|
|
|
return result['log'];
|
2022-09-27 22:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
case 'safeSearch':
|
2022-09-28 01:43:29 +02:00
|
|
|
_protectionsManagementProcess.add('safeSearch');
|
|
|
|
notifyListeners();
|
|
|
|
|
2022-09-27 22:49:58 +02:00
|
|
|
final result = await updateSafeSearch(server, newStatus);
|
2022-09-28 01:43:29 +02:00
|
|
|
|
|
|
|
_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 {
|
2022-09-28 01:43:29 +02:00
|
|
|
notifyListeners();
|
2022-10-03 22:41:19 +02:00
|
|
|
return result['log'];
|
2022-09-27 22:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
case 'safeBrowsing':
|
2022-09-28 01:43:29 +02:00
|
|
|
_protectionsManagementProcess.add('safeBrowsing');
|
|
|
|
notifyListeners();
|
|
|
|
|
2022-09-27 22:49:58 +02:00
|
|
|
final result = await updateSafeBrowsing(server, newStatus);
|
2022-09-28 01:43:29 +02:00
|
|
|
|
|
|
|
_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 {
|
2022-09-28 01:43:29 +02:00
|
|
|
notifyListeners();
|
2022-10-03 22:41:19 +02:00
|
|
|
return result['log'];
|
2022-09-27 22:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
case 'parentalControl':
|
2022-09-28 01:43:29 +02:00
|
|
|
_protectionsManagementProcess.add('parentalControl');
|
|
|
|
notifyListeners();
|
|
|
|
|
2022-09-27 22:49:58 +02:00
|
|
|
final result = await updateParentalControl(server, newStatus);
|
2022-09-28 01:43:29 +02:00
|
|
|
|
|
|
|
_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 {
|
2022-09-28 01:43:29 +02:00
|
|
|
notifyListeners();
|
2022-10-03 22:41:19 +02:00
|
|
|
return result['log'];
|
2022-09-27 22:49:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-26 18:49:41 +02:00
|
|
|
Future<bool> saveServerIntoDb(Server server) async {
|
|
|
|
try {
|
|
|
|
return await _dbInstance!.transaction((txn) async {
|
|
|
|
await txn.rawInsert(
|
2022-09-27 02:38:59 +02:00
|
|
|
'INSERT INTO servers (id, name, connectionMethod, domain, path, port, user, password, defaultServer, authToken) VALUES ("${server.id}", "${server.name}", "${server.connectionMethod}", "${server.domain}", ${server.path != null ? "${server.path}" : null}, ${server.port}, "${server.user}", "${server.password}", 0, "${server.authToken}")',
|
2022-09-26 22:43:30 +02:00
|
|
|
);
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<bool> editServerDb(Server server) async {
|
|
|
|
try {
|
|
|
|
return await _dbInstance!.transaction((txn) async {
|
|
|
|
await txn.rawUpdate(
|
2022-09-27 02:38:59 +02:00
|
|
|
'UPDATE servers SET name = "${server.name}", connectionMethod = "${server.connectionMethod}", domain = "${server.domain}", path = ${server.path != null ? "${server.path}" : null}, port = ${server.port}, user = "${server.user}", password = "${server.password}", authToken = "${server.authToken}" WHERE id = "${server.id}"',
|
2022-09-26 22:43:30 +02:00
|
|
|
);
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<bool> setDefaultServerDb(String id) async {
|
|
|
|
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"',
|
|
|
|
);
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-26 16:08:56 +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'],
|
2022-09-26 16:08:56 +02:00
|
|
|
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'])!,
|
2022-09-27 02:38:59 +02:00
|
|
|
authToken: server['authToken']
|
2022-09-26 16:08:56 +02:00
|
|
|
);
|
|
|
|
_serversList.add(serverObj);
|
2022-09-26 18:49:41 +02:00
|
|
|
if (convertFromIntToBool(server['defaultServer']) == true) {
|
2022-09-26 16:08:56 +02:00
|
|
|
_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;
|
2022-09-27 02:38:59 +02:00
|
|
|
}
|
|
|
|
else {
|
2022-09-27 14:29:36 +02:00
|
|
|
_serverStatus.loadStatus = 2;
|
2022-09-27 02:38:59 +02:00
|
|
|
}
|
2022-09-26 16:08:56 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|