diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 37d61e56878..36b0f74a614 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -102,6 +102,9 @@ the best way. For crashes, please provide a full failure log. 'label': 'Action' 'value': | + Replace the following command with the one you're calling or a + description of the failing action: + ```sh nslookup -debug -type=a 'www.example.com' '$YOUR_AGH_ADDRESS' ``` diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a3af2fe174..f140346b519 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,7 +1,7 @@ 'name': 'build' 'env': - 'GO_VERSION': '1.20.12' + 'GO_VERSION': '1.21.8' 'NODE_VERSION': '16' 'on': @@ -101,7 +101,10 @@ - 'name': 'Set up Docker Buildx' 'uses': 'docker/setup-buildx-action@v1' - 'name': 'Run snapshot build' - 'run': 'make SIGN=0 VERBOSE=1 build-release build-docker' + # Set a custom version string, since the checkout@v2 action does not seem + # to know about the master branch, while the version script uses it to + # count the number of commits within the branch. + 'run': 'make SIGN=0 VERBOSE=1 VERSION="v0.0.0-github" build-release build-docker' 'notify': 'needs': diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 1ba27d28f98..ebbe80ef556 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,7 +1,7 @@ 'name': 'lint' 'env': - 'GO_VERSION': '1.20.12' + 'GO_VERSION': '1.21.8' 'on': 'push': diff --git a/CHANGELOG.md b/CHANGELOG.md index a2f02b181c8..e3953d3f5fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,21 +14,93 @@ and this project adheres to +### Added + +- Ability to disable the use of system hosts file information for query + resolution ([#6610]). +- Ability to define custom directories for storage of query log files and + statistics ([#5992]). + +### Fixed + +- Incorrect tracking of the system hosts file's changes ([#6711]). + +[#5992]: https://github.com/AdguardTeam/AdGuardHome/issues/5992 +[#6610]: https://github.com/AdguardTeam/AdGuardHome/issues/6610 +[#6711]: https://github.com/AdguardTeam/AdGuardHome/issues/6711 + +## [v0.107.45] - 2024-03-06 + +See also the [v0.107.45 GitHub milestone][ms-v0.107.45]. + +### Security + +- Go version has been updated to prevent the possibility of exploiting the Go + vulnerabilities fixed in [Go 1.21.8][go-1.21.8]. + +### Added + +- Context menu item in the Query Log to add a Client to the Persistent client + list ([#6679]). + +### Changed + +- Starting with this release our scripts are using Go's [forward compatibility + mechanism][go-toolchain] for updating the Go version. + + **Important note for porters:** This change means that if your `go` version + is 1.21+ but is different from the one required by AdGuard Home, the `go` tool + will automatically download the required version. + + If you want to use the version installed on your builder, run: + + ```sh + go get go@$YOUR_VERSION + go mod tidy + ``` + + and call `make` with `GOTOOLCHAIN=local`. + +### Deprecated + +- Go 1.21 support. Future versions will require at least Go 1.22 to build. + +### Fixed + +- Missing IP addresses in logs when querying for domain names from the ignore + lists. +- Blank page after resetting access clients ([#6634]). +- Wrong algorithm for caching bootstrapped upstream addresses ([#6723]). + +### Removed + +- Go 1.20 support, as it has reached end of life. + +[#6634]: https://github.com/AdguardTeam/AdGuardHome/issues/6634 +[#6679]: https://github.com/AdguardTeam/AdGuardHome/issues/6679 +[#6723]: https://github.com/AdguardTeam/AdGuardHome/issues/6723 + +[go-1.21.8]: https://groups.google.com/g/golang-announce/c/5pwGVUPoMbg +[go-toolchain]: https://go.dev/blog/toolchain +[ms-v0.107.45]: https://github.com/AdguardTeam/AdGuardHome/milestone/80?closed=1 + + + ## [v0.107.44] - 2024-02-06 See also the [v0.107.44 GitHub milestone][ms-v0.107.44]. @@ -2759,11 +2831,12 @@ See also the [v0.104.2 GitHub milestone][ms-v0.104.2]. -[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.44...HEAD +[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.45...HEAD +[v0.107.45]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.44...v0.107.45 [v0.107.44]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.43...v0.107.44 [v0.107.43]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.42...v0.107.43 [v0.107.42]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.41...v0.107.42 diff --git a/Makefile b/Makefile index b40b4cd0820..8fccfc35461 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ # Makefile. Bump this number every time a significant change is made to # this Makefile. # -# AdGuard-Project-Version: 2 +# AdGuard-Project-Version: 4 # Don't name these macros "GO" etc., because GNU Make apparently makes # them exported environment variables with the literal value of @@ -27,6 +27,7 @@ DIST_DIR = dist GOAMD64 = v1 GOPROXY = https://goproxy.cn|https://proxy.golang.org|direct GOSUMDB = sum.golang.google.cn +GOTOOLCHAIN = go1.21.8 GPG_KEY = devteam@adguard.com GPG_KEY_PASSPHRASE = not-a-real-password NPM = npm @@ -56,15 +57,16 @@ BUILD_RELEASE_DEPS_0 = deps js-build BUILD_RELEASE_DEPS_1 = go-deps ENV = env\ - COMMIT='$(COMMIT)'\ CHANNEL='$(CHANNEL)'\ - GPG_KEY='$(GPG_KEY)'\ - GPG_KEY_PASSPHRASE='$(GPG_KEY_PASSPHRASE)'\ + COMMIT='$(COMMIT)'\ DIST_DIR='$(DIST_DIR)'\ GO="$(GO.MACRO)"\ GOAMD64="$(GOAMD64)"\ GOPROXY='$(GOPROXY)'\ GOSUMDB='$(GOSUMDB)'\ + GOTOOLCHAIN='$(GOTOOLCHAIN)'\ + GPG_KEY='$(GPG_KEY)'\ + GPG_KEY_PASSPHRASE='$(GPG_KEY_PASSPHRASE)'\ PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\ RACE='$(RACE)'\ SIGN='$(SIGN)'\ @@ -117,6 +119,8 @@ go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh # targets. go-test: ; $(ENV) RACE='1' "$(SHELL)" ./scripts/make/go-test.sh +go-upd-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-upd-tools.sh + go-check: go-tools go-lint go-test # A quick check to make sure that all supported operating systems can be @@ -132,10 +136,3 @@ openapi-lint: ; cd ./openapi/ && $(YARN) test openapi-show: ; cd ./openapi/ && $(YARN) start txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh - -# TODO(a.garipov): Consider adding to scripts/ and the common project -# structure. -go-upd-tools: - cd ./internal/tools/ &&\ - "$(GO.MACRO)" get -u &&\ - "$(GO.MACRO)" mod tidy diff --git a/bamboo-specs/release.yaml b/bamboo-specs/release.yaml index e7004570405..26d39c8fee2 100644 --- a/bamboo-specs/release.yaml +++ b/bamboo-specs/release.yaml @@ -7,7 +7,7 @@ # Make sure to sync any changes with the branch overrides below. 'variables': 'channel': 'edge' - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' 'stages': - 'Build frontend': @@ -272,7 +272,7 @@ # need to build a few of these. 'variables': 'channel': 'beta' - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' # release-vX.Y.Z branches are the branches from which the actual final # release is built. - '^release-v[0-9]+\.[0-9]+\.[0-9]+': @@ -287,4 +287,4 @@ # are the ones that actually get released. 'variables': 'channel': 'release' - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' diff --git a/bamboo-specs/snapcraft.yaml b/bamboo-specs/snapcraft.yaml index 77948f13efa..bbf2b271f8a 100644 --- a/bamboo-specs/snapcraft.yaml +++ b/bamboo-specs/snapcraft.yaml @@ -10,7 +10,7 @@ # Make sure to sync any changes with the branch overrides below. 'variables': 'channel': 'edge' - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' 'snapcraftChannel': 'edge' 'stages': @@ -191,7 +191,7 @@ # need to build a few of these. 'variables': 'channel': 'beta' - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' 'snapcraftChannel': 'beta' # release-vX.Y.Z branches are the branches from which the actual final # release is built. @@ -207,5 +207,5 @@ # are the ones that actually get released. 'variables': 'channel': 'release' - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' 'snapcraftChannel': 'candidate' diff --git a/bamboo-specs/test.yaml b/bamboo-specs/test.yaml index 86e08cc47fc..b27817dfdd0 100644 --- a/bamboo-specs/test.yaml +++ b/bamboo-specs/test.yaml @@ -5,7 +5,8 @@ 'key': 'AHBRTSPECS' 'name': 'AdGuard Home - Build and run tests' 'variables': - 'dockerGo': 'adguard/golang-ubuntu:7.6' + 'dockerGo': 'adguard/golang-ubuntu:8.1' + 'channel': 'development' 'stages': - 'Tests': @@ -73,7 +74,7 @@ make\ ARCH="amd64"\ OS="windows darwin linux"\ - CHANNEL="development"\ + CHANNEL=${bamboo.channel}\ SIGN=0\ PARALLELISM=1\ VERBOSE=2\ @@ -115,3 +116,16 @@ 'labels': [] 'other': 'concurrent-build-plugin': 'system-default' + +'branch-overrides': + # rc-vX.Y.Z branches are the release candidate branches. They are created + # from the release branch and are used to build the release candidate + # images. + - '^rc-v[0-9]+\.[0-9]+\.[0-9]+': + # Build betas on release branches manually. + 'triggers': [] + # Set the default release channel on the release branch to beta, as we + # may need to build a few of these. + 'variables': + 'dockerGo': 'adguard/golang-ubuntu:8.1' + 'channel': 'candidate' diff --git a/client/src/__locales/be.json b/client/src/__locales/be.json index ad13bfacd70..61af80d8844 100644 --- a/client/src/__locales/be.json +++ b/client/src/__locales/be.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream DNS-серверы абноўлены", "dns_test_ok_toast": "Паказаныя серверы DNS працуюць карэктна", "dns_test_not_ok_toast": "Сервер «{{key}}»: немагчыма выкарыстоўваць, праверце слушнасць напісання", + "dns_test_parsing_error_toast": "Раздзел {{section}}: радок {{line}}: немагчыма выкарыстоўваць, праверце слушнасць напісання", "dns_test_warning_toast": "Upstream «{{key}}» не адказвае на тэставыя запыты і можа не працаваць належным чынам", "unblock": "Адблакаваць", "block": "Заблакаваць", @@ -243,6 +244,7 @@ "allow_this_client": "Дазволіць доступ гэтаму кліенту", "block_for_this_client_only": "Заблакаваць толькі для гэтага кліента", "unblock_for_this_client_only": "Адблакаваць толькі для гэтага кліента", + "add_persistent_client": "Дадаць у захаваныя кліенты", "time_table_header": "Час", "date": "Дата", "domain_name_table_header": "Дамен", @@ -462,6 +464,7 @@ "form_add_id": "Дадаць ідэнтыфікатар", "form_client_name": "Увядзіце імя кліента", "name": "Назва", + "client_name": "Кліент {{id}}", "client_global_settings": "Выкарыстаць глабальныя налады", "client_deleted": "Кліент «{{key}}» паспяхова выдалены", "client_added": "Кліент «{{key}}» паспяхова дададзены", diff --git a/client/src/__locales/cs.json b/client/src/__locales/cs.json index a13d6a488b1..f8f64dcb65b 100644 --- a/client/src/__locales/cs.json +++ b/client/src/__locales/cs.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Odchozí servery byly úspěšně uloženy", "dns_test_ok_toast": "Specifikované DNS servery pracují správně", "dns_test_not_ok_toast": "Server \"{{key}}\": nemohl být použit, zkontrolujte, zda jste ho správně napsali", + "dns_test_parsing_error_toast": "Sekce {{section}}: řádek {{line}}: nelze použít, zkontrolujte prosím, zda jste ho správně napsali", "dns_test_warning_toast": "Upstream \"{{key}}\" neodpovídá na testovací požadavky a nemusí fungovat správně", "unblock": "Odblokovat", "block": "Blokovat", @@ -243,6 +244,7 @@ "allow_this_client": "Povolit tohoto klienta", "block_for_this_client_only": "Blokovat pouze pro tohoto klienta", "unblock_for_this_client_only": "Odblokovat pouze pro tohoto klienta", + "add_persistent_client": "Přidat jako trvalého klienta", "time_table_header": "Čas", "date": "Datum", "domain_name_table_header": "Název domény", @@ -465,6 +467,7 @@ "form_add_id": "Přidat identifikátor", "form_client_name": "Zadejte název klienta", "name": "Název", + "client_name": "Klient {{id}}", "client_global_settings": "Použít globální nastavení", "client_deleted": "Klient \"{{key}}\" byl úspěšně odstraněn", "client_added": "Klient \"{{key}}\" byl úspěšně přidán", diff --git a/client/src/__locales/da.json b/client/src/__locales/da.json index ce34569e701..272ee813363 100644 --- a/client/src/__locales/da.json +++ b/client/src/__locales/da.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream-servere er gemt", "dns_test_ok_toast": "Angivne DNS-servere fungerer korrekt", "dns_test_not_ok_toast": "Server \"{{key}}\": Kunne ikke bruges. Tjek, at du har angivet den korrekt", + "dns_test_parsing_error_toast": "Sektion {{section}}: linje {{line}}: kunne ikke anvendes. Tjek at den er angivet korrekt", "dns_test_warning_toast": "Upstream \"{{key}}\" svarer ikke på testforespørgsler og fungerer muligvis ikke korrekt", "unblock": "Afblokering", "block": "Blokering", @@ -243,6 +244,7 @@ "allow_this_client": "Tillad denne klient", "block_for_this_client_only": "Blokér kun for denne klient", "unblock_for_this_client_only": "Afblokér kun for denne klient", + "add_persistent_client": "Tilføj som vedvarende klient", "time_table_header": "Tid", "date": "Dato", "domain_name_table_header": "Domænenavn", @@ -465,6 +467,7 @@ "form_add_id": "Tilføj identifikator", "form_client_name": "Angiv klientnavn", "name": "Navn", + "client_name": "Klient {{id}}", "client_global_settings": "Brug globale indstillinger", "client_deleted": "Klient \"{{key}}\" slettet", "client_added": "Klient \"{{key}}\" tilføjet", diff --git a/client/src/__locales/de.json b/client/src/__locales/de.json index c0b1b590e98..bdf1da7d784 100644 --- a/client/src/__locales/de.json +++ b/client/src/__locales/de.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream-Server erfolgreich gespeichert", "dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß", "dns_test_not_ok_toast": "Server „{{key}}“: konnte nicht verwendet werden, bitte überprüfen Sie die korrekte Schreibweise", + "dns_test_parsing_error_toast": "Abschnitt {{section}}: Zeile {{line}}: konnte nicht verwendet werden, bitte überprüfen Sie, ob alles richtig geschrieben ist", "dns_test_warning_toast": "Upstream „{{key}}“ reagiert nicht auf Testanfragen und funktioniert möglicherweise nicht fehlerfrei", "unblock": "Entsperren", "block": "Sperren", @@ -243,6 +244,7 @@ "allow_this_client": "Diesen Client zulassen", "block_for_this_client_only": "Nur für diesen Client sperren", "unblock_for_this_client_only": "Nur für diesen Client freigeben", + "add_persistent_client": "Als dauerhaften Client hinzufügen", "time_table_header": "Zeit", "date": "Datum", "domain_name_table_header": "Domainname", @@ -465,6 +467,7 @@ "form_add_id": "Kennung hinzufügen", "form_client_name": "Clientnamen eingeben", "name": "Name", + "client_name": "Client {{id}}", "client_global_settings": "Allgemeine Einstellungen nutzen", "client_deleted": "Client „{{key}}“ erfolgreich entfernt", "client_added": "Client „{{key}}“ erfolgreich hinzugefügt", diff --git a/client/src/__locales/en.json b/client/src/__locales/en.json index 112928bee47..bc3e459cd7c 100644 --- a/client/src/__locales/en.json +++ b/client/src/__locales/en.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream servers successfully saved", "dns_test_ok_toast": "Specified DNS servers are working correctly", "dns_test_not_ok_toast": "Server \"{{key}}\": could not be used, please check that you've written it correctly", + "dns_test_parsing_error_toast": "Section {{section}}: line {{line}}: could not be used, please check that you've written it correctly", "dns_test_warning_toast": "Upstream \"{{key}}\" does not respond to test requests and may not work properly", "unblock": "Unblock", "block": "Block", @@ -243,6 +244,7 @@ "allow_this_client": "Allow this client", "block_for_this_client_only": "Block for this client only", "unblock_for_this_client_only": "Unblock for this client only", + "add_persistent_client": "Add as persistent client", "time_table_header": "Time", "date": "Date", "domain_name_table_header": "Domain name", @@ -465,6 +467,7 @@ "form_add_id": "Add identifier", "form_client_name": "Enter client name", "name": "Name", + "client_name": "Client {{id}}", "client_global_settings": "Use global settings", "client_deleted": "Client \"{{key}}\" successfully deleted", "client_added": "Client \"{{key}}\" successfully added", diff --git a/client/src/__locales/es.json b/client/src/__locales/es.json index efbd744ccb6..be20a4243ac 100644 --- a/client/src/__locales/es.json +++ b/client/src/__locales/es.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Servidores DNS de subida guardados correctamente", "dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente", "dns_test_not_ok_toast": "Servidor \"{{key}}\": no se puede utilizar, por favor revisa si lo has escrito correctamente", + "dns_test_parsing_error_toast": "No se pudo utilizar la sección {{section}}: línea {{line}}:, verifica si la escribiste correctamente", "dns_test_warning_toast": "DNS de subida \"{{key}}\" no responde a las peticiones de prueba y es posible que no funcione correctamente", "unblock": "Desbloquear", "block": "Bloquear", @@ -243,6 +244,7 @@ "allow_this_client": "Permitir a este cliente", "block_for_this_client_only": "Bloquear solo para este cliente", "unblock_for_this_client_only": "Desbloquear solo para este cliente", + "add_persistent_client": "Añadir como cliente persistente", "time_table_header": "Hora", "date": "Fecha", "domain_name_table_header": "Nombre del dominio", @@ -465,6 +467,7 @@ "form_add_id": "Añadir identificador", "form_client_name": "Ingresa el nombre del cliente", "name": "Nombre", + "client_name": "Cliente {{id}}", "client_global_settings": "Usar configuración global", "client_deleted": "Cliente \"{{key}}\" eliminado correctamente", "client_added": "Cliente \"{{key}}\" añadido correctamente", diff --git a/client/src/__locales/fa.json b/client/src/__locales/fa.json index 907b95cfdf0..ae4a2258d74 100644 --- a/client/src/__locales/fa.json +++ b/client/src/__locales/fa.json @@ -220,6 +220,7 @@ "updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است", "dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند", "dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید", + "dns_test_parsing_error_toast": "بخش {{section}}: خط {{line}}: نمی‌تواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را به‌درستی نوشته‌اید", "unblock": "رفع انسداد", "block": "مسدود کردن", "disallow_this_client": "این مشتری را رد کنید", @@ -420,6 +421,7 @@ "form_add_id": "افزودن احرازکننده", "form_client_name": "نام کلاینت را وارد کنید", "name": "نام", + "client_name": "مشتری {{id}}", "client_global_settings": "استفاده از تنظیمات سراسری", "client_deleted": "کلاینت \"{{key}}\" را با موفقیت حذف کرد", "client_added": "کلاینت \"{{key}}\" را با موفقیت اضافه کرد", diff --git a/client/src/__locales/fi.json b/client/src/__locales/fi.json index 6cecca15168..07db2ab09eb 100644 --- a/client/src/__locales/fi.json +++ b/client/src/__locales/fi.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Ylävirtapalvelimet tallennettiin", "dns_test_ok_toast": "Määritetyt DNS-palvelimet toimivat oikein", "dns_test_not_ok_toast": "Palvelin \"{{key}}\": Ei voitu käyttää, tarkista oikeinkirjoitus", + "dns_test_parsing_error_toast": "Osio {{section}}: rivi {{line}}: Ei voitu käyttää, tarkista oikeinkirjoitus", "dns_test_warning_toast": "Datavuon \"{{key}}\" ei vastaa testipyyntöihin eikä välttämättä toimi kunnolla", "unblock": "Salli", "block": "Estä", @@ -243,6 +244,7 @@ "allow_this_client": "Salli tämä päätelaite", "block_for_this_client_only": "Estä vain tältä päätelaitteelta", "unblock_for_this_client_only": "Salli vain tälle päätelaitteelle", + "add_persistent_client": "Lisää pysyvänä päätelaitteena", "time_table_header": "Aika", "date": "Päiväys", "domain_name_table_header": "Verkkotunnus", @@ -446,7 +448,7 @@ "manual_update": "Seuraa näitä ohjeita päivittääksesi manuaalisesti.", "processing_update": "Odota kun AdGuard Home päivittyy", "clients_title": "Pysyvät päätelaitteet", - "clients_desc": "Määritä pysyvät AdGuard Homeen yhdistetyt päätelaitetiedot.", + "clients_desc": "Määritä AdGuard Homeen pysyvästi yhdistettyjen päätelaitteiden tiedot.", "settings_global": "Yleinen", "settings_custom": "Mukautettu", "table_client": "Asiakas", @@ -465,6 +467,7 @@ "form_add_id": "Lisää tunniste", "form_client_name": "Syötä päätelaitteen nimi", "name": "Nimi", + "client_name": "Päätelaite {{id}}", "client_global_settings": "Käytä yleisiä asetuksia", "client_deleted": "Päätelaite \"{{key}}\" poistettiin", "client_added": "Päätelaite \"{{key}}\" lisättiin", diff --git a/client/src/__locales/fr.json b/client/src/__locales/fr.json index a7766cb911c..6bc2d8cffba 100644 --- a/client/src/__locales/fr.json +++ b/client/src/__locales/fr.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Serveurs en amont enregistrés", "dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement", "dns_test_not_ok_toast": "Impossible d'utiliser le serveur « {{key}} »: veuillez vérifier si le nom saisi est bien correct", + "dns_test_parsing_error_toast": "La section {{section}}: ligne {{line}}: n'a pas pu être utilisée, veuillez vérifier que vous l'avez écrite correctement", "dns_test_warning_toast": "L'amont « {{key}} » ne répond pas aux demandes de test et peut ne pas fonctionner correctement", "unblock": "Débloquer", "block": "Bloquer", @@ -243,6 +244,7 @@ "allow_this_client": "Autoriser ce client", "block_for_this_client_only": "Bloquer uniquement pour ce client", "unblock_for_this_client_only": "Débloquer uniquement pour ce client", + "add_persistent_client": "Ajouter comme client persistant", "time_table_header": "Temps", "date": "Date", "domain_name_table_header": "Nom de domaine", @@ -465,6 +467,7 @@ "form_add_id": "Ajouter identifiant", "form_client_name": "Saisissez le nom du client", "name": "Nom", + "client_name": "Client {{id}}", "client_global_settings": "Utiliser les paramètres généraux", "client_deleted": "Le client « {{key}} » a été supprimé", "client_added": "Le client « {{key}} » a été ajouté", diff --git a/client/src/__locales/hr.json b/client/src/__locales/hr.json index 7fe2c68a126..c29167cf33c 100644 --- a/client/src/__locales/hr.json +++ b/client/src/__locales/hr.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Uzvodni poslužitelji uspješno su spremljeni", "dns_test_ok_toast": "Odabrani DNS poslužitelji su trenutno aktivni", "dns_test_not_ok_toast": "\"{{key}}\" poslužitelja: ne može se upotrijebiti, provjerite jeste li to ispravno napisali", + "dns_test_parsing_error_toast": "Odjeljak {{section}}: redak {{line}}: nije moguće koristiti, provjerite jeste li ispravno napisali", "dns_test_warning_toast": "Upstream \"{{key}}\" ne odgovara na zahtjeve za testiranje i možda neće raditi ispravno", "unblock": "Odblokiraj", "block": "Blokiraj", @@ -243,6 +244,7 @@ "allow_this_client": "Omogući ovog klijenta", "block_for_this_client_only": "Blokiraj samo za ovog klijenta", "unblock_for_this_client_only": "Odblokiraj samo za ovog klijenta", + "add_persistent_client": "Dodaj u spremljene klijente", "time_table_header": "Vrijeme", "date": "Datum", "domain_name_table_header": "Naziv domene", @@ -462,6 +464,7 @@ "form_add_id": "Dodaj identifikator", "form_client_name": "Unesite naziv klijenta", "name": "Naziv", + "client_name": "Klijent {{id}}", "client_global_settings": "Koristi globalne postavke", "client_deleted": "Klijent \"{{key}}\" je uspješno uklonjen", "client_added": "Klijent \"{{key}}\" je uspješno dodan", diff --git a/client/src/__locales/hu.json b/client/src/__locales/hu.json index 40bf85122ef..7c94437ed54 100644 --- a/client/src/__locales/hu.json +++ b/client/src/__locales/hu.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream szerverek sikeresen mentve", "dns_test_ok_toast": "A megadott DNS-kiszolgálók megfelelően működnek", "dns_test_not_ok_toast": "Szerver \"{{key}}\": nem használható, ellenőrizze, hogy helyesen írta-e be", + "dns_test_parsing_error_toast": "Szekció {{section}}: sor {{line}}: nem használható, ellenőrizze, hogy helyesen írta-e be", "dns_test_warning_toast": "A \"{{key}}\" feltöltés nem válaszol a tesztkérelmekre, és lehet, hogy nem működik megfelelően", "unblock": "Feloldás", "block": "Blokkolás", @@ -243,6 +244,7 @@ "allow_this_client": "Engedélyezés ennek a kliensnek", "block_for_this_client_only": "Tiltás csak ennek a kliensnek", "unblock_for_this_client_only": "Feloldás csak ennek a kliensnek", + "add_persistent_client": "Hozzáadás állandó ügyfélként", "time_table_header": "Idő", "date": "Dátum", "domain_name_table_header": "Domain név", @@ -462,6 +464,7 @@ "form_add_id": "Azonosító hozzáadása", "form_client_name": "Adja meg a kliens nevét", "name": "Név", + "client_name": "Ügyfél {{id}}", "client_global_settings": "Globális beállítások használata", "client_deleted": "A(z) \"{{key}}\" kliens sikeresen el lett távolítva", "client_added": "A(z) \"{{key}}\" kliens sikeresen hozzá lett adva", diff --git a/client/src/__locales/id.json b/client/src/__locales/id.json index 960df7ee8d1..3b8cb123ead 100644 --- a/client/src/__locales/id.json +++ b/client/src/__locales/id.json @@ -224,10 +224,10 @@ "example_upstream_regular": "DNS reguler (melalui UDP);", "example_upstream_regular_port": "DNS biasa (lebih dari UDP, dengan port);", "example_upstream_udp": "DNS biasa (lebih dari UDP, nama host);", - "example_upstream_dot": "terenkripsi <0>DNS-over-TLS;", - "example_upstream_doh": "terenkripsi <0>DNS-over-HTTPS;", - "example_upstream_doh3": "DNS-over-HTTPS terenkripsi dengan paksa <0>HTTP/3 dan tidak ada fallback ke HTTP/2 atau lebih rendah;", - "example_upstream_doq": "terenkripsi <0>DNS-over-QUIC;", + "example_upstream_dot": "<0>DNS melalui TLS terenkripsi;", + "example_upstream_doh": "<0>DNS melalui HTTPS terenkripsi;", + "example_upstream_doh3": "DNS melalui HTTPS terenkripsi dengan <0>HTTP/3 secara paksa dan tidak ada cadangan ke HTTP/2 atau lebih rendah;", + "example_upstream_doq": "<0>DNS melalui QUIC terenkripsi;", "example_upstream_sdns": "<0>Stempel DNS untuk <1>DNSCrypt atau pengarah <2>DNS-over-HTTPS;", "example_upstream_tcp": "DNS reguler (melalui TCP);", "example_upstream_tcp_port": "DNS biasa (melalui TCP, dengan port);", @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Server upstream berhasil disimpan", "dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar", "dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar", + "dns_test_parsing_error_toast": "Bagian {{section}}: baris {{line}}: tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar", "dns_test_warning_toast": "Upstream \"{{key}}\" tidak menanggapi permintaan pengujian dan mungkin tidak berfungsi dengan baik", "unblock": "Buka Blokir", "block": "Blok", @@ -243,6 +244,7 @@ "allow_this_client": "Ijinkan klien ini", "block_for_this_client_only": "Blok hanya untuk klien ini", "unblock_for_this_client_only": "Jangan diblok hanya untuk klien ini", + "add_persistent_client": "Tambahkan sebagai klien persisten", "time_table_header": "Waktu", "date": "Tanggal", "domain_name_table_header": "Nama domain", @@ -289,7 +291,7 @@ "custom_ip": "Custom IP", "blocking_ipv4": "Blokiran IPv4", "blocking_ipv6": "Blokiran IPv6", - "blocked_response_ttl": "TTL Respons yang diblokir", + "blocked_response_ttl": "Respons TTL yang diblokir", "blocked_response_ttl_desc": "Menentukan berapa detik klien harus menyimpan respons yang difilter dalam cache", "form_enter_blocked_response_ttl": "Masukkan TTL respons yang diblokir (detik)", "dnscrypt": "DNSCrypt", @@ -424,7 +426,7 @@ "encryption_reset": "Anda yakin ingin mengatur ulang pengaturan enkripsi?", "encryption_warning": "Peringatan", "encryption_plain_dns_enable": "Aktifkan DNS biasa", - "encryption_plain_dns_desc": "DNS Biasa diaktifkan secara standar. Anda dapat menonaktifkannya untuk memaksa semua perangkat menggunakan DNS terenkripsi. Untuk melakukan ini, Anda harus mengaktifkan setidaknya satu protokol DNS terenkripsi", + "encryption_plain_dns_desc": "DNS biasa diaktifkan secara standar. Anda dapat menonaktifkannya untuk memaksa semua perangkat menggunakan DNS terenkripsi. Untuk melakukan ini, Anda harus mengaktifkan setidaknya satu protokol DNS terenkripsi", "encryption_plain_dns_error": "Untuk menonaktifkan DNS biasa, aktifkan setidaknya satu protokol DNS terenkripsi", "topline_expiring_certificate": "Sertifikat SSL Anda hampir kedaluwarsa. Perbarui <0>Pengaturan enkripsi.", "topline_expired_certificate": "Sertifikat SSL Anda kedaluwarsa. Perbarui <0>Pengaturan enkripsi.", @@ -442,7 +444,7 @@ "fix": "Perbaiki", "dns_providers": "Berikut adalah <0>daftar penyedia DNS yang dikenal untuk dipilih.", "update_now": "Perbarui sekarang", - "update_failed": "Pembaruan otomatis gagal. Silahkan ikuti petunjuk ini untuk perbarui secara manual.", + "update_failed": "Pembaruan otomatis gagal. Silakan ikuti langkah-langkah berikut untuk memperbarui secara manual.", "manual_update": "Silakan mengikuti langkah berikut untuk memperbarui secara manual.", "processing_update": "Silahkan tunggu, AdGuard Home sedang diperbarui", "clients_title": "Klien yang gigih", @@ -465,6 +467,7 @@ "form_add_id": "Tambahkan pengenal", "form_client_name": "Masukkan nama klien", "name": "Nama", + "client_name": "Klien {{id}}", "client_global_settings": "Gunakan pengaturan global", "client_deleted": "Klien \"{{key}}\" berhasil dihapus", "client_added": "Klien \"{{key}}\" berhasil ditambahkan", @@ -545,7 +548,7 @@ "domain": "Domain", "ecs": "ECS", "punycode": "Kode kecil", - "answer": "Jawab", + "answer": "Jawaban", "filter_added_successfully": "Filter telah berhasil ditambahkan", "filter_removed_successfully": "Daftar ini telah sukses dihapus", "filter_updated": "Daftar telah sukses diperbarui", @@ -679,7 +682,7 @@ "form_error_password_length": "Kata sandi harus terdiri dari {{min}} hingga {{max}}", "anonymizer_notification": "<0>Catatan: Anonimisasi IP diaktifkan. Anda dapat menonaktifkannya di <1>Pengaturan umum .", "confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?", - "cache_cleared": "Cache DNS berhasil dibersihkan", + "cache_cleared": "Cache DNS berhasil dihapus", "clear_cache": "Hapus cache", "make_static": "Jadikan statis", "theme_auto_desc": "Otomatis (berdasarkan skema warna perangkat anda)", diff --git a/client/src/__locales/it.json b/client/src/__locales/it.json index a29004af5ba..88e4e053225 100644 --- a/client/src/__locales/it.json +++ b/client/src/__locales/it.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "I server upstream sono stati salvati correttamente", "dns_test_ok_toast": "I server DNS specificati funzionano correttamente", "dns_test_not_ok_toast": "Server \"{{key}}\": non può essere utilizzato, assicurati di averlo digitato correttamente", + "dns_test_parsing_error_toast": "Sezione {{section}}: riga {{line}}: non può essere usata, controlla se l'hai scritta correttamente", "dns_test_warning_toast": "Upstream \"{{key}}\" non risponde alle richieste di test e potrebbe non funzionare correttamente", "unblock": "Sblocca", "block": "Blocca", @@ -243,6 +244,7 @@ "allow_this_client": "Consenti questo client", "block_for_this_client_only": "Blocca solo per questo client", "unblock_for_this_client_only": "Sblocca solo per questo client", + "add_persistent_client": "Aggiungi come client persistente", "time_table_header": "Ora", "date": "Data", "domain_name_table_header": "Nome dominio", @@ -465,6 +467,7 @@ "form_add_id": "Aggiungi identificatore", "form_client_name": "Inserisci nome client", "name": "Nome", + "client_name": "Client {{id}}", "client_global_settings": "Utilizza le impostazioni globali", "client_deleted": "Client \"{{key}}\" eliminato correttamente", "client_added": "Client \"{{key}}\" aggiunto correttamente", diff --git a/client/src/__locales/ja.json b/client/src/__locales/ja.json index 3e0521ece96..06cbc108703 100644 --- a/client/src/__locales/ja.json +++ b/client/src/__locales/ja.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "アップストリームサーバーを保存しました。", "dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています", "dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください", + "dns_test_parsing_error_toast": "セクション {{section}}: 行 {{line}}: を使用できませんでした。正しく記述されているか確認してください", "dns_test_warning_toast": "アップストリーム\"{{key}}\"はテストリクエストに応答せず、正しく動作しない可能性があります。", "unblock": "ブロック解除", "block": "ブロック", @@ -243,6 +244,7 @@ "allow_this_client": "このクライアントを許可する", "block_for_this_client_only": "このクライアントに対してのみブロックする", "unblock_for_this_client_only": "このクライアントに対してのみブロックを解除する", + "add_persistent_client": "永続クライアントとして追加する", "time_table_header": "時刻", "date": "購入日時", "domain_name_table_header": "ドメイン名", @@ -465,6 +467,7 @@ "form_add_id": "識別子を追加する", "form_client_name": "クライアント名を入力してください", "name": "名前", + "client_name": "クライアント {{id}}", "client_global_settings": "グローバル設定を使用する", "client_deleted": "クライアント \"{{key}}\" の削除に成功しました", "client_added": "クライアント \"{{key}}\" の追加に成功しました", diff --git a/client/src/__locales/ko.json b/client/src/__locales/ko.json index 7ce4ad02cd1..bbab696a224 100644 --- a/client/src/__locales/ko.json +++ b/client/src/__locales/ko.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "업스트림 서버가 성공적으로 저장되었습니다", "dns_test_ok_toast": "지정된 DNS 서버가 올바르게 작동하고 있습니다.", "dns_test_not_ok_toast": "서버 '{{key}}': 사용할 수 없습니다, 제대로 작성했는지 확인하세요", + "dns_test_parsing_error_toast": "섹션 {{section}}: 줄 {{line}}: 사용할 수 없으며, 올바르게 작성했는지 확인하세요.", "dns_test_warning_toast": "업스트림 '{{key}}'이(가) 테스트 요청에 응답하지 않으며 제대로 작동하지 않을 수 있습니다", "unblock": "차단 해제", "block": "차단", @@ -243,6 +244,7 @@ "allow_this_client": "클라이언트 허용", "block_for_this_client_only": "이 클라이언트에 대해서만 차단", "unblock_for_this_client_only": "이 클라이언트에 대해서만 차단 해제", + "add_persistent_client": "저장된 클라이언트에 추가", "time_table_header": "시간", "date": "날짜", "domain_name_table_header": "도메인명", @@ -465,6 +467,7 @@ "form_add_id": "식별자 추가", "form_client_name": "클라이언트 이름 입력", "name": "이름", + "client_name": "클라이언트 {{id}}", "client_global_settings": "글로벌 설정 사용", "client_deleted": "클라이언트 '{{key}}'이(가) 정상적으로 삭제되었습니다", "client_added": "클라이언트 '{{key}}'이(가) 정상적으로 추가되었습니다", diff --git a/client/src/__locales/nl.json b/client/src/__locales/nl.json index 5e545f98a67..2ff6c7527aa 100644 --- a/client/src/__locales/nl.json +++ b/client/src/__locales/nl.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream-servers succesvol opgeslagen", "dns_test_ok_toast": "Opgegeven DNS-servers werken correct", "dns_test_not_ok_toast": "Server \"{{key}}\": kon niet worden gebruikt, controleer of je het correct hebt geschreven", + "dns_test_parsing_error_toast": "Sectie {{section}}: regel {{line}}: kan niet worden gebruikt. Controleer of je het correct hebt geschreven", "dns_test_warning_toast": "Upstream \"{{key}}\" reageert niet op testverzoeken en werkt mogelijk niet goed", "unblock": "Deblokkeren", "block": "Blokkeren", @@ -243,6 +244,7 @@ "allow_this_client": "Toepassing/systeem toelaten", "block_for_this_client_only": "Alleen voor deze cliënt blokkeren", "unblock_for_this_client_only": "Alleen voor deze cliënt deblokkeren", + "add_persistent_client": "Toevoegen als permanente client", "time_table_header": "Tijd", "date": "Datum", "domain_name_table_header": "Domein naam", @@ -465,6 +467,7 @@ "form_add_id": "ID toevoegen", "form_client_name": "Vul gebruikersnaam in", "name": "Naam", + "client_name": "Client {{id}}", "client_global_settings": "Gebruik globale instelling", "client_deleted": "Gebruiker \"{{key}}\" met succes verwijderd", "client_added": "Gebruiker \"{{key}}\" met succes toegevoegd", diff --git a/client/src/__locales/no.json b/client/src/__locales/no.json index 0d9a5d39111..8708e4d8da7 100644 --- a/client/src/__locales/no.json +++ b/client/src/__locales/no.json @@ -212,6 +212,7 @@ "updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne", "dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig", "dns_test_not_ok_toast": "Tjeneren «{{key}}» kunne ikke brukes, vennligst dobbeltsjekk at du har skrevet den riktig", + "dns_test_parsing_error_toast": "Seksjon {{section}}: linje {{line}}: kunne ikke brukes, vennligst sjekk at du har skrevet det riktig", "unblock": "Tillat", "block": "Blokker", "disallow_this_client": "Ikke tillat denne klienten", diff --git a/client/src/__locales/pl.json b/client/src/__locales/pl.json index d657eb06c69..8d0b5b1452b 100644 --- a/client/src/__locales/pl.json +++ b/client/src/__locales/pl.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Serwery nadrzędne zostały pomyślnie zapisane", "dns_test_ok_toast": "Określone serwery DNS działają poprawnie", "dns_test_not_ok_toast": "Serwer \"{{key}}\": nie może być użyte, sprawdź, czy zapisano go poprawnie", + "dns_test_parsing_error_toast": "Sekcja {{section}}: linia {{line}}: nie może być użyte, sprawdź, czy zapisano go poprawnie", "dns_test_warning_toast": "Upstream \"{{key}}\" nie odpowiada na zapytania testowe i może nie działać prawidłowo", "unblock": "Odblokuj", "block": "Zablokuj", @@ -243,6 +244,7 @@ "allow_this_client": "Pozwól temu klientowi", "block_for_this_client_only": "Zablokuj tylko tego klienta", "unblock_for_this_client_only": "Odblokuj tylko tego klienta", + "add_persistent_client": "Dodaj do zapisanych klientów", "time_table_header": "Czas", "date": "Data", "domain_name_table_header": "Nazwa domeny", @@ -423,6 +425,9 @@ "encryption_hostnames": "Nazwy hostów", "encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?", "encryption_warning": "Ostrzeżenie", + "encryption_plain_dns_enable": "Włącz zwykły DNS", + "encryption_plain_dns_desc": "Zwykły DNS jest domyślnie włączony. Możesz go wyłączyć, aby zmusić wszystkie urządzenia do korzystania z szyfrowanego DNS. Aby to zrobić, musisz włączyć co najmniej jeden szyfrowany protokół DNS", + "encryption_plain_dns_error": "Aby wyłączyć zwykły DNS, włącz co najmniej jeden szyfrowany protokół DNS", "topline_expiring_certificate": "Twój certyfikat SSL wkrótce wygaśnie. Zaktualizuj <0>Ustawienia szyfrowania.", "topline_expired_certificate": "Twój certyfikat SSL wygasł. Zaktualizuj <0>Ustawienia szyfrowania.", "form_error_port_range": "Wpisz numer portu z zakresu 80-65535", @@ -462,6 +467,7 @@ "form_add_id": "Dodaj identyfikator", "form_client_name": "Wpisz nazwę klienta", "name": "Nazwa", + "client_name": "Klient {{id}}", "client_global_settings": "Użyj ustawień globalnych", "client_deleted": "Klient \"{{key}}\" został pomyślnie usunięty", "client_added": "Klient \"{{key}}\" został pomyślnie dodany", diff --git a/client/src/__locales/pt-br.json b/client/src/__locales/pt-br.json index 5541d5a3626..caf1be0a126 100644 --- a/client/src/__locales/pt-br.json +++ b/client/src/__locales/pt-br.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Servidores DNS primário salvos com sucesso", "dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente", "dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se você escreveu corretamente", + "dns_test_parsing_error_toast": "A seção {{section}}: linha {{line}}: não pôde ser usada. Verifique se foi escrita corretamente", "dns_test_warning_toast": "Servidor DNS primário \"{{key}}\" não responde aos Solicitações de teste e pode não funcionar corretamente", "unblock": "Desbloquear", "block": "Bloquear", @@ -243,6 +244,7 @@ "allow_this_client": "Permitir este cliente", "block_for_this_client_only": "Bloquear apenas para este cliente", "unblock_for_this_client_only": "Desbloquear apenas para este cliente", + "add_persistent_client": "Adicionar como cliente persistente", "time_table_header": "Data", "date": "Data", "domain_name_table_header": "Nome de domínio", @@ -465,6 +467,7 @@ "form_add_id": "Adicionar identificador", "form_client_name": "Digite o nome do cliente", "name": "Nome", + "client_name": "Cliente {{id}}", "client_global_settings": "Usar configurações global", "client_deleted": "Cliente \"{{key}}\" excluído com sucesso", "client_added": "Cliente \"{{key}}\" adicionado com sucesso", diff --git a/client/src/__locales/pt-pt.json b/client/src/__locales/pt-pt.json index 138143cdfba..fe5d1263cef 100644 --- a/client/src/__locales/pt-pt.json +++ b/client/src/__locales/pt-pt.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Servidores DNS primário guardados com sucesso", "dns_test_ok_toast": "Os servidores DNS especificados estão a funcionar corretamente", "dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se o escreveu corretamente", + "dns_test_parsing_error_toast": "A seção {{section}}: linha {{line}}: não pôde ser usada. Verifique se foi escrita corretamente", "dns_test_warning_toast": "Servidor DNS primário \"{{key}}\" não responde aos solicitações de teste e pode não funcionar corretamente", "unblock": "Desbloquear", "block": "Bloquear", @@ -243,6 +244,7 @@ "allow_this_client": "Permitir este cliente", "block_for_this_client_only": "Bloquear apenas para este cliente", "unblock_for_this_client_only": "Desbloquear apenas para este cliente", + "add_persistent_client": "Adicionar como cliente persistente", "time_table_header": "Data", "date": "Data", "domain_name_table_header": "Nome do domínio", @@ -465,6 +467,7 @@ "form_add_id": "Adicionar identificador", "form_client_name": "Insira o nome do cliente", "name": "Nome", + "client_name": "Cliente {{id}}", "client_global_settings": "Usar definições globais", "client_deleted": "Cliente \"{{key}}\" excluído com sucesso", "client_added": "Cliente \"{{key}}\" adicionado com sucesso", diff --git a/client/src/__locales/ro.json b/client/src/__locales/ro.json index 03331064377..7ec981a7786 100644 --- a/client/src/__locales/ro.json +++ b/client/src/__locales/ro.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Serverele din amonte au fost salvate cu succes", "dns_test_ok_toast": "Serverele DNS specificate funcționează corect", "dns_test_not_ok_toast": "Serverul \"{{key}}\": nu a putut fi utilizat, verificați dacă l-ați scris corect", + "dns_test_parsing_error_toast": "Secțiune {{section}}: linie {{line}}: nu a putut fi folosit, vă rugăm să verificați dacă l-ați scris corect", "dns_test_warning_toast": "„{{key}}” în amonte nu răspunde la solicitările de testare și s-ar putea să nu funcționeze corect", "unblock": "Deblocați", "block": "Blocați", @@ -243,6 +244,7 @@ "allow_this_client": "Permiteți acest client", "block_for_this_client_only": "Blocați numai pentru acest client", "unblock_for_this_client_only": "Deblocați numai pentru acest client", + "add_persistent_client": "Adăugați ca client persistent", "time_table_header": "Ora", "date": "Data", "domain_name_table_header": "Nume domeniu", @@ -462,6 +464,7 @@ "form_add_id": "Adăugați identificator", "form_client_name": "Introduceți nume client", "name": "Nume", + "client_name": "Client {{id}}", "client_global_settings": "Folosiți setări globale", "client_deleted": "Clientul \"{{key}}\" a fost șters cu succes", "client_added": "Clientul \"{{key}}\" a fost adăugat cu succes", diff --git a/client/src/__locales/ru.json b/client/src/__locales/ru.json index 9e4be5360e2..ba9dee82ebf 100644 --- a/client/src/__locales/ru.json +++ b/client/src/__locales/ru.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "DNS-серверы успешно обновлены", "dns_test_ok_toast": "Указанные серверы DNS работают корректно", "dns_test_not_ok_toast": "Сервер «{{key}}»: невозможно использовать, проверьте правильность написания", + "dns_test_parsing_error_toast": "Раздел {{section}}: строка {{line}}: невозможно использовать, проверьте правильность написания", "dns_test_warning_toast": "Upstream «{{key}}» не отвечает на тестовые запросы и может работать некорректно", "unblock": "Разблокировать", "block": "Заблокировать", @@ -243,6 +244,7 @@ "allow_this_client": "Разрешить доступ клиенту", "block_for_this_client_only": "Заблокировать только для этого клиента", "unblock_for_this_client_only": "Разблокировать только для этого клиента", + "add_persistent_client": "Добавить в сохранённые клиенты", "time_table_header": "Время", "date": "Дата", "domain_name_table_header": "Домен", @@ -465,6 +467,7 @@ "form_add_id": "Добавить идентификатор", "form_client_name": "Введите имя клиента", "name": "Имя", + "client_name": "Клиент {{id}}", "client_global_settings": "Использовать глобальные настройки", "client_deleted": "Клиент «{{key}}» успешно удалён", "client_added": "Клиент «{{key}}» успешно добавлен", diff --git a/client/src/__locales/sk.json b/client/src/__locales/sk.json index fb573726420..614ff3ec198 100644 --- a/client/src/__locales/sk.json +++ b/client/src/__locales/sk.json @@ -26,7 +26,7 @@ "enabled_dhcp": "DHCP server zapnutý", "disabled_dhcp": "DHCP server vypnutý", "unavailable_dhcp": "DHCP nie je dostupné", - "unavailable_dhcp_desc": "AdGuard Home nemôže vo vašom OS prevádzkovať DHCP server", + "unavailable_dhcp_desc": "AdGuard Home nemôže vo Vašom OS prevádzkovať DHCP server", "dhcp_title": "DHCP server (experimentálne!)", "dhcp_description": "Ak Váš smerovač neposkytuje možnosť nastaviť DHCP, môžete použiť vlastný zabudovaný DHCP server AdGuard.", "dhcp_enable": "Zapnúť DHCP server", @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream servery boli úspešne uložené", "dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne", "dns_test_not_ok_toast": "Server \"{{key}}\": nemohol byť použitý, skontrolujte, či ste ho správne napísali", + "dns_test_parsing_error_toast": "Sekcia {{section}}: riadok {{line}}: nepodarilo sa použiť, skontrolujte, či ste ho napísali správne", "dns_test_warning_toast": "Upstream \"{{key}}\" neodpovedá na testovacie dopyty a nemusí fungovať správne", "unblock": "Odblokovať", "block": "Blokovať", @@ -243,6 +244,7 @@ "allow_this_client": "Povoliť tohto klienta", "block_for_this_client_only": "Blokovať len pre tohto klienta", "unblock_for_this_client_only": "Odblokovať len pre tohto klienta", + "add_persistent_client": "Pridať ako trvalého klienta", "time_table_header": "Čas", "date": "Dátum", "domain_name_table_header": "Meno domény", @@ -465,6 +467,7 @@ "form_add_id": "Pridajte identifikátor", "form_client_name": "Zadajte meno klienta", "name": "Meno", + "client_name": "Klient {{id}}", "client_global_settings": "Použiť globálne nastavenia", "client_deleted": "\"{{key}}\" klienta bol úspešne vymazaný", "client_added": "\"{{key}}\" klienta bol úspešne pridaný", diff --git a/client/src/__locales/sl.json b/client/src/__locales/sl.json index 4621e04be3a..99be87c67cb 100644 --- a/client/src/__locales/sl.json +++ b/client/src/__locales/sl.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Gorvodni trežniki so uspešno shranjeni", "dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno", "dns_test_not_ok_toast": "Ni mogoče uporabiti: strežnika \"{{key}}\". Preverite, ali ste ga pravilno napisali", + "dns_test_parsing_error_toast": "Razdelek {{section}}: vrstica {{line}}: ni bilo mogoče uporabiti, preverite, ali ste ga pravilno zapisali", "dns_test_warning_toast": "Upstream \"{{key}}\" se ne odziva na testne zahteve in morda ne deluje pravilno", "unblock": "Omogoči", "block": "Onemogoči", @@ -243,6 +244,7 @@ "allow_this_client": "Dovoli tega odjemalca", "block_for_this_client_only": "Onemogoči samo za tega odjemalca", "unblock_for_this_client_only": "Omogoči samo za tega odjemalca", + "add_persistent_client": "Dodaj kot vztrajnega odjemalca", "time_table_header": "Čas", "date": "Datum", "domain_name_table_header": "Ime domene", @@ -465,6 +467,7 @@ "form_add_id": "Dodaj identifikatorja", "form_client_name": "Vnesite ime odjemalca", "name": "Ime", + "client_name": "Odjemalec {{id}}", "client_global_settings": "Uporabi splošne nastavitve", "client_deleted": "Odjemalec \"{{key}}\" je bil uspešno izbrisan", "client_added": "Odjemalec \"{{key}}\" je bil uspešno dodan", diff --git a/client/src/__locales/sr-cs.json b/client/src/__locales/sr-cs.json index 583822e78d3..312451be580 100644 --- a/client/src/__locales/sr-cs.json +++ b/client/src/__locales/sr-cs.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Upstream serveri su uspešno sačuvani", "dns_test_ok_toast": "Dati DNS serveri rade ispravno", "dns_test_not_ok_toast": "Server \"{{key}}\": se ne može koristiti. Proverite da li ste ga ispravno uneli", + "dns_test_parsing_error_toast": "Odeljak {{section}}: linija {{line}}: ne može se koristiti, molimo proverite da li ste ga ispravno napisali", "dns_test_warning_toast": "Apstrim \"{{key}}\" ne odgovara na zahteve za testiranje i možda neće raditi kako treba", "unblock": "Odblokiraj", "block": "Blokiraj", @@ -243,6 +244,7 @@ "allow_this_client": "Dozvoli ovaj klijent", "block_for_this_client_only": "Blokiraj samo za ovaj klijent", "unblock_for_this_client_only": "Odblokiraj samo za ovaj klijent", + "add_persistent_client": "Dodati u sačuvane klijente", "time_table_header": "Vreme", "date": "Datum", "domain_name_table_header": "Ime domena", @@ -462,6 +464,7 @@ "form_add_id": "Dodaj identifikator", "form_client_name": "Unesite ime klijenta", "name": "Ime", + "client_name": "Klijent {{id}}", "client_global_settings": "Koristi globalne postavke", "client_deleted": "Klijent \"{{key}}\" uspešno izbrisan", "client_added": "Klijent \"{{key}}\" uspešno dodat", diff --git a/client/src/__locales/sv.json b/client/src/__locales/sv.json index a1a11a6f18c..8d5dbb5d1aa 100644 --- a/client/src/__locales/sv.json +++ b/client/src/__locales/sv.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Sparade uppströms dns-servrar", "dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt", "dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt", + "dns_test_parsing_error_toast": "Avsnitt {{section}}: rad {{line}}: kunde inte användas, kontrollera att du har skrivit det korrekt", "dns_test_warning_toast": "Uppströms \"{{key}}\" svarar inte på testförfrågningar och kanske inte fungerar korrekt", "unblock": "Avblockera", "block": "Blockera", @@ -243,6 +244,7 @@ "allow_this_client": "Tillåt den här klienten", "block_for_this_client_only": "Blockera endast för denna klient", "unblock_for_this_client_only": "Avblockera endast för denna klient", + "add_persistent_client": "Lägg till som beständig klient", "time_table_header": "Tid", "date": "Datum", "domain_name_table_header": "Domännamn", @@ -461,6 +463,7 @@ "form_add_id": "Lägg till identifierare", "form_client_name": "Skriv in klientnamn", "name": "Namn", + "client_name": "Klient {{id}}", "client_global_settings": "Använda globala inställningar", "client_deleted": "Klient \"{{key}}\" har raderats", "client_added": "Klient \"{{key}}\" har lagts till", diff --git a/client/src/__locales/tr.json b/client/src/__locales/tr.json index b3ce3ba6bca..e43cb20edec 100644 --- a/client/src/__locales/tr.json +++ b/client/src/__locales/tr.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Üst sunucular başarıyla kaydedildi", "dns_test_ok_toast": "Belirtilen DNS sunucuları düzgün çalışıyor", "dns_test_not_ok_toast": "Sunucu \"{{key}}\": kullanılamıyor, lütfen doğru yazdığınızdan emin olun", + "dns_test_parsing_error_toast": "{{section}} bölümü: {{line}}. satır: kullanılamadı, lütfen doğru yazdığınızı kontrol edin", "dns_test_warning_toast": "Üst kaynak \"{{key}}\", test isteklerine yanıt vermiyor ve düzgün çalışmayabilir", "unblock": "Engeli kaldır", "block": "Engelle", @@ -243,6 +244,7 @@ "allow_this_client": "Bu istemciye izin ver", "block_for_this_client_only": "Yalnızca bu istemci için engelle", "unblock_for_this_client_only": "Yalnızca bu istemci için engellemeyi kaldır", + "add_persistent_client": "Kalıcı istemci olarak ekle", "time_table_header": "Saat", "date": "Tarih", "domain_name_table_header": "Alan adı", @@ -465,6 +467,7 @@ "form_add_id": "Tanımlayıcı ekle", "form_client_name": "İstemci ismi girin", "name": "Adı", + "client_name": "İstemci {{id}}", "client_global_settings": "Genel ayarları kullan", "client_deleted": "\"{{key}}\" istemcisi başarıyla silindi", "client_added": "\"{{key}}\" istemcisi başarıyla eklendi", diff --git a/client/src/__locales/uk.json b/client/src/__locales/uk.json index dbec359c556..87300a2f81c 100644 --- a/client/src/__locales/uk.json +++ b/client/src/__locales/uk.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "DNS-сервери успішно збережено", "dns_test_ok_toast": "Вказані DNS сервери працюють правильно", "dns_test_not_ok_toast": "Сервер «{{key}}»: неможливо використати. Перевірте правильність введення", + "dns_test_parsing_error_toast": "Розділ {{section}}: рядок {{line}}: неможливо використати. Перевірте правильність введення", "dns_test_warning_toast": "Upstream «{{key}}» не відповідає на тестові запити та може працювати не правильно", "unblock": "Дозволити", "block": "Заборонити", @@ -243,6 +244,7 @@ "allow_this_client": "Дозволити цей клієнт", "block_for_this_client_only": "Заборонити тільки цей клієнт", "unblock_for_this_client_only": "Дозволити тільки цей клієнт", + "add_persistent_client": "Додати в збережені клієнти", "time_table_header": "Час", "date": "Дата", "domain_name_table_header": "Назва домену", @@ -465,6 +467,7 @@ "form_add_id": "Додати ідентифікатор", "form_client_name": "Введіть ім'я клієнта", "name": "Ім'я", + "client_name": "Клієнт {{id}}", "client_global_settings": "Використати загальні налаштування", "client_deleted": "Клієнта «{{key}}» успішно видалено", "client_added": "Клієнта «{{key}}» успішно додано", diff --git a/client/src/__locales/vi.json b/client/src/__locales/vi.json index fb68549f371..4736281a5ba 100644 --- a/client/src/__locales/vi.json +++ b/client/src/__locales/vi.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "Các máy chủ thượng nguồn đã được lưu thành công", "dns_test_ok_toast": "Máy chủ DNS có thể sử dụng", "dns_test_not_ok_toast": "Máy chủ \"{{key}}\"': không thể sử dụng, vui lòng kiểm tra lại", + "dns_test_parsing_error_toast": "Phần {{section}}: dòng {{line}}: không thể sử dụng được, vui lòng kiểm tra xem bạn đã viết đúng chưa", "dns_test_warning_toast": "Ngược lại \"{{key}}\" không phản hồi các yêu cầu kiểm tra và có thể không hoạt động bình thường", "unblock": "Bỏ chặn", "block": "Chặn", @@ -243,6 +244,7 @@ "allow_this_client": "Cho phép ứng dụng khách này", "block_for_this_client_only": "Chỉ chặn ứng dụng khách này", "unblock_for_this_client_only": "Chỉ hủy chặn ứng dụng khách này", + "add_persistent_client": "Thêm làm ứng dụng khách liên tục", "time_table_header": "Thời gian", "date": "Ngày", "domain_name_table_header": "Tên miền", @@ -462,6 +464,7 @@ "form_add_id": "Thêm định danh", "form_client_name": "Nhập tên máy khách", "name": "Tên", + "client_name": "Khách hàng {{id}}", "client_global_settings": "Sử dụng cài đặt toàn cầu", "client_deleted": "Máy khách \"{{key}}\" đã xóa thành công", "client_added": "Máy khách \"{{key}}\" đã thêm thành công", diff --git a/client/src/__locales/zh-cn.json b/client/src/__locales/zh-cn.json index dda8a01781f..d93d0731ac0 100644 --- a/client/src/__locales/zh-cn.json +++ b/client/src/__locales/zh-cn.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "上游服务器保存成功", "dns_test_ok_toast": "指定的 DNS 服务器现已正常运行", "dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确", + "dns_test_parsing_error_toast": "第 {{section}} 节:第 {{line}} 行:无法使用,请检查您输入的是否正确", "dns_test_warning_toast": "上游 “{{key}}” 不响应测试请求,可能无法正常工作", "unblock": "放行", "block": "拦截", @@ -243,6 +244,7 @@ "allow_this_client": "允许这个客户端", "block_for_this_client_only": "仅对此客户端拦截", "unblock_for_this_client_only": "仅解除对此客户端的拦截", + "add_persistent_client": "添加为持久客户端", "time_table_header": "时间", "date": "日期", "domain_name_table_header": "域名", @@ -465,6 +467,7 @@ "form_add_id": "添加标识符", "form_client_name": "输入客户端名称", "name": "名称", + "client_name": "客户端 {{id}}", "client_global_settings": "使用全局设置", "client_deleted": "客户端 \"{{key}}\" 删除成功", "client_added": "客户端 \"{{key}}\" 添加成功", diff --git a/client/src/__locales/zh-tw.json b/client/src/__locales/zh-tw.json index ddaa6244f0d..0028fed19a3 100644 --- a/client/src/__locales/zh-tw.json +++ b/client/src/__locales/zh-tw.json @@ -236,6 +236,7 @@ "updated_upstream_dns_toast": "上游的伺服器被成功地儲存", "dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作", "dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它", + "dns_test_parsing_error_toast": "第 {{section}} 節:第 {{line}} 行:無法使用,請檢查您輸入的是否正確", "dns_test_warning_toast": "上游 “{{key}}” 不回應測試請求,可能無法正常工作", "unblock": "解除封鎖", "block": "封鎖", @@ -243,6 +244,7 @@ "allow_this_client": "允許此用戶端", "block_for_this_client_only": "僅對此用戶端封鎖", "unblock_for_this_client_only": "僅對此用戶端解除封鎖", + "add_persistent_client": "新增為永久性客戶端", "time_table_header": "時間", "date": "日期", "domain_name_table_header": "域名", @@ -465,6 +467,7 @@ "form_add_id": "新增識別碼", "form_client_name": "輸入用戶端名稱", "name": "名稱", + "client_name": "用戶端 {{id}}", "client_global_settings": "使用全域的設定", "client_deleted": "用戶端 \"{{key}}\" 被成功地刪除", "client_added": "用戶端 \"{{key}}\" 被成功地加入", diff --git a/client/src/actions/index.js b/client/src/actions/index.js index e0e50841047..c7af4fa0057 100644 --- a/client/src/actions/index.js +++ b/client/src/actions/index.js @@ -403,6 +403,11 @@ export const testUpstream = ( const message = upstreamResponse[key]; if (message.startsWith('WARNING:')) { dispatch(addErrorToast({ error: i18next.t('dns_test_warning_toast', { key }) })); + } else if (message.endsWith(': parsing error')) { + const info = message.substring(0, message.indexOf(':')); + const [sectionKey, line] = info.split(' '); + const section = i18next.t(sectionKey); + dispatch(addErrorToast({ error: i18next.t('dns_test_parsing_error_toast', { section, line }) })); } else if (message !== 'OK') { dispatch(addErrorToast({ error: i18next.t('dns_test_not_ok_toast', { key }) })); } diff --git a/client/src/components/Filters/Modal.js b/client/src/components/Filters/Modal.js index aba53b302a1..5144a6f2222 100644 --- a/client/src/components/Filters/Modal.js +++ b/client/src/components/Filters/Modal.js @@ -13,6 +13,8 @@ ReactModal.setAppElement('#root'); const MODAL_TYPE_TO_TITLE_TYPE_MAP = { [MODAL_TYPE.EDIT_FILTERS]: 'edit', [MODAL_TYPE.ADD_FILTERS]: 'new', + [MODAL_TYPE.EDIT_CLIENT]: 'edit', + [MODAL_TYPE.ADD_CLIENT]: 'new', [MODAL_TYPE.SELECT_MODAL_TYPE]: 'new', [MODAL_TYPE.CHOOSE_FILTERING_LIST]: 'choose', }; diff --git a/client/src/components/Logs/Cells/ClientCell.js b/client/src/components/Logs/Cells/ClientCell.js index d0dd316850a..da15efc3705 100644 --- a/client/src/components/Logs/Cells/ClientCell.js +++ b/client/src/components/Logs/Cells/ClientCell.js @@ -3,7 +3,7 @@ import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import { nanoid } from 'nanoid'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; -import { Link } from 'react-router-dom'; +import { Link, useHistory } from 'react-router-dom'; import propTypes from 'prop-types'; import { checkFiltered, getBlockingClientName } from '../../../helpers/helpers'; @@ -25,12 +25,14 @@ const ClientCell = ({ }) => { const { t } = useTranslation(); const dispatch = useDispatch(); + const history = useHistory(); const autoClients = useSelector((state) => state.dashboard.autoClients, shallowEqual); const isDetailed = useSelector((state) => state.queryLogs.isDetailed); const allowedСlients = useSelector((state) => state.access.allowed_clients, shallowEqual); const [isOptionsOpened, setOptionsOpened] = useState(false); const autoClient = autoClients.find((autoClient) => autoClient.name === client); + const clients = useSelector((state) => state.dashboard.clients); const source = autoClient?.source; const whoisAvailable = client_info && Object.keys(client_info.whois).length > 0; const clientName = client_info?.name || client_id; @@ -55,6 +57,8 @@ const ClientCell = ({ const isFiltered = checkFiltered(reason); + const clientIds = clients.map((c) => c.ids).flat(); + const nameClass = classNames('w-90 o-hidden d-flex flex-column', { 'mt-2': isDetailed && !client_info?.name && !whoisAvailable, 'white-space--nowrap': isDetailed, @@ -66,7 +70,6 @@ const ClientCell = ({ const renderBlockingButton = (isFiltered, domain) => { const buttonType = isFiltered ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK; - const clients = useSelector((state) => state.dashboard.clients); const { confirmMessage, @@ -118,6 +121,15 @@ const ClientCell = ({ }, ]; + if (!clientIds.includes(client)) { + BUTTON_OPTIONS.push({ + name: 'add_persistent_client', + onClick: () => { + history.push(`/#clients?clientId=${client}`); + }, + }); + } + const getOptions = (options) => { if (options.length === 0) { return null; diff --git a/client/src/components/Settings/Clients/ClientsTable/ClientsTable.js b/client/src/components/Settings/Clients/ClientsTable/ClientsTable.js index f4744a5a66c..3f82ee98186 100644 --- a/client/src/components/Settings/Clients/ClientsTable/ClientsTable.js +++ b/client/src/components/Settings/Clients/ClientsTable/ClientsTable.js @@ -4,6 +4,7 @@ import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import { Trans, useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; +import { useHistory, useLocation } from 'react-router-dom'; import ReactTable from 'react-table'; import { getAllBlockedServices, getBlockedServices } from '../../../../actions/services'; @@ -39,8 +40,12 @@ const ClientsTable = ({ }) => { const [t] = useTranslation(); const dispatch = useDispatch(); + const location = useLocation(); + const history = useHistory(); const services = useSelector((store) => store?.services); const globalSettings = useSelector((store) => store?.settings.settingsList) || {}; + const params = new URLSearchParams(location.search); + const clientId = params.get('clientId'); const { safesearch } = globalSettings; @@ -48,6 +53,12 @@ const ClientsTable = ({ dispatch(getAllBlockedServices()); dispatch(getBlockedServices()); dispatch(initSettings()); + + if (clientId) { + toggleClientModal({ + type: MODAL_TYPE.ADD_CLIENT, + }); + } }, []); const handleFormAdd = (values) => { @@ -85,11 +96,15 @@ const ClientsTable = ({ } } - if (modalType === MODAL_TYPE.EDIT_FILTERS) { + if (modalType === MODAL_TYPE.EDIT_CLIENT) { handleFormUpdate(config, modalClientName); } else { handleFormAdd(config); } + + if (clientId) { + history.push('/#clients'); + } }; const getOptionsWithLabels = (options) => ( @@ -133,6 +148,14 @@ const ClientsTable = ({ } }; + const handleClose = () => { + toggleClientModal(); + + if (clientId) { + history.push('/#clients'); + } + }; + const columns = [ { Header: t('table_client'), @@ -298,7 +321,7 @@ const ClientsTable = ({ type="button" className="btn btn-icon btn-outline-primary btn-sm mr-2" onClick={() => toggleClientModal({ - type: MODAL_TYPE.EDIT_FILTERS, + type: MODAL_TYPE.EDIT_CLIENT, name: clientName, }) } @@ -371,12 +394,13 @@ const ClientsTable = ({ diff --git a/client/src/components/Settings/Clients/Form.js b/client/src/components/Settings/Clients/Form.js index 2df5b65535f..46c90928ff6 100644 --- a/client/src/components/Settings/Clients/Form.js +++ b/client/src/components/Settings/Clients/Form.js @@ -147,7 +147,7 @@ let Form = (props) => { useGlobalSettings, useGlobalServices, blockedServicesSchedule, - toggleClientModal, + handleClose, processingAdding, processingUpdating, invalid, @@ -427,7 +427,7 @@ let Form = (props) => { disabled={submitting} onClick={() => { reset(); - toggleClientModal(); + handleClose(); }} > cancel_btn @@ -456,7 +456,7 @@ Form.propTypes = { reset: PropTypes.func.isRequired, change: PropTypes.func.isRequired, submitting: PropTypes.bool.isRequired, - toggleClientModal: PropTypes.func.isRequired, + handleClose: PropTypes.func.isRequired, useGlobalSettings: PropTypes.bool, useGlobalServices: PropTypes.bool, blockedServicesSchedule: PropTypes.object, diff --git a/client/src/components/Settings/Clients/Modal.js b/client/src/components/Settings/Clients/Modal.js index 9c244a21062..321e663cb7d 100644 --- a/client/src/components/Settings/Clients/Modal.js +++ b/client/src/components/Settings/Clients/Modal.js @@ -6,7 +6,9 @@ import ReactModal from 'react-modal'; import { MODAL_TYPE } from '../../../helpers/constants'; import Form from './Form'; -const getInitialData = (initial) => { +const getInitialData = ({ + initial, modalType, clientId, clientName, +}) => { if (initial && initial.blocked_services) { const { blocked_services } = initial; const blocked = {}; @@ -21,46 +23,60 @@ const getInitialData = (initial) => { }; } + if (modalType !== MODAL_TYPE.EDIT_CLIENT && clientId) { + return { + ...initial, + name: clientName, + ids: [clientId], + }; + } + return initial; }; -const Modal = (props) => { - const { - isModalOpen, +const Modal = ({ + isModalOpen, + modalType, + currentClientData, + handleSubmit, + handleClose, + processingAdding, + processingUpdating, + tagsOptions, + clientId, + t, +}) => { + const initialData = getInitialData({ + initial: currentClientData, modalType, - currentClientData, - handleSubmit, - toggleClientModal, - processingAdding, - processingUpdating, - tagsOptions, - } = props; - const initialData = getInitialData(currentClientData); + clientId, + clientName: t('client_name', { id: clientId }), + }); return ( toggleClientModal()} + onRequestClose={handleClose} >

- {modalType === MODAL_TYPE.EDIT_FILTERS ? ( + {modalType === MODAL_TYPE.EDIT_CLIENT ? ( client_edit ) : ( client_new )}

-
"), + Rules: []string{ + "||bsky.app^", + "||bsky.social^", + }, }, { ID: "canais_globo", Name: "Canais Globo", @@ -1927,6 +1935,14 @@ var blockedServices = []blockedService{{ "||minecraftservices.com^", "||mojang.com^", }, +}, { + ID: "nebula", + Name: "Nebula", + IconSVG: []byte(""), + Rules: []string{ + "||nebula.app^", + "||nebula.tv^", + }, }, { ID: "netflix", Name: "Netflix", diff --git a/internal/home/control.go b/internal/home/control.go index db0c2c5ef73..9cc2c5ba014 100644 --- a/internal/home/control.go +++ b/internal/home/control.go @@ -15,7 +15,6 @@ import ( "github.com/AdguardTeam/AdGuardHome/internal/version" "github.com/AdguardTeam/golibs/httphdr" "github.com/AdguardTeam/golibs/log" - "github.com/AdguardTeam/golibs/mathutil" "github.com/AdguardTeam/golibs/netutil" "github.com/NYTimes/gziphandler" ) @@ -145,7 +144,7 @@ func handleStatus(w http.ResponseWriter, r *http.Request) { // Make sure that we don't send negative numbers to the frontend, // since enough time might have passed to make the difference less // than zero. - protectionDisabledDuration = mathutil.Max( + protectionDisabledDuration = max( 0, time.Until(*protectionDisabledUntil).Milliseconds(), ) diff --git a/internal/rdns/rdns.go b/internal/rdns/rdns.go index 93898b3ec42..7130ccf34a4 100644 --- a/internal/rdns/rdns.go +++ b/internal/rdns/rdns.go @@ -7,7 +7,6 @@ import ( "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/log" - "github.com/AdguardTeam/golibs/mathutil" "github.com/bluele/gcache" ) @@ -88,8 +87,7 @@ func (r *Default) Process(ip netip.Addr) (host string, changed bool) { log.Debug("rdns: resolving %q: %s", ip, err) } - // TODO(s.chzhen): Use built-in function max in Go 1.21. - ttl = mathutil.Max(ttl, r.cacheTTL) + ttl = max(ttl, r.cacheTTL) item := &cacheItem{ expiry: time.Now().Add(ttl), diff --git a/internal/tools/go.mod b/internal/tools/go.mod index c6af873d324..5b811b57ffe 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -1,18 +1,18 @@ module github.com/AdguardTeam/AdGuardHome/internal/tools -go 1.20 +go 1.21.8 require ( github.com/fzipp/gocyclo v0.6.0 github.com/golangci/misspell v0.4.1 github.com/gordonklaus/ineffassign v0.1.0 - github.com/kisielk/errcheck v1.6.3 + github.com/kisielk/errcheck v1.7.0 github.com/kyoh86/looppointer v0.2.1 - github.com/securego/gosec/v2 v2.18.2 + github.com/securego/gosec/v2 v2.19.0 github.com/uudashr/gocognit v1.1.2 - golang.org/x/tools v0.17.0 - golang.org/x/vuln v1.0.3 - honnef.co/go/tools v0.4.6 + golang.org/x/tools v0.19.0 + golang.org/x/vuln v1.0.4 + honnef.co/go/tools v0.4.7 mvdan.cc/gofumpt v0.6.0 mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 ) @@ -26,9 +26,9 @@ require ( github.com/kyoh86/nolint v0.0.1 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/exp/typeparams v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/mod v0.14.0 // indirect + golang.org/x/exp/typeparams v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/mod v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect + golang.org/x/sys v0.18.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/tools/go.sum b/internal/tools/go.sum index fbd0a6c93b0..6b8959f4bae 100644 --- a/internal/tools/go.sum +++ b/internal/tools/go.sum @@ -3,39 +3,53 @@ github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/golangci/misspell v0.4.1 h1:+y73iSicVy2PqyX7kmUefHusENlrP9YwuHZHPLGQj/g= github.com/golangci/misspell v0.4.1/go.mod h1:9mAN1quEo3DlpbaIKKyEvRxK1pwqR9s/Sea1bJCtlNI= github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786 h1:rcv+Ippz6RAtvaGgKxc+8FQIpxHgsF+HBzPyYL2cyVU= +github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786/go.mod h1:apVn/GCasLZUVpAJ6oWAuyP7Ne7CEsQbTnc0plM3m+o= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= -github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= +github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kyoh86/looppointer v0.2.1 h1:Jx9fnkBj/JrIryBLMTYNTj9rvc2SrPS98Dg0w7fxdJg= github.com/kyoh86/looppointer v0.2.1/go.mod h1:q358WcM8cMWU+5vzqukvaZtnJi1kw/MpRHQm3xvTrjw= github.com/kyoh86/nolint v0.0.1 h1:GjNxDEkVn2wAxKHtP7iNTrRxytRZ1wXxLV5j4XzGfRU= github.com/kyoh86/nolint v0.0.1/go.mod h1:1ZiZZ7qqrZ9dZegU96phwVcdQOMKIqRzFJL3ewq9gtI= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/gomega v1.28.1 h1:MijcGUbfYuznzK/5R4CPNoUP/9Xvuo20sXfEm6XxoTA= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= +github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/securego/gosec/v2 v2.18.2 h1:DkDt3wCiOtAHf1XkiXZBhQ6m6mK/b9T/wD257R3/c+I= -github.com/securego/gosec/v2 v2.18.2/go.mod h1:xUuqSF6i0So56Y2wwohWAmB07EdBkUN6crbLlHwbyJs= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/securego/gosec/v2 v2.19.0 h1:gl5xMkOI0/E6Hxx0XCY2XujA3V7SNSefA8sC+3f1gnk= +github.com/securego/gosec/v2 v2.19.0/go.mod h1:hOkDcHz9J/XIgIlPDXalxjeVYsHxoWUc5zJSHxcB8YM= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= @@ -49,21 +63,21 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp/typeparams v0.0.0-20240119083558-1b970713d09a h1:8qmSSA8Gz/1kTrCe0nqR0R3Gb/NDhykzWw2q2mWZydM= -golang.org/x/exp/typeparams v0.0.0-20240119083558-1b970713d09a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240222234643-814bf88cf225 h1:BzKNaIRXh1bD+1557OcFIHlpYBiVbK4zEyn8zBHi1SE= +golang.org/x/exp/typeparams v0.0.0-20240222234643-814bf88cf225/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -79,24 +93,24 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201007032633-0806396f153e/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/vuln v1.0.3 h1:k2wzzWGpdntQzNsCOLTabCFk76oTe69BPwad5H52F4w= -golang.org/x/vuln v1.0.3/go.mod h1:NbJdUQhX8jY++FtuhrXs2Eyx0yePo9pF7nPlIjo9aaQ= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/vuln v1.0.4 h1:SP0mPeg2PmGCu03V+61EcQiOjmpri2XijexKdzv8Z1I= +golang.org/x/vuln v1.0.4/go.mod h1:NbJdUQhX8jY++FtuhrXs2Eyx0yePo9pF7nPlIjo9aaQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -104,8 +118,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= -honnef.co/go/tools v0.4.6/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 h1:zCr3iRRgdk5eIikZNDphGcM6KGVTx3Yu+/Uu9Es254w= diff --git a/scripts/README.md b/scripts/README.md index b567cbd4af7..c756c382b3e 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -87,6 +87,22 @@ Optional environment: * `VERSION`: release version. Will be set by `version.sh` if it is unset or if it has the default `Makefile` value of `v0.0.0`. +We're using Go's [forward compatibility mechanism][go-toolchain] for updating +the Go version. This means that if your `go` version is 1.21+ but is different +from the one required by AdGuard Home, the `go` tool will automatically download +the required version. + +If you want to use the version installed on your builder, run: + +```sh +go get go@$YOUR_VERSION +go mod tidy +``` + +and call `make` with `GOTOOLCHAIN=local`. + +[go-toolchain]: https://go.dev/blog/toolchain + ### `clean.sh`: Cleanup diff --git a/scripts/blocked-services/main.go b/scripts/blocked-services/main.go index 5e57860af8f..bb0b97cc7a9 100644 --- a/scripts/blocked-services/main.go +++ b/scripts/blocked-services/main.go @@ -9,12 +9,12 @@ import ( "net/http" "net/url" "os" + "slices" "strings" "text/template" "time" "github.com/AdguardTeam/golibs/log" - "golang.org/x/exp/slices" ) func main() { diff --git a/scripts/hooks/pre-commit b/scripts/hooks/pre-commit index 42d1e413e74..b0cce8d6409 100755 --- a/scripts/hooks/pre-commit +++ b/scripts/hooks/pre-commit @@ -6,7 +6,9 @@ set -e -f -u # Bump this number every time a significant change is made to this # script. # -# AdGuard-Project-Version: 1 +# AdGuard-Project-Version: 2 + +# TODO(a.garipov): Add pre-merge-commit. # Only show interactive prompts if there a terminal is attached to # stdout. While this technically doesn't guarantee that reading from diff --git a/scripts/make/go-build.sh b/scripts/make/go-build.sh index 7f629cd8549..48d68c00d4c 100644 --- a/scripts/make/go-build.sh +++ b/scripts/make/go-build.sh @@ -51,12 +51,12 @@ readonly channel case "$channel" in -('development'|'edge'|'beta'|'release') +('development'|'edge'|'beta'|'release'|'candidate') # All is well, go on. ;; (*) echo "invalid channel '$channel', supported values are\ - 'development', 'edge', 'beta', and 'release'" 1>&2 + 'development', 'edge', 'beta', 'release', and 'candidate'" 1>&2 exit 1 ;; esac diff --git a/scripts/make/go-lint.sh b/scripts/make/go-lint.sh index ce8718dcd40..4792158aeb2 100644 --- a/scripts/make/go-lint.sh +++ b/scripts/make/go-lint.sh @@ -30,33 +30,6 @@ set -f -u -# Warnings - -go_version="$( "${GO:-go}" version )" -readonly go_version - -go_min_version='go1.20.12' -go_version_msg=" -warning: your go version (${go_version}) is different from the recommended minimal one (${go_min_version}). -if you have the version installed, please set the GO environment variable. -for example: - - export GO='${go_min_version}' -" -readonly go_min_version go_version_msg - -case "$go_version" -in -('go version'*"$go_min_version"*) - # Go on. - ;; -(*) - echo "$go_version_msg" 1>&2 - ;; -esac - - - # Simple analyzers # blocklist_imports is a simple check against unwanted packages. The following @@ -74,18 +47,24 @@ esac # # See https://github.com/golang/go/issues/45200. # -# * Package sort is replaced by golang.org/x/exp/slices. +# * Package sort is replaced by package slices. # # * Package unsafe is… unsafe. # +# * Package golang.org/x/exp/slices has been moved into stdlib. +# # * Package golang.org/x/net/context has been moved into stdlib. # # Currently, the only standard exception are files generated from protobuf # schemas, which use package reflect. If your project needs more exceptions, # add and document them. # -# TODO(a.garipov): Add deprecated packages golang.org/x/exp/maps and -# golang.org/x/exp/slices once all projects switch to Go 1.21. +# TODO(a.garipov): Add golibs/log. +# +# TODO(a.garipov): Add "golang.org/x/exp/slices" back after a release. +# +# TODO(a.garipov): Add deprecated package golang.org/x/exp/maps once all +# projects switch to Go 1.22. blocklist_imports() { git grep\ -e '[[:space:]]"errors"$'\ @@ -124,12 +103,10 @@ underscores() { underscore_files="$( git ls-files '*_*.go'\ | grep -F\ - -e '_big.go'\ -e '_bsd.go'\ -e '_darwin.go'\ -e '_freebsd.go'\ -e '_linux.go'\ - -e '_little.go'\ -e '_next.go'\ -e '_openbsd.go'\ -e '_others.go'\ diff --git a/scripts/make/go-test.sh b/scripts/make/go-test.sh index 03d2c100997..3727587e69f 100644 --- a/scripts/make/go-test.sh +++ b/scripts/make/go-test.sh @@ -51,9 +51,9 @@ readonly count_flags cover_flags shuffle_flags timeout_flags "$go" test\ "$count_flags"\ "$cover_flags"\ - "$shuffle_flags"\ "$race_flags"\ + "$shuffle_flags"\ "$timeout_flags"\ - "$x_flags"\ "$v_flags"\ + "$x_flags"\ ./... diff --git a/scripts/make/go-tools.sh b/scripts/make/go-tools.sh index fdb70f86935..9d7051034d7 100644 --- a/scripts/make/go-tools.sh +++ b/scripts/make/go-tools.sh @@ -30,8 +30,6 @@ set -e -f -u go="${GO:-go}" readonly go -# TODO(a.garipov): Add goconst? - # Remove only the actual binaries in the bin/ directory, as developers may add # their own scripts there. Most commonly, a script named “go” for tools that # call the go binary and need a particular version. diff --git a/scripts/make/go-upd-tools.sh b/scripts/make/go-upd-tools.sh new file mode 100644 index 00000000000..7486661d637 --- /dev/null +++ b/scripts/make/go-upd-tools.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +# This comment is used to simplify checking local copies of the script. Bump +# this number every time a significant change is made to this script. +# +# AdGuard-Project-Version: 1 + +verbose="${VERBOSE:-0}" +readonly verbose + +if [ "$verbose" -gt '1' ] +then + env + set -x + x_flags='-x=1' +elif [ "$verbose" -gt '0' ] +then + set -x + x_flags='-x=0' +else + set +x + x_flags='-x=0' +fi +readonly x_flags + +set -e -f -u + +go="${GO:-go}" +readonly go + +cd ./internal/tools/ +"$go" get -u +"$go" mod tidy diff --git a/scripts/make/version.sh b/scripts/make/version.sh index 68e84e9c303..c57151919de 100644 --- a/scripts/make/version.sh +++ b/scripts/make/version.sh @@ -43,7 +43,7 @@ bump_minor='/^v[0-9]+\.[0-9]+\.0$/ { } { - printf("invalid release version: \"%s\"\n", $0); + printf("invalid minor release version: \"%s\"\n", $0); exit 1; }' @@ -74,8 +74,16 @@ readonly channel case "$channel" in ('development') - # Use the dummy version for development builds. - version='v0.0.0' + # commit_number is the number of current commit within the branch. + commit_number="$( git rev-list --count master..HEAD )" + readonly commit_number + + # The development builds are described with a combination of unset semantic + # version, the commit's number within the branch, and the commit hash, e.g.: + # + # v0.0.0-dev.5-a1b2c3d4 + # + version="v0.0.0-dev.${commit_number}+$( git rev-parse --short HEAD )" ;; ('edge') # last_minor_zero is the last new minor release. @@ -120,15 +128,40 @@ in version="$last_tag" ;; +('candidate') + # This pseudo-channel is used to set a proper versions into release + # candidate builds. + + # last_tag is expected to be the latest release tag. + last_tag="$( git describe --abbrev=0 )" + readonly last_tag + + # current_branch is the name of the branch currently checked out. + current_branch="$( git rev-parse --abbrev-ref HEAD )" + readonly current_branch + + # The branch should be named like: + # + # rc-v12.34.56 + # + if ! echo "$current_branch" | grep -E -e '^rc-v[0-9]+\.[0-9]+\.[0-9]+$' -q + then + echo "invalid release candidate branch name '$current_branch'" 1>&2 + + exit 1 + fi + + version="${current_branch#rc-}-rc.$( git rev-list --count "$last_tag"..HEAD )" + ;; (*) echo "invalid channel '$channel', supported values are\ - 'development', 'edge', 'beta', and 'release'" 1>&2 + 'development', 'edge', 'beta', 'release' and 'candidate'" 1>&2 exit 1 ;; esac # Finally, make sure that we don't output invalid versions. -if ! echo "$version" | grep -E -e '^v[0-9]+\.[0-9]+\.[0-9]+(-[ab]\.[0-9]+)?(\+[[:xdigit:]]+)?$' -q +if ! echo "$version" | grep -E -e '^v[0-9]+\.[0-9]+\.[0-9]+(-(a|b|dev|rc)\.[0-9]+)?(\+[[:xdigit:]]+)?$' -q then echo "generated an invalid version '$version'" 1>&2 diff --git a/scripts/translations/download.go b/scripts/translations/download.go index 123cf3502d8..d83f0bac3fa 100644 --- a/scripts/translations/download.go +++ b/scripts/translations/download.go @@ -8,6 +8,7 @@ import ( "net/url" "os" "path/filepath" + "slices" "strings" "sync" "time" @@ -15,7 +16,6 @@ import ( "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/ioutil" "github.com/AdguardTeam/golibs/log" - "golang.org/x/exp/slices" ) // download and save all translations. diff --git a/scripts/translations/main.go b/scripts/translations/main.go index cff6d03c11f..e03dcb1041f 100644 --- a/scripts/translations/main.go +++ b/scripts/translations/main.go @@ -11,6 +11,7 @@ import ( "os" "os/exec" "path/filepath" + "slices" "strings" "time" @@ -18,7 +19,6 @@ import ( "github.com/AdguardTeam/golibs/errors" "github.com/AdguardTeam/golibs/log" "golang.org/x/exp/maps" - "golang.org/x/exp/slices" ) const (