mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-04 20:30:35 +00:00
Changed api requests
This commit is contained in:
parent
f14828ae19
commit
e161cfb594
32 changed files with 1376 additions and 740 deletions
200
lib/classes/http_client.dart
Normal file
200
lib/classes/http_client.dart
Normal file
|
@ -0,0 +1,200 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
|
||||
import 'package:adguard_home_manager/models/server.dart';
|
||||
|
||||
enum ExceptionType { socket, timeout, handshake, unknown }
|
||||
|
||||
class HttpResponse {
|
||||
final bool successful;
|
||||
final String? body;
|
||||
final int? statusCode;
|
||||
final ExceptionType? exception;
|
||||
|
||||
const HttpResponse({
|
||||
required this.successful,
|
||||
required this.body,
|
||||
required this.statusCode,
|
||||
this.exception,
|
||||
});
|
||||
}
|
||||
|
||||
String getConnectionString({
|
||||
required Server server,
|
||||
required String urlPath,
|
||||
}) {
|
||||
return "${server.connectionMethod}://${server.domain}${server.port != null ? ':${server.port}' : ""}${server.path ?? ""}/control$urlPath";
|
||||
}
|
||||
|
||||
class HttpRequestClient {
|
||||
static Future<HttpResponse> get({
|
||||
required String urlPath,
|
||||
required Server server,
|
||||
int timeout = 10,
|
||||
}) async{
|
||||
final String connectionString = getConnectionString(server: server, urlPath: urlPath);
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse(connectionString));
|
||||
if (server.authToken != null) {
|
||||
request.headers.set('Authorization', 'Basic ${server.authToken}');
|
||||
}
|
||||
HttpClientResponse response = await request.close().timeout(
|
||||
Duration(seconds: timeout)
|
||||
);
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
return HttpResponse(
|
||||
successful: response.statusCode >= 400 ? false : true,
|
||||
body: reply,
|
||||
statusCode: response.statusCode
|
||||
);
|
||||
} on SocketException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.socket
|
||||
);
|
||||
} on TimeoutException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.timeout
|
||||
);
|
||||
} on HandshakeException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.handshake
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.unknown
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<HttpResponse> post({
|
||||
required String urlPath,
|
||||
required Server server,
|
||||
dynamic body,
|
||||
int timeout = 10,
|
||||
}) async{
|
||||
final String connectionString = getConnectionString(server: server, urlPath: urlPath);
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.postUrl(Uri.parse(connectionString));
|
||||
if (server.authToken != null) {
|
||||
request.headers.set('Authorization', 'Basic ${server.authToken}');
|
||||
}
|
||||
request.headers.set('content-type', 'application/json');
|
||||
request.add(utf8.encode(json.encode(body)));
|
||||
HttpClientResponse response = await request.close().timeout(
|
||||
Duration(seconds: timeout)
|
||||
);
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
return HttpResponse(
|
||||
successful: response.statusCode >= 400 ? false : true,
|
||||
body: reply,
|
||||
statusCode: response.statusCode
|
||||
);
|
||||
} on SocketException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.socket
|
||||
);
|
||||
} on TimeoutException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.timeout
|
||||
);
|
||||
} on HandshakeException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.handshake
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.unknown
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<HttpResponse> put({
|
||||
required String urlPath,
|
||||
required Server server,
|
||||
dynamic body,
|
||||
int timeout = 10,
|
||||
}) async{
|
||||
final String connectionString = getConnectionString(server: server, urlPath: urlPath);
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.putUrl(Uri.parse(connectionString));
|
||||
if (server.authToken != null) {
|
||||
request.headers.set('Authorization', 'Basic ${server.authToken}');
|
||||
}
|
||||
request.headers.set('content-type', 'application/json');
|
||||
request.add(utf8.encode(json.encode(body)));
|
||||
HttpClientResponse response = await request.close().timeout(
|
||||
Duration(seconds: timeout)
|
||||
);
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
return HttpResponse(
|
||||
successful: response.statusCode >= 400 ? false : true,
|
||||
body: reply,
|
||||
statusCode: response.statusCode
|
||||
);
|
||||
} on SocketException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.socket
|
||||
);
|
||||
} on TimeoutException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.timeout
|
||||
);
|
||||
} on HandshakeException {
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.handshake
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const HttpResponse(
|
||||
successful: false,
|
||||
body: null,
|
||||
statusCode: null,
|
||||
exception: ExceptionType.unknown
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,8 +3,8 @@ import 'dart:io';
|
|||
import 'package:store_checker/store_checker.dart';
|
||||
|
||||
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||
import 'package:adguard_home_manager/services/external_requests.dart';
|
||||
import 'package:adguard_home_manager/models/github_release.dart';
|
||||
import 'package:adguard_home_manager/services/http_requests.dart';
|
||||
|
||||
Future<GitHubRelease?> checkAppUpdates({
|
||||
required String currentBuildNumber,
|
||||
|
@ -13,16 +13,16 @@ Future<GitHubRelease?> checkAppUpdates({
|
|||
required bool isBeta
|
||||
}) async {
|
||||
var result = isBeta
|
||||
? await getReleasesGitHub()
|
||||
: await getLatestReleaseGitHub();
|
||||
? await ExternalRequests.getReleasesGitHub()
|
||||
: await ExternalRequests.getLatestReleaseGitHub();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
late GitHubRelease gitHubRelease;
|
||||
if (isBeta) {
|
||||
gitHubRelease = (result['body'] as List<GitHubRelease>).firstWhere((r) => r.prerelease == true);
|
||||
gitHubRelease = (result.content as List<GitHubRelease>).firstWhere((r) => r.prerelease == true);
|
||||
}
|
||||
else {
|
||||
gitHubRelease = result['body'] as GitHubRelease;
|
||||
gitHubRelease = result.content as GitHubRelease;
|
||||
}
|
||||
|
||||
final update = gitHubUpdateExists(
|
||||
|
|
|
@ -4,27 +4,20 @@ import 'package:flutter/material.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||
import 'package:adguard_home_manager/models/server.dart';
|
||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
|
||||
Future<bool> clearDnsCache(BuildContext context, Server server) async {
|
||||
Future<ApiResponse> clearDnsCache(BuildContext context, Server server) async {
|
||||
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
|
||||
|
||||
final ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.clearingDnsCache);
|
||||
|
||||
final result = await serversProvider.apiClient!.resetDnsCache();
|
||||
final result = await serversProvider.apiClient2!.resetDnsCache();
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
|
||||
appConfigProvider.addLog(result['log']);
|
||||
return false;
|
||||
}
|
||||
return result;
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/models/clients.dart';
|
||||
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||
import 'package:adguard_home_manager/functions/maps_fns.dart';
|
||||
|
@ -105,9 +106,9 @@ class ClientsProvider with ChangeNotifier {
|
|||
if (updateLoading == true) {
|
||||
_loadStatus = LoadStatus.loading;
|
||||
}
|
||||
final result = await _serversProvider!.apiClient!.getClients();
|
||||
if (result['result'] == 'success') {
|
||||
setClientsData(result['data'], false);
|
||||
final result = await _serversProvider!.apiClient2!.getClients();
|
||||
if (result.successful == true) {
|
||||
setClientsData(result.content as Clients, false);
|
||||
_loadStatus = LoadStatus.loaded;
|
||||
notifyListeners();
|
||||
return true;
|
||||
|
@ -122,9 +123,9 @@ class ClientsProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> deleteClient(Client client) async {
|
||||
final result = await _serversProvider!.apiClient!.postDeleteClient(name: client.name);
|
||||
final result = await _serversProvider!.apiClient2!.postDeleteClient(name: client.name);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
Clients clientsData = clients!;
|
||||
clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList();
|
||||
setClientsData(clientsData, false);
|
||||
|
@ -138,7 +139,7 @@ class ClientsProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> editClient(Client client) async {
|
||||
final result = await _serversProvider!.apiClient!.postUpdateClient(
|
||||
final result = await _serversProvider!.apiClient2!.postUpdateClient(
|
||||
data: {
|
||||
'name': client.name,
|
||||
'data': serverVersionIsAhead(
|
||||
|
@ -151,7 +152,7 @@ class ClientsProvider with ChangeNotifier {
|
|||
}
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
Clients clientsData = clients!;
|
||||
clientsData.clients = clientsData.clients.map((e) {
|
||||
if (e.name == client.name) {
|
||||
|
@ -173,7 +174,7 @@ class ClientsProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> addClient(Client client) async {
|
||||
final result = await _serversProvider!.apiClient!.postAddClient(
|
||||
final result = await _serversProvider!.apiClient2!.postAddClient(
|
||||
data: serverVersionIsAhead(
|
||||
currentVersion: _statusProvider!.serverStatus!.serverVersion,
|
||||
referenceVersion: 'v0.107.28',
|
||||
|
@ -183,7 +184,7 @@ class ClientsProvider with ChangeNotifier {
|
|||
: removePropFromMap(client.toJson(), 'safe_search')
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
Clients clientsData = clients!;
|
||||
clientsData.clients.add(client);
|
||||
setClientsData(clientsData, false);
|
||||
|
@ -197,7 +198,7 @@ class ClientsProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> addClientList(String item, AccessSettingsList type) async {
|
||||
Future<ApiResponse> addClientList(String item, AccessSettingsList type) async {
|
||||
Map<String, List<String>> body = {
|
||||
"allowed_clients": clients!.clientsAllowedBlocked?.allowedClients ?? [],
|
||||
"disallowed_clients": clients!.clientsAllowedBlocked?.disallowedClients ?? [],
|
||||
|
@ -214,34 +215,30 @@ class ClientsProvider with ChangeNotifier {
|
|||
body['blocked_hosts']!.add(item);
|
||||
}
|
||||
|
||||
final result = await _serversProvider!.apiClient!.requestAllowedBlockedClientsHosts(body);
|
||||
final result = await _serversProvider!.apiClient2!.requestAllowedBlockedClientsHosts(
|
||||
body: body
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
_clients?.clientsAllowedBlocked = ClientsAllowedBlocked(
|
||||
allowedClients: body['allowed_clients'] ?? [],
|
||||
disallowedClients: body['disallowed_clients'] ?? [],
|
||||
blockedHosts: body['blocked_hosts'] ?? [],
|
||||
);
|
||||
notifyListeners();
|
||||
return { 'success': true };
|
||||
return result;
|
||||
}
|
||||
else if (result['result'] == 'error' && result['message'] == 'client_another_list') {
|
||||
else if (result.successful == false && result.content == 'client_another_list') {
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': false,
|
||||
'error': 'client_another_list'
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> removeClientList(String client, AccessSettingsList type) async {
|
||||
Future<ApiResponse> removeClientList(String client, AccessSettingsList type) async {
|
||||
Map<String, List<String>> body = {
|
||||
"allowed_clients": clients!.clientsAllowedBlocked?.allowedClients ?? [],
|
||||
"disallowed_clients": clients!.clientsAllowedBlocked?.disallowedClients ?? [],
|
||||
|
@ -258,30 +255,26 @@ class ClientsProvider with ChangeNotifier {
|
|||
body['blocked_hosts'] = body['blocked_hosts']!.where((c) => c != client).toList();
|
||||
}
|
||||
|
||||
final result = await _serversProvider!.apiClient!.requestAllowedBlockedClientsHosts(body);
|
||||
final result = await _serversProvider!.apiClient2!.requestAllowedBlockedClientsHosts(
|
||||
body: body
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
_clients?.clientsAllowedBlocked = ClientsAllowedBlocked(
|
||||
allowedClients: body['allowed_clients'] ?? [],
|
||||
disallowedClients: body['disallowed_clients'] ?? [],
|
||||
blockedHosts: body['blocked_hosts'] ?? [],
|
||||
);
|
||||
notifyListeners();
|
||||
return { 'success': true };
|
||||
return result;
|
||||
}
|
||||
else if (result['result'] == 'error' && result['message'] == 'client_another_list') {
|
||||
else if (result.successful == false && result.content == 'client_another_list') {
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': false,
|
||||
'error': 'client_another_list'
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
import 'package:adguard_home_manager/models/dhcp.dart';
|
||||
|
@ -41,9 +42,9 @@ class DhcpProvider with ChangeNotifier {
|
|||
_loadStatus = LoadStatus.loading;
|
||||
notifyListeners();
|
||||
}
|
||||
final result = await _serversProvider!.apiClient!.getDhcpData();
|
||||
if (result['result'] == 'success') {
|
||||
_dhcp = result['data'];
|
||||
final result = await _serversProvider!.apiClient2!.getDhcpData();
|
||||
if (result.successful == true) {
|
||||
_dhcp = result.content as DhcpModel;
|
||||
_loadStatus = LoadStatus.loaded;
|
||||
notifyListeners();
|
||||
return true;
|
||||
|
@ -58,7 +59,7 @@ class DhcpProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> deleteLease(Lease lease) async {
|
||||
final result = await _serversProvider!.apiClient!.deleteStaticLease(
|
||||
final result = await _serversProvider!.apiClient2!.deleteStaticLease(
|
||||
data: {
|
||||
"mac": lease.mac,
|
||||
"ip": lease.ip,
|
||||
|
@ -66,7 +67,7 @@ class DhcpProvider with ChangeNotifier {
|
|||
}
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DhcpModel data = dhcp!;
|
||||
data.dhcpStatus.staticLeases = data.dhcpStatus.staticLeases.where((l) => l.mac != lease.mac).toList();
|
||||
setDhcpData(data);
|
||||
|
@ -78,8 +79,8 @@ class DhcpProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> createLease(Lease lease) async {
|
||||
final result = await _serversProvider!.apiClient!.createStaticLease(
|
||||
Future<ApiResponse> createLease(Lease lease) async {
|
||||
final result = await _serversProvider!.apiClient2!.createStaticLease(
|
||||
data: {
|
||||
"mac": lease.mac,
|
||||
"ip": lease.ip,
|
||||
|
@ -87,29 +88,14 @@ class DhcpProvider with ChangeNotifier {
|
|||
}
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DhcpModel data = dhcp!;
|
||||
data.dhcpStatus.staticLeases.add(lease);
|
||||
setDhcpData(data);
|
||||
return { 'success': true };
|
||||
}
|
||||
else if (result['result'] == 'error' && result['message'] == 'already_exists' ) {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 'already_exists'
|
||||
};
|
||||
}
|
||||
else if (result['result'] == 'error' && result['message'] == 'server_not_configured' ) {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 'server_not_configured'
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
import 'package:adguard_home_manager/models/dns_info.dart';
|
||||
|
@ -58,12 +59,12 @@ class DnsProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> savePrivateReverseServersConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient!.setDnsConfig(
|
||||
Future<ApiResponse> savePrivateReverseServersConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient2!.setDnsConfig(
|
||||
data: value
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DnsInfo data = dnsInfo!;
|
||||
if (value['local_ptr_upstreams'] != null) {
|
||||
data.localPtrUpstreams = value['local_ptr_upstreams'];
|
||||
|
@ -71,107 +72,71 @@ class DnsProvider with ChangeNotifier {
|
|||
data.usePrivatePtrResolvers = value['use_private_ptr_resolvers'];
|
||||
data.resolveClients = value['resolve_clients'];
|
||||
setDnsInfoData(data);
|
||||
return { 'success': true };
|
||||
}
|
||||
else if (result['log'] != null && result['log'].statusCode == '400') {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 400
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> saveUpstreamDnsConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient!.setDnsConfig(
|
||||
Future<ApiResponse> saveUpstreamDnsConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient2!.setDnsConfig(
|
||||
data: value
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DnsInfo data = dnsInfo!;
|
||||
data.upstreamDns = List<String>.from(value['upstream_dns']);
|
||||
data.upstreamMode = value['upstream_mode'];
|
||||
setDnsInfoData(data);
|
||||
return { 'success': true };
|
||||
}
|
||||
else if (result['log'] != null && result['log'].statusCode == '400') {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 400
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> saveBootstrapDnsConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient!.setDnsConfig(
|
||||
Future<ApiResponse> saveBootstrapDnsConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient2!.setDnsConfig(
|
||||
data: value
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DnsInfo data = dnsInfo!;
|
||||
data.bootstrapDns = List<String>.from(value['bootstrap_dns']);
|
||||
setDnsInfoData(data);
|
||||
return { 'success': true };
|
||||
}
|
||||
else if (result['log'] != null && result['log'].statusCode == '400') {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 400
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> saveCacheCacheConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient!.setDnsConfig(
|
||||
Future<ApiResponse> saveCacheCacheConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient2!.setDnsConfig(
|
||||
data: value
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DnsInfo data = dnsInfo!;
|
||||
data.cacheSize = value['cache_size'];
|
||||
data.cacheTtlMin = value['cache_ttl_min'];
|
||||
data.cacheTtlMax = value['cache_ttl_max'];
|
||||
data.cacheOptimistic = value['cache_optimistic'];
|
||||
setDnsInfoData(data);
|
||||
return { 'success': true };
|
||||
}
|
||||
else if (result['log'] != null && result['log'].statusCode == '400') {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 400
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> saveDnsServerConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient!.setDnsConfig(
|
||||
Future<ApiResponse> saveDnsServerConfig(Map<String, dynamic> value) async {
|
||||
final result = await _serversProvider!.apiClient2!.setDnsConfig(
|
||||
data: value
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
DnsInfo data = dnsInfo!;
|
||||
data.ratelimit = value['ratelimit'];
|
||||
data.ednsCsEnabled = value['edns_cs_enabled'];
|
||||
|
@ -181,19 +146,10 @@ class DnsProvider with ChangeNotifier {
|
|||
data.blockingIpv4 = value['blocking_ipv4'];
|
||||
data.blockingIpv6 = value['blocking_ipv6'];
|
||||
setDnsInfoData(data);
|
||||
return { 'success': true };
|
||||
}
|
||||
else if (result['log'] != null && result['log'].statusCode == '400') {
|
||||
return {
|
||||
'success': false,
|
||||
'error': 400
|
||||
};
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'success': false,
|
||||
'error': null
|
||||
};
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -88,10 +88,10 @@ class FilteringProvider with ChangeNotifier {
|
|||
_blockedServicesLoadStatus = LoadStatus.loading;
|
||||
if (showLoader == true) notifyListeners();
|
||||
|
||||
final result = await _serversProvider!.apiClient!.getBlockedServices();
|
||||
if (result['result'] == 'success') {
|
||||
final result = await _serversProvider!.apiClient2!.getBlockedServices();
|
||||
if (result.successful == true) {
|
||||
_blockedServicesLoadStatus = LoadStatus.loaded;
|
||||
_blockedServicesList = BlockedServices(services: result['data']);
|
||||
_blockedServicesList = BlockedServices(services: result.content as List<BlockedService>);
|
||||
|
||||
notifyListeners();
|
||||
return true;
|
||||
|
@ -112,9 +112,9 @@ class FilteringProvider with ChangeNotifier {
|
|||
_loadStatus = LoadStatus.loading;
|
||||
}
|
||||
|
||||
final result = await _serversProvider!.apiClient!.getFiltering();
|
||||
if (result['result'] == 'success') {
|
||||
_filtering = result['data'];
|
||||
final result = await _serversProvider!.apiClient2!.getFiltering();
|
||||
if (result.successful == true) {
|
||||
_filtering = result.content as Filtering;
|
||||
_loadStatus = LoadStatus.loaded;
|
||||
notifyListeners();
|
||||
return true;
|
||||
|
@ -127,15 +127,16 @@ class FilteringProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<Map<String, dynamic>> updateLists() async {
|
||||
final result = await _serversProvider!.apiClient!.updateLists();
|
||||
if (result['result'] == 'success') {
|
||||
final result2 = await _serversProvider!.apiClient!.getFiltering();
|
||||
if (result2['result'] == 'success') {
|
||||
_filtering = result2['data'];
|
||||
final result = await _serversProvider!.apiClient2!.updateLists();
|
||||
if (result.successful == true) {
|
||||
final result2 = await _serversProvider!.apiClient2!.getFiltering();
|
||||
if (result2.successful == true) {
|
||||
_filtering = result2.content as Filtering;
|
||||
notifyListeners();
|
||||
print(result.content);
|
||||
return {
|
||||
"success": true,
|
||||
"data": result['data']
|
||||
"data": result.content
|
||||
};
|
||||
}
|
||||
else {
|
||||
|
@ -151,10 +152,10 @@ class FilteringProvider with ChangeNotifier {
|
|||
|
||||
Future<bool> enableDisableFiltering() async {
|
||||
final newValue = !_statusProvider!.serverStatus!.filteringEnabled;
|
||||
final result = await _serversProvider!.apiClient!.updateFiltering(
|
||||
final result = await _serversProvider!.apiClient2!.updateFiltering(
|
||||
enable: newValue
|
||||
);
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
setFilteringProtectionStatus(newValue, false);
|
||||
notifyListeners();
|
||||
return true;
|
||||
|
@ -166,13 +167,13 @@ class FilteringProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> changeUpdateFrequency(int value) async {
|
||||
final result = await _serversProvider!.apiClient!.requestChangeUpdateFrequency(
|
||||
final result = await _serversProvider!.apiClient2!.requestChangeUpdateFrequency(
|
||||
data: {
|
||||
"enabled": filtering!.enabled,
|
||||
"interval": value
|
||||
}
|
||||
);
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
setFiltersUpdateFrequency(value);
|
||||
return true;
|
||||
}
|
||||
|
@ -185,9 +186,9 @@ class FilteringProvider with ChangeNotifier {
|
|||
Future<bool> removeCustomRule(String rule) async {
|
||||
final List<String> newRules = filtering!.userRules.where((r) => r != rule).toList();
|
||||
|
||||
final result = await _serversProvider!.apiClient!.setCustomRules(rules: newRules);
|
||||
final result = await _serversProvider!.apiClient2!.setCustomRules(rules: newRules);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
Filtering filteringData = filtering!;
|
||||
filteringData.userRules = newRules;
|
||||
_filtering = filteringData;
|
||||
|
@ -205,18 +206,18 @@ class FilteringProvider with ChangeNotifier {
|
|||
required String listUrl,
|
||||
required String type
|
||||
}) async {
|
||||
final result1 = await _serversProvider!.apiClient!.deleteFilterList(
|
||||
final result1 = await _serversProvider!.apiClient2!.deleteFilterList(
|
||||
data: {
|
||||
"url": listUrl,
|
||||
"whitelist": type == 'whitelist' ? true : false
|
||||
}
|
||||
);
|
||||
|
||||
if (result1['result'] == 'success') {
|
||||
final result2 = await _serversProvider!.apiClient!.getFiltering();
|
||||
if (result1.successful == true) {
|
||||
final result2 = await _serversProvider!.apiClient2!.getFiltering();
|
||||
|
||||
if (result2['result'] == 'success') {
|
||||
_filtering = result2['data'];
|
||||
if (result2.successful == true) {
|
||||
_filtering = result2.content as Filtering;
|
||||
notifyListeners();
|
||||
return true;
|
||||
}
|
||||
|
@ -236,7 +237,7 @@ class FilteringProvider with ChangeNotifier {
|
|||
required String type,
|
||||
required FilteringListActions action
|
||||
}) async {
|
||||
final result1 = await _serversProvider!.apiClient!.updateFilterList(
|
||||
final result1 = await _serversProvider!.apiClient2!.updateFilterList(
|
||||
data: {
|
||||
"data": {
|
||||
"enabled": action == FilteringListActions.disable || action == FilteringListActions.enable
|
||||
|
@ -250,11 +251,11 @@ class FilteringProvider with ChangeNotifier {
|
|||
}
|
||||
);
|
||||
|
||||
if (result1['result'] == 'success') {
|
||||
final result2 = await _serversProvider!.apiClient!.getFiltering();
|
||||
if (result1.successful == true) {
|
||||
final result2 = await _serversProvider!.apiClient2!.getFiltering();
|
||||
|
||||
if (result2['result'] == 'success') {
|
||||
_filtering = result2['data'];
|
||||
if (result2.successful == true) {
|
||||
_filtering = result2.content as Filtering;
|
||||
notifyListeners();
|
||||
return true;
|
||||
}
|
||||
|
@ -273,9 +274,9 @@ class FilteringProvider with ChangeNotifier {
|
|||
final List<String> newRules = filtering!.userRules;
|
||||
newRules.add(rule);
|
||||
|
||||
final result = await _serversProvider!.apiClient!.setCustomRules(rules: newRules);
|
||||
final result = await _serversProvider!.apiClient2!.setCustomRules(rules: newRules);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
Filtering filteringData = filtering!;
|
||||
filteringData.userRules = newRules;
|
||||
_filtering = filteringData;
|
||||
|
@ -287,8 +288,9 @@ class FilteringProvider with ChangeNotifier {
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> addList({required String name, required String url, required String type}) async {
|
||||
final result1 = await _serversProvider!.apiClient!.addFilteringList(
|
||||
final result1 = await _serversProvider!.apiClient2!.addFilteringList(
|
||||
data: {
|
||||
'name': name,
|
||||
'url': url,
|
||||
|
@ -296,13 +298,13 @@ class FilteringProvider with ChangeNotifier {
|
|||
}
|
||||
);
|
||||
|
||||
if (result1['result'] == 'success') {
|
||||
if (result1['data'].toString().contains("OK")) {
|
||||
final result2 = await _serversProvider!.apiClient!.getFiltering();
|
||||
final items = result1['data'].toString().split(' ')[1];
|
||||
if (result1.successful == true) {
|
||||
if (result1.content.toString().contains("OK")) {
|
||||
final result2 = await _serversProvider!.apiClient2!.getFiltering();
|
||||
final items = result1.content.toString().split(' ')[1];
|
||||
|
||||
if (result2['result'] == 'success') {
|
||||
_filtering = result2['data'];
|
||||
if (result2.successful == true) {
|
||||
_filtering = result2.content as Filtering;
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': true,
|
||||
|
@ -325,14 +327,14 @@ class FilteringProvider with ChangeNotifier {
|
|||
};
|
||||
}
|
||||
}
|
||||
else if (result1['result'] == 'error' && result1['log'].statusCode == '400' && result1['log'].resBody.toString().contains("data is HTML, not plain text")) {
|
||||
else if (result1.successful == false && result1.statusCode == 400 && result1.content.toString().contains("data is HTML, not plain text")) {
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': false,
|
||||
'error': 'invalid_url'
|
||||
};
|
||||
}
|
||||
else if (result1['result'] == 'error' && result1['log'].statusCode == '400' && result1['log'].resBody.toString().contains('url already exists')) {
|
||||
else if (result1.successful == false && result1.statusCode == 400 && result1.content.toString().contains('url already exists')) {
|
||||
notifyListeners();
|
||||
return {
|
||||
'success': false,
|
||||
|
@ -355,9 +357,9 @@ class FilteringProvider with ChangeNotifier {
|
|||
_blockedServicesLoadStatus = LoadStatus.loading;
|
||||
}
|
||||
|
||||
final result = await _serversProvider!.apiClient!.getBlockedServices();
|
||||
if (result['result'] == 'success') {
|
||||
_blockedServicesList = BlockedServices(services: result['data']);
|
||||
final result = await _serversProvider!.apiClient2!.getBlockedServices();
|
||||
if (result.successful == true) {
|
||||
_blockedServicesList = BlockedServices(services: result.content as List<BlockedService>);
|
||||
_blockedServicesLoadStatus = LoadStatus.loaded;
|
||||
|
||||
notifyListeners();
|
||||
|
@ -371,11 +373,11 @@ class FilteringProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> updateBlockedServices(List<String> values) async {
|
||||
final result = await _serversProvider!.apiClient!.setBlockedServices(
|
||||
final result = await _serversProvider!.apiClient2!.setBlockedServices(
|
||||
data: values
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
setBlockedServices(values);
|
||||
return true;
|
||||
}
|
||||
|
@ -393,13 +395,13 @@ class FilteringProvider with ChangeNotifier {
|
|||
required Filter list,
|
||||
required bool isWhitelist,
|
||||
}) async {
|
||||
final result = await _serversProvider!.apiClient!.deleteFilterList(
|
||||
final result = await _serversProvider!.apiClient2!.deleteFilterList(
|
||||
data: {
|
||||
"url": list.url,
|
||||
"whitelist": isWhitelist
|
||||
}
|
||||
);
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
return ProcessedList(list: list, successful: true);
|
||||
}
|
||||
else {
|
||||
|
@ -426,7 +428,7 @@ class FilteringProvider with ChangeNotifier {
|
|||
required Filter list,
|
||||
required bool isWhitelist,
|
||||
}) async {
|
||||
final result = await _serversProvider!.apiClient!.updateFilterList(
|
||||
final result = await _serversProvider!.apiClient2!.updateFilterList(
|
||||
data: {
|
||||
"data": {
|
||||
"enabled": !list.enabled,
|
||||
|
@ -437,7 +439,7 @@ class FilteringProvider with ChangeNotifier {
|
|||
"whitelist": isWhitelist
|
||||
}
|
||||
);
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
return ProcessedList(list: list, successful: true);
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -35,14 +35,14 @@ class RewriteRulesProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> addDnsRewrite(RewriteRules rule) async {
|
||||
final result = await _serversProvider!.apiClient!.addDnsRewriteRule(
|
||||
final result = await _serversProvider!.apiClient2!.addDnsRewriteRule(
|
||||
data: {
|
||||
"domain": rule.domain,
|
||||
"answer": rule.answer
|
||||
}
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
List<RewriteRules> data = rewriteRules!;
|
||||
data.add(rule);
|
||||
setRewriteRulesData(data);
|
||||
|
@ -55,7 +55,7 @@ class RewriteRulesProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> editDnsRewrite(RewriteRules newRule, RewriteRules oldRule) async {
|
||||
final result = await _serversProvider!.apiClient!.updateRewriteRule(
|
||||
final result = await _serversProvider!.apiClient2!.updateRewriteRule(
|
||||
body: {
|
||||
"target": {
|
||||
"answer": oldRule.answer,
|
||||
|
@ -68,7 +68,7 @@ class RewriteRulesProvider with ChangeNotifier {
|
|||
}
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
List<RewriteRules> data = rewriteRules!;
|
||||
final index = data.indexOf(oldRule);
|
||||
data[index] = newRule;
|
||||
|
@ -82,14 +82,14 @@ class RewriteRulesProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> deleteDnsRewrite(RewriteRules rule) async {
|
||||
final result = await _serversProvider!.apiClient!.deleteDnsRewriteRule(
|
||||
final result = await _serversProvider!.apiClient2!.deleteDnsRewriteRule(
|
||||
data: {
|
||||
"domain": rule.domain,
|
||||
"answer": rule.answer
|
||||
}
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
List<RewriteRules> data = rewriteRules!;
|
||||
data = data.where((item) => item.domain != rule.domain).toList();
|
||||
setRewriteRulesData(data);
|
||||
|
@ -108,10 +108,10 @@ class RewriteRulesProvider with ChangeNotifier {
|
|||
_loadStatus = LoadStatus.loading;
|
||||
}
|
||||
|
||||
final result = await _serversProvider!.apiClient!.getDnsRewriteRules();
|
||||
final result = await _serversProvider!.apiClient2!.getDnsRewriteRules();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
_rewriteRules = result['data'];
|
||||
if (result.successful == true) {
|
||||
_rewriteRules = result.content as List<RewriteRules>;
|
||||
_loadStatus = LoadStatus.loaded;
|
||||
notifyListeners();
|
||||
return true;
|
||||
|
|
|
@ -3,6 +3,8 @@ import 'dart:async';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/services/external_requests.dart';
|
||||
import 'package:adguard_home_manager/models/server.dart';
|
||||
import 'package:adguard_home_manager/models/update_available.dart';
|
||||
import 'package:adguard_home_manager/services/http_requests.dart';
|
||||
|
@ -16,6 +18,7 @@ class ServersProvider with ChangeNotifier {
|
|||
List<Server> _serversList = [];
|
||||
Server? _selectedServer;
|
||||
ApiClient? _apiClient;
|
||||
ApiClientV2? _apiClient2;
|
||||
|
||||
bool _updatingServer = false;
|
||||
|
||||
|
@ -28,6 +31,10 @@ class ServersProvider with ChangeNotifier {
|
|||
return _apiClient;
|
||||
}
|
||||
|
||||
ApiClientV2? get apiClient2 {
|
||||
return _apiClient2;
|
||||
}
|
||||
|
||||
List<Server> get serversList {
|
||||
return _serversList;
|
||||
}
|
||||
|
@ -75,6 +82,11 @@ class ServersProvider with ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
void setApiClient2(ApiClientV2 client) {
|
||||
_apiClient2 = client;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void setUpdatingServer(bool status) {
|
||||
_updatingServer = status;
|
||||
notifyListeners();
|
||||
|
@ -176,9 +188,9 @@ class ServersProvider with ChangeNotifier {
|
|||
final result = await client!.checkServerUpdates();
|
||||
if (result['result'] == 'success') {
|
||||
UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']);
|
||||
final gitHubResult = await client.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
|
||||
if (gitHubResult['result'] == 'success') {
|
||||
data.changelog = gitHubResult['body'];
|
||||
final gitHubResult = await ExternalRequests.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
|
||||
if (gitHubResult.successful == true) {
|
||||
data.changelog = gitHubResult.content;
|
||||
}
|
||||
setUpdateAvailableData(data);
|
||||
setUpdateAvailableLoadStatus(LoadStatus.loaded, true);
|
||||
|
@ -188,9 +200,9 @@ class ServersProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future initializateServer(Server server, ApiClient apiClient) async {
|
||||
final serverStatus = await _apiClient!.getServerStatus();
|
||||
if (serverStatus['result'] == 'success') {
|
||||
Future initializateServer(Server server, ApiClient apiClient, ApiClientV2 apiClient2) async {
|
||||
final serverStatus = await _apiClient2!.getServerStatus();
|
||||
if (serverStatus.successful == true) {
|
||||
checkServerUpdatesAvailable( // Do not await
|
||||
server: server,
|
||||
apiClient: apiClient
|
||||
|
@ -226,8 +238,10 @@ class ServersProvider with ChangeNotifier {
|
|||
if (defaultServer != null) {
|
||||
_selectedServer = defaultServer;
|
||||
final client = ApiClient(server: defaultServer);
|
||||
final client2 = ApiClientV2(server: defaultServer);
|
||||
_apiClient = client;
|
||||
initializateServer(defaultServer, client);
|
||||
_apiClient2 = client2;
|
||||
initializateServer(defaultServer, client, client2);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -244,13 +258,13 @@ class ServersProvider with ChangeNotifier {
|
|||
const Duration(seconds: 2),
|
||||
(timer) async {
|
||||
if (_selectedServer != null && _selectedServer == server) {
|
||||
final result = await _apiClient!.checkServerUpdates();
|
||||
if (result['result'] == 'success') {
|
||||
UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result['data']);
|
||||
final result = await _apiClient2!.checkServerUpdates();
|
||||
if (result.successful == true) {
|
||||
UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result.content);
|
||||
if (data.currentVersion == data.newVersion) {
|
||||
final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
|
||||
if (gitHubResult['result'] == 'success') {
|
||||
data.changelog = gitHubResult['body'];
|
||||
final gitHubResult = await ExternalRequests.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
|
||||
if (gitHubResult.successful == true) {
|
||||
data.changelog = gitHubResult.content;
|
||||
}
|
||||
setUpdateAvailableData(data);
|
||||
timer.cancel();
|
||||
|
|
|
@ -6,7 +6,6 @@ import 'package:adguard_home_manager/models/server_status.dart';
|
|||
import 'package:adguard_home_manager/models/filtering_status.dart';
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||
import 'package:adguard_home_manager/functions/time_server_disabled.dart';
|
||||
|
||||
class StatusProvider with ChangeNotifier {
|
||||
|
@ -104,7 +103,7 @@ class StatusProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Future<dynamic> updateBlocking({
|
||||
Future<bool> updateBlocking({
|
||||
required String block,
|
||||
required bool newStatus,
|
||||
int? time
|
||||
|
@ -114,14 +113,14 @@ class StatusProvider with ChangeNotifier {
|
|||
_protectionsManagementProcess.add('general');
|
||||
notifyListeners();
|
||||
|
||||
final result = await _serversProvider!.apiClient!.updateGeneralProtection(
|
||||
final result = await _serversProvider!.apiClient2!.updateGeneralProtection(
|
||||
enable: newStatus,
|
||||
time: time
|
||||
);
|
||||
|
||||
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
_serverStatus!.generalEnabled = newStatus;
|
||||
if (time != null) {
|
||||
final deadline = generateTimeDeadline(time);
|
||||
|
@ -135,32 +134,12 @@ class StatusProvider with ChangeNotifier {
|
|||
stopCountdown();
|
||||
}
|
||||
notifyListeners();
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return result['log'];
|
||||
return false;
|
||||
}
|
||||
|
||||
case 'general_legacy':
|
||||
_protectionsManagementProcess.add('general');
|
||||
notifyListeners();
|
||||
|
||||
final result = await _serversProvider!.apiClient!.updateGeneralProtectionLegacy(newStatus);
|
||||
|
||||
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
_serverStatus!.generalEnabled = newStatus;
|
||||
notifyListeners();
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return result['log'];
|
||||
}
|
||||
|
||||
|
||||
case 'filtering':
|
||||
_protectionsManagementProcess.add('filtering');
|
||||
notifyListeners();
|
||||
|
@ -174,72 +153,61 @@ class StatusProvider with ChangeNotifier {
|
|||
if (result['result'] == 'success') {
|
||||
_serverStatus!.filteringEnabled = newStatus;
|
||||
notifyListeners();
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
|
||||
notifyListeners();
|
||||
return result['log'];
|
||||
return false;
|
||||
}
|
||||
|
||||
case 'safeSearch':
|
||||
_protectionsManagementProcess.add('safeSearch');
|
||||
notifyListeners();
|
||||
|
||||
final result = serverVersionIsAhead(
|
||||
currentVersion: serverStatus!.serverVersion,
|
||||
referenceVersion: 'v0.107.28',
|
||||
referenceVersionBeta: 'v0.108.0-b.33'
|
||||
) == true
|
||||
? await _serversProvider!.apiClient!.updateSafeSearchSettings(body: { 'enabled': newStatus })
|
||||
: await _serversProvider!.apiClient!.updateSafeSearchLegacy(newStatus);
|
||||
final result = await _serversProvider!.apiClient2!.updateSafeSearchSettings(body: { 'enabled': newStatus });
|
||||
|
||||
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeSearch').toList();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
_serverStatus!.safeSearchEnabled = newStatus;
|
||||
notifyListeners();
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return result['log'];
|
||||
return false;
|
||||
}
|
||||
|
||||
case 'safeBrowsing':
|
||||
_protectionsManagementProcess.add('safeBrowsing');
|
||||
notifyListeners();
|
||||
|
||||
final result = await _serversProvider!.apiClient!.updateSafeBrowsing(newStatus);
|
||||
final result = await _serversProvider!.apiClient2!.updateSafeBrowsing(enable: newStatus);
|
||||
|
||||
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeBrowsing').toList();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
_serverStatus!.safeBrowsingEnabled = newStatus;
|
||||
notifyListeners();
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return result['log'];
|
||||
return false;
|
||||
}
|
||||
|
||||
case 'parentalControl':
|
||||
_protectionsManagementProcess.add('parentalControl');
|
||||
notifyListeners();
|
||||
|
||||
final result = await _serversProvider!.apiClient!.updateParentalControl(newStatus);
|
||||
final result = await _serversProvider!.apiClient2!.updateParentalControl(enable: newStatus);
|
||||
|
||||
_protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'parentalControl').toList();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
_serverStatus!.parentalControlEnabled = newStatus;
|
||||
notifyListeners();
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
notifyListeners();
|
||||
return result['log'];
|
||||
return false;
|
||||
}
|
||||
|
||||
default:
|
||||
|
@ -252,9 +220,9 @@ class StatusProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> getFilteringRules() async {
|
||||
final result = await _serversProvider!.apiClient!.getFilteringRules();
|
||||
if (result['result'] == 'success') {
|
||||
_filteringStatus = result['data'];
|
||||
final result = await _serversProvider!.apiClient2!.getFilteringRules();
|
||||
if (result.successful == true) {
|
||||
_filteringStatus = result.content as FilteringStatus;
|
||||
notifyListeners();
|
||||
return true;
|
||||
}
|
||||
|
@ -270,10 +238,10 @@ class StatusProvider with ChangeNotifier {
|
|||
_loadStatus = LoadStatus.loading;
|
||||
}
|
||||
|
||||
final result = await _serversProvider!.apiClient!.getServerStatus();
|
||||
if (result['result'] == 'success') {
|
||||
final result = await _serversProvider!.apiClient2!.getServerStatus();
|
||||
if (result.successful == true) {
|
||||
setServerStatusData(
|
||||
data: result['data']
|
||||
data: result.content as ServerStatus
|
||||
);
|
||||
_loadStatus = LoadStatus.loaded;
|
||||
notifyListeners();
|
||||
|
@ -292,12 +260,12 @@ class StatusProvider with ChangeNotifier {
|
|||
}) async {
|
||||
if (_serverStatus == null) return false;
|
||||
|
||||
final rules = await _serversProvider!.apiClient!.getFilteringRules();
|
||||
final rules = await _serversProvider!.apiClient2!.getFilteringRules();
|
||||
|
||||
if (rules['result'] == 'success') {
|
||||
if (rules.successful == true) {
|
||||
FilteringStatus oldStatus = _serverStatus!.filteringStatus;
|
||||
|
||||
List<String> newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList();
|
||||
List<String> newRules = (rules.content as FilteringStatus).userRules.where((d) => !d.contains(domain)).toList();
|
||||
if (newStatus == 'block') {
|
||||
newRules.add("||$domain^");
|
||||
}
|
||||
|
@ -308,9 +276,9 @@ class StatusProvider with ChangeNotifier {
|
|||
newObj.userRules = newRules;
|
||||
_filteringStatus = newObj;
|
||||
|
||||
final result = await _serversProvider!.apiClient!.postFilteringRules(data: {'rules': newRules});
|
||||
final result = await _serversProvider!.apiClient2!.postFilteringRules(data: {'rules': newRules});
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
|
@ -324,11 +292,11 @@ class StatusProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<bool> updateSafeSearchConfig(Map<String, bool> status) async {
|
||||
final result = await _serversProvider!.apiClient!.updateSafeSearchSettings(
|
||||
final result = await _serversProvider!.apiClient2!.updateSafeSearchSettings(
|
||||
body: status
|
||||
);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
ServerStatus data = serverStatus!;
|
||||
data.safeSearchEnabled = status['enabled'] ?? false;
|
||||
data.safeSeachBing = status['bing'] ?? false;
|
||||
|
|
|
@ -58,11 +58,11 @@ class _CheckHostModalState extends State<CheckHostModal> {
|
|||
void checkHost() async {
|
||||
setState(() => resultWidget = checking());
|
||||
|
||||
final result = await serversProvider.apiClient!.checkHostFiltered(host: domainController.text);
|
||||
final result = await serversProvider.apiClient2!.checkHostFiltered(host: domainController.text);
|
||||
|
||||
if (mounted) {
|
||||
if (result['result'] == 'success') {
|
||||
final status = getFilteredStatus(context, appConfigProvider, result['data']['reason'], true);
|
||||
if (result.successful == true) {
|
||||
final status = getFilteredStatus(context, appConfigProvider, result.content['reason'], true);
|
||||
if (mounted) {
|
||||
setState(() => resultWidget = Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
|
|
@ -53,11 +53,9 @@ class _FiltersState extends State<Filters> {
|
|||
void updateLists() async {
|
||||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.updatingLists);
|
||||
|
||||
final result = await filteringProvider.updateLists();
|
||||
|
||||
if (!mounted) return;
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
|
|
|
@ -81,10 +81,7 @@ class _ManagementModalState extends State<ManagementModal> with SingleTickerProv
|
|||
newStatus: value,
|
||||
time: time
|
||||
);
|
||||
if (mounted && result != null) {
|
||||
if (result != false) {
|
||||
appConfigProvider.addLog(result);
|
||||
}
|
||||
if (mounted && result == false) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.invalidUsernamePassword,
|
||||
|
|
|
@ -7,8 +7,6 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||
import 'package:adguard_home_manager/screens/logs/configuration/config_widgets.dart';
|
||||
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||
|
||||
class RetentionItem {
|
||||
|
@ -21,62 +19,27 @@ class RetentionItem {
|
|||
});
|
||||
}
|
||||
|
||||
class LogsConfigModal extends StatelessWidget {
|
||||
final void Function(Map<String, dynamic>) onConfirm;
|
||||
final void Function() onClear;
|
||||
final bool dialog;
|
||||
final String serverVersion;
|
||||
|
||||
const LogsConfigModal({
|
||||
Key? key,
|
||||
required this.onConfirm,
|
||||
required this.onClear,
|
||||
required this.dialog,
|
||||
required this.serverVersion
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final serversProvider = Provider.of<ServersProvider>(context);
|
||||
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
||||
|
||||
return LogsConfigModalWidget(
|
||||
serversProvider: serversProvider,
|
||||
appConfigProvider: appConfigProvider,
|
||||
context: context,
|
||||
onConfirm: onConfirm,
|
||||
onClear: onClear,
|
||||
dialog: dialog,
|
||||
serverVersion: serverVersion,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class LogsConfigModalWidget extends StatefulWidget {
|
||||
final ServersProvider serversProvider;
|
||||
final AppConfigProvider appConfigProvider;
|
||||
class LogsConfigModal extends StatefulWidget {
|
||||
final BuildContext context;
|
||||
final void Function(Map<String, dynamic>) onConfirm;
|
||||
final void Function() onClear;
|
||||
final bool dialog;
|
||||
final String serverVersion;
|
||||
|
||||
const LogsConfigModalWidget({
|
||||
Key? key,
|
||||
required this.serversProvider,
|
||||
required this.appConfigProvider,
|
||||
const LogsConfigModal({
|
||||
super.key,
|
||||
required this.context,
|
||||
required this.onConfirm,
|
||||
required this.onClear,
|
||||
required this.dialog,
|
||||
required this.serverVersion
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
State<LogsConfigModalWidget> createState() => _LogsConfigModalWidgetState();
|
||||
State<LogsConfigModal> createState() => _LogsConfigModalState();
|
||||
}
|
||||
|
||||
class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
|
||||
class _LogsConfigModalState extends State<LogsConfigModal> {
|
||||
bool generalSwitch = false;
|
||||
bool anonymizeClientIp = false;
|
||||
double? retentionTime;
|
||||
|
@ -88,21 +51,15 @@ class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
|
|||
void loadData() async {
|
||||
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
|
||||
|
||||
final result = serverVersionIsAhead(
|
||||
currentVersion: widget.serverVersion,
|
||||
referenceVersion: 'v0.107.28',
|
||||
referenceVersionBeta: 'v0.108.0-b.33'
|
||||
) == true
|
||||
? await serversProvider.apiClient!.getQueryLogInfo()
|
||||
: await serversProvider.apiClient!.getQueryLogInfoLegacy();
|
||||
final result = await serversProvider.apiClient2!.getQueryLogInfo();
|
||||
|
||||
if (mounted) {
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
setState(() {
|
||||
generalSwitch = result['data']['enabled'];
|
||||
anonymizeClientIp = result['data']['anonymize_client_ip'];
|
||||
retentionTime = result['data']['interval'] != null
|
||||
? double.parse(result['data']['interval'].toString())
|
||||
generalSwitch = result.content['enabled'];
|
||||
anonymizeClientIp = result.content['anonymize_client_ip'];
|
||||
retentionTime = result.content['interval'] != null
|
||||
? double.parse(result.content['interval'].toString())
|
||||
: null;
|
||||
loadStatus = LoadStatus.loaded;
|
||||
});
|
||||
|
@ -115,11 +72,7 @@ class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
|
|||
|
||||
@override
|
||||
void initState() {
|
||||
retentionItems = serverVersionIsAhead(
|
||||
currentVersion: widget.serverVersion,
|
||||
referenceVersion: 'v0.107.28',
|
||||
referenceVersionBeta: 'v0.108.0-b.33'
|
||||
) == true ? [
|
||||
retentionItems = [
|
||||
RetentionItem(
|
||||
label: AppLocalizations.of(widget.context)!.hours6,
|
||||
value: 21600000
|
||||
|
@ -140,27 +93,6 @@ class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
|
|||
label: AppLocalizations.of(widget.context)!.days90,
|
||||
value: 7776000000
|
||||
),
|
||||
] : [
|
||||
RetentionItem(
|
||||
label: AppLocalizations.of(widget.context)!.hours6,
|
||||
value: 0.25
|
||||
),
|
||||
RetentionItem(
|
||||
label: AppLocalizations.of(widget.context)!.hours24,
|
||||
value: 1
|
||||
),
|
||||
RetentionItem(
|
||||
label: AppLocalizations.of(widget.context)!.days7,
|
||||
value: 7
|
||||
),
|
||||
RetentionItem(
|
||||
label: AppLocalizations.of(widget.context)!.days30,
|
||||
value: 30
|
||||
),
|
||||
RetentionItem(
|
||||
label: AppLocalizations.of(widget.context)!.days90,
|
||||
value: 90
|
||||
),
|
||||
];
|
||||
|
||||
loadData();
|
||||
|
|
|
@ -25,10 +25,10 @@ class LogsListAppBar extends StatelessWidget {
|
|||
final bool showDivider;
|
||||
|
||||
const LogsListAppBar({
|
||||
Key? key,
|
||||
super.key,
|
||||
required this.innerBoxIsScrolled,
|
||||
required this.showDivider,
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -43,17 +43,11 @@ class LogsListAppBar extends StatelessWidget {
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.updatingSettings);
|
||||
|
||||
final result = serverVersionIsAhead(
|
||||
currentVersion: statusProvider.serverStatus!.serverVersion,
|
||||
referenceVersion: 'v0.107.28',
|
||||
referenceVersionBeta: 'v0.108.0-b.33'
|
||||
) == true
|
||||
? await serversProvider.apiClient!.updateQueryLogParameters(data: data)
|
||||
: await serversProvider.apiClient!.updateQueryLogParametersLegacy(data: data);
|
||||
final result = await serversProvider.apiClient2!.updateQueryLogParameters(data: data);
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.logsConfigUpdated,
|
||||
|
@ -61,8 +55,6 @@ class LogsListAppBar extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.logsConfigNotUpdated,
|
||||
|
@ -75,11 +67,11 @@ class LogsListAppBar extends StatelessWidget {
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.updatingSettings);
|
||||
|
||||
final result = await serversProvider.apiClient!.clearLogs();
|
||||
final result = await serversProvider.apiClient2!.clearLogs();
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.logsCleared,
|
||||
|
@ -159,6 +151,7 @@ class LogsListAppBar extends StatelessWidget {
|
|||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => LogsConfigModal(
|
||||
context: context,
|
||||
onConfirm: updateConfig,
|
||||
onClear: clearQueries,
|
||||
dialog: true,
|
||||
|
@ -172,6 +165,7 @@ class LogsListAppBar extends StatelessWidget {
|
|||
context: context,
|
||||
useRootNavigator: true,
|
||||
builder: (context) => LogsConfigModal(
|
||||
context: context,
|
||||
onConfirm: updateConfig,
|
||||
onClear: clearQueries,
|
||||
dialog: false,
|
||||
|
|
|
@ -103,14 +103,14 @@ class _ClientsListState extends State<ClientsList> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.clientRemovedSuccessfully,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 'client_another_list') {
|
||||
else if (result.successful == false && result.content == 'client_another_list') {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.clientAnotherList,
|
||||
|
@ -120,7 +120,7 @@ class _ClientsListState extends State<ClientsList> {
|
|||
else {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: type == 'allowed' || type == 'blocked'
|
||||
label: type == AccessSettingsList.allowed || type == AccessSettingsList.disallowed
|
||||
? AppLocalizations.of(context)!.clientNotRemoved
|
||||
: AppLocalizations.of(context)!.domainNotAdded,
|
||||
color: Colors.red
|
||||
|
@ -136,14 +136,14 @@ class _ClientsListState extends State<ClientsList> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.clientAddedSuccessfully,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 'client_another_list') {
|
||||
else if (result.successful == false && result.content == 'client_another_list') {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.clientAnotherList,
|
||||
|
@ -153,7 +153,7 @@ class _ClientsListState extends State<ClientsList> {
|
|||
else {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: type == 'allowed' || type == 'blocked'
|
||||
label: type == AccessSettingsList.allowed || type == AccessSettingsList.disallowed
|
||||
? AppLocalizations.of(context)!.clientNotRemoved
|
||||
: AppLocalizations.of(context)!.domainNotAdded,
|
||||
color: Colors.red
|
||||
|
|
|
@ -194,8 +194,7 @@ class _DhcpScreenState extends State<DhcpScreen> {
|
|||
void saveSettings() async {
|
||||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.savingSettings);
|
||||
|
||||
final result = await serversProvider.apiClient!.saveDhcpConfig(
|
||||
final result = await serversProvider.apiClient2!.saveDhcpConfig(
|
||||
data: {
|
||||
"enabled": enabled,
|
||||
"interface_name": selectedInterface!.name,
|
||||
|
@ -213,10 +212,9 @@ class _DhcpScreenState extends State<DhcpScreen> {
|
|||
}
|
||||
}
|
||||
);
|
||||
|
||||
if (!mounted) return;
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.settingsSaved,
|
||||
|
@ -236,14 +234,11 @@ class _DhcpScreenState extends State<DhcpScreen> {
|
|||
Future.delayed(const Duration(seconds: 0), () async {
|
||||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.restoringConfig);
|
||||
|
||||
final result = await serversProvider.apiClient!.resetDhcpConfig();
|
||||
|
||||
final result = await serversProvider.apiClient2!.resetDhcpConfig();
|
||||
if (!mounted) return;
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
clearAll();
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.configRestored,
|
||||
|
|
|
@ -66,21 +66,21 @@ class DhcpLeases extends StatelessWidget {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.staticLeaseCreated,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 'already_exists' ) {
|
||||
else if (result.successful == false && result.content == "already_exists") {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.staticLeaseExists,
|
||||
color: Colors.red
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 'server_not_configured' ) {
|
||||
else if (result.successful == false && result.content == "server_not_configured") {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.serverNotConfigured,
|
||||
|
|
|
@ -11,7 +11,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart';
|
|||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
|
||||
class BootstrapDnsScreen extends StatefulWidget {
|
||||
const BootstrapDnsScreen({Key? key}) : super(key: key);
|
||||
const BootstrapDnsScreen({super.key});
|
||||
|
||||
@override
|
||||
State<BootstrapDnsScreen> createState() => _BootstrapDnsScreenState();
|
||||
|
@ -79,14 +79,14 @@ class _BootstrapDnsScreenState extends State<BootstrapDnsScreen> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsConfigSaved,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 400) {
|
||||
else if (result.successful == false && result.statusCode == 400) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.someValueNotValid,
|
||||
|
|
|
@ -16,7 +16,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart';
|
|||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
|
||||
class CacheConfigDnsScreen extends StatefulWidget {
|
||||
const CacheConfigDnsScreen({Key? key}) : super(key: key);
|
||||
const CacheConfigDnsScreen({super.key});
|
||||
|
||||
@override
|
||||
State<CacheConfigDnsScreen> createState() => _CacheConfigDnsScreenState();
|
||||
|
@ -85,14 +85,14 @@ class _CacheConfigDnsScreenState extends State<CacheConfigDnsScreen> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsConfigSaved,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 400) {
|
||||
else if (result.successful== false && result.statusCode == 400) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.someValueNotValid,
|
||||
|
@ -138,7 +138,7 @@ class _CacheConfigDnsScreenState extends State<CacheConfigDnsScreen> {
|
|||
|
||||
void clearCache() async {
|
||||
final result = await clearDnsCache(context, serversProvider.selectedServer!);
|
||||
if (result == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsCacheCleared,
|
||||
|
|
|
@ -63,7 +63,7 @@ class _DnsSettingsState extends State<DnsSettings> {
|
|||
|
||||
void clearCache() async {
|
||||
final result = await clearDnsCache(context, serversProvider.selectedServer!);
|
||||
if (result == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsCacheCleared,
|
||||
|
|
|
@ -15,7 +15,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart';
|
|||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
|
||||
class DnsServerSettingsScreen extends StatefulWidget {
|
||||
const DnsServerSettingsScreen({Key? key}) : super(key: key);
|
||||
const DnsServerSettingsScreen({super.key});
|
||||
|
||||
@override
|
||||
State<DnsServerSettingsScreen> createState() => _DnsServerSettingsScreenState();
|
||||
|
@ -118,14 +118,14 @@ class _DnsServerSettingsScreenState extends State<DnsServerSettingsScreen> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsConfigSaved,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 400) {
|
||||
else if (result.successful == false && result.statusCode == 400) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.someValueNotValid,
|
||||
|
|
|
@ -111,14 +111,14 @@ class _PrivateReverseDnsServersScreenState extends State<PrivateReverseDnsServer
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsConfigSaved,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 400) {
|
||||
else if (result.successful == false && result.statusCode == 400) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.someValueNotValid,
|
||||
|
|
|
@ -17,7 +17,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart';
|
|||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
|
||||
class UpstreamDnsScreen extends StatefulWidget {
|
||||
const UpstreamDnsScreen({Key? key}) : super(key: key);
|
||||
const UpstreamDnsScreen({super.key});
|
||||
|
||||
@override
|
||||
State<UpstreamDnsScreen> createState() => _UpstreamDnsScreenState();
|
||||
|
@ -151,14 +151,14 @@ class _UpstreamDnsScreenState extends State<UpstreamDnsScreen> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.dnsConfigSaved,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else if (result['success'] == false && result['error'] == 400) {
|
||||
else if (result.successful == false && result.statusCode == 400) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.someValueNotValid,
|
||||
|
|
|
@ -13,6 +13,8 @@ import 'package:adguard_home_manager/screens/settings/encryption/master_switch.d
|
|||
import 'package:adguard_home_manager/screens/settings/encryption/encryption_functions.dart';
|
||||
import 'package:adguard_home_manager/screens/settings/encryption/error_message.dart';
|
||||
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
import 'package:adguard_home_manager/models/encryption.dart';
|
||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||
import 'package:adguard_home_manager/functions/desktop_mode.dart';
|
||||
import 'package:adguard_home_manager/functions/base64.dart';
|
||||
|
@ -20,37 +22,16 @@ import 'package:adguard_home_manager/functions/snackbar.dart';
|
|||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||
|
||||
class EncryptionSettings extends StatelessWidget {
|
||||
const EncryptionSettings({Key? key}) : super(key: key);
|
||||
class EncryptionSettings extends StatefulWidget {
|
||||
const EncryptionSettings({super.key});
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final serversProvider = Provider.of<ServersProvider>(context);
|
||||
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
||||
|
||||
return EncryptionSettingsWidget(
|
||||
serversProvider: serversProvider,
|
||||
appConfigProvider: appConfigProvider,
|
||||
);
|
||||
}
|
||||
State<EncryptionSettings> createState() => _EncryptionSettingsState();
|
||||
}
|
||||
|
||||
class EncryptionSettingsWidget extends StatefulWidget {
|
||||
final ServersProvider serversProvider;
|
||||
final AppConfigProvider appConfigProvider;
|
||||
|
||||
const EncryptionSettingsWidget({
|
||||
Key? key,
|
||||
required this.serversProvider,
|
||||
required this.appConfigProvider,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<EncryptionSettingsWidget> createState() => _EncryptionSettingsWidgetState();
|
||||
}
|
||||
|
||||
class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
||||
int loadStatus = 0;
|
||||
class _EncryptionSettingsState extends State<EncryptionSettings> {
|
||||
LoadStatus loadStatus = LoadStatus.loading;
|
||||
|
||||
bool enabled = false;
|
||||
|
||||
|
@ -96,54 +77,52 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
bool formEdited = false;
|
||||
|
||||
void fetchData({bool? showRefreshIndicator}) async {
|
||||
setState(() => loadStatus = 0);
|
||||
setState(() => loadStatus = LoadStatus.loading);
|
||||
|
||||
final result = await Provider.of<ServersProvider>(context, listen: false).apiClient!.getEncryptionSettings();
|
||||
final result = await Provider.of<ServersProvider>(context, listen: false).apiClient2!.getEncryptionSettings();
|
||||
if (!mounted) return;
|
||||
|
||||
if (mounted) {
|
||||
if (result['result'] == 'success') {
|
||||
await checkValidDataApi(data: result['data'].toJson());
|
||||
final data = result.content as EncryptionData;
|
||||
|
||||
if (result.successful == true) {
|
||||
await checkValidDataApi(data: data.toJson());
|
||||
if (!mounted) return;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
enabled = result['data'].enabled;
|
||||
domainNameController.text = result['data'].serverName ?? '';
|
||||
redirectHttps = result['data'].forceHttps;
|
||||
httpsPortController.text = result['data'].portHttps != null ? result['data'].portHttps.toString() : '';
|
||||
tlsPortController.text = result['data'].portDnsOverTls != null ? result['data'].portDnsOverTls.toString() : '';
|
||||
dnsOverQuicPortController.text = result['data'].portDnsOverQuic != null ? result['data'].portDnsOverQuic.toString() : '';
|
||||
if (result['data'].certificateChain != '') {
|
||||
enabled = data.enabled;
|
||||
domainNameController.text = data.serverName ?? '';
|
||||
redirectHttps = data.forceHttps ?? false;
|
||||
httpsPortController.text = data.portHttps != null ? data.portHttps.toString() : '';
|
||||
tlsPortController.text = data.portDnsOverTls != null ? data.portDnsOverTls.toString() : '';
|
||||
dnsOverQuicPortController.text = data.portDnsOverQuic != null ? data.portDnsOverQuic.toString() : '';
|
||||
if (data.certificateChain != '') {
|
||||
certificateOption = 1;
|
||||
certificateContentController.text = decodeBase64(result['data'].certificateChain);
|
||||
certificateContentController.text = decodeBase64(data.certificateChain);
|
||||
}
|
||||
else {
|
||||
certificateOption = 0;
|
||||
certificatePathController.text = result['data'].certificatePath;
|
||||
certificatePathController.text = data.certificatePath;
|
||||
}
|
||||
if (result['data'].privateKey != '' || result['data'].privateKeySaved == true) {
|
||||
if (data.privateKey != '' || data.privateKeySaved == true) {
|
||||
privateKeyOption = 1;
|
||||
}
|
||||
else {
|
||||
privateKeyOption = 0;
|
||||
privateKeyPathController.text = result['data'].privateKeyPath;
|
||||
privateKeyPathController.text = data.privateKeyPath;
|
||||
}
|
||||
usePreviouslySavedKey = result['data'].privateKeySaved;
|
||||
|
||||
loadStatus = 1;
|
||||
usePreviouslySavedKey = data.privateKeySaved;
|
||||
loadStatus = LoadStatus.loaded;
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
widget.appConfigProvider.addLog(result['log']);
|
||||
setState(() => loadStatus = 2);
|
||||
}
|
||||
setState(() => loadStatus = LoadStatus.error);
|
||||
}
|
||||
}
|
||||
|
||||
Future checkValidDataApi({Map<String, dynamic>? data}) async {
|
||||
setState(() => certKeyValidApi = 0);
|
||||
|
||||
final result = await Provider.of<ServersProvider>(context, listen: false).apiClient!.checkEncryptionSettings(
|
||||
final result = await Provider.of<ServersProvider>(context, listen: false).apiClient2!.checkEncryptionSettings(
|
||||
data: data ?? {
|
||||
"enabled": enabled,
|
||||
"server_name": domainNameController.text,
|
||||
|
@ -160,23 +139,20 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
);
|
||||
|
||||
if (mounted) {
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
setState(() {
|
||||
if (result['data']['warning_validation'] != null && result['data']['warning_validation'] != '') {
|
||||
if (result.content['warning_validation'] != null && result.content['warning_validation'] != '') {
|
||||
certKeyValidApi = 2;
|
||||
validDataError = result['data']['warning_validation'];
|
||||
validDataError = result.content['warning_validation'];
|
||||
}
|
||||
else {
|
||||
certKeyValidApi = 1;
|
||||
validDataError = null;
|
||||
}
|
||||
certKeyValid = result['data'];
|
||||
certKeyValid = result.content;
|
||||
});
|
||||
}
|
||||
else {
|
||||
if (result['log'].resBody != null) {
|
||||
setState(() => validDataError = result['log'].resBody);
|
||||
}
|
||||
setState(() => certKeyValidApi = 2);
|
||||
}
|
||||
}
|
||||
|
@ -228,7 +204,7 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.savingConfig);
|
||||
|
||||
final result = await serversProvider.apiClient!.saveEncryptionSettings(
|
||||
final result = await serversProvider.apiClient2!.saveEncryptionSettings(
|
||||
data: {
|
||||
"enabled": enabled,
|
||||
"server_name": domainNameController.text,
|
||||
|
@ -246,7 +222,7 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.encryptionConfigSaved,
|
||||
|
@ -254,19 +230,17 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.encryptionConfigNotSaved,
|
||||
color: Colors.red
|
||||
);
|
||||
|
||||
if (result['log'].resBody != null) {
|
||||
if (result.content != null) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => ErrorMessageEncryption(
|
||||
errorMessage: result['log'].resBody
|
||||
errorMessage: result.content
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -303,7 +277,7 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
body: Builder(
|
||||
builder: (context) {
|
||||
switch (loadStatus) {
|
||||
case 0:
|
||||
case LoadStatus.loading:
|
||||
return SizedBox(
|
||||
width: double.maxFinite,
|
||||
child: Column(
|
||||
|
@ -324,7 +298,7 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
)
|
||||
);
|
||||
|
||||
case 1:
|
||||
case LoadStatus.loaded:
|
||||
return ListView(
|
||||
children: [
|
||||
EncryptionMasterSwitch(
|
||||
|
@ -641,7 +615,7 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
],
|
||||
);
|
||||
|
||||
case 2:
|
||||
case LoadStatus.error:
|
||||
return SizedBox(
|
||||
width: double.maxFinite,
|
||||
child: Column(
|
||||
|
|
|
@ -35,11 +35,11 @@ class UpdateScreen extends StatelessWidget {
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.requestingUpdate);
|
||||
|
||||
final result = await serversProvider.apiClient!.requestUpdateServer();
|
||||
final result = await serversProvider.apiClient2!.requestUpdateServer();
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
if (result.successful == true) {
|
||||
serversProvider.recheckPeriodServerUpdated();
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
|
|
764
lib/services/api_client.dart
Normal file
764
lib/services/api_client.dart
Normal file
|
@ -0,0 +1,764 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
|
||||
import 'package:adguard_home_manager/models/blocked_services.dart';
|
||||
import 'package:adguard_home_manager/models/dns_info.dart';
|
||||
import 'package:adguard_home_manager/models/encryption.dart';
|
||||
import 'package:adguard_home_manager/models/dhcp.dart';
|
||||
import 'package:adguard_home_manager/models/rewrite_rules.dart';
|
||||
import 'package:adguard_home_manager/models/filtering.dart';
|
||||
import 'package:adguard_home_manager/models/filtering_status.dart';
|
||||
import 'package:adguard_home_manager/models/server_info.dart';
|
||||
import 'package:adguard_home_manager/models/logs.dart';
|
||||
import 'package:adguard_home_manager/models/clients.dart';
|
||||
import 'package:adguard_home_manager/models/clients_allowed_blocked.dart';
|
||||
import 'package:adguard_home_manager/models/server.dart';
|
||||
import 'package:adguard_home_manager/models/server_status.dart';
|
||||
import 'package:adguard_home_manager/classes/http_client.dart';
|
||||
|
||||
class ApiResponse {
|
||||
final bool successful;
|
||||
final dynamic content;
|
||||
final int? statusCode;
|
||||
|
||||
const ApiResponse({
|
||||
required this.successful,
|
||||
this.content,
|
||||
this.statusCode,
|
||||
});
|
||||
}
|
||||
|
||||
class ApiClientV2 {
|
||||
final Server server;
|
||||
|
||||
ApiClientV2({
|
||||
required this.server
|
||||
});
|
||||
|
||||
Future<ApiResponse> getServerStatus() async {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.get(urlPath: "/stats", server: server),
|
||||
HttpRequestClient.get(urlPath: "/status", server: server),
|
||||
HttpRequestClient.get(urlPath: "/filtering/status", server: server),
|
||||
HttpRequestClient.get(urlPath: "/safesearch/status", server: server),
|
||||
HttpRequestClient.get(urlPath: "/safebrowsing/status", server: server),
|
||||
HttpRequestClient.get(urlPath: "/parental/status", server: server),
|
||||
HttpRequestClient.get(urlPath: "/clients", server: server),
|
||||
]);
|
||||
|
||||
if (
|
||||
results.map((e) => e.successful).every((e) => e == true) &&
|
||||
results.map((e) => e.body).every((e) => e != null)
|
||||
) {
|
||||
final Map<String, dynamic> mappedData = {
|
||||
'stats': jsonDecode(results[0].body!),
|
||||
'clients': jsonDecode(results[6].body!)['clients'],
|
||||
'status': jsonDecode(results[1].body!),
|
||||
'filtering': jsonDecode(results[2].body!),
|
||||
'safeSearch': jsonDecode(results[3].body!),
|
||||
'safeBrowsingEnabled': jsonDecode(results[4].body!),
|
||||
'parentalControlEnabled': jsonDecode(results[5].body!),
|
||||
};
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: ServerStatus.fromJson(mappedData)
|
||||
);
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateFiltering({
|
||||
required bool enable
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: "/filtering/config",
|
||||
server: server,
|
||||
body: {
|
||||
'enabled': enable
|
||||
}
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateSafeBrowsing({
|
||||
required bool enable
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: enable == true
|
||||
? "/safebrowsing/enable"
|
||||
: "/safebrowsing/disable",
|
||||
server: server,
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateParentalControl({
|
||||
required bool enable
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: enable == true
|
||||
? "/parental/enable"
|
||||
: "/parental/disable",
|
||||
server: server,
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateGeneralProtection({
|
||||
required bool enable,
|
||||
int? time,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: "/protection",
|
||||
server: server,
|
||||
body: {
|
||||
'enabled': enable,
|
||||
'duration': time
|
||||
}
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getClients() async {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.get(urlPath: "/clients", server: server),
|
||||
HttpRequestClient.get(urlPath: "/access/list", server: server),
|
||||
]);
|
||||
if (
|
||||
results.map((e) => e.successful).every((e) => e == true) &&
|
||||
results.map((e) => e.body).every((e) => e != null)
|
||||
) {
|
||||
try {
|
||||
final clients = Clients.fromJson(jsonDecode(results[0].body!));
|
||||
clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(results[1].body!));
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: clients
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> requestAllowedBlockedClientsHosts({
|
||||
required Map<String, List<String>?> body
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: "/access/set",
|
||||
server: server,
|
||||
body: body
|
||||
);
|
||||
if (result.statusCode == 400) {
|
||||
return const ApiResponse(
|
||||
successful: false,
|
||||
content: "client_another_list"
|
||||
);
|
||||
}
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getLogs({
|
||||
required int count,
|
||||
int? offset,
|
||||
DateTime? olderThan,
|
||||
String? responseStatus,
|
||||
String? search
|
||||
}) async {
|
||||
final result = await HttpRequestClient.get(
|
||||
urlPath: '/querylog?limit=$count${offset != null ? '&offset=$offset' : ''}${olderThan != null ? '&older_than=${olderThan.toIso8601String()}' : ''}${responseStatus != null ? '&response_status=$responseStatus' : ''}${search != null ? '&search=$search' : ''}',
|
||||
server: server
|
||||
);
|
||||
if (result.successful == true) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: LogsData.fromJson(jsonDecode(result.body!))
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> getFilteringRules() async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/filtering/status', server: server);
|
||||
if (result.successful == true) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: FilteringStatus.fromJson(jsonDecode(result.body!))
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> postFilteringRules({
|
||||
required Map<String, List<String>> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/filtering/set_rules',
|
||||
server: server,
|
||||
body: data
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> postAddClient({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/clients/add',
|
||||
server: server,
|
||||
body: data
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> postUpdateClient({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/clients/update',
|
||||
server: server,
|
||||
body: data
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> postDeleteClient({
|
||||
required String name,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/clients/delete',
|
||||
server: server,
|
||||
body: {'name': name},
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getFiltering() async {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.get(urlPath: '/filtering/status', server: server),
|
||||
HttpRequestClient.get(urlPath: '/blocked_services/list', server: server),
|
||||
]);
|
||||
if (results[0].successful == true && results[0].body != null) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: Filtering.fromJson({
|
||||
...jsonDecode(results[0].body!),
|
||||
"blocked_services": results[1].body != null
|
||||
? jsonDecode(results[1].body!)
|
||||
: []
|
||||
})
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> setCustomRules({
|
||||
required List<String> rules,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/filtering/set_rules',
|
||||
server: server,
|
||||
body: {'rules': rules},
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> addFilteringList({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/filtering/add_url',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
content: result.body,
|
||||
statusCode: result.statusCode
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateFilterList({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/filtering/set_url',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> deleteFilterList({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/filtering/remove_url',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getServerInfo() async {
|
||||
final result = await HttpRequestClient.get(urlPath: "/status", server: server);
|
||||
if (result.successful) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: ServerInfoData.fromJson(jsonDecode(result.body!))
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateLists() async {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.post(
|
||||
urlPath: '/filtering/refresh',
|
||||
server: server,
|
||||
body: {'whitelist': true},
|
||||
),
|
||||
HttpRequestClient.post(
|
||||
urlPath: '/filtering/refresh',
|
||||
server: server,
|
||||
body: {'whitelist': false},
|
||||
),
|
||||
]);
|
||||
if (
|
||||
results.map((e) => e.successful).every((e) => e == true) &&
|
||||
results.map((e) => e.body).every((e) => e != null)
|
||||
) {
|
||||
try {
|
||||
final clients = Clients.fromJson(jsonDecode(results[0].body!));
|
||||
clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(results[1].body!));
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: {'updated': jsonDecode(results[0].body!)['updated']+jsonDecode(results[1].body!)['updated']}
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> checkHostFiltered({
|
||||
required String host
|
||||
}) async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/filtering/check_host?name=$host', server: server);
|
||||
if (result.successful) {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: jsonDecode(result.body!)
|
||||
);
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> requestChangeUpdateFrequency({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/filtering/config',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> setBlockedServices({
|
||||
required List<String> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/blocked_services/set',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getDhcpData() async {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.get(urlPath: '/dhcp/interfaces', server: server),
|
||||
HttpRequestClient.get(urlPath: '/dhcp/status', server: server),
|
||||
]);
|
||||
if (
|
||||
results.map((e) => e.successful).every((e) => e == true) &&
|
||||
results.map((e) => e.body).every((e) => e != null)
|
||||
) {
|
||||
try {
|
||||
List<NetworkInterface> interfaces = List<NetworkInterface>.from(jsonDecode(results[0].body!).entries.map((entry) => NetworkInterface.fromJson(entry.value)));
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: DhcpModel(
|
||||
networkInterfaces: interfaces,
|
||||
dhcpStatus: DhcpStatus.fromJson(jsonDecode(results[1].body!))
|
||||
)
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> saveDhcpConfig({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/dhcp/set_config',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> resetDhcpConfig() async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/dhcp/reset',
|
||||
server: server,
|
||||
body: {},
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> deleteStaticLease({
|
||||
required Map<String, dynamic> data
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/dhcp/remove_static_lease',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> createStaticLease({
|
||||
required Map<String, dynamic> data
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/dhcp/add_static_lease',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
if (result.statusCode == 400 && result.body != null && result.body!.contains('static lease already exists')) {
|
||||
return const ApiResponse(
|
||||
successful: false,
|
||||
content: "already_exists",
|
||||
statusCode: 400
|
||||
);
|
||||
}
|
||||
if (result.statusCode == 400 && result.body != null && result.body!.contains('server is unconfigured')) {
|
||||
return const ApiResponse(
|
||||
successful: false,
|
||||
content: "server_not_configured",
|
||||
statusCode: 400
|
||||
);
|
||||
}
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> restoreAllLeases() async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/dhcp/reset_leases',
|
||||
server: server,
|
||||
body: {},
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getDnsRewriteRules() async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/rewrite/list', server: server);
|
||||
if (result.successful) {
|
||||
try {
|
||||
final List<RewriteRules> data = List<RewriteRules>.from(
|
||||
jsonDecode(result.body!).map((item) => RewriteRules.fromJson(item))
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: data
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> deleteDnsRewriteRule({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/rewrite/delete',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> addDnsRewriteRule({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/rewrite/add',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getQueryLogInfo() async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/querylog/config', server: server);
|
||||
if (result.successful) {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: jsonDecode(result.body!)
|
||||
);
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateQueryLogParameters({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.put(
|
||||
urlPath: '/querylog/config/update',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> clearLogs() async {
|
||||
final result = await HttpRequestClient.put(
|
||||
urlPath: '/querylog_clear',
|
||||
server: server,
|
||||
body: {},
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getDnsInfo() async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/dns_info', server: server);
|
||||
if (result.successful) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: DnsInfo.fromJson(jsonDecode(result.body!))
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> setDnsConfig({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/dns_config',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
if (result.statusCode == 400) {
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
content: "data_not_valid",
|
||||
statusCode: result.statusCode
|
||||
);
|
||||
}
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> getEncryptionSettings() async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/tls/status', server: server);
|
||||
if (result.successful) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: EncryptionData.fromJson(jsonDecode(result.body!))
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> getBlockedServices() async {
|
||||
final result = await HttpRequestClient.get(urlPath: '/blocked_services/all', server: server);
|
||||
if (result.successful) {
|
||||
try {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: List<BlockedService>.from(
|
||||
BlockedServicesFromApi.fromJson(jsonDecode(result.body!)).blockedServices
|
||||
)
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> checkEncryptionSettings({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/tls/validate',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
content: result.body != null ? jsonDecode(result.body!) : null
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> saveEncryptionSettings({
|
||||
required Map<String, dynamic> data,
|
||||
}) async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/tls/configure',
|
||||
server: server,
|
||||
body: data,
|
||||
);
|
||||
return ApiResponse(
|
||||
successful: result.successful,
|
||||
content: result.body
|
||||
);
|
||||
}
|
||||
|
||||
Future<ApiResponse> resetDnsCache() async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/cache_clear',
|
||||
server: server,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> checkServerUpdates() async {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.post(urlPath: '/version.json', server: server, body: { "recheck_now": true }),
|
||||
HttpRequestClient.get(urlPath: '/status', server: server),
|
||||
]);
|
||||
if (
|
||||
results.map((e) => e.successful).every((e) => e == true) &&
|
||||
results.map((e) => e.body).every((e) => e != null)
|
||||
) {
|
||||
try {
|
||||
final Map<String, dynamic> obj = {
|
||||
...jsonDecode(results[0].body!),
|
||||
'current_version': ServerInfoData.fromJson(jsonDecode(results[1].body!)).version
|
||||
};
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: obj
|
||||
);
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
Future<ApiResponse> requestUpdateServer() async {
|
||||
final result = await HttpRequestClient.post(
|
||||
urlPath: '/update',
|
||||
server: server,
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateSafeSearchSettings({
|
||||
required Map<String, bool> body
|
||||
}) async {
|
||||
final result = await HttpRequestClient.put(
|
||||
urlPath: '/safesearch/settings',
|
||||
server: server,
|
||||
body: body
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
|
||||
Future<ApiResponse> updateRewriteRule({
|
||||
required Map<String, dynamic> body
|
||||
}) async {
|
||||
final result = await HttpRequestClient.put(
|
||||
urlPath: '/rewrite/update',
|
||||
server: server,
|
||||
body: body
|
||||
);
|
||||
return ApiResponse(successful: result.successful);
|
||||
}
|
||||
}
|
80
lib/services/external_requests.dart
Normal file
80
lib/services/external_requests.dart
Normal file
|
@ -0,0 +1,80 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
|
||||
import 'package:adguard_home_manager/models/github_release.dart';
|
||||
import 'package:adguard_home_manager/constants/urls.dart';
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
|
||||
class ExternalRequests {
|
||||
static Future<ApiResponse> getUpdateChangelog({
|
||||
required String releaseTag
|
||||
}) async {
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse("${Urls.adGuardHomeReleasesTags}/$releaseTag"));
|
||||
HttpClientResponse response = await request.close();
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
if (response.statusCode == 200) {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: jsonDecode(reply)['body'],
|
||||
statusCode: response.statusCode
|
||||
);
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<ApiResponse> getReleasesGitHub() async {
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getReleasesGitHub));
|
||||
HttpClientResponse response = await request.close();
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
if (response.statusCode == 200) {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: List<GitHubRelease>.from(jsonDecode(reply).map((entry) => GitHubRelease.fromJson(entry)))
|
||||
);
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<ApiResponse> getLatestReleaseGitHub() async {
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getLatestReleaseGitHub));
|
||||
HttpClientResponse response = await request.close();
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
if (response.statusCode == 200) {
|
||||
return ApiResponse(
|
||||
successful: true,
|
||||
content: GitHubRelease.fromJson(jsonDecode(reply)),
|
||||
statusCode: response.statusCode
|
||||
);
|
||||
}
|
||||
else {
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
} catch (e, stackTrace) {
|
||||
Sentry.captureException(e, stackTrace: stackTrace);
|
||||
return const ApiResponse(successful: false);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2165,79 +2165,6 @@ class ApiClient {
|
|||
}
|
||||
}
|
||||
|
||||
Future getUpdateChangelog({
|
||||
required String releaseTag
|
||||
}) async {
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse("${Urls.adGuardHomeReleasesTags}/$releaseTag"));
|
||||
HttpClientResponse response = await request.close();
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
if (response.statusCode == 200) {
|
||||
return {
|
||||
'result': 'success',
|
||||
'hasResponse': true,
|
||||
'error': false,
|
||||
'statusCode': response.statusCode,
|
||||
'body': jsonDecode(reply)['body']
|
||||
};
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'result': 'error',
|
||||
'log': AppLog(
|
||||
type: 'update_encryption_settings',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'error_code_not_expected',
|
||||
statusCode: response.statusCode.toString(),
|
||||
resBody: reply,
|
||||
)
|
||||
};
|
||||
}
|
||||
} on SocketException {
|
||||
return {
|
||||
'result': 'no_connection',
|
||||
'message': 'SocketException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'SocketException'
|
||||
)
|
||||
};
|
||||
} on TimeoutException {
|
||||
return {
|
||||
'result': 'no_connection',
|
||||
'message': 'TimeoutException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'TimeoutException'
|
||||
)
|
||||
};
|
||||
} on HandshakeException {
|
||||
return {
|
||||
'result': 'ssl_error',
|
||||
'message': 'HandshakeException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'HandshakeException'
|
||||
)
|
||||
};
|
||||
} catch (e) {
|
||||
return {
|
||||
'result': 'error',
|
||||
'message': e.toString(),
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: e.toString()
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Future requestUpdateServer() async {
|
||||
final result = await apiRequest(
|
||||
urlPath: '/update',
|
||||
|
@ -2334,145 +2261,3 @@ class ApiClient {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future getReleasesGitHub() async {
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getReleasesGitHub));
|
||||
HttpClientResponse response = await request.close();
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
if (response.statusCode == 200) {
|
||||
return {
|
||||
'result': 'success',
|
||||
'hasResponse': true,
|
||||
'error': false,
|
||||
'statusCode': response.statusCode,
|
||||
'body': List<GitHubRelease>.from(jsonDecode(reply).map((entry) => GitHubRelease.fromJson(entry)))
|
||||
};
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'result': 'error',
|
||||
'log': AppLog(
|
||||
type: 'update_encryption_settings',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'error_code_not_expected',
|
||||
statusCode: response.statusCode.toString(),
|
||||
resBody: reply,
|
||||
)
|
||||
};
|
||||
}
|
||||
} on SocketException {
|
||||
return {
|
||||
'result': 'no_connection',
|
||||
'message': 'SocketException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'SocketException'
|
||||
)
|
||||
};
|
||||
} on TimeoutException {
|
||||
return {
|
||||
'result': 'no_connection',
|
||||
'message': 'TimeoutException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'TimeoutException'
|
||||
)
|
||||
};
|
||||
} on HandshakeException {
|
||||
return {
|
||||
'result': 'ssl_error',
|
||||
'message': 'HandshakeException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'HandshakeException'
|
||||
)
|
||||
};
|
||||
} catch (e) {
|
||||
return {
|
||||
'result': 'error',
|
||||
'message': e.toString(),
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: e.toString()
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Future getLatestReleaseGitHub() async {
|
||||
try {
|
||||
HttpClient httpClient = HttpClient();
|
||||
HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getLatestReleaseGitHub));
|
||||
HttpClientResponse response = await request.close();
|
||||
String reply = await response.transform(utf8.decoder).join();
|
||||
httpClient.close();
|
||||
if (response.statusCode == 200) {
|
||||
return {
|
||||
'result': 'success',
|
||||
'hasResponse': true,
|
||||
'error': false,
|
||||
'statusCode': response.statusCode,
|
||||
'body': GitHubRelease.fromJson(jsonDecode(reply))
|
||||
};
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'result': 'error',
|
||||
'log': AppLog(
|
||||
type: 'update_encryption_settings',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'error_code_not_expected',
|
||||
statusCode: response.statusCode.toString(),
|
||||
resBody: reply,
|
||||
)
|
||||
};
|
||||
}
|
||||
} on SocketException {
|
||||
return {
|
||||
'result': 'no_connection',
|
||||
'message': 'SocketException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'SocketException'
|
||||
)
|
||||
};
|
||||
} on TimeoutException {
|
||||
return {
|
||||
'result': 'no_connection',
|
||||
'message': 'TimeoutException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'TimeoutException'
|
||||
)
|
||||
};
|
||||
} on HandshakeException {
|
||||
return {
|
||||
'result': 'ssl_error',
|
||||
'message': 'HandshakeException',
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'HandshakeException'
|
||||
)
|
||||
};
|
||||
} catch (e) {
|
||||
return {
|
||||
'result': 'error',
|
||||
'message': e.toString(),
|
||||
'log': AppLog(
|
||||
type: 'check_latest_release_github',
|
||||
dateTime: DateTime.now(),
|
||||
message: e.toString()
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
|
@ -12,6 +12,7 @@ import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
|
|||
import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart';
|
||||
|
||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||
import 'package:adguard_home_manager/constants/urls.dart';
|
||||
import 'package:adguard_home_manager/functions/open_url.dart';
|
||||
|
@ -191,10 +192,11 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
statusProvider.setServerStatusLoad(LoadStatus.loading);
|
||||
final ApiClient apiClient = ApiClient(server: serverObj);
|
||||
final serverStatus = await apiClient.getServerStatus();
|
||||
final ApiClientV2 apiClient2 = ApiClientV2(server: serverObj);
|
||||
final serverStatus2 = await apiClient2.getServerStatus();
|
||||
|
||||
// If something goes wrong when fetching server status
|
||||
if (serverStatus['result'] != 'success') {
|
||||
appConfigProvider.addLog(serverStatus['log']);
|
||||
if (serverStatus2.successful == false) {
|
||||
statusProvider.setServerStatusLoad(LoadStatus.error);
|
||||
Navigator.pop(context);
|
||||
return;
|
||||
|
|
|
@ -8,6 +8,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||
import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart';
|
||||
import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart';
|
||||
|
||||
import 'package:adguard_home_manager/models/server_status.dart';
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||
import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
|
@ -104,23 +106,21 @@ class _ServersListItemState extends State<ServersListItem> with SingleTickerProv
|
|||
if (result['result'] == 'success') {
|
||||
final ApiClient apiClient = ApiClient(server: server);
|
||||
serversProvider.setApiClient(apiClient);
|
||||
final ApiClientV2 apiClient2 = ApiClientV2(server: server);
|
||||
serversProvider.setApiClient2(apiClient2);
|
||||
serversProvider.setSelectedServer(server);
|
||||
|
||||
statusProvider.setServerStatusLoad(LoadStatus.loading);
|
||||
final serverStatus = await apiClient.getServerStatus();
|
||||
if (serverStatus['result'] == 'success') {
|
||||
final serverStatus = await apiClient2.getServerStatus();
|
||||
if (serverStatus.successful == true) {
|
||||
statusProvider.setServerStatusData(
|
||||
data: serverStatus['data']
|
||||
data: serverStatus.content as ServerStatus
|
||||
);
|
||||
serversProvider.checkServerUpdatesAvailable(
|
||||
server: server,
|
||||
);
|
||||
statusProvider.setServerStatusLoad(LoadStatus.loaded);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(serverStatus['log']);
|
||||
statusProvider.setServerStatusLoad(LoadStatus.error);
|
||||
}
|
||||
|
||||
process.close();
|
||||
}
|
||||
|
|
|
@ -7,6 +7,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||
import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart';
|
||||
import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart';
|
||||
|
||||
import 'package:adguard_home_manager/models/server_status.dart';
|
||||
import 'package:adguard_home_manager/services/api_client.dart';
|
||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||
import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||
import 'package:adguard_home_manager/constants/enums.dart';
|
||||
|
@ -73,13 +75,15 @@ class _ServersTileItemState extends State<ServersTileItem> with SingleTickerProv
|
|||
if (result['result'] == 'success') {
|
||||
final ApiClient apiClient = ApiClient(server: server);
|
||||
serversProvider.setApiClient(apiClient);
|
||||
final ApiClientV2 apiClient2 = ApiClientV2(server: server);
|
||||
serversProvider.setApiClient2(apiClient2);
|
||||
serversProvider.setSelectedServer(server);
|
||||
|
||||
statusProvider.setServerStatusLoad(LoadStatus.loading);
|
||||
final serverStatus = await apiClient.getServerStatus();
|
||||
if (serverStatus['result'] == 'success') {
|
||||
final serverStatus = await apiClient2.getServerStatus();
|
||||
if (serverStatus.successful == true) {
|
||||
statusProvider.setServerStatusData(
|
||||
data: serverStatus['data']
|
||||
data: serverStatus.content as ServerStatus
|
||||
);
|
||||
serversProvider.checkServerUpdatesAvailable(
|
||||
server: server,
|
||||
|
@ -87,7 +91,6 @@ class _ServersTileItemState extends State<ServersTileItem> with SingleTickerProv
|
|||
statusProvider.setServerStatusLoad(LoadStatus.loaded);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(serverStatus['log']);
|
||||
statusProvider.setServerStatusLoad(LoadStatus.error);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue