diff --git a/lib/classes/http_override.dart b/lib/classes/http_override.dart new file mode 100644 index 0000000..06daa81 --- /dev/null +++ b/lib/classes/http_override.dart @@ -0,0 +1,9 @@ +import 'dart:io'; + +class MyHttpOverrides extends HttpOverrides { + @override + HttpClient createHttpClient(SecurityContext? context){ + return super.createHttpClient(context) + ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; + } +} \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index ec90670..d05df4b 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -99,5 +99,12 @@ "noSavedLogs": "No saved logs", "logs": "Logs", "copyLogsClipboard": "Copy logs to clipboard", - "logsCopiedClipboard": "Logs copied to clipboard" + "logsCopiedClipboard": "Logs copied to clipboard", + "advancedSettings": "Advanced settings", + "dontCheckCertificate": "Don't check SSL certificate", + "dontCheckCertificateDescription": "Overrides the server's SSL certificate validation", + "advancedSetupDescription": "Advanced options", + "settingsUpdatedSuccessfully": "Settings updated successfully.", + "cannotUpdateSettings": "Settings cannot be updated.", + "restartAppTakeEffect": "Restart the application" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 14d2e49..3bbd735 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -99,5 +99,12 @@ "noSavedLogs": "No hay logs guardados", "logs": "Registros", "copyLogsClipboard": "Copiar logs al portapapeles", - "logsCopiedClipboard": "Registros copiados al portapapeles" + "logsCopiedClipboard": "Registros copiados al portapapeles", + "advancedSettings": "Ajustes avanzados", + "dontCheckCertificate": "No comprobar el certificado SSL", + "dontCheckCertificateDescription": "Anula la validación del certificado SSL del servidor", + "advancedSetupDescription": "Opciones avanzadas", + "settingsUpdatedSuccessfully": "Ajustes actualizados correctamente.", + "cannotUpdateSettings": "No se han podido actualizar los ajustes.", + "restartAppTakeEffect": "Reinicia la aplicación para que se apliquen los cambios." } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 209b645..8f03280 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,6 +12,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/base.dart'; +import 'package:adguard_home_manager/classes/http_override.dart'; import 'package:adguard_home_manager/services/database.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -28,6 +29,11 @@ void main() async { ServersProvider serversProvider = ServersProvider(); final dbData = await loadDb(); + + if (dbData['appConfig']['overrideSslCheck'] == 1) { + HttpOverrides.global = MyHttpOverrides(); + } + serversProvider.setDbInstance(dbData['dbInstance']); appConfigProvider.saveFromDb(dbData['dbInstance'], dbData['appConfig']); serversProvider.saveFromDb(dbData['servers']); diff --git a/lib/providers/app_config_provider.dart b/lib/providers/app_config_provider.dart index 849e58e..f841918 100644 --- a/lib/providers/app_config_provider.dart +++ b/lib/providers/app_config_provider.dart @@ -19,6 +19,8 @@ class AppConfigProvider with ChangeNotifier { final List _logs = []; + int _overrideSslCheck = 0; + PackageInfo? get getAppInfo { return _appInfo; } @@ -61,6 +63,10 @@ class AppConfigProvider with ChangeNotifier { return _logs; } + bool get overrideSslCheck { + return _overrideSslCheck == 1 ? true : false; + } + void setDbInstance(Database db) { _dbInstance = db; } @@ -87,6 +93,19 @@ class AppConfigProvider with ChangeNotifier { notifyListeners(); } + Future setOverrideSslCheck(bool status) async { + final updated = await _updateOverrideSslCheck(status == true ? 1 : 0); + if (updated == true) { + _overrideSslCheck = status == true ? 1 : 0; + notifyListeners(); + return true; + } + else { + return false; + } + } + + Future setSelectedTheme(int value) async { final updated = await _updateThemeDb(value); if (updated == true) { @@ -112,9 +131,23 @@ class AppConfigProvider with ChangeNotifier { } } + Future _updateOverrideSslCheck(int value) async { + try { + return await _dbInstance!.transaction((txn) async { + await txn.rawUpdate( + 'UPDATE appConfig SET overrideSslCheck = $value', + ); + return true; + }); + } catch (e) { + return false; + } + } + void saveFromDb(Database dbInstance, Map dbData) { _selectedTheme = dbData['theme']; - + _overrideSslCheck = dbData['overrideSslCheck']; + _dbInstance = dbInstance; notifyListeners(); } diff --git a/lib/screens/settings/advanced_setings.dart b/lib/screens/settings/advanced_setings.dart new file mode 100644 index 0000000..bfe5758 --- /dev/null +++ b/lib/screens/settings/advanced_setings.dart @@ -0,0 +1,65 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:adguard_home_manager/screens/settings/custom_list_tile.dart'; + +import 'package:adguard_home_manager/providers/app_config_provider.dart'; + +class AdvancedSettings extends StatelessWidget { + const AdvancedSettings({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final appConfigProvider = Provider.of(context); + + Future updateSslCheck(bool newStatus) async { + final result = await appConfigProvider.setOverrideSslCheck(newStatus); + if (result == true) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.restartAppTakeEffect), + backgroundColor: Colors.green, + ) + ); + } + else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.cannotUpdateSettings), + backgroundColor: Colors.red, + ) + ); + } + } + + return Scaffold( + appBar: AppBar( + title: Text(AppLocalizations.of(context)!.advancedSettings), + ), + body: ListView( + children: [ + CustomListTile( + leadingIcon: Icons.lock, + label: AppLocalizations.of(context)!.dontCheckCertificate, + description: AppLocalizations.of(context)!.dontCheckCertificateDescription, + trailing: Switch( + value: appConfigProvider.overrideSslCheck, + onChanged: updateSslCheck, + activeColor: Theme.of(context).primaryColor, + ), + onTap: () => updateSslCheck(!appConfigProvider.overrideSslCheck), + padding: const EdgeInsets.only( + top: 10, + bottom: 10, + left: 20, + right: 10 + ) + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 5f30089..e1b0a90 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -1,3 +1,4 @@ +import 'package:adguard_home_manager/screens/settings/advanced_setings.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -76,6 +77,18 @@ class Settings extends StatelessWidget { : AppLocalizations.of(context)!.noServerSelected, onTap: navigateServers, ), + CustomListTile( + leadingIcon: Icons.settings, + label: AppLocalizations.of(context)!.advancedSettings, + description: AppLocalizations.of(context)!.advancedSetupDescription, + onTap: () => { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const AdvancedSettings() + ) + ) + }, + ), const Divider(), SectionLabel(label: AppLocalizations.of(context)!.aboutApp), CustomListTile( diff --git a/lib/services/database.dart b/lib/services/database.dart index 49b84b1..eae2b2c 100644 --- a/lib/services/database.dart +++ b/lib/services/database.dart @@ -4,16 +4,29 @@ Future> loadDb() async { List>? servers; List>? appConfig; + Future upgradeDbToV2(Database db) async { + await db.execute("ALTER TABLE appConfig ADD COLUMN overrideSslCheck NUMERIC"); + await db.execute("UPDATE appConfig SET overrideSslCheck = 0"); + + await db.transaction((txn) async{ + await txn.rawQuery( + 'SELECT * FROM appConfig', + ); + }); + } + Database db = await openDatabase( 'adguard_home_manager.db', - version: 1, + version: 2, onCreate: (Database db, int version) async { await db.execute("CREATE TABLE servers (id TEXT PRIMARY KEY, name TEXT, connectionMethod TEXT, domain TEXT, path TEXT, port INTEGER, user TEXT, password TEXT, defaultServer INTEGER, authToken TEXT)"); - await db.execute("CREATE TABLE appConfig (theme NUMERIC)"); - await db.execute("INSERT INTO appConfig (theme) VALUES (0)"); + await db.execute("CREATE TABLE appConfig (theme NUMERIC, overrideSslCheck NUMERIC)"); + await db.execute("INSERT INTO appConfig (theme, overrideSslCheck) VALUES (0, 0)"); }, onUpgrade: (Database db, int oldVersion, int newVersion) async { - + if (oldVersion == 1) { + await upgradeDbToV2(db); + } }, onOpen: (Database db) async { await db.transaction((txn) async{