mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-15 06:22:48 +00:00
Changed auth functions
This commit is contained in:
parent
d38b895076
commit
e5528c0d2c
5 changed files with 129 additions and 41 deletions
|
@ -681,5 +681,6 @@
|
|||
"failedElements": "Failed elements",
|
||||
"processingLists": "Processing lists...",
|
||||
"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."
|
||||
}
|
|
@ -681,5 +681,6 @@
|
|||
"failedElements": "Elementos fallidos",
|
||||
"processingLists": "Procesando listas...",
|
||||
"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."
|
||||
}
|
|
@ -36,6 +36,19 @@ class ApiClientV2 {
|
|||
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 {
|
||||
final results = await Future.wait([
|
||||
HttpRequestClient.get(urlPath: "/stats", server: server),
|
||||
|
|
82
lib/services/auth.dart
Normal file
82
lib/services/auth.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter/material.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/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/services/api_client.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/providers/status_provider.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/providers/servers_provider.dart';
|
||||
import 'package:adguard_home_manager/models/server.dart';
|
||||
|
@ -32,11 +32,11 @@ class AddServerModal extends StatefulWidget {
|
|||
final void Function(String version) onUnsupportedVersion;
|
||||
|
||||
const AddServerModal({
|
||||
Key? key,
|
||||
super.key,
|
||||
this.server,
|
||||
required this.fullScreen,
|
||||
required this.onUnsupportedVersion
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
State<AddServerModal> createState() => _AddServerModalState();
|
||||
|
@ -119,11 +119,11 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
));
|
||||
}
|
||||
|
||||
String getErrorMessage(String message) {
|
||||
if (message == 'invalid_username_password') return AppLocalizations.of(context)!.invalidUsernamePassword;
|
||||
if (message == 'many_attempts') return AppLocalizations.of(context)!.tooManyAttempts;
|
||||
if (message == 'no_connection') return AppLocalizations.of(context)!.cantReachServer;
|
||||
if (message == 'server_error') return AppLocalizations.of(context)!.serverError;
|
||||
String getErrorMessage(AuthStatus status) {
|
||||
if (status == AuthStatus.invalidCredentials) return AppLocalizations.of(context)!.invalidUsernamePassword;
|
||||
if (status == AuthStatus.manyAttepts) return AppLocalizations.of(context)!.tooManyAttempts;
|
||||
if (status == AuthStatus.socketException || status == AuthStatus.timeoutException) return AppLocalizations.of(context)!.cantReachServer;
|
||||
if (status == AuthStatus.serverError) return AppLocalizations.of(context)!.serverError;
|
||||
return AppLocalizations.of(context)!.unknownError;
|
||||
}
|
||||
|
||||
|
@ -146,17 +146,16 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
);
|
||||
|
||||
final result = homeAssistant == true
|
||||
? await loginHA(serverObj)
|
||||
: await login(serverObj);
|
||||
? await ServerAuth.loginHA(serverObj)
|
||||
: await ServerAuth.login(serverObj);
|
||||
|
||||
// If something goes wrong with the connection
|
||||
if (result['result'] != 'success') {
|
||||
if (result != AuthStatus.success) {
|
||||
cancelConnecting();
|
||||
appConfigProvider.addLog(result['log']);
|
||||
if (mounted) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: getErrorMessage(result['result']),
|
||||
label: getErrorMessage(result),
|
||||
color: Colors.red
|
||||
);
|
||||
}
|
||||
|
@ -172,13 +171,6 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
// If something goes wrong when saving the connection on the db
|
||||
if (serverCreated != null) {
|
||||
if (mounted) setState(() => isConnecting = false);
|
||||
appConfigProvider.addLog(
|
||||
AppLog(
|
||||
type: 'save_connection_db',
|
||||
dateTime: DateTime.now(),
|
||||
message: serverCreated.toString()
|
||||
)
|
||||
);
|
||||
if (mounted) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
|
@ -190,27 +182,27 @@ 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();
|
||||
final serverStatus = await apiClient2.getServerStatus();
|
||||
|
||||
// If something goes wrong when fetching server status
|
||||
if (serverStatus2.successful == false) {
|
||||
if (serverStatus.successful == false) {
|
||||
statusProvider.setServerStatusLoad(LoadStatus.error);
|
||||
Navigator.pop(context);
|
||||
return;
|
||||
}
|
||||
|
||||
final status = serverStatus.content as ServerStatus;
|
||||
|
||||
// If everything is successful
|
||||
statusProvider.setServerStatusData(
|
||||
data: serverStatus['data']
|
||||
data: status
|
||||
);
|
||||
serversProvider.setApiClient(apiClient);
|
||||
serversProvider.setApiClient2(apiClient2);
|
||||
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);
|
||||
widget.onUnsupportedVersion(serverStatus['data'].serverVersion);
|
||||
widget.onUnsupportedVersion(status.serverVersion);
|
||||
}
|
||||
else {
|
||||
Navigator.pop(context);
|
||||
|
@ -236,17 +228,16 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
);
|
||||
|
||||
final result = homeAssistant == true
|
||||
? await loginHA(serverObj)
|
||||
: await login(serverObj);
|
||||
? await ServerAuth.loginHA(serverObj)
|
||||
: await ServerAuth.login(serverObj);
|
||||
|
||||
// If something goes wrong with the connection
|
||||
if (result['result'] != 'success') {
|
||||
if (result != AuthStatus.success) {
|
||||
cancelConnecting();
|
||||
appConfigProvider.addLog(result['log']);
|
||||
if (mounted) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: getErrorMessage(result['result']),
|
||||
label: getErrorMessage(result),
|
||||
color: Colors.red
|
||||
);
|
||||
}
|
||||
|
@ -279,14 +270,14 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
}
|
||||
|
||||
// If everything is successful
|
||||
final ApiClient apiClient = ApiClient(server: serverObj);
|
||||
final version = await apiClient.getServerVersion();
|
||||
final ApiClientV2 apiClient2 = ApiClientV2(server: serverObj);
|
||||
final version = await apiClient2.getServerVersion();
|
||||
if (
|
||||
version['result'] == 'success' &&
|
||||
(version['data'].contains('a') || version['data'].contains('b')) // alpha or beta
|
||||
version.successful == true &&
|
||||
(version.content.contains('a') || version.content.contains('b')) // alpha or beta
|
||||
) {
|
||||
Navigator.pop(context);
|
||||
widget.onUnsupportedVersion(version['data']);
|
||||
widget.onUnsupportedVersion(version.content);
|
||||
}
|
||||
else {
|
||||
Navigator.pop(context);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue