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",
|
"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."
|
||||||
}
|
}
|
|
@ -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."
|
||||||
}
|
}
|
|
@ -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
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
|
// 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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue