Changed auth functions

This commit is contained in:
Juan Gilsanz Polo 2023-11-20 01:51:35 +01:00
parent d38b895076
commit e5528c0d2c
5 changed files with 129 additions and 41 deletions

View file

@ -681,5 +681,6 @@
"failedElements": "Failed elements", "failedElements": "Failed elements",
"processingLists": "Processing lists...", "processingLists": "Processing lists...",
"enableDisableResult": "Enable or disable result", "enableDisableResult": "Enable or disable result",
"selectedListsEnabledDisabledSuccessfully": "All selected lists have been enabled or disabled successfully" "selectedListsEnabledDisabledSuccessfully": "All selected lists have been enabled or disabled successfully",
"sslWarning": "If you are using an HTTPS connection with a self signed certificate, make sure to enable \"Don't check SSL certificate\" at Settings > Advanced settings."
} }

View file

@ -681,5 +681,6 @@
"failedElements": "Elementos fallidos", "failedElements": "Elementos fallidos",
"processingLists": "Procesando listas...", "processingLists": "Procesando listas...",
"enableDisableResult": "Resultado de activar o desactivar", "enableDisableResult": "Resultado de activar o desactivar",
"selectedListsEnabledDisabledSuccessfully": "Todas las listas seleccionadas se han activado o desactivado correctamente." "selectedListsEnabledDisabledSuccessfully": "Todas las listas seleccionadas se han activado o desactivado correctamente.",
"sslWarning": "Si estás usando una conexión HTTPS con un certificado autofirmado, asegúrate de activar \"No comprobar el certificado SSL\" en Ajustes > Ajustes avanzados."
} }

View file

@ -36,6 +36,19 @@ class ApiClientV2 {
required this.server required this.server
}); });
Future<ApiResponse> getServerVersion() async {
final result = await HttpRequestClient.get(urlPath: '/status', server: server);
if (result.successful == true) {
return ApiResponse(
successful: true,
content: jsonDecode(result.body!)['version']
);
}
else {
return const ApiResponse(successful: false);
}
}
Future<ApiResponse> getServerStatus() async { Future<ApiResponse> getServerStatus() async {
final results = await Future.wait([ final results = await Future.wait([
HttpRequestClient.get(urlPath: "/stats", server: server), HttpRequestClient.get(urlPath: "/stats", server: server),

82
lib/services/auth.dart Normal file
View file

@ -0,0 +1,82 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:adguard_home_manager/classes/http_client.dart';
import 'package:adguard_home_manager/models/server.dart';
enum AuthStatus {
success,
invalidCredentials,
manyAttepts,
serverError,
socketException,
timeoutException,
handshakeException,
unknown
}
class ServerAuth {
static Future<AuthStatus> login(Server server) async {
try {
final body = {
"name": server.user,
"password": server.password
};
final connectionString = "${server.connectionMethod}://${server.domain}${server.port != null ? ':${server.port}' : ""}${server.path ?? ""}/control/login";
HttpClient httpClient = HttpClient();
HttpClientRequest request = await httpClient.postUrl(Uri.parse(connectionString));
request.headers.set('content-type', 'application/json');
request.headers.contentLength = utf8.encode(jsonEncode(body)).length;
request.add(utf8.encode(json.encode(body)));
HttpClientResponse response = await request.close().timeout(const Duration(seconds: 10));
httpClient.close();
if (response.statusCode == 200) {
return AuthStatus.success;
}
else if (response.statusCode == 400 || response.statusCode == 401 || response.statusCode == 403) {
return AuthStatus.invalidCredentials;
}
else if (response.statusCode == 429) {
return AuthStatus.manyAttepts;
}
else if (response.statusCode == 500) {
return AuthStatus.serverError;
}
else {
return AuthStatus.unknown;
}
} on SocketException {
return AuthStatus.socketException;
} on TimeoutException {
return AuthStatus.timeoutException;
} on HandshakeException {
return AuthStatus.handshakeException;
} catch (e) {
return AuthStatus.unknown;
}
}
static Future<AuthStatus> loginHA(Server server) async {
try {
final result = await HttpRequestClient.get(urlPath: "/status", server: server);
if (result.successful) {
return AuthStatus.success;
}
else if (result.statusCode == 401 || result.statusCode == 403) {
return AuthStatus.invalidCredentials;
}
else {
return AuthStatus.unknown;
}
} on SocketException {
return AuthStatus.socketException;
} on TimeoutException {
return AuthStatus.timeoutException;
} on HandshakeException {
return AuthStatus.handshakeException;
} catch (e) {
return AuthStatus.unknown;
}
}
}

View file

@ -1,5 +1,4 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:segmented_button_slide/segmented_button_slide.dart'; import 'package:segmented_button_slide/segmented_button_slide.dart';
@ -11,6 +10,8 @@ import 'package:adguard_home_manager/widgets/section_label.dart';
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart'; import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart'; import 'package:adguard_home_manager/widgets/add_server/add_server_functions.dart';
import 'package:adguard_home_manager/models/server_status.dart';
import 'package:adguard_home_manager/services/auth.dart';
import 'package:adguard_home_manager/providers/app_config_provider.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/services/api_client.dart';
import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/snackbar.dart';
@ -19,7 +20,6 @@ import 'package:adguard_home_manager/functions/open_url.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/status_provider.dart';
import 'package:adguard_home_manager/functions/base64.dart'; import 'package:adguard_home_manager/functions/base64.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/models/app_log.dart'; import 'package:adguard_home_manager/models/app_log.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/models/server.dart';
@ -32,11 +32,11 @@ class AddServerModal extends StatefulWidget {
final void Function(String version) onUnsupportedVersion; final void Function(String version) onUnsupportedVersion;
const AddServerModal({ const AddServerModal({
Key? key, super.key,
this.server, this.server,
required this.fullScreen, required this.fullScreen,
required this.onUnsupportedVersion required this.onUnsupportedVersion
}) : super(key: key); });
@override @override
State<AddServerModal> createState() => _AddServerModalState(); State<AddServerModal> createState() => _AddServerModalState();
@ -119,11 +119,11 @@ class _AddServerModalState extends State<AddServerModal> {
)); ));
} }
String getErrorMessage(String message) { String getErrorMessage(AuthStatus status) {
if (message == 'invalid_username_password') return AppLocalizations.of(context)!.invalidUsernamePassword; if (status == AuthStatus.invalidCredentials) return AppLocalizations.of(context)!.invalidUsernamePassword;
if (message == 'many_attempts') return AppLocalizations.of(context)!.tooManyAttempts; if (status == AuthStatus.manyAttepts) return AppLocalizations.of(context)!.tooManyAttempts;
if (message == 'no_connection') return AppLocalizations.of(context)!.cantReachServer; if (status == AuthStatus.socketException || status == AuthStatus.timeoutException) return AppLocalizations.of(context)!.cantReachServer;
if (message == 'server_error') return AppLocalizations.of(context)!.serverError; if (status == AuthStatus.serverError) return AppLocalizations.of(context)!.serverError;
return AppLocalizations.of(context)!.unknownError; return AppLocalizations.of(context)!.unknownError;
} }
@ -146,17 +146,16 @@ class _AddServerModalState extends State<AddServerModal> {
); );
final result = homeAssistant == true final result = homeAssistant == true
? await loginHA(serverObj) ? await ServerAuth.loginHA(serverObj)
: await login(serverObj); : await ServerAuth.login(serverObj);
// If something goes wrong with the connection // If something goes wrong with the connection
if (result['result'] != 'success') { if (result != AuthStatus.success) {
cancelConnecting(); cancelConnecting();
appConfigProvider.addLog(result['log']);
if (mounted) { if (mounted) {
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
label: getErrorMessage(result['result']), label: getErrorMessage(result),
color: Colors.red color: Colors.red
); );
} }
@ -172,13 +171,6 @@ class _AddServerModalState extends State<AddServerModal> {
// If something goes wrong when saving the connection on the db // If something goes wrong when saving the connection on the db
if (serverCreated != null) { if (serverCreated != null) {
if (mounted) setState(() => isConnecting = false); if (mounted) setState(() => isConnecting = false);
appConfigProvider.addLog(
AppLog(
type: 'save_connection_db',
dateTime: DateTime.now(),
message: serverCreated.toString()
)
);
if (mounted) { if (mounted) {
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -190,27 +182,27 @@ class _AddServerModalState extends State<AddServerModal> {
} }
statusProvider.setServerStatusLoad(LoadStatus.loading); statusProvider.setServerStatusLoad(LoadStatus.loading);
final ApiClient apiClient = ApiClient(server: serverObj);
final serverStatus = await apiClient.getServerStatus();
final ApiClientV2 apiClient2 = ApiClientV2(server: serverObj); final ApiClientV2 apiClient2 = ApiClientV2(server: serverObj);
final serverStatus2 = await apiClient2.getServerStatus(); final serverStatus = await apiClient2.getServerStatus();
// If something goes wrong when fetching server status // If something goes wrong when fetching server status
if (serverStatus2.successful == false) { if (serverStatus.successful == false) {
statusProvider.setServerStatusLoad(LoadStatus.error); statusProvider.setServerStatusLoad(LoadStatus.error);
Navigator.pop(context); Navigator.pop(context);
return; return;
} }
final status = serverStatus.content as ServerStatus;
// If everything is successful // If everything is successful
statusProvider.setServerStatusData( statusProvider.setServerStatusData(
data: serverStatus['data'] data: status
); );
serversProvider.setApiClient(apiClient); serversProvider.setApiClient2(apiClient2);
statusProvider.setServerStatusLoad(LoadStatus.loaded); statusProvider.setServerStatusLoad(LoadStatus.loaded);
if (serverStatus['data'].serverVersion.contains('a') || serverStatus['data'].serverVersion.contains('b')) { if (status.serverVersion.contains('a') || status.serverVersion.contains('b')) {
Navigator.pop(context); Navigator.pop(context);
widget.onUnsupportedVersion(serverStatus['data'].serverVersion); widget.onUnsupportedVersion(status.serverVersion);
} }
else { else {
Navigator.pop(context); Navigator.pop(context);
@ -236,17 +228,16 @@ class _AddServerModalState extends State<AddServerModal> {
); );
final result = homeAssistant == true final result = homeAssistant == true
? await loginHA(serverObj) ? await ServerAuth.loginHA(serverObj)
: await login(serverObj); : await ServerAuth.login(serverObj);
// If something goes wrong with the connection // If something goes wrong with the connection
if (result['result'] != 'success') { if (result != AuthStatus.success) {
cancelConnecting(); cancelConnecting();
appConfigProvider.addLog(result['log']);
if (mounted) { if (mounted) {
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
label: getErrorMessage(result['result']), label: getErrorMessage(result),
color: Colors.red color: Colors.red
); );
} }
@ -279,14 +270,14 @@ class _AddServerModalState extends State<AddServerModal> {
} }
// If everything is successful // If everything is successful
final ApiClient apiClient = ApiClient(server: serverObj); final ApiClientV2 apiClient2 = ApiClientV2(server: serverObj);
final version = await apiClient.getServerVersion(); final version = await apiClient2.getServerVersion();
if ( if (
version['result'] == 'success' && version.successful == true &&
(version['data'].contains('a') || version['data'].contains('b')) // alpha or beta (version.content.contains('a') || version.content.contains('b')) // alpha or beta
) { ) {
Navigator.pop(context); Navigator.pop(context);
widget.onUnsupportedVersion(version['data']); widget.onUnsupportedVersion(version.content);
} }
else { else {
Navigator.pop(context); Navigator.pop(context);