diff --git a/.gitignore b/.gitignore index 6f4a17f..d37570d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # Env diff --git a/android/app/.cxx/Debug/4s676p3c/arm64-v8a/.cmake/api/v1/reply/index-2025-03-09T18-26-01-0152.json b/android/app/.cxx/Debug/4s676p3c/arm64-v8a/.cmake/api/v1/reply/index-2025-03-09T19-31-30-0557.json similarity index 100% rename from android/app/.cxx/Debug/4s676p3c/arm64-v8a/.cmake/api/v1/reply/index-2025-03-09T18-26-01-0152.json rename to android/app/.cxx/Debug/4s676p3c/arm64-v8a/.cmake/api/v1/reply/index-2025-03-09T19-31-30-0557.json diff --git a/android/app/.cxx/Debug/4s676p3c/arm64-v8a/configure_fingerprint.bin b/android/app/.cxx/Debug/4s676p3c/arm64-v8a/configure_fingerprint.bin index 72e381e..6a7dacd 100644 --- a/android/app/.cxx/Debug/4s676p3c/arm64-v8a/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4s676p3c/arm64-v8a/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Logu s q/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Π2  Π2r +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2r p -n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/android_gradle_build.json  Π2 Π2w +n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/android_gradle_build.json  2 2w u -s/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/android_gradle_build_mini.json  Π2 Π2d +s/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/android_gradle_build_mini.json  2 2d b -`/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/build.ninja  Π2 Π2h +`/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/build.ninja  2 2h f -d/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/build.ninja.txt  Π2m +d/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/build.ninja.txt  2m k -i/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/build_file_index.txt  Π2 P Π2n +i/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/build_file_index.txt  2 P 2n l -j/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/compile_commands.json  Π2r +j/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/compile_commands.json  2r p -n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/compile_commands.json.bin  Π2 x +n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/compile_commands.json.bin  2 x v -t/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/metadata_generation_command.txt  Π2 - Π2k +t/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/metadata_generation_command.txt  2 + 2k i -g/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/prefab_config.json  Π2  ( Π2p +g/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/prefab_config.json  2  ( 2p n -l/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/symbol_folder_index.txt  Π2  c Π2T +l/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/arm64-v8a/symbol_folder_index.txt  2  c 2T R -P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Π2  ؄2 \ No newline at end of file +P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ؄2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/.cmake/api/v1/reply/index-2025-03-09T18-26-01-0543.json b/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/.cmake/api/v1/reply/index-2025-03-09T19-31-30-0871.json similarity index 100% rename from android/app/.cxx/Debug/4s676p3c/armeabi-v7a/.cmake/api/v1/reply/index-2025-03-09T18-26-01-0543.json rename to android/app/.cxx/Debug/4s676p3c/armeabi-v7a/.cmake/api/v1/reply/index-2025-03-09T19-31-30-0871.json diff --git a/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/configure_fingerprint.bin b/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/configure_fingerprint.bin index 064663e..00da33a 100644 --- a/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Logw u s/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Ѡ2  Ѡ2t +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2t r -p/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/android_gradle_build.json  Ѡ2 Ѡ2y +p/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/android_gradle_build.json  2 2y w -u/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/android_gradle_build_mini.json  Ѡ2 Ѡ2f +u/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/android_gradle_build_mini.json  2 2f d -b/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/build.ninja  Ѡ2 Ѡ2j +b/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/build.ninja  2 2j h -f/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/build.ninja.txt  Ѡ2o +f/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/build.ninja.txt  2o m -k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/build_file_index.txt  Ѡ2 P Ѡ2p +k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/build_file_index.txt  2 P 2p n -l/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/compile_commands.json  Ѡ2t +l/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/compile_commands.json  2t r -p/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/compile_commands.json.bin  Ѡ2 z +p/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/compile_commands.json.bin  2 z x -v/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/metadata_generation_command.txt  Ѡ2 - Ѡ2m +v/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/metadata_generation_command.txt  2 + 2m k -i/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/prefab_config.json  Ѡ2  ( Ѡ2r +i/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/prefab_config.json  2  ( 2r p -n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/symbol_folder_index.txt  Ѡ2  e Ѡ2T +n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/armeabi-v7a/symbol_folder_index.txt  2  e 2T R -P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Ѡ2  ؄2 \ No newline at end of file +P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ؄2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/4s676p3c/x86/.cmake/api/v1/reply/index-2025-03-09T18-26-01-0932.json b/android/app/.cxx/Debug/4s676p3c/x86/.cmake/api/v1/reply/index-2025-03-09T19-31-31-0179.json similarity index 100% rename from android/app/.cxx/Debug/4s676p3c/x86/.cmake/api/v1/reply/index-2025-03-09T18-26-01-0932.json rename to android/app/.cxx/Debug/4s676p3c/x86/.cmake/api/v1/reply/index-2025-03-09T19-31-31-0179.json diff --git a/android/app/.cxx/Debug/4s676p3c/x86/configure_fingerprint.bin b/android/app/.cxx/Debug/4s676p3c/x86/configure_fingerprint.bin index f93955d..aa45397 100644 --- a/android/app/.cxx/Debug/4s676p3c/x86/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4s676p3c/x86/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Logo m k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Ԡ2  Ԡ2l +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  p2l j -h/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/android_gradle_build.json  Ԡ2 Ԡ2q +h/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/android_gradle_build.json  2 p2q o -m/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/android_gradle_build_mini.json  Ԡ2 Ԡ2^ +m/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/android_gradle_build_mini.json  2 2^ \ -Z/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/build.ninja  Ԡ2 Ԡ2b +Z/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/build.ninja  2 彐2b ` -^/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/build.ninja.txt  Ԡ2g +^/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/build.ninja.txt  2g e -c/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/build_file_index.txt  Ԡ2 P Ԡ2h +c/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/build_file_index.txt  2 P 2h f -d/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/compile_commands.json  Ԡ2l +d/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/compile_commands.json  2l j -h/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/compile_commands.json.bin  Ԡ2 r +h/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/compile_commands.json.bin  2 r p -n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/metadata_generation_command.txt  Ԡ2 - Ԡ2e +n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/metadata_generation_command.txt  2 + 2e c -a/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/prefab_config.json  Ԡ2  ( Ԡ2j +a/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/prefab_config.json  2  ( 2j h -f/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/symbol_folder_index.txt  Ԡ2  ] Ԡ2T +f/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86/symbol_folder_index.txt  2  ] 2T R -P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  Ԡ2  ؄2 \ No newline at end of file +P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ؄2 \ No newline at end of file diff --git a/android/app/.cxx/Debug/4s676p3c/x86_64/.cmake/api/v1/reply/index-2025-03-09T18-26-02-0299.json b/android/app/.cxx/Debug/4s676p3c/x86_64/.cmake/api/v1/reply/index-2025-03-09T19-31-31-0481.json similarity index 100% rename from android/app/.cxx/Debug/4s676p3c/x86_64/.cmake/api/v1/reply/index-2025-03-09T18-26-02-0299.json rename to android/app/.cxx/Debug/4s676p3c/x86_64/.cmake/api/v1/reply/index-2025-03-09T19-31-31-0481.json diff --git a/android/app/.cxx/Debug/4s676p3c/x86_64/configure_fingerprint.bin b/android/app/.cxx/Debug/4s676p3c/x86_64/configure_fingerprint.bin index 0b39a14..3f4a000 100644 --- a/android/app/.cxx/Debug/4s676p3c/x86_64/configure_fingerprint.bin +++ b/android/app/.cxx/Debug/4s676p3c/x86_64/configure_fingerprint.bin @@ -2,27 +2,27 @@ C/C++ Structured Logr p n/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/additional_project_files.txtC A -?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  נ2  נ2o +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  2  2o m -k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/android_gradle_build.json  נ2 נ2t +k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/android_gradle_build.json  2 2t r -p/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/android_gradle_build_mini.json  נ2 נ2a +p/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/android_gradle_build_mini.json  2 2a _ -]/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/build.ninja  נ2 נ2e +]/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/build.ninja  2 2e c -a/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/build.ninja.txt  נ2j +a/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/build.ninja.txt  2j h -f/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/build_file_index.txt  נ2 P נ2k +f/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/build_file_index.txt  2 P 2k i -g/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/compile_commands.json  נ2o +g/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/compile_commands.json  2o m -k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/compile_commands.json.bin  נ2 u +k/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/compile_commands.json.bin  2 u s -q/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/metadata_generation_command.txt  נ2 - נ2h +q/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/metadata_generation_command.txt  2 + 2h f -d/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/prefab_config.json  נ2  ( נ2m +d/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/prefab_config.json  2  ( 2m k -i/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/symbol_folder_index.txt  נ2  ` נ2T +i/Users/juan/Proyectos/adguard-home-manager/android/app/.cxx/Debug/4s676p3c/x86_64/symbol_folder_index.txt  2  ` 2T R -P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  נ2  ؄2 \ No newline at end of file +P/Users/juan/flutter/packages/flutter_tools/gradle/src/main/groovy/CMakeLists.txt  2  ؄2 \ No newline at end of file diff --git a/lib/constants/regexps.dart b/lib/constants/regexps.dart index 84ea2bc..c07dee5 100644 --- a/lib/constants/regexps.dart +++ b/lib/constants/regexps.dart @@ -1,6 +1,6 @@ class Regexps { static final wildcardDomain = RegExp(r'^(\*\.)?([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+$'); - static final domain = RegExp(r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$'); + static final domain = RegExp(r'^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,10}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,10})$'); static final ipv4Address = RegExp(r'^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)){4}$'); static final ipv6Address = RegExp(r'(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))'); static final subroute = RegExp(r'^\/\b([A-Za-z0-9_\-~/]*)[^\/|\.|\:]$'); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index fa952aa..f923e8b 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -803,5 +803,8 @@ "myOtherApps": "My other apps", "myOtherAppsDescription": "Check my other apps, make a donation, contact support, and more", "topToBottom": "From top to bottom", - "bottomToTop": "From bottom to top" + "bottomToTop": "From bottom to top", + "upstreamTimeout": "Upstream timeout", + "upstreamTimeoutHelper": "Specifies the number of seconds to wait for a response from the upstream server", + "fieldCannotBeEmpty": "This field cannot be empty" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 19a36cf..c93c501 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -803,5 +803,8 @@ "myOtherApps": "Mis otras apps", "myOtherAppsDescription": "Comprueba mis otras apps, hacer una donación, contactar al soporte, y más", "topToBottom": "Desde arriba hacia abajo", - "bottomToTop": "Desde abajo hacia arriba" + "bottomToTop": "Desde abajo hacia arriba", + "upstreamTimeout": "Tiempo de espera del upstream", + "upstreamTimeoutHelper": "Especifica el número de segundos que se debe esperar para recibir una respuesta del servidor upstream", + "fieldCannotBeEmpty": "El campo no puede estar vacío" } \ No newline at end of file diff --git a/lib/models/dns_info.dart b/lib/models/dns_info.dart index 5a53023..7007644 100644 --- a/lib/models/dns_info.dart +++ b/lib/models/dns_info.dart @@ -26,6 +26,7 @@ class DnsInfo { int? ratelimitSubnetLenIpv4; int? ratelimitSubnetLenIpv6; List? ratelimitWhitelist; + int? upstreamTimeout; DnsInfo({ required this.upstreamDns, @@ -55,6 +56,7 @@ class DnsInfo { required this.ratelimitSubnetLenIpv4, required this.ratelimitSubnetLenIpv6, required this.ratelimitWhitelist, + required this.upstreamTimeout, }); factory DnsInfo.fromJson(Map json) => DnsInfo( @@ -85,6 +87,7 @@ class DnsInfo { ratelimitSubnetLenIpv4: json["ratelimit_subnet_len_ipv4"], ratelimitSubnetLenIpv6: json["ratelimit_subnet_len_ipv6"], ratelimitWhitelist: json["ratelimit_whitelist"] != null ? List.from(json["ratelimit_whitelist"].map((x) => x)) : [], + upstreamTimeout: json["upstream_timeout"], ); Map toJson() => { @@ -115,5 +118,6 @@ class DnsInfo { "ratelimit_subnet_len_ipv4": ratelimitSubnetLenIpv4, "ratelimit_subnet_len_ipv6": ratelimitSubnetLenIpv6, "ratelimit_whitelist": ratelimitWhitelist != null ? List.from(ratelimitWhitelist!.map((x) => x)) : null, + "upstream_timeout": upstreamTimeout, }; } diff --git a/lib/screens/logs/filters/clients_modal.dart b/lib/screens/logs/filters/clients_modal.dart index ef0e989..05b7213 100644 --- a/lib/screens/logs/filters/clients_modal.dart +++ b/lib/screens/logs/filters/clients_modal.dart @@ -114,10 +114,12 @@ class _ClientsModalState extends State { } void searchAddedClient(_ClientLog client) { - final notIps = client.ids?.where((e) => isIpAddress(e) == false).toList(); - if (notIps == null || notIps.isEmpty) return; - logsProvider.setSearchText('"${notIps[0]}"'); + final ips = client.ids?.where((e) => isIpAddress(e) == true).toList(); + if (ips == null || ips.isEmpty) return; + logsProvider.setSearchText(ips[0]); + logsProvider.filterLogs(); Navigator.of(context).pop(); + Navigator.pop(context); } if (widget.dialog == true) { @@ -302,7 +304,7 @@ class _ClientsModalState extends State { subtitle: _selectedList == 0 ? _filteredClients[index].name : _filteredClients[index].ids?.join(", "), checkboxActive: logsProvider.selectedClients.contains(_filteredClients[index].ip), isAddedClient: _selectedList == 1, - onSearchAddedClient: () => searchAddedClient(_filteredClients[index]), + onSearchAddedClient: _filteredClients[index].ids != null && _filteredClients[index].ids!.where((e) => isIpAddress(e) == true).isNotEmpty ? () => searchAddedClient(_filteredClients[index]) : null, onChanged: (isSelected) { if (isSelected == true) { logsProvider.setSelectedClients([ @@ -376,7 +378,7 @@ class _ListItem extends StatelessWidget { final bool checkboxActive; final void Function(bool) onChanged; final bool isAddedClient; - final void Function() onSearchAddedClient; + final void Function()? onSearchAddedClient; const _ListItem({ required this.title, diff --git a/lib/screens/settings/dns/upstream_dns.dart b/lib/screens/settings/dns/upstream_dns.dart index 33818a1..1ae8c5e 100644 --- a/lib/screens/settings/dns/upstream_dns.dart +++ b/lib/screens/settings/dns/upstream_dns.dart @@ -1,5 +1,3 @@ -// ignore_for_file: use_build_context_synchronously - import 'dart:io'; import 'package:flutter/material.dart'; @@ -30,6 +28,9 @@ class _UpstreamDnsScreenState extends State { bool validValues = false; + final upstreamTimeoutController = TextEditingController(); + String? upstreamTimeoutError = null; + checkValidValues() { if ( dnsServers.isNotEmpty && @@ -61,6 +62,7 @@ class _UpstreamDnsScreenState extends State { } } upstreamMode = dnsProvider.dnsInfo!.upstreamMode ?? ""; + upstreamTimeoutController.text = dnsProvider.dnsInfo!.upstreamTimeout != null ? dnsProvider.dnsInfo!.upstreamTimeout.toString() : ""; validValues = true; super.initState(); } @@ -72,6 +74,23 @@ class _UpstreamDnsScreenState extends State { final width = MediaQuery.of(context).size.width; + void validateTimeout(String value) { + if (value != '' && int.tryParse(value) != null && int.parse(value) > 0) { + setState(() { + upstreamTimeoutError = null; + validValues = true; + }); + } + else { + setState(() { + upstreamTimeoutError = value == '' + ? AppLocalizations.of(context)!.fieldCannotBeEmpty + : AppLocalizations.of(context)!.invalidValue; + validValues = false; + }); + } + } + void openAddCommentModal() { if (width > 900 || !(Platform.isAndroid || Platform.isIOS)) { showDialog( @@ -146,11 +165,13 @@ class _UpstreamDnsScreenState extends State { final result = await dnsProvider.saveUpstreamDnsConfig({ "upstream_dns": dnsServers.map((e) => e['controller'] != null ? e['controller'].text : e['comment']).toList(), - "upstream_mode": upstreamMode + "upstream_mode": upstreamMode, + "upstream_timeout": int.tryParse(upstreamTimeoutController.text) }); processModal.close(); + if (!context.mounted) return; if (result.successful == true) { showSnackbar( appConfigProvider: appConfigProvider, @@ -312,6 +333,27 @@ class _UpstreamDnsScreenState extends State { subtitle: AppLocalizations.of(context)!.fastestIpAddressDescription, onChanged: (value) => setState(() => upstreamMode = value), ), + const SizedBox(height: 16), + SectionLabel(label: AppLocalizations.of(context)!.others), + Padding( + padding: const EdgeInsets.all(16), + child: TextFormField( + controller: upstreamTimeoutController, + onChanged: validateTimeout, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.timer_rounded), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10) + ) + ), + labelText: AppLocalizations.of(context)!.upstreamTimeout, + helperText: AppLocalizations.of(context)!.upstreamTimeoutHelper, + helperMaxLines: 2, + errorText: upstreamTimeoutError + ) + ), + ), ], ), ), diff --git a/macos/Podfile.lock b/macos/Podfile.lock index e815ee7..ae5c12f 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -6,33 +6,34 @@ PODS: - FlutterMacOS (1.0.0) - package_info_plus (0.0.1): - FlutterMacOS - - screen_retriever (0.0.1): + - screen_retriever_macos (0.0.1): - FlutterMacOS - - Sentry/HybridSDK (8.36.0) - - sentry_flutter (8.9.0): + - Sentry/HybridSDK (8.44.0) + - sentry_flutter (8.13.2): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 8.36.0) + - Sentry/HybridSDK (= 8.44.0) - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - sqflite (0.0.3): + - sqflite_darwin (0.0.4): - Flutter - FlutterMacOS - - "sqlite3 (3.46.1+1)": - - "sqlite3/common (= 3.46.1+1)" - - "sqlite3/common (3.46.1+1)" - - "sqlite3/dbstatvtab (3.46.1+1)": + - sqlite3 (3.49.1): + - sqlite3/common (= 3.49.1) + - sqlite3/common (3.49.1) + - sqlite3/dbstatvtab (3.49.1): - sqlite3/common - - "sqlite3/fts5 (3.46.1+1)": + - sqlite3/fts5 (3.49.1): - sqlite3/common - - "sqlite3/perf-threadsafe (3.46.1+1)": + - sqlite3/perf-threadsafe (3.49.1): - sqlite3/common - - "sqlite3/rtree (3.46.1+1)": + - sqlite3/rtree (3.49.1): - sqlite3/common - sqlite3_flutter_libs (0.0.1): + - Flutter - FlutterMacOS - - "sqlite3 (~> 3.46.0+1)" + - sqlite3 (~> 3.49.1) - sqlite3/dbstatvtab - sqlite3/fts5 - sqlite3/perf-threadsafe @@ -47,11 +48,11 @@ DEPENDENCIES: - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`) - - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) + - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) @@ -69,33 +70,33 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - screen_retriever: - :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos sentry_flutter: :path: Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos shared_preferences_foundation: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin sqlite3_flutter_libs: - :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos + :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos window_manager: :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: - device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 + device_info_plus: 1b14eed9bf95428983aed283a8d51cce3d8c4215 dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c - screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 - Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57 - sentry_flutter: 0eb93e5279eb41e2392212afe1ccd2fecb4f8cbe + package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b + screen_retriever_macos: 776e0fa5d42c6163d2bf772d22478df4b302b161 + Sentry: 0f9bc9adfc0b960e7f3bb5ec67e9a3d8193f3bdb + sentry_flutter: 64a43fb39ab4c7f67d8a4cad52b49e22439e58b7 shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec - sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb - sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983 + sqlite3_flutter_libs: cc304edcb8e1d8c595d1b08c7aeb46a47691d9db url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6982a10..dcd4e29 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -48,6 +48,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index 8e02df2..b3c1761 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -6,4 +6,8 @@ class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/pubspec.yaml b/pubspec.yaml index 4222db1..a9dc55c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 2.20.1+148 +version: 2.20.2+149 environment: sdk: '>=2.18.1 <3.0.0'