Bug fixes

This commit is contained in:
Juan Gilsanz Polo 2023-10-04 19:20:43 +02:00
parent bc7cb4ccd4
commit 525facc538
9 changed files with 171 additions and 121 deletions

View file

@ -72,8 +72,8 @@ class DhcpStatus {
factory DhcpStatus.fromJson(Map<String, dynamic> json) => DhcpStatus( factory DhcpStatus.fromJson(Map<String, dynamic> json) => DhcpStatus(
interfaceName: json["interface_name"], interfaceName: json["interface_name"],
v4: IpVersion.fromJson(json["v4"]), v4: json["v4"] != null ? IpVersion.fromJson(json["v4"]) : null,
v6: IpVersion.fromJson(json["v6"]), v6: json["v6"] != null ? IpVersion.fromJson(json["v6"]) : null,
leases: List<Lease>.from(json["leases"].map((x) => Lease.fromJson(x))), leases: List<Lease>.from(json["leases"].map((x) => Lease.fromJson(x))),
staticLeases: List<Lease>.from(json["static_leases"].map((x) => Lease.fromJson(x))), staticLeases: List<Lease>.from(json["static_leases"].map((x) => Lease.fromJson(x))),
enabled: json["enabled"], enabled: json["enabled"],

View file

@ -12,7 +12,7 @@ class DnsInfo {
int? cacheSize; int? cacheSize;
int? cacheTtlMin; int? cacheTtlMin;
int? cacheTtlMax; int? cacheTtlMax;
bool cacheOptimistic; bool? cacheOptimistic;
bool resolveClients; bool resolveClients;
bool usePrivatePtrResolvers; bool usePrivatePtrResolvers;
List<String> localPtrUpstreams; List<String> localPtrUpstreams;

View file

@ -169,12 +169,14 @@ class ServersProvider with ChangeNotifier {
void checkServerUpdatesAvailable({ void checkServerUpdatesAvailable({
required Server server, required Server server,
ApiClient? apiClient
}) async { }) async {
final client = apiClient ?? _apiClient;
setUpdateAvailableLoadStatus(LoadStatus.loading, true); setUpdateAvailableLoadStatus(LoadStatus.loading, true);
final result = await _apiClient!.checkServerUpdates(); final result = await client!.checkServerUpdates();
if (result['result'] == 'success') { if (result['result'] == 'success') {
UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']); UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']);
final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); final gitHubResult = await client!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
if (gitHubResult['result'] == 'success') { if (gitHubResult['result'] == 'success') {
data.changelog = gitHubResult['body']; data.changelog = gitHubResult['body'];
} }
@ -186,11 +188,12 @@ class ServersProvider with ChangeNotifier {
} }
} }
Future initializateServer(Server server) async { Future initializateServer(Server server, ApiClient apiClient) async {
final serverStatus = await _apiClient!.getServerStatus(); final serverStatus = await _apiClient!.getServerStatus();
if (serverStatus['result'] == 'success') { if (serverStatus['result'] == 'success') {
checkServerUpdatesAvailable( // Do not await checkServerUpdatesAvailable( // Do not await
server: server, server: server,
apiClient: apiClient
); );
} }
} }
@ -222,8 +225,9 @@ class ServersProvider with ChangeNotifier {
if (defaultServer != null) { if (defaultServer != null) {
_selectedServer = defaultServer; _selectedServer = defaultServer;
_apiClient = ApiClient(server: defaultServer); final client = ApiClient(server: defaultServer);
initializateServer(defaultServer); _apiClient = client;
initializateServer(defaultServer, client);
} }
} }
else { else {

View file

@ -304,7 +304,7 @@ class _HomeState extends State<Home> {
displacement: 95, displacement: 95,
onRefresh: () async { onRefresh: () async {
final result = await statusProvider.getServerStatus(); final result = await statusProvider.getServerStatus();
if (result == false) { if (mounted && result == false) {
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.serverStatusNotRefreshed, label: AppLocalizations.of(context)!.serverStatusNotRefreshed,

View file

@ -80,7 +80,7 @@ class _ManagementModalState extends State<ManagementModal> with SingleTickerProv
newStatus: value, newStatus: value,
time: time time: time
); );
if (result != null) { if (mounted && result != null) {
if (result != false) { if (result != false) {
appConfigProvider.addLog(result); appConfigProvider.addLog(result);
} }

View file

@ -58,7 +58,7 @@ class _CacheConfigDnsScreenState extends State<CacheConfigDnsScreen> {
cacheSizeController.text = dnsProvider.dnsInfo!.cacheSize.toString(); cacheSizeController.text = dnsProvider.dnsInfo!.cacheSize.toString();
overrideMinTtlController.text = dnsProvider.dnsInfo!.cacheTtlMin.toString(); overrideMinTtlController.text = dnsProvider.dnsInfo!.cacheTtlMin.toString();
overrideMaxTtlController.text = dnsProvider.dnsInfo!.cacheTtlMax.toString(); overrideMaxTtlController.text = dnsProvider.dnsInfo!.cacheTtlMax.toString();
optimisticCache = dnsProvider.dnsInfo!.cacheOptimistic; optimisticCache = dnsProvider.dnsInfo!.cacheOptimistic ?? false;
validData = true; validData = true;
super.initState(); super.initState();
} }

View file

@ -130,7 +130,7 @@ class _TopItemsScreenState extends State<TopItemsScreen> {
body: RefreshIndicator( body: RefreshIndicator(
onRefresh: () async { onRefresh: () async {
final result = await statusProvider.getServerStatus(); final result = await statusProvider.getServerStatus();
if (result == false) { if (mounted && result == false) {
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.serverStatusNotRefreshed, label: AppLocalizations.of(context)!.serverStatusNotRefreshed,

View file

@ -20,6 +20,7 @@ import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/models/clients_allowed_blocked.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.dart';
import 'package:adguard_home_manager/constants/urls.dart'; import 'package:adguard_home_manager/constants/urls.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
Future<Map<String, dynamic>> apiRequest({ Future<Map<String, dynamic>> apiRequest({
@ -270,80 +271,107 @@ class ApiClient {
}); });
Future getServerVersion() async { Future getServerVersion() async {
final result = await apiRequest( try {
server: server, final result = await apiRequest(
method: 'get', server: server,
urlPath: '/status', method: 'get',
type: 'get_server_version' urlPath: '/status',
); type: 'get_server_version'
);
if (result['hasResponse'] == true) { if (result['hasResponse'] == true) {
if (result['statusCode'] == 200 && result['body'] != null) { if (result['statusCode'] == 200 && result['body'] != null) {
return { return {
'result': 'success', 'result': 'success',
'data': jsonDecode(result['body'])['version'] 'data': jsonDecode(result['body'])['version']
}; };
}
else {
return {
'result': 'error',
'log': AppLog(
type: 'get_server_version',
dateTime: DateTime.now(),
message: 'error_code_not_expected',
statusCode: result['statusCode'].toString(),
resBody: result['body']
)
};
}
} }
else { else {
return { return result;
'result': 'error',
'log': AppLog(
type: 'get_server_version',
dateTime: DateTime.now(),
message: 'error_code_not_expected',
statusCode: result['statusCode'].toString(),
resBody: result['body']
)
};
} }
} } catch (e) {
else { Sentry.captureException(e);
return result; return {
'result': 'error',
'log': AppLog(
type: 'get_server_version',
dateTime: DateTime.now(),
message: 'error_code_not_expected',
resBody: e.toString()
)
};
} }
} }
Future getServerStatus() async { Future getServerStatus() async {
final result = await Future.wait([ try {
apiRequest(server: server, method: 'get', urlPath: '/stats', type: 'server_status'), final result = await Future.wait([
apiRequest(server: server, method: 'get', urlPath: '/status', type: 'server_status'), apiRequest(server: server, method: 'get', urlPath: '/stats', type: 'server_status'),
apiRequest(server: server, method: 'get', urlPath: '/filtering/status', type: 'server_status'), apiRequest(server: server, method: 'get', urlPath: '/status', type: 'server_status'),
apiRequest(server: server, method: 'get', urlPath: '/safesearch/status', type: 'server_status'), apiRequest(server: server, method: 'get', urlPath: '/filtering/status', type: 'server_status'),
apiRequest(server: server, method: 'get', urlPath: '/safebrowsing/status', type: 'server_status'), apiRequest(server: server, method: 'get', urlPath: '/safesearch/status', type: 'server_status'),
apiRequest(server: server, method: 'get', urlPath: '/parental/status', type: 'server_status'), apiRequest(server: server, method: 'get', urlPath: '/safebrowsing/status', type: 'server_status'),
apiRequest(server: server, method: 'get', urlPath: '/clients', type: 'server_status'), apiRequest(server: server, method: 'get', urlPath: '/parental/status', type: 'server_status'),
]); apiRequest(server: server, method: 'get', urlPath: '/clients', type: 'server_status'),
]);
if (
result[0]['hasResponse'] == true &&
result[1]['hasResponse'] == true &&
result[2]['hasResponse'] == true &&
result[3]['hasResponse'] == true &&
result[4]['hasResponse'] == true &&
result[5]['hasResponse'] == true &&
result[6]['hasResponse'] == true
) {
if ( if (
result[0]['statusCode'] == 200 && result[0]['hasResponse'] == true &&
result[1]['statusCode'] == 200 && result[1]['hasResponse'] == true &&
result[2]['statusCode'] == 200 && result[2]['hasResponse'] == true &&
result[3]['statusCode'] == 200 && result[3]['hasResponse'] == true &&
result[4]['statusCode'] == 200 && result[4]['hasResponse'] == true &&
result[5]['statusCode'] == 200 && result[5]['hasResponse'] == true &&
result[6]['statusCode'] == 200 result[6]['hasResponse'] == true
) { ) {
final Map<String, dynamic> mappedData = { if (
'stats': jsonDecode(result[0]['body']), result[0]['statusCode'] == 200 &&
'clients': jsonDecode(result[6]['body'])['clients'], result[1]['statusCode'] == 200 &&
'status': jsonDecode(result[1]['body']), result[2]['statusCode'] == 200 &&
'filtering': jsonDecode(result[2]['body']), result[3]['statusCode'] == 200 &&
'safeSearch': jsonDecode(result[3]['body']), result[4]['statusCode'] == 200 &&
'safeBrowsingEnabled': jsonDecode(result[4]['body']), result[5]['statusCode'] == 200 &&
'parentalControlEnabled': jsonDecode(result[5]['body']), result[6]['statusCode'] == 200
}; ) {
return { final Map<String, dynamic> mappedData = {
'result': 'success', 'stats': jsonDecode(result[0]['body']),
'data': ServerStatus.fromJson(mappedData) 'clients': jsonDecode(result[6]['body'])['clients'],
}; 'status': jsonDecode(result[1]['body']),
'filtering': jsonDecode(result[2]['body']),
'safeSearch': jsonDecode(result[3]['body']),
'safeBrowsingEnabled': jsonDecode(result[4]['body']),
'parentalControlEnabled': jsonDecode(result[5]['body']),
};
return {
'result': 'success',
'data': ServerStatus.fromJson(mappedData)
};
}
else {
return {
'result': 'error',
'log': AppLog(
type: 'get_server_status',
dateTime: DateTime.now(),
message: 'error_code_not_expected',
statusCode: result.map((res) => res['statusCode']).toString(),
resBody: result.map((res) => res['body']).toString()
)
};
}
} }
else { else {
return { return {
@ -351,24 +379,23 @@ class ApiClient {
'log': AppLog( 'log': AppLog(
type: 'get_server_status', type: 'get_server_status',
dateTime: DateTime.now(), dateTime: DateTime.now(),
message: 'error_code_not_expected', message: 'no_response',
statusCode: result.map((res) => res['statusCode']).toString(), statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(),
resBody: result.map((res) => res['body']).toString() resBody: result.map((res) => res['body'] ?? 'null').toString()
) )
}; };
} }
} } catch (e) {
else { Sentry.captureException(e);
return { return {
'result': 'error', 'result': 'error',
'log': AppLog( 'log': AppLog(
type: 'get_server_status', type: 'get_server_status',
dateTime: DateTime.now(), dateTime: DateTime.now(),
message: 'no_response', message: 'no_response',
statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), resBody: e.toString()
resBody: result.map((res) => res['body'] ?? 'null').toString() )
) };
};
} }
} }
@ -2004,34 +2031,48 @@ class ApiClient {
} }
Future checkServerUpdates() async { Future checkServerUpdates() async {
final result = await Future.wait([ try {
apiRequest( final result = await Future.wait([
urlPath: '/version.json', apiRequest(
method: 'post', urlPath: '/version.json',
server: server, method: 'post',
type: 'check_server_updates', server: server,
body: { type: 'check_server_updates',
"recheck_now": true body: {
} "recheck_now": true
), }
apiRequest( ),
urlPath: '/status', apiRequest(
method: 'get', urlPath: '/status',
server: server, method: 'get',
type: 'check_server_updates', server: server,
), type: 'check_server_updates',
]); ),
]);
if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) {
if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) {
final Map<String, dynamic> obj = { final Map<String, dynamic> obj = {
...jsonDecode(result[0]['body']), ...jsonDecode(result[0]['body']),
'current_version': ServerInfoData.fromJson(jsonDecode(result[1]['body'])).version 'current_version': ServerInfoData.fromJson(jsonDecode(result[1]['body'])).version
}; };
return { return {
'result': 'success', 'result': 'success',
'data': obj 'data': obj
}; };
}
else {
return {
'result': 'error',
'log': AppLog(
type: 'get_filtering_status',
dateTime: DateTime.now(),
message: 'error_code_not_expected',
statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(),
resBody: result.map((res) => res['body'] ?? 'null').toString(),
)
};
}
} }
else { else {
return { return {
@ -2039,22 +2080,21 @@ class ApiClient {
'log': AppLog( 'log': AppLog(
type: 'get_filtering_status', type: 'get_filtering_status',
dateTime: DateTime.now(), dateTime: DateTime.now(),
message: 'error_code_not_expected', message: 'no_response',
statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(),
resBody: result.map((res) => res['body'] ?? 'null').toString(), resBody: result.map((res) => res['body'] ?? 'null').toString(),
) )
}; };
} }
} } catch (e) {
else { Sentry.captureException(e);
return { return {
'result': 'error', 'result': 'error',
'log': AppLog( 'log': AppLog(
type: 'get_filtering_status', type: 'get_filtering_status',
dateTime: DateTime.now(), dateTime: DateTime.now(),
message: 'no_response', message: 'no_response',
statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), resBody: e.toString(),
resBody: result.map((res) => res['body'] ?? 'null').toString(),
) )
}; };
} }

View file

@ -256,6 +256,8 @@ class _AddServerModalState extends State<AddServerModal> {
? await loginHA(serverObj) ? await loginHA(serverObj)
: await login(serverObj); : await login(serverObj);
if (!mounted) return;
if (result['result'] == 'success') { if (result['result'] == 'success') {
if (serverObj.user != null && serverObj.password != null) { if (serverObj.user != null && serverObj.password != null) {
serverObj.authToken = encodeBase64UserPass(serverObj.user!, serverObj.password!); serverObj.authToken = encodeBase64UserPass(serverObj.user!, serverObj.password!);
@ -268,6 +270,8 @@ class _AddServerModalState extends State<AddServerModal> {
final serverStatus = await apiClient.getServerStatus(); final serverStatus = await apiClient.getServerStatus();
if (!mounted) return;
if (serverStatus['result'] == 'success') { if (serverStatus['result'] == 'success') {
statusProvider.setServerStatusData( statusProvider.setServerStatusData(
data: serverStatus['data'] data: serverStatus['data']
@ -380,12 +384,14 @@ class _AddServerModalState extends State<AddServerModal> {
? await loginHA(serverObj) ? await loginHA(serverObj)
: await login(serverObj); : await login(serverObj);
if (!mounted) return;
if (result['result'] == 'success') { if (result['result'] == 'success') {
if (serverObj.user != null && serverObj.password != null) { if (serverObj.user != null && serverObj.password != null) {
serverObj.authToken = encodeBase64UserPass(serverObj.user!, serverObj.password!); serverObj.authToken = encodeBase64UserPass(serverObj.user!, serverObj.password!);
} }
final serverSaved = await serversProvider.editServer(serverObj); final serverSaved = await serversProvider.editServer(serverObj);
if (!mounted) return;
if (serverSaved == null) { if (serverSaved == null) {
final ApiClient apiClient = ApiClient(server: serverObj); final ApiClient apiClient = ApiClient(server: serverObj);
final version = await apiClient.getServerVersion(); final version = await apiClient.getServerVersion();