From a0349b6c7ea64bc3fe117f4e432e22f98ca1577f Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Thu, 30 Mar 2023 14:37:05 +0300 Subject: [PATCH 1/5] Pull request 1792: 5633-invalid-date Updates #5633. Squashed commit of the following: commit 889bc7acb82472d72d7b3103554e70342513a567 Author: Ainar Garipov Date: Thu Mar 30 14:31:42 2023 +0300 client: fix dashboard date --- client/src/components/Dashboard/index.js | 2 +- client/src/components/ui/Line.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/components/Dashboard/index.js b/client/src/components/Dashboard/index.js index 73d9c595042..5435497919a 100644 --- a/client/src/components/Dashboard/index.js +++ b/client/src/components/Dashboard/index.js @@ -185,7 +185,7 @@ const Dashboard = ({ )} { - const interval = useSelector((state) => state.stats.interval); + const interval = msToDays(useSelector((state) => state.stats.interval)); return Date: Thu, 30 Mar 2023 16:13:19 +0300 Subject: [PATCH 2/5] Pull request 1793: upd-all Merge in DNS/adguard-home from upd-all to master Squashed commit of the following: commit 19535409f54360618e1239bddd7ce495d19e0ca4 Author: Ainar Garipov Date: Thu Mar 30 16:06:49 2023 +0300 all: upd deps, i18n, filters, services, tools --- CHANGELOG.md | 3 + client/src/__locales/cs.json | 28 +++++- client/src/__locales/da.json | 28 +++++- client/src/__locales/de.json | 28 +++++- client/src/__locales/es.json | 28 +++++- client/src/__locales/fi.json | 44 +++++++-- client/src/__locales/fr.json | 28 +++++- client/src/__locales/it.json | 28 +++++- client/src/__locales/ja.json | 28 +++++- client/src/__locales/ko.json | 28 +++++- client/src/__locales/nl.json | 28 +++++- client/src/__locales/pt-br.json | 28 +++++- client/src/__locales/pt-pt.json | 28 +++++- client/src/__locales/ru.json | 28 +++++- client/src/__locales/sk.json | 28 +++++- client/src/__locales/sl.json | 28 +++++- client/src/__locales/sv.json | 12 ++- client/src/__locales/tr.json | 28 +++++- client/src/__locales/zh-cn.json | 28 +++++- client/src/__locales/zh-tw.json | 28 +++++- client/src/helpers/filters/filters.js | 4 +- client/src/helpers/trackers/trackers.json | 99 +++++++++++++++++++- go.mod | 22 ++--- go.sum | 51 +++++------ internal/filtering/servicelist.go | 105 +++++++++++++++++++++- internal/tools/go.mod | 18 ++-- internal/tools/go.sum | 45 ++++------ 27 files changed, 773 insertions(+), 106 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1248e7fba6a..54ea69a17e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ NOTE: Add new changes BELOW THIS COMMENT. is described in `openapi/openapi.yaml`. The duration of this pause could also be set with the config field `protection_disabled_until` in `dns` section of the YAML configuration file. +- Ability to create a static DHCP lease from a dynamic one more easily + ([#3459]). - Two new HTTP APIs, `PUT /control/stats/config/update` and `GET control/stats/config`, which can be used to set and receive the query log configuration. See openapi/openapi.yaml for the full description. @@ -134,6 +136,7 @@ In this release, the schema version has changed from 17 to 20. [#1333]: https://github.com/AdguardTeam/AdGuardHome/issues/1333 [#1472]: https://github.com/AdguardTeam/AdGuardHome/issues/1472 [#3290]: https://github.com/AdguardTeam/AdGuardHome/issues/3290 +[#3459]: https://github.com/AdguardTeam/AdGuardHome/issues/3459 [#5567]: https://github.com/AdguardTeam/AdGuardHome/issues/5567 [#5584]: https://github.com/AdguardTeam/AdGuardHome/issues/5584 [#5631]: https://github.com/AdguardTeam/AdGuardHome/issues/5631 diff --git a/client/src/__locales/cs.json b/client/src/__locales/cs.json index 0931b6a174b..444415e2168 100644 --- a/client/src/__locales/cs.json +++ b/client/src/__locales/cs.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Zapnutá Rodičovská kontrola", "disabled_safe_search_toast": "Vypnuté bezpečné vyhledávání", "enabled_save_search_toast": "Zapnuté bezpečné vyhledávání", + "updated_save_search_toast": "Nastavení Bezpečného vyhledávání aktualizováno", "enabled_table_header": "Zapnuto", "name_table_header": "Název", "list_url_table_header": "Seznam URL", @@ -290,6 +291,8 @@ "rate_limit": "Rychlostní limit", "edns_enable": "Povolit klientskou podsíť EDNS", "edns_cs_desc": "Přidá možnost podsítě klienta EDNS (ECS) do odchozích požadavků a zaznamá hodnoty odeslané klienty do protokolu dotazů.", + "edns_use_custom_ip": "Použít vlastní IP pro EDNS", + "edns_use_custom_ip_desc": "Povolit použití vlastní IP pro EDNS", "rate_limit_desc": "Počet požadavků za sekundu, které smí jeden klient provádět (0: neomezeno)", "blocking_ipv4_desc": "IP adresa, která se má vrátit v případě blokovaného požadavku typu A", "blocking_ipv6_desc": "IP adresa, která se má vrátit v případě blokovaného požadavku typu AAAA", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Opravdu chcete změnit uchovávání statistik? Pokud snížíte hodnotu intervalu, některá data budou ztracena", "statistics_cleared": "Statistiky úspěšně vyčištěny", "statistics_enable": "Povolit statistiky", + "ignore_domains": "Ignorované domény (oddělené novým řádkem)", + "ignore_domains_title": "Ignorované domény", + "ignore_domains_desc_stats": "Dotazy pro tyto domény se do statistik nezapisují", + "ignore_domains_desc_query": "Dotazy pro tyto domény se do záznamu dotazů nezapisují", "interval_hours": "Hodiny: {{count}}", "interval_hours_plural": "Hodiny: {{count}}", "filters_configuration": "Konfigurace filtrů", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Poznámka: Anonymizace IP je zapnuta. Můžete ji vypnout v <1>Obecných nastaveních.", "confirm_dns_cache_clear": "Opravdu chcete vymazat mezipaměť DNS?", "cache_cleared": "Mezipaměť DNS úspěšně vymazána", - "clear_cache": "Vymazat mezipaměť" + "clear_cache": "Vymazat mezipaměť", + "make_static": "Nastavit jako statickou", + "theme_auto_desc": "Automatický (podle barevného motivu vašeho zařízení)", + "theme_dark_desc": "Tmavý motiv", + "theme_light_desc": "Světlý motiv", + "disable_for_seconds": "Na {{count}} sek.", + "disable_for_seconds_plural": "Na {{count}} sek.", + "disable_for_minutes": "Na {{count}} min.", + "disable_for_minutes_plural": "Na {{count}} min.", + "disable_for_hours": "Na {{count}} hod.", + "disable_for_hours_plural": "Na {{count}} hod.", + "disable_until_tomorrow": "Do zítřka", + "disable_notify_for_seconds": "Vypnout ochranu na {{count}} sek.", + "disable_notify_for_seconds_plural": "Vypnout ochranu na {{count}} sek.", + "disable_notify_for_minutes": "Vypnout ochranu na {{count}} min.", + "disable_notify_for_minutes_plural": "Vypnout ochranu na {{count}} min.", + "disable_notify_for_hours": "Vypnout ochranu na {{count}} hod.", + "disable_notify_for_hours_plural": "Vypnout ochranu na {{count}} hod.", + "disable_notify_until_tomorrow": "Vypnout ochranu do zítřka", + "enable_protection_timer": "Ochrana bude zapnuta za {{time}}" } diff --git a/client/src/__locales/da.json b/client/src/__locales/da.json index 67288436eda..465143b5a37 100644 --- a/client/src/__locales/da.json +++ b/client/src/__locales/da.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Forældrekontrol aktiveret", "disabled_safe_search_toast": "Sikker søgning deaktiveret", "enabled_save_search_toast": "Sikker søgning aktiveret", + "updated_save_search_toast": "Sikker søgning opdateret", "enabled_table_header": "Aktiveret", "name_table_header": "Navn", "list_url_table_header": "Liste-URL", @@ -290,6 +291,8 @@ "rate_limit": "Hyppighedsgrænse", "edns_enable": "Aktivér EDNS-klientundernet", "edns_cs_desc": "Tilføj indstillingen EDNS Client Subnet (ECS) til upstream-forespørgsler og log de af klienterne sendte værdier i forespørgselsloggen.", + "edns_use_custom_ip": "Brug tilpasset IP til EDNS", + "edns_use_custom_ip_desc": "Tillad brug af tilpasset IP til EDNS", "rate_limit_desc": "Antallet af forespørgsler pr. sekund tilladt pr. klient (værdien 0 = ubegrænset)", "blocking_ipv4_desc": "Returneret IP-adresse for en blokeret A-forespørgsel", "blocking_ipv6_desc": "Returneret IP-adresse for en blokeret AAAA-forespørgsel", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Sikker på, at du vil ændre på statistikbevaring? Mindskes intervalværdien, vil nogle data gå tabt", "statistics_cleared": "Statistikkerne er ryddet", "statistics_enable": "Aktivér statistikker", + "ignore_domains": "Ignorerede domæner (adskilt af ny linje)", + "ignore_domains_title": "Ignorerede domæner", + "ignore_domains_desc_stats": "Forespørgsler til disse domæner opføres ikke i statistikken", + "ignore_domains_desc_query": "Forespørgsler til disse domæner opføres ikke i forespørgselsloggen", "interval_hours": "{{count}} time", "interval_hours_plural": "{{count}} timer", "filters_configuration": "Filteropsætninger", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Bemærk: IP-anonymisering er aktiveret. Det kan deaktiveres via <1>Generelle indstillinger.", "confirm_dns_cache_clear": "Sikker på, at DNS-cache skal ryddes?", "cache_cleared": "DNS-cache hermed ryddet", - "clear_cache": "Ryd cache" + "clear_cache": "Ryd cache", + "make_static": "Gør statisk", + "theme_auto_desc": "Auto (baseret på enhedens farveskema)", + "theme_dark_desc": "Mørkt tema", + "theme_light_desc": "Lyst tema", + "disable_for_seconds": "I {{count}} sekund", + "disable_for_seconds_plural": "I {{count}} sekunder", + "disable_for_minutes": "I {{count}} minut", + "disable_for_minutes_plural": "I {{count}} minutter", + "disable_for_hours": "I {{count}} time", + "disable_for_hours_plural": "I {{count}} timer", + "disable_until_tomorrow": "Indtil i morgen", + "disable_notify_for_seconds": "Deaktivere beskyttelse i {{count}} sekund", + "disable_notify_for_seconds_plural": "Deaktivere beskyttelse i {{count}} sekunder", + "disable_notify_for_minutes": "Deaktivere beskyttelse i {{count}} minut", + "disable_notify_for_minutes_plural": "Deaktivere beskyttelse i {{count}} minutter", + "disable_notify_for_hours": "Deaktivere beskyttelse i {{count}} time", + "disable_notify_for_hours_plural": "Deaktivere beskyttelse i {{count}} timer", + "disable_notify_until_tomorrow": "Deaktiver beskyttelse indtil i morgen", + "enable_protection_timer": "Beskyttelse deaktiveres om {{time}}" } diff --git a/client/src/__locales/de.json b/client/src/__locales/de.json index 3bbb7aff75a..b7d59a9c583 100644 --- a/client/src/__locales/de.json +++ b/client/src/__locales/de.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Kindersicherung aktiviert", "disabled_safe_search_toast": "Sichere Suche deaktiviert", "enabled_save_search_toast": "Sichere Suche aktiviert", + "updated_save_search_toast": "Einstellungen für die sichere Suche aktualisiert", "enabled_table_header": "Aktiviert", "name_table_header": "Name", "list_url_table_header": "Adressliste", @@ -290,6 +291,8 @@ "rate_limit": "Begrenzungswert", "edns_enable": "EDNS Client Subnetz aktivieren", "edns_cs_desc": "Die Option EDNS Client Subnetz (ECS) zu Upstream-Anfragen hinzufügen und die von Clients gesendeten Werte protokollieren.", + "edns_use_custom_ip": "Benutzerdefinierte IP für EDNS verwenden", + "edns_use_custom_ip_desc": "Benutzerdefinierte IP für EDNS zulassen", "rate_limit_desc": "Die Anzahl der Anfragen pro Sekunde, die ein einzelner Client stellen darf. Das Setzen auf 0 bedeutet keine Begrenzung.", "blocking_ipv4_desc": "IP-Adresse, die für eine gesperrte A-Anfrage zurückgegeben werden soll", "blocking_ipv6_desc": "IP-Adresse, die für eine gesperrte AAAA-Anfrage zurückgegeben werden soll", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Möchten Sie wirklich die Aufbewahrung der Statistiken ändern? Wenn Sie den Zeitabstand verringern, gehen einige Daten verloren.", "statistics_cleared": "Statistiken wurden erfolgreich gelöscht", "statistics_enable": "Statistiken aktivieren", + "ignore_domains": "Ignorierte Domains (durch Zeilenumbruch getrennt)", + "ignore_domains_title": "Ignorierte Domains", + "ignore_domains_desc_stats": "Abfragen für diese Domains werden nicht in die Statistik aufgenommen", + "ignore_domains_desc_query": "Abfragen für diese Domains werden nicht in das Abfrageprotokoll aufgenommen", "interval_hours": "{{count}} Stunde", "interval_hours_plural": "{{count}} Stunden", "filters_configuration": "Filterkonfiguration", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Hinweis: Die IP-Anonymisierung ist aktiviert. Sie können sie in den <1>Allgemeinen Einstellungen deaktivieren.", "confirm_dns_cache_clear": "Möchten Sie den DNS-Cache wirklich leeren?", "cache_cleared": "DNS-Cache erfolgreich geleert", - "clear_cache": "Cache leeren" + "clear_cache": "Cache leeren", + "make_static": "Statisch machen", + "theme_auto_desc": "Automatisch (basierend auf dem Farbschema Ihres Geräts)", + "theme_dark_desc": "Dunkles Farbschema", + "theme_light_desc": "Helles Farbschema", + "disable_for_seconds": "Für {{count}} Sekunde", + "disable_for_seconds_plural": "Für {{count}} Sekunden", + "disable_for_minutes": "Für {{count}} Minute", + "disable_for_minutes_plural": "Für {{count}} Minuten", + "disable_for_hours": "Für {{count}} Stunde", + "disable_for_hours_plural": "Für {{count}} Stunden", + "disable_until_tomorrow": "Bis morgen", + "disable_notify_for_seconds": "Schutz für {{count}} Sekunde deaktivieren", + "disable_notify_for_seconds_plural": "Schutz für {{count}} Sekunden deaktivieren", + "disable_notify_for_minutes": "Schutz für {{count}} Minute deaktivieren", + "disable_notify_for_minutes_plural": "Schutz für {{count}} Minuten deaktivieren", + "disable_notify_for_hours": "Schutz für {{count}} Stunde deaktivieren", + "disable_notify_for_hours_plural": "Schutz für {{count}} Stunden deaktivieren", + "disable_notify_until_tomorrow": "Schutz bis morgen deaktivieren", + "enable_protection_timer": "Der Schutz wird in {{time}} wieder aktiviert" } diff --git a/client/src/__locales/es.json b/client/src/__locales/es.json index f0238614ae6..2e112cd31ea 100644 --- a/client/src/__locales/es.json +++ b/client/src/__locales/es.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Control parental habilitado", "disabled_safe_search_toast": "Búsqueda segura deshabilitada", "enabled_save_search_toast": "Búsqueda segura habilitada", + "updated_save_search_toast": "Configuración de búsqueda segura actualizada", "enabled_table_header": "Habilitado", "name_table_header": "Nombre", "list_url_table_header": "URL de la lista", @@ -290,6 +291,8 @@ "rate_limit": "Límite de cantidad", "edns_enable": "Habilitar subred de cliente EDNS", "edns_cs_desc": "Añade la opción subred de cliente EDNS (ECS) a las peticiones del DNS de subida y registra los valores enviados por los clientes en el registro de consultas.", + "edns_use_custom_ip": "Usar IP personalizada para EDNS", + "edns_use_custom_ip_desc": "Permitir el uso de IP personalizadas para EDNS", "rate_limit_desc": "Número de peticiones por segundo permitidas por cliente. Establecerlo en 0 significa que no hay límite.", "blocking_ipv4_desc": "Dirección IP devolverá una petición A bloqueada", "blocking_ipv6_desc": "Dirección IP devolverá una petición AAAA bloqueada", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "¿Estás seguro de que deseas cambiar la retención de estadísticas? Si disminuye el valor del intervalo, se perderán algunos datos", "statistics_cleared": "Estadísticas borradas correctamente", "statistics_enable": "Habilitar estadísticas", + "ignore_domains": "Dominios ignorados (separados por una nueva línea)", + "ignore_domains_title": "Dominios ignorados", + "ignore_domains_desc_stats": "Las consultas para estos dominios no aparecen en las estadísticas", + "ignore_domains_desc_query": "Las consultas para estos dominios no aparecen en el registro de consultas", "interval_hours": "{{count}} hora", "interval_hours_plural": "{{count}} horas", "filters_configuration": "Configuración de filtros", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Nota: La anonimización de IP está habilitada. Puedes deshabilitarla en <1>Configuración general.", "confirm_dns_cache_clear": "¿Estás seguro de que deseas borrar la caché DNS?", "cache_cleared": "Caché DNS borrado correctamente", - "clear_cache": "Borrar caché" + "clear_cache": "Borrar caché", + "make_static": "Hacer estático", + "theme_auto_desc": "Automático (basado en el esquema de colores de tu dispositivo)", + "theme_dark_desc": "Tema oscuro", + "theme_light_desc": "Tema claro", + "disable_for_seconds": "Por {{count}} segundo", + "disable_for_seconds_plural": "Por {{count}} segundos", + "disable_for_minutes": "Por {{count}} minuto", + "disable_for_minutes_plural": "Por {{count}} minutos", + "disable_for_hours": "Por {{count}} hora", + "disable_for_hours_plural": "Por {{count}} horas", + "disable_until_tomorrow": "Hasta mañana", + "disable_notify_for_seconds": "Desactivar la protección por {{count}} segundo", + "disable_notify_for_seconds_plural": "Desactivar la protección por {{count}} segundos", + "disable_notify_for_minutes": "Desactivar la protección por {{count}} minuto", + "disable_notify_for_minutes_plural": "Desactivar la protección por {{count}} minutos", + "disable_notify_for_hours": "Desactivar la protección por {{count}} hora", + "disable_notify_for_hours_plural": "Desactivar la protección por {{count}} horas", + "disable_notify_until_tomorrow": "Desactivar la protección hasta mañana", + "enable_protection_timer": "La protección se activará en {{time}}" } diff --git a/client/src/__locales/fi.json b/client/src/__locales/fi.json index b04ad0217f2..e74f05d558d 100644 --- a/client/src/__locales/fi.json +++ b/client/src/__locales/fi.json @@ -9,12 +9,12 @@ "bootstrap_dns": "Bootstrap DNS-palvelimet", "bootstrap_dns_desc": "Bootstrap DNS-palvelimia käytetään ylävirroiksi määritettyjen DoH/DoT-resolvereiden IP-osoitteiden selvitykseen.", "local_ptr_title": "Yksityiset käänteiset DNS-palvelimet", - "local_ptr_desc": "DNS-palvelimet, joita AdGuard Home käyttää paikallisille PTR-kyselyille. Näitä palvelimia käytetään yksityistä IP-osoitetta käyttävien PTR-kyselyiden osoitteiden, kuten \"192.168.12.34\", selvitykseen käänteisen DNS:n avulla. Jos ei käytössä, AdGuard Home käyttää käyttöjärjestelmän oletusarvoisia DNS-resolvereita, poislukien AdGuard Homen omat osoitteet.", + "local_ptr_desc": "DNS-palvelimet, joita AdGuard Home käyttää paikallisille PTR-pyynnöille. Näitä palvelimia käytetään yksityistä IP-osoitetta käyttävien PTR-pyyntöjen osoitteiden, kuten \"192.168.12.34\", selvitykseen käänteisen DNS:n avulla. Jos ei käytössä, AdGuard Home käyttää käyttöjärjestelmän oletusarvoisia DNS-resolvereita, poislukien AdGuard Homen omat osoitteet.", "local_ptr_default_resolver": "Oletusarvoisesti AdGuard Home käyttää seuraavia käänteisiä DNS-resolvereita: {{ip}}.", "local_ptr_no_default_resolver": "AdGuard Home ei voinut määrittää tälle järjestelmälle sopivaa yksityistä käänteistä DNS-resolveria.", "local_ptr_placeholder": "Syötä yksi palvelimen osoite per rivi", "resolve_clients_title": "Käytä päätelaitteiden IP-osoitteille käänteistä selvitystä", - "resolve_clients_desc": "Selvitä päätelaitteiden IP-osoitteiden isäntänimet käänteisesti lähettämällä PTR-kyselyt sopiville resolvereille (yksityiset DNS-palvelimet paikallisille päätelaitteille, lähtevät palvelimet päätelaitteille, joilla on julkiset IP-osoitteet).", + "resolve_clients_desc": "Selvitä päätelaitteiden IP-osoitteiden isäntänimet käänteisesti lähettämällä PTR-pyynnöt sopiville resolvereille (yksityiset DNS-palvelimet paikallisille päätelaitteille, lähtevät palvelimet päätelaitteille, joilla on julkiset IP-osoitteet).", "use_private_ptr_resolvers_title": "Käytä yksityisiä käänteisiä DNS-resolvereita", "use_private_ptr_resolvers_desc": "Suorita käänteiset DNS-selvitykset paikallisesti tarjotuille osoitteille käyttäen näitä ylävirran palvelimia. Jos ei käytössä, vastaa AdGuard Home kaikkiin sen tyyppisiin PTR-pyyntöihin NXDOMAIN-arvolla, pois lukien DHCP, /etc/hosts, yms. -tiedoista tunnistettut päätelaitteet.", "check_dhcp_servers": "Etsi DHCP-palvelimia", @@ -75,7 +75,7 @@ "dhcp_add_static_lease": "Lisää kiinteä laina", "dhcp_reset_leases": "Tyhjennä kaikki lainat", "dhcp_reset_leases_confirm": "Haluatko varmasti tyhjentää kaikki lainat?", - "dhcp_reset_leases_success": "DHCP-lainat tyhjennettiin", + "dhcp_reset_leases_success": "DHCP-lainojen tyhjennys onnistui", "dhcp_reset": "Haluatko varmasti palauttaa DHCP-asetukset?", "country": "Maa", "city": "Kaupunki", @@ -167,10 +167,11 @@ "enabled_parental_toast": "Lapsilukko otettiin käyttöön", "disabled_safe_search_toast": "Turvallinen haku poistettiin käytöstä", "enabled_save_search_toast": "Turvallinen haku otettiin käyttöön", + "updated_save_search_toast": "Turvallisen haun asetukset päivitettiin", "enabled_table_header": "Käytössä", "name_table_header": "Nimi", "list_url_table_header": "Listan URL", - "rules_count_table_header": "Sääntöjä", + "rules_count_table_header": "Sääntöjen määrä", "last_time_updated_table_header": "Viimeisin päivitys", "actions_table_header": "Toiminnot", "request_table_header": "Pyyntö", @@ -253,8 +254,8 @@ "query_log_response_status": "Tila: {{value}}", "query_log_filtered": "Suodattanut {{filter}}", "query_log_confirm_clear": "Haluatko varmasti tyhjentää pyyntöhistorian?", - "query_log_cleared": "Pyyntöhistoria tyhjennettiin", - "query_log_updated": "Pyyntöhistoria päivitettiin", + "query_log_cleared": "Pyyntöhistorian tyhjennys onnistui", + "query_log_updated": "Pyyntöhistorian päivitys onnistui", "query_log_clear": "Tyhjennä pyyntöhistoria", "query_log_retention": "Pyyntöhistorian säilytys", "query_log_enable": "Käytä historiaa", @@ -290,6 +291,8 @@ "rate_limit": "Pyyntöjen ajoitus", "edns_enable": "Käytä EDNS-päätelaitealivekkoa", "edns_cs_desc": "Lähetä päätelaitteiden aliverkot DNS-palvelimille.", + "edns_use_custom_ip": "Käytä omaa IP-osoitetta EDNS:lle", + "edns_use_custom_ip_desc": "Salli oman IP-osoitteen käyttö EDNS-mekanismille.", "rate_limit_desc": "Päätelaitteelle sallittu pyyntöjen enimmäismäärä sekunnissa. Arvo 0 tarkoittaa rajatonta.", "blocking_ipv4_desc": "Estettyyn A-pyyntöön palautettava IP-osoite", "blocking_ipv6_desc": "Estettyyn AAAA-pyyntöön palautettava IP-osoite", @@ -367,7 +370,7 @@ "encryption_config_saved": "Salausasetukset tallennettiin", "encryption_server": "Palvelimen nimi", "encryption_server_enter": "Syötä verkkotunnuksesi", - "encryption_server_desc": "Jos määritetty, AdGuard Home tunnistaa ClientID-tunnisteet, vastaa DDR-kyselyihin ja suorittaa yhteyden lisätarkistuksia. Jos ei määritetty, nämä ominaisuudet eivät ole käytössä. On vastattava yhtä varmenteen DNS-nimistä.", + "encryption_server_desc": "Jos määritetty, AdGuard Home tunnistaa ClientID-tunnisteet, vastaa DDR-pyyntöihin ja suorittaa yhteyden lisätarkistuksia. Jos ei määritetty, nämä ominaisuudet eivät ole käytössä. On vastattava yhtä varmenteen DNS-nimistä.", "encryption_redirect": "Automaattinen HTTPS-ohjaus", "encryption_redirect_desc": "Jos käytössä, AdGuard Home ohjaa HTTP-osoitteet automaattisesti HTTPS-osoitteisiin.", "encryption_https": "HTTPS-portti", @@ -416,7 +419,7 @@ "clients_title": "Pysyvät päätelaitteet", "clients_desc": "Määritä pysyvät AdGuard Homeen yhdistetyt päätelaitetiedot.", "settings_global": "Yleinen", - "settings_custom": "Muut aiheet", + "settings_custom": "Mukautettu", "table_client": "Asiakas", "table_name": "Nimi", "save_btn": "Tallenna", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Haluatko varmasti muuttaa tilastojen säilytysaikaa? Jos aikaa lyhennetään, joitakin tietoja menetetään.", "statistics_cleared": "Tilastot tyhjennettiin", "statistics_enable": "Ota tilastointi käyttöön", + "ignore_domains": "Ohitettavat verkkotunnukset (erotettu rivinvaihdolla)", + "ignore_domains_title": "Ohitettavat verkkotunnukset", + "ignore_domains_desc_stats": "Näihin verkkotunnuksiin lähetettyjä pyyntöjä ei tallenneta tilastoihin.", + "ignore_domains_desc_query": "Näihin verkkotunnuksiin lähetettyjä pyyntöjä ei tallenneta pyyntöhistoriaan.", "interval_hours": "{{count}} tunti", "interval_hours_plural": "{{count}} tuntia", "filters_configuration": "Suodatinten määritys", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Huomioi: IP-osoitteen anonymisointi on käytössä. Voit poistaa sen käytöstä <1>Yleisistä asetuksista.", "confirm_dns_cache_clear": "Haluatko varmasti tyhjentää DNS-välimuistin?", "cache_cleared": "DNS-välimuistin tyhjennys onnistui", - "clear_cache": "Tyhjennä välimuisti" + "clear_cache": "Tyhjennä välimuisti", + "make_static": "Tallenna kiinteäksi", + "theme_auto_desc": "Automaattinen (seuraa laitteen väriteemaa)", + "theme_dark_desc": "Tumma teema", + "theme_light_desc": "Vaalea teema", + "disable_for_seconds": "{{count}} sekunniksi", + "disable_for_seconds_plural": "{{count}} sekunniksi", + "disable_for_minutes": "{{count}} minuutiksi", + "disable_for_minutes_plural": "{{count}} minuutiksi", + "disable_for_hours": "{{count}} tunniksi", + "disable_for_hours_plural": "{{count}} tunniksi", + "disable_until_tomorrow": "Huomiseen asti", + "disable_notify_for_seconds": "Poista suojaus käytöstä {{count}} sekunniksi", + "disable_notify_for_seconds_plural": "Poista suojaus käytöstä {{count}} sekunniksi", + "disable_notify_for_minutes": "Poista suojaus käytöstä {{count}} minuutiksi", + "disable_notify_for_minutes_plural": "Poista suojaus käytöstä {{count}} minuutiksi", + "disable_notify_for_hours": "Poista suojaus käytöstä {{count}} tunniksi", + "disable_notify_for_hours_plural": "Poista suojaus käytöstä {{count}} tunniksi", + "disable_notify_until_tomorrow": "Poista suojaus käytöstä huomiseen asti", + "enable_protection_timer": "Suojaus otetaan käyttöön {{time}} kuluttua" } diff --git a/client/src/__locales/fr.json b/client/src/__locales/fr.json index a99e2baa98b..b514ca872b7 100644 --- a/client/src/__locales/fr.json +++ b/client/src/__locales/fr.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Contrôle Parental activé", "disabled_safe_search_toast": "Recherche Sécurisée désactivée", "enabled_save_search_toast": "Recherche Sécurisée activée", + "updated_save_search_toast": "Les paramètres de Recherche sécurisée sont mis à jour", "enabled_table_header": "Activé", "name_table_header": "Nom", "list_url_table_header": "URL de la liste", @@ -290,6 +291,8 @@ "rate_limit": "Limite de taux", "edns_enable": "Activer le sous-réseau du client EDNS", "edns_cs_desc": "Ajouter l'option du sous-réseau Client EDNS (ECS) au requêtes en amont et enregistrer les valeurs envoyées par les clients dans le journal des requêtes.", + "edns_use_custom_ip": "Utiliser une IP personnalisée pour EDNS", + "edns_use_custom_ip_desc": "Autoriser l'utilisation d'une adresse IP personnalisée pour EDNS", "rate_limit_desc": "Le nombre de requêtes par seconde qu’un seul client est autorisé à faire. Le réglage 0 fait illimité.", "blocking_ipv4_desc": "Adresse IP à renvoyer pour une demande A bloquée", "blocking_ipv6_desc": "Adresse IP à renvoyer pour une demande AAAA bloquée", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Êtes-vous sûr de vouloir modifier le maintien des statistiques ? Si vous diminuez la valeur de l'intervalle, certaines données seront perdues", "statistics_cleared": "Statistiques effacées", "statistics_enable": "Activer les statistiques", + "ignore_domains": "Domaines ignorés (séparés par une nouvelle ligne)", + "ignore_domains_title": "Domaines ignorés", + "ignore_domains_desc_stats": "Les requêtes pour ces domaines ne sont pas écrites dans les statistiques", + "ignore_domains_desc_query": "Les requêtes pour ces domaines ne sont pas écrites dans le journal des requêtes", "interval_hours": "{{count}} heure", "interval_hours_plural": "{{count}} heures", "filters_configuration": "Configuration des filtres", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Note : L'anonymisation IP est activée. Vous pouvez la désactiver dans les <1>paramètres généraux.", "confirm_dns_cache_clear": "Voulez-vous vraiment vider le cache DNS ?", "cache_cleared": "Le cache DNS a été vidé", - "clear_cache": "Vider le cache" + "clear_cache": "Vider le cache", + "make_static": "Rendre statique", + "theme_auto_desc": "Auto (en fonction de la palette de couleurs de votre appareil)", + "theme_dark_desc": "Thème sombre", + "theme_light_desc": "Thème clair", + "disable_for_seconds": "Pendant {{count}} seconde", + "disable_for_seconds_plural": "Pendant {{count}} secondes", + "disable_for_minutes": "Pendant {{count}} minute", + "disable_for_minutes_plural": "Pendant {{count}} minutes", + "disable_for_hours": "Pendant {{count}} heure", + "disable_for_hours_plural": "Pendant {{count}} heures", + "disable_until_tomorrow": "Jusqu'à demain", + "disable_notify_for_seconds": "Désactiver la protection pendant {{count}} seconde", + "disable_notify_for_seconds_plural": "Désactiver la protection pendant {{count}} secondes", + "disable_notify_for_minutes": "Désactiver la protection pendant {{count}} minute", + "disable_notify_for_minutes_plural": "Désactiver la protection pendant {{count}} minutes", + "disable_notify_for_hours": "Désactiver la protection pendant {{count}} heure", + "disable_notify_for_hours_plural": "Désactiver la protection pendant {{count}} heures", + "disable_notify_until_tomorrow": "Désactiver la protection jusqu'à demain", + "enable_protection_timer": "La protection sera activée dans {{time}}" } diff --git a/client/src/__locales/it.json b/client/src/__locales/it.json index e09fd79cf92..b2b2c1433ae 100644 --- a/client/src/__locales/it.json +++ b/client/src/__locales/it.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Il Controllo Parentale è attivo", "disabled_safe_search_toast": "La Ricerca Sicura è disattivata", "enabled_save_search_toast": "La Ricerca Sicura è attiva", + "updated_save_search_toast": "Impostazioni di Safe Search aggiornate", "enabled_table_header": "Attivo", "name_table_header": "Nome", "list_url_table_header": "Elenco URL", @@ -290,6 +291,8 @@ "rate_limit": "Limite delle richieste", "edns_enable": "Attiva client di sottorete EDNS", "edns_cs_desc": "Aggiunge l'opzione EDNS Client Subnet (ECS) alle richieste upstream e registra i valori inviati dai client nel registro delle richieste.", + "edns_use_custom_ip": "Usa IP personalizzato per EDNS", + "edns_use_custom_ip_desc": "Consentire l'uso di un IP personalizzato per EDNS", "rate_limit_desc": "Il numero di richieste al secondo consentite da un singolo client. Impostare questo valore a 0 rimuove le limitazioni.", "blocking_ipv4_desc": "Indirizzo IP per una richiesta DNS IPv4 bloccata", "blocking_ipv6_desc": "Indirizzo IP restituito per una richiesta DNS IPv6 bloccata", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Sei sicuro di voler modificare la conservazione delle statistiche? Se il valore di intervallo dovesse diminuire, alcuni dati andranno persi", "statistics_cleared": "Statistiche azzerate correttamente", "statistics_enable": "Attiva statistiche", + "ignore_domains": "Domini ignorati (separati da nuova riga)", + "ignore_domains_title": "Domini ignorati", + "ignore_domains_desc_stats": "Le richieste per questi domini non vengono scritte nelle statistiche", + "ignore_domains_desc_query": "Le richieste per questi domini non vengono scritte nel registro delle richieste", "interval_hours": "{{count}} ora", "interval_hours_plural": "{{count}} ore", "filters_configuration": "Configurazione filtri", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Attenzione: L'anonimizzazione dell'IP è abilitata. Puoi disabilitarla in <1>Impostazioni generali.", "confirm_dns_cache_clear": "Sei sicuro di voler cancellare la cache DNS?", "cache_cleared": "Cache DNS è stata cancellata correttamente", - "clear_cache": "Cancella cache" + "clear_cache": "Cancella cache", + "make_static": "Rendere statico", + "theme_auto_desc": "Auto (in base alla combinazione di colori del tuo dispositivo)", + "theme_dark_desc": "Tema scuro", + "theme_light_desc": "Tema chiaro", + "disable_for_seconds": "Per {{count}} secondo", + "disable_for_seconds_plural": "Per {{count}} secondi", + "disable_for_minutes": "Per {{count}} minuto", + "disable_for_minutes_plural": "Per {{count}} minuti", + "disable_for_hours": "Per {{count}} ora", + "disable_for_hours_plural": "Per {{count}} ore", + "disable_until_tomorrow": "Fino a domani", + "disable_notify_for_seconds": "Disattiva la protezione per {{count}} secondo", + "disable_notify_for_seconds_plural": "Disattiva la protezione per {{count}} secondi", + "disable_notify_for_minutes": "Disattiva protezione per {{count}} minuto", + "disable_notify_for_minutes_plural": "Disattiva la protezione per {{count}} minuti", + "disable_notify_for_hours": "Disattiva la protezione per {{count}} ora", + "disable_notify_for_hours_plural": "Disattiva la protezione per {{count}} ore", + "disable_notify_until_tomorrow": "Disattiva la protezione fino a domani", + "enable_protection_timer": "La protezione verrà attivata in {{time}}" } diff --git a/client/src/__locales/ja.json b/client/src/__locales/ja.json index 1ae0a1f849a..08a6f4e397b 100644 --- a/client/src/__locales/ja.json +++ b/client/src/__locales/ja.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "ペアレンタルコントロールが有効になりました", "disabled_safe_search_toast": "セーフサーチが無効になりました", "enabled_save_search_toast": "セーフサーチが有効になりました", + "updated_save_search_toast": "セーフ サーチの設定が更新されました。", "enabled_table_header": "有効", "name_table_header": "名称", "list_url_table_header": "URLリスト", @@ -290,6 +291,8 @@ "rate_limit": "頻度制限", "edns_enable": "EDNSクライアントサブネットを有効にする", "edns_cs_desc": "アップストリームリクエストにEDNSクライアントサブネットオプション(ECS)を追加し、クライアントから送信された値をクエリログに記録します。", + "edns_use_custom_ip": "EDNSにカスタムIPを使用する", + "edns_use_custom_ip_desc": "EDNS に対してカスタム IP の使用を許可します。", "rate_limit_desc": "一つのクライアントに対して許可される1秒あたりのリクエスト数(「0」に設定すると、制限なしになります)", "blocking_ipv4_desc": "ブロックされたAリクエストに対して応答されるIPアドレス", "blocking_ipv6_desc": "ブロックされたAAAAリクエストに対して応答されるIPアドレス", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "統計の保持を変更してもよろしいですか? 期間を短くすると、一部のデータが失われます", "statistics_cleared": "統計の消去に成功しました", "statistics_enable": "統計を有効にする", + "ignore_domains": "無視するドメイン(それぞれ改行で区切ってください)", + "ignore_domains_title": "無視するドメイン", + "ignore_domains_desc_stats": "これらのドメインへのクエリは統計に書き込まれません。", + "ignore_domains_desc_query": "これらのドメインへのクエリはクエリログに書き込まれません。", "interval_hours": "{{count}}時間", "interval_hours_plural": "{{count}}時間", "filters_configuration": "フィルタ設定", @@ -642,5 +649,24 @@ "anonymizer_notification": "【<0>注意】IPの匿名化が有効になっています。 <1>一般設定で無効にできます。", "confirm_dns_cache_clear": "DNS キャッシュをクリアしてもよろしいですか?", "cache_cleared": "DNSキャッシュのクリア完了です。", - "clear_cache": "キャッシュをクリアする" + "clear_cache": "キャッシュをクリアする", + "make_static": "静的(static)にする", + "theme_auto_desc": "自動(デバイスの配色に合わせる)", + "theme_dark_desc": "ダークテーマ", + "theme_light_desc": "ライトテーマ", + "disable_for_seconds": "{{count}}秒間", + "disable_for_seconds_plural": "{{count}}秒間", + "disable_for_minutes": "{{count}}分間", + "disable_for_minutes_plural": "{{count}}分間", + "disable_for_hours": "{{count}}時間", + "disable_for_hours_plural": "{{count}}時間", + "disable_until_tomorrow": "明日まで", + "disable_notify_for_seconds": "保護を {{count}} 秒間無効にする", + "disable_notify_for_seconds_plural": "保護を {{count}} 秒間無効にする", + "disable_notify_for_minutes": "保護を {{count}} 分間無効にする", + "disable_notify_for_minutes_plural": "保護を {{count}} 分間無効にする", + "disable_notify_for_hours": "保護を {{count}} 時間無効にする", + "disable_notify_for_hours_plural": "保護を {{count}} 時間無効にする", + "disable_notify_until_tomorrow": "明日まで保護を無効にする", + "enable_protection_timer": "保護は後 {{time}} で有効になります" } diff --git a/client/src/__locales/ko.json b/client/src/__locales/ko.json index 9847db95c0d..cf0028e4647 100644 --- a/client/src/__locales/ko.json +++ b/client/src/__locales/ko.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "자녀 보호 활성화됨", "disabled_safe_search_toast": "세이프서치 비활성화됨", "enabled_save_search_toast": "세이프서치 활성화됨", + "updated_save_search_toast": "세이프서치 설정 업데이트됨", "enabled_table_header": "활성화됨", "name_table_header": "이름", "list_url_table_header": "리스트 URL", @@ -290,6 +291,8 @@ "rate_limit": "한도 제한", "edns_enable": "EDNS 클라이언트 서브넷 활성화", "edns_cs_desc": "업스트림 요청에 EDNS 클라이언트 서브넷 옵션(ECS)을 추가하고 쿼리 로그에 클라이언트가 보낸 값을 기록합니다.", + "edns_use_custom_ip": "EDNS에 사용자 지정 IP 사용", + "edns_use_custom_ip_desc": "EDNS에 사용자 지정 IP 사용하도록 허용합니다.", "rate_limit_desc": "단일 클라이언트에서 허용 가능한 초 당 요청 생성 숫자 (0: 무제한)", "blocking_ipv4_desc": "차단된 A 요청에 대해서 반환할 IP 주소", "blocking_ipv6_desc": "차단된 AAAA 요청에 대해서 반환할 IP 주소", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "정말로 통계 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다", "statistics_cleared": "통계를 성공적으로 초기화했습니다.", "statistics_enable": "통계 활성화", + "ignore_domains": "무시된 도메인(줄 바꿈으로 구분)", + "ignore_domains_title": "무시된 도메인", + "ignore_domains_desc_stats": "이러한 도메인에 대한 쿼리는 통계에 기록되지 않습니다.", + "ignore_domains_desc_query": "이러한 도메인에 대한 쿼리는 쿼리 로그에 기록되지 않습니다.", "interval_hours": "{{count}} 시간", "interval_hours_plural": "{{count}} 시간", "filters_configuration": "필터 구성", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>참고: IP 익명화가 활성화되었습니다. <1>일반 설정에서 비활성화할 수 있습니다.", "confirm_dns_cache_clear": "정말로 DNS 캐시를 지우시겠습니까?", "cache_cleared": "DNS 캐시를 성공적으로 지웠습니다", - "clear_cache": "캐시 지우기" + "clear_cache": "캐시 지우기", + "make_static": "정적으로 만들기", + "theme_auto_desc": "자동(기기의 색 구성표에 따라 설정)", + "theme_dark_desc": "다크 테마", + "theme_light_desc": "라이트 테마", + "disable_for_seconds": "{{count}}초", + "disable_for_seconds_plural": "{{count}}초", + "disable_for_minutes": "{{count}}분", + "disable_for_minutes_plural": "{{count}}분간", + "disable_for_hours": "{{count}}시간", + "disable_for_hours_plural": "{{count}}시간", + "disable_until_tomorrow": "내일까지", + "disable_notify_for_seconds": "{{count}}초 동안 보호 기능 비활성화", + "disable_notify_for_seconds_plural": "{{count}}초 동안 보호 기능 비활성화", + "disable_notify_for_minutes": "{{count}}분 동안 보호 기능 비활성화", + "disable_notify_for_minutes_plural": "{{count}}분 동안 보호 기능 비활성화", + "disable_notify_for_hours": "{{count}}시간 동안 보호 기능 비활성화", + "disable_notify_for_hours_plural": "{{count}}시간 동안 보호 기능 비활성화", + "disable_notify_until_tomorrow": "내일까지 보호 기능 비활성화", + "enable_protection_timer": "{{time}}에 보호 기능이 활성화됩니다." } diff --git a/client/src/__locales/nl.json b/client/src/__locales/nl.json index 9db3884f208..474d9ad0c71 100644 --- a/client/src/__locales/nl.json +++ b/client/src/__locales/nl.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Ingeschakeld Ouderlijk toezicht", "disabled_safe_search_toast": "Uitgeschakeld Veilig zoeken", "enabled_save_search_toast": "Ingeschakeld Veilig zoeken", + "updated_save_search_toast": "Safe Search-instellingen bijgewerkt", "enabled_table_header": "Ingeschakeld", "name_table_header": "Naam", "list_url_table_header": "URL lijst", @@ -290,6 +291,8 @@ "rate_limit": "Ratio limiet", "edns_enable": "EDNS client subnet inschakelen", "edns_cs_desc": "De EDNS Client Subnet-optie (ECS) toevoegen aan upstream-verzoeken en de waarden die door de clients zijn verzonden registreren in het querylogboek.", + "edns_use_custom_ip": "Aangepast IP-adres gebruiken voor EDNS", + "edns_use_custom_ip_desc": "Toestaan om aangepast IP-adres voor EDNS te gebruiken", "rate_limit_desc": "Het aantal verzoeken per seconde toegelaten per toestel. 0 betekent onbeperkt.", "blocking_ipv4_desc": "IP-adres dat moet worden teruggegeven voor een geblokkeerd A-verzoek", "blocking_ipv6_desc": "IP-adres dat moet worden teruggegeven voor een geblokkeerd A-verzoek", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Weet u zeker dat u de bewaartermijn van de statistieken wilt wijzigen? Als u de intervalwaarde verlaagt, gaan sommige gegevens verloren", "statistics_cleared": "Statistieken succesvol gewist", "statistics_enable": "Statistieken inschakelen", + "ignore_domains": "Genegeerde domeinen (gescheiden door nieuwe regel)", + "ignore_domains_title": "Genegeerde domeinen", + "ignore_domains_desc_stats": "Zoekopdrachten voor deze domeinen worden niet naar de statistieken geschreven", + "ignore_domains_desc_query": "Zoekopdrachten voor deze domeinen worden niet naar het zoeklogboek geschreven", "interval_hours": "{{count}} uur", "interval_hours_plural": "{{count}} uren", "filters_configuration": "Filters instellingen", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Opmerking: IP-anonimisering is ingeschakeld. Je kunt het uitschakelen in <1>Algemene instellingen.", "confirm_dns_cache_clear": "Weet je zeker dat je de DNS-cache wilt wissen?", "cache_cleared": "DNS-cache succesvol gewist", - "clear_cache": "Cache wissen" + "clear_cache": "Cache wissen", + "make_static": "Statisch maken", + "theme_auto_desc": "Automatisch (op basis van het kleurenschema van jouw apparaat)", + "theme_dark_desc": "Donker thema", + "theme_light_desc": "Licht thema", + "disable_for_seconds": "Voor {{count}} seconde", + "disable_for_seconds_plural": "Voor {{count}} seconden", + "disable_for_minutes": "Voor {{count}} minuut", + "disable_for_minutes_plural": "Voor {{count}} minuten", + "disable_for_hours": "Voor {{count}} uur", + "disable_for_hours_plural": "Voor {{count}} uren", + "disable_until_tomorrow": "Tot morgen", + "disable_notify_for_seconds": "Beveiliging uitschakelen voor {{count}} seconde", + "disable_notify_for_seconds_plural": "Beveiliging uitschakelen voor {{count}} seconden", + "disable_notify_for_minutes": "Beveiliging uitschakelen voor {{count}} minuut", + "disable_notify_for_minutes_plural": "Beveiliging uitschakelen voor {{count}} minuten", + "disable_notify_for_hours": "Beveiliging uitschakelen voor {{count}} uur", + "disable_notify_for_hours_plural": "Beveiliging uitschakelen voor {{count}} uren", + "disable_notify_until_tomorrow": "Beveiliging uitschakelen tot morgen", + "enable_protection_timer": "Bescherming wordt ingeschakeld over {{time}}" } diff --git a/client/src/__locales/pt-br.json b/client/src/__locales/pt-br.json index c7af3cc6524..7e5956128c4 100644 --- a/client/src/__locales/pt-br.json +++ b/client/src/__locales/pt-br.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Controle parental ativado", "disabled_safe_search_toast": "Pesquisa segura desativada", "enabled_save_search_toast": "Pesquisa segura ativada", + "updated_save_search_toast": "Configurações de Pesquisa Segura atualizadas", "enabled_table_header": "Ativado", "name_table_header": "Nome", "list_url_table_header": "URL da lista", @@ -290,6 +291,8 @@ "rate_limit": "Taxa limite", "edns_enable": "Ativar a sub-rede do cliente EDNS", "edns_cs_desc": "Adicione a opção de sub-rede de cliente EDNS (ECS) às solicitações de servidor DNS primário e registre os valores enviados pelos clientes no registro de consulta.", + "edns_use_custom_ip": "Usar IP personalizado para EDNS", + "edns_use_custom_ip_desc": "Permitir o uso de IP personalizado para EDNS", "rate_limit_desc": "O número de solicitações por segundo permitidas por cliente. Definir como 0 significa que não há limite.", "blocking_ipv4_desc": "Endereço de IP a ser retornado para uma solicitação bloqueada", "blocking_ipv6_desc": "Endereço de IP a ser retornado para uma solicitação AAAA bloqueada", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Você tem certeza que quer alterar o arquivamento das estatísticas? Se diminuir o valor do intervalo, alguns dados serão perdidos", "statistics_cleared": "As estatísticas foram limpas com sucesso", "statistics_enable": "Ativar estatísticas", + "ignore_domains": "Domínios ignorados (separados por nova linha)", + "ignore_domains_title": "Domínios ignorados", + "ignore_domains_desc_stats": "As consultas para esses domínios não são gravadas nas estatísticas", + "ignore_domains_desc_query": "As consultas para esses domínios não são gravadas no log de consulta", "interval_hours": "{{count}} hora", "interval_hours_plural": "{{count}} horas", "filters_configuration": "Configuração de filtros", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Observação: A anonimização de IP está ativada. Você pode desativá-lo em <1>Configurações gerais.", "confirm_dns_cache_clear": "Tem certeza de que deseja limpar o cache DNS?", "cache_cleared": "Cache DNS limpo com sucesso", - "clear_cache": "Limpar cache" + "clear_cache": "Limpar cache", + "make_static": "Tornar estático", + "theme_auto_desc": "Automático (com base no esquema de cores do seu dispositivo)", + "theme_dark_desc": "Tema escuro", + "theme_light_desc": "Tema claro", + "disable_for_seconds": "Por {{count}} segundo", + "disable_for_seconds_plural": "Por {{count}} segundos", + "disable_for_minutes": "Por {{count}} minuto", + "disable_for_minutes_plural": "Por {{count}} minutos", + "disable_for_hours": "Por {{count}} hora", + "disable_for_hours_plural": "Por {{count}} horas", + "disable_until_tomorrow": "Até amanhã", + "disable_notify_for_seconds": "Desativar proteção por {{count}} segundo", + "disable_notify_for_seconds_plural": "Desativar proteção por {{count}} segundos", + "disable_notify_for_minutes": "Desativar proteção por {{count}} minuto", + "disable_notify_for_minutes_plural": "Desativar proteção por {{count}} minutos", + "disable_notify_for_hours": "Desativar proteção por {{count}} hora", + "disable_notify_for_hours_plural": "Desativar proteção por {{count}} horas", + "disable_notify_until_tomorrow": "Desativar a proteção até amanhã", + "enable_protection_timer": "A proteção será ativada em {{time}}" } diff --git a/client/src/__locales/pt-pt.json b/client/src/__locales/pt-pt.json index b710fe3dadc..34574c3ebc4 100644 --- a/client/src/__locales/pt-pt.json +++ b/client/src/__locales/pt-pt.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Controlo parental ativado", "disabled_safe_search_toast": "Pesquisa segura desativada", "enabled_save_search_toast": "Pesquisa segura ativada", + "updated_save_search_toast": "Configurações de pesquisa segura actualizadas", "enabled_table_header": "Ativado", "name_table_header": "Nome", "list_url_table_header": "URL da lista", @@ -290,6 +291,8 @@ "rate_limit": "Limite de taxa", "edns_enable": "Ativar a sub-rede do cliente EDNS", "edns_cs_desc": "Adicione a opção de sub-rede de cliente EDNS (ECS) às solicitações de servidor DNS primário e registre os valores enviados pelos clientes no registo de consulta.", + "edns_use_custom_ip": "Usar IP personalizado para EDNS", + "edns_use_custom_ip_desc": "Permitir a utilização de IP personalizado para EDNS", "rate_limit_desc": "O número de solicitações por segundo permitido por cliente. Configurando para 0 significa sem limite.", "blocking_ipv4_desc": "Endereço IP a ser devolvido para uma solicitação A bloqueada", "blocking_ipv6_desc": "Endereço IP a ser devolvido para uma solicitação AAAA bloqueada", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Tem a certeza que quer alterar a retenção de estatísticas? Se diminuir o valor do intervalo, alguns dados serão perdidos", "statistics_cleared": "As estatísticas foram apagadas com sucesso", "statistics_enable": "Ativar estatísticas", + "ignore_domains": "Domínios ignorados (separados por nova linha)", + "ignore_domains_title": "Domínios ignorados", + "ignore_domains_desc_stats": "As consultas para estes domínios não aparecem nas estatísticas", + "ignore_domains_desc_query": "As consultas para estes domínios nãoaparecem no registo de consultas", "interval_hours": "{{count}} hora", "interval_hours_plural": "{{count}} horas", "filters_configuration": "Definição dos filtros", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Observação: A anonimização de IP está ativada. Você pode desativá-la em <1>Definições gerais.", "confirm_dns_cache_clear": "Tem certeza de que quer limpar a cache DNS?", "cache_cleared": "O cache DNS foi apagado com sucesso", - "clear_cache": "Limpar cache" + "clear_cache": "Limpar cache", + "make_static": "Tornar estático", + "theme_auto_desc": "Automático (com base no esquema de cores do seu dispositivo)", + "theme_dark_desc": "Tema escuro", + "theme_light_desc": "Tema claro", + "disable_for_seconds": "Por {{count}} segundo", + "disable_for_seconds_plural": "Por {{count}} segundos", + "disable_for_minutes": "Por {{count}} minuto", + "disable_for_minutes_plural": "Por {{count}} minutos", + "disable_for_hours": "Por {{count}} hora", + "disable_for_hours_plural": "Por {{count}} horas", + "disable_until_tomorrow": "Até amanhã", + "disable_notify_for_seconds": "Desativar proteção por {{count}} segundo", + "disable_notify_for_seconds_plural": "Desativar proteção por {{count}} segundos", + "disable_notify_for_minutes": "Desativar proteção por {{count}} minuto", + "disable_notify_for_minutes_plural": "Desativar proteção por {{count}} minutos", + "disable_notify_for_hours": "Desativar proteção por {{count}} hora", + "disable_notify_for_hours_plural": "Desativar proteção por {{count}} horas", + "disable_notify_until_tomorrow": "Desativar a proteção até amanhã", + "enable_protection_timer": "A proteção será habilitada em {{time}}" } diff --git a/client/src/__locales/ru.json b/client/src/__locales/ru.json index afe8c5cfbb2..aa78f3aecf5 100644 --- a/client/src/__locales/ru.json +++ b/client/src/__locales/ru.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Родительский контроль вкл.", "disabled_safe_search_toast": "Безопасный поиск выкл.", "enabled_save_search_toast": "Безопасный поиск вкл.", + "updated_save_search_toast": "Настройки безопасного поиска обновлены", "enabled_table_header": "Вкл.", "name_table_header": "Имя", "list_url_table_header": "URL-адрес списка", @@ -290,6 +291,8 @@ "rate_limit": "Rate limit", "edns_enable": "Включить отправку EDNS Client Subnet", "edns_cs_desc": "Добавлять опцию EDNS Client Subnet (ECS) к запросам к upstream-серверам, а также записывать присланные клиентами значения в журнал.", + "edns_use_custom_ip": "Использовать указанный IP для EDNS", + "edns_use_custom_ip_desc": "Разрешить использовать собственный IP для EDNS", "rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно).", "blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса", "blocking_ipv6_desc": "IP-адрес, возвращаемый при блокировке AAAA-запроса", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Вы уверены, что хотите изменить срок хранения статистики? При сокращении интервала данные могут быть утеряны", "statistics_cleared": "Статистика успешно очищена", "statistics_enable": "Включить статистику", + "ignore_domains": "Игнорируемые домены (построчно)", + "ignore_domains_title": "Игнорируемые домены", + "ignore_domains_desc_stats": "Запросы для этих доменов не записываются в статистику", + "ignore_domains_desc_query": "Запросы для этих доменов не записываются в журнал запросов", "interval_hours": "{{count}} час", "interval_hours_plural": "{{count}} часов", "filters_configuration": "Настройка фильтров", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Внимание: включена анонимизация IP-адресов. Вы можете отключить её в разделе <1>Основные настройки.", "confirm_dns_cache_clear": "Вы уверены, что хотите очистить кеш DNS?", "cache_cleared": "Кеш DNS успешно очищен", - "clear_cache": "Очистить кеш" + "clear_cache": "Очистить кеш", + "make_static": "Сделать статической", + "theme_auto_desc": "Авто (на основе цветовой схемы вашего устройства)", + "theme_dark_desc": "Тёмная тема", + "theme_light_desc": "Светлая тема", + "disable_for_seconds": "На {{count}} секунд", + "disable_for_seconds_plural": "На {{count}} секунд", + "disable_for_minutes": "На {{count}} минуту", + "disable_for_minutes_plural": "На {{count}} минут", + "disable_for_hours": "На {{count}} час", + "disable_for_hours_plural": "На {{count}} часов", + "disable_until_tomorrow": "До завтра", + "disable_notify_for_seconds": "Отключить защиту на {{count}} секунд", + "disable_notify_for_seconds_plural": "Отключить защиту на {{count}} секунд", + "disable_notify_for_minutes": "Отключить защиту на {{count}} минуту", + "disable_notify_for_minutes_plural": "Отключить защиту на {{count}} минут", + "disable_notify_for_hours": "Отключить защиту на {{count}} час", + "disable_notify_for_hours_plural": "Отключить защиту на {{count}} часов", + "disable_notify_until_tomorrow": "Отключить защиту до завтра", + "enable_protection_timer": "Защита будет включена в {{time}}" } diff --git a/client/src/__locales/sk.json b/client/src/__locales/sk.json index de0076a4b13..d98a9f53c06 100644 --- a/client/src/__locales/sk.json +++ b/client/src/__locales/sk.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Zapnutá Rodičovská kontrola", "disabled_safe_search_toast": "Vypnuté Bezpečné vyhľadávanie", "enabled_save_search_toast": "Zapnuté Bezpečné vyhľadávanie", + "updated_save_search_toast": "Nastavenia Bezpečného vyhľadávania boli aktualizované", "enabled_table_header": "Zapnuté", "name_table_header": "Meno", "list_url_table_header": "Zoznam URL adries", @@ -290,6 +291,8 @@ "rate_limit": "Rýchlostný limit", "edns_enable": "Povoliť klientsku podsiete EDNS", "edns_cs_desc": "Pridáva možnosť EDNS Client Subnet (ECS) do upstream požiadaviek a zapíše hodnoty odoslané klientmi do denníka dopytov.", + "edns_use_custom_ip": "Použiť vlastnú IP adresu pre EDNS", + "edns_use_custom_ip_desc": "Povoliť používanie vlastnej IP adresy pre EDNS", "rate_limit_desc": "Počet požiadaviek za sekundu, ktoré môže jeden klient vykonať. Nastavenie na hodnotu 0 znamená neobmedzene.", "blocking_ipv4_desc": "IP adresa, ktorá sa má vrátiť v prípade blokovanej žiadosti A", "blocking_ipv6_desc": "IP adresa, ktorá sa má vrátiť v prípade blokovanej žiadosti AAAA", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Naozaj chcete zmeniť uchovávanie štatistík? Ak znížite hodnotu intervalu, niektoré údaje sa stratia", "statistics_cleared": "Štatistika bola úspešne vynulovaná", "statistics_enable": "Zapnúť štatistiku", + "ignore_domains": "Ignorované domény (oddelené novým riadkom)", + "ignore_domains_title": "Ignorované domény", + "ignore_domains_desc_stats": "Dopyty pre tieto domény sa nezapisujú do štatistík", + "ignore_domains_desc_query": "Dopyty pre tieto domény sa nezapisujú do denníka dopytov", "interval_hours": "{{count}} hodina", "interval_hours_plural": "{{count}} hodín", "filters_configuration": "Konfigurácia filtrov", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Poznámka: Anonymizácia IP je zapnutá. Môžete ju vypnúť vo <1>Všeobecných nastaveniach.", "confirm_dns_cache_clear": "Naozaj chcete vymazať vyrovnávaciu pamäť DNS?", "cache_cleared": "Vyrovnávacia pamäť DNS bola úspešne vymazaná", - "clear_cache": "Vymazať vyrovnávaciu pamäť" + "clear_cache": "Vymazať vyrovnávaciu pamäť", + "make_static": "Vytvárať štatistiku", + "theme_auto_desc": "Automaticky (na základe farebnej schémy Vášho zariadenia)", + "theme_dark_desc": "Tmavá téma", + "theme_light_desc": "Svetlá téma", + "disable_for_seconds": "Na {{count}} sekundu", + "disable_for_seconds_plural": "Na {{count}} sekúnd", + "disable_for_minutes": "Na {{count}} minútu", + "disable_for_minutes_plural": "Na {{count}} minút", + "disable_for_hours": "Na {{count}} hodinu", + "disable_for_hours_plural": "Na {{count}} hodín", + "disable_until_tomorrow": "Do zajtra", + "disable_notify_for_seconds": "Vypnite ochranu na {{count}} sekundu", + "disable_notify_for_seconds_plural": "Vypnite ochranu na {{count}} sekúnd", + "disable_notify_for_minutes": "Vypnite ochranu na {{count}} minútu", + "disable_notify_for_minutes_plural": "Vypnite ochranu na {{count}} minút", + "disable_notify_for_hours": "Vypnite ochranu na {{count}} hodinu", + "disable_notify_for_hours_plural": "Vypnite ochranu na {{count}} hodín", + "disable_notify_until_tomorrow": "Vypnúť ochranu do zajtra", + "enable_protection_timer": "Ochrana bude zapnutá o {{time}}" } diff --git a/client/src/__locales/sl.json b/client/src/__locales/sl.json index e8f6635c8cf..a46256c2a99 100644 --- a/client/src/__locales/sl.json +++ b/client/src/__locales/sl.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Omogočen starševski nadzor", "disabled_safe_search_toast": "Onemogočeno Varno iskanje", "enabled_save_search_toast": "Omogočeno Varno iskanje", + "updated_save_search_toast": "Nastavitve varnega iskanja so posodobljene", "enabled_table_header": "Omogočeno", "name_table_header": "Ime", "list_url_table_header": "Seznam URL naslovov", @@ -290,6 +291,8 @@ "rate_limit": "Omejitev hitrosti", "edns_enable": "Omogoči odjemalsko podomrežje EDNS", "edns_cs_desc": "Dodaj možnost podomrežja odjemalca EDNS (ECS) zahtevam v gorvodnem toku in zabeleži vrednosti, ki jih pošljejo odjemalci, v dnevnik poizvedb.", + "edns_use_custom_ip": "Uporabi IP po meri za EDNS", + "edns_use_custom_ip_desc": "Dovoli uporabo naslova IP po meri za EDNS", "rate_limit_desc": "Dovoljeno število zahtev na sekundo na odjemalca. Nastavitev na 0 pomeni brez omejitve.", "blocking_ipv4_desc": "IP naslov, ki mora biti vrnjen za onemogočeno zahtevo A", "blocking_ipv6_desc": "IP naslov, ki mora biti vrnjen za onemogočeno zahtevo AAAA", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "Ali ste prepričani, da želite spremeniti zadrževanje statistike? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni", "statistics_cleared": "Statistika je bila uspešno počiščena", "statistics_enable": "Omogoči statistiko", + "ignore_domains": "Prezrte domene (ločene z novo vrstico)", + "ignore_domains_title": "Prezrte domene", + "ignore_domains_desc_stats": "Poizvedbe za te domene niso zapisane v statistiko", + "ignore_domains_desc_query": "Poizvedbe za te domene niso zapisane v dnevnik poizvedb", "interval_hours": "{{count}} ur", "interval_hours_plural": "{{count}} ur", "filters_configuration": "Nastavitve filtrov", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Opomba: Anonimizacija IP je omogočena. Onemogočite ga lahko v <1>Splošnih nastavitvah.", "confirm_dns_cache_clear": "Ali ste prepričani, da želite počistiti predpomnilnik DNS?", "cache_cleared": "Predpomnilnik DNS je bil uspešno počiščen", - "clear_cache": "Počisti predpomnilnik" + "clear_cache": "Počisti predpomnilnik", + "make_static": "Naredi statično", + "theme_auto_desc": "Samodejno (glede na barvno shemo vaše naprave)", + "theme_dark_desc": "Temna tema", + "theme_light_desc": "Svetla tema", + "disable_for_seconds": "Za {{count}} sekundo", + "disable_for_seconds_plural": "Za {{count}} sekund", + "disable_for_minutes": "Za {{count}} minuto", + "disable_for_minutes_plural": "Za {{count}} minut", + "disable_for_hours": "Za {{count}} uro", + "disable_for_hours_plural": "Za {{count}} ur", + "disable_until_tomorrow": "Do jutri", + "disable_notify_for_seconds": "Onemogoči zaščito za {{count}} sekundo", + "disable_notify_for_seconds_plural": "Onemogoči zaščito za {{count}} sekund", + "disable_notify_for_minutes": "Onemogoči zaščito za {{count}} minuto", + "disable_notify_for_minutes_plural": "Onemogoči zaščito za {{count}} minut", + "disable_notify_for_hours": "Onemogoči zaščito za {{count}} uro", + "disable_notify_for_hours_plural": "Onemogoči zaščito za {{count}} ur", + "disable_notify_until_tomorrow": "Onemogoči zaščito do jutri", + "enable_protection_timer": "Zaščita bo omogočena ob {{time}}" } diff --git a/client/src/__locales/sv.json b/client/src/__locales/sv.json index 94ca457001a..cc004642b38 100644 --- a/client/src/__locales/sv.json +++ b/client/src/__locales/sv.json @@ -523,6 +523,7 @@ "statistics_retention_confirm": "Är du säker på att du vill ändra retentionstiden för statistik? Om du minskar intervallet kommer viss data att gå förlorad", "statistics_cleared": "Statistiken har rensats", "statistics_enable": "Aktivera statistik", + "ignore_domains_title": "Ignorerade domäner", "interval_hours": "{{count}} timme", "interval_hours_plural": "{{count}} timmar", "filters_configuration": "Filterinställningar", @@ -642,5 +643,14 @@ "anonymizer_notification": "<0>Observera: IP-anonymisering är aktiverad. Du kan inaktivera den i <1>Allmänna inställningar.", "confirm_dns_cache_clear": "Är du säker på att du vill rensa DNS-cache?", "cache_cleared": "DNS-cacheminnet har rensats", - "clear_cache": "Rensa cache" + "clear_cache": "Rensa cache", + "theme_dark_desc": "Mörkt tema", + "theme_light_desc": "Ljust tema", + "disable_for_seconds": "I {{count}} sekund", + "disable_for_seconds_plural": "I {{count}} sekunder", + "disable_for_minutes": "I {{count}} minut", + "disable_for_minutes_plural": "I {{count}} minuter", + "disable_for_hours": "I {{count}} timme", + "disable_for_hours_plural": "I {{count}} timmar", + "disable_until_tomorrow": "Tills imorgon" } diff --git a/client/src/__locales/tr.json b/client/src/__locales/tr.json index d4e3b1727f6..54aad5e4839 100644 --- a/client/src/__locales/tr.json +++ b/client/src/__locales/tr.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Ebeveyn Denetimi etkinleştirildi", "disabled_safe_search_toast": "Güvenli Arama devre dışı bırakıldı", "enabled_save_search_toast": "Güvenli Arama etkinleştirildi", + "updated_save_search_toast": "Güvenli Arama ayarları güncellendi", "enabled_table_header": "Etkin", "name_table_header": "Ad", "list_url_table_header": "Liste URL'si", @@ -290,6 +291,8 @@ "rate_limit": "Sıklık limiti", "edns_enable": "EDNS istemci alt ağını etkinleştir", "edns_cs_desc": "Kaynak yönü isteklerine EDNS İstemci Alt Ağı seçeneğini (ECS) ekleyin ve istemciler tarafından gönderilen değerleri sorgu günlüğüne kaydedin.", + "edns_use_custom_ip": "EDNS için özel IP kullan", + "edns_use_custom_ip_desc": "EDNS için özel IP kullanımına izin ver", "rate_limit_desc": "İstemci başına izin verilen saniyedeki istek sayısı. 0 olarak ayarlamak, sınır olmadığı anlamına gelir.", "blocking_ipv4_desc": "Engellenen bir A isteği için geri döndürülecek IP adresi", "blocking_ipv6_desc": "Engellenen bir AAAA isteği için geri döndürülecek IP adresi", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "İstatistik saklama süresini değiştirmek istediğinizden emin misiniz? Aralık değerini azaltırsanız, bazı veriler kaybolacaktır", "statistics_cleared": "İstatistikler başarıyla temizlendi", "statistics_enable": "İstatistikleri etkinleştir", + "ignore_domains": "Yok sayılan alan adları (yeni satırla ayrılmış)", + "ignore_domains_title": "Yok sayılan alan adları", + "ignore_domains_desc_stats": "Bu alan adları için yapılan sorgular istatistiklere yazılmaz", + "ignore_domains_desc_query": "Bu alan adları için yapılan sorgular sorgu günlüğüne yazılmaz", "interval_hours": "{{count}} saat", "interval_hours_plural": "{{count}} saat", "filters_configuration": "Filtre yapılandırması", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>Not: IP anonimleştirme etkinleştirildi. Bunu <1>Genel ayarlardan devre dışı bırakabilirsiniz.", "confirm_dns_cache_clear": "DNS önbelleğini temizlemek istediğinizden emin misiniz?", "cache_cleared": "DNS önbelleği başarıyla temizlendi", - "clear_cache": "Önbelleği temizle" + "clear_cache": "Önbelleği temizle", + "make_static": "Statik yap", + "theme_auto_desc": "Otomatik (cihazınızın renk düzenine göre)", + "theme_dark_desc": "Koyu tema", + "theme_light_desc": "Açık tema", + "disable_for_seconds": "{{count}} saniye için", + "disable_for_seconds_plural": "{{count}} saniye için", + "disable_for_minutes": "{{count}} dakika için", + "disable_for_minutes_plural": "{{count}} dakika için", + "disable_for_hours": "{{count}} saat için", + "disable_for_hours_plural": "{{count}} saat için", + "disable_until_tomorrow": "Yarına kadar", + "disable_notify_for_seconds": "Korumayı {{count}} saniyeliğine devre dışı bırak", + "disable_notify_for_seconds_plural": "Korumayı {{count}} saniyeliğine devre dışı bırak", + "disable_notify_for_minutes": "Korumayı {{count}} dakiklığına devre dışı bırak", + "disable_notify_for_minutes_plural": "Korumayı {{count}} dakiklığına devre dışı bırak", + "disable_notify_for_hours": "Korumayı {{count}} saatliğine devre dışı bırak", + "disable_notify_for_hours_plural": "Korumayı {{count}} saatliğine devre dışı bırak", + "disable_notify_until_tomorrow": "Korumayı yarına kadar devre dışı bırak", + "enable_protection_timer": "Koruma {{time}} içinde etkinleştirilecektir" } diff --git a/client/src/__locales/zh-cn.json b/client/src/__locales/zh-cn.json index 3d417844208..e0235dae016 100644 --- a/client/src/__locales/zh-cn.json +++ b/client/src/__locales/zh-cn.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "家长控制已启用", "disabled_safe_search_toast": "安全搜索已禁用", "enabled_save_search_toast": "安全搜索已启用", + "updated_save_search_toast": "安全搜索设置更新成功", "enabled_table_header": "已启用", "name_table_header": "名称", "list_url_table_header": "清单网址", @@ -290,6 +291,8 @@ "rate_limit": "速度限制", "edns_enable": "启用 EDNS 客户端子网", "edns_cs_desc": "在上游请求中加入 EDNS 客户端子网(“EDNS Client Subnet”,即 ECS)选项,并在查询日志中记录客户端发送的数值。", + "edns_use_custom_ip": "为 EDNS 使用自定义 IP", + "edns_use_custom_ip_desc": "允许为 EDNS 使用自定义 IP", "rate_limit_desc": "每个客户端每秒钟查询次数的限制。设置为 0 意味着不限制。", "blocking_ipv4_desc": "拦截 A 记录请求返回的 IP 地址", "blocking_ipv6_desc": "拦截 AAAA 记录请求返回的 IP 地址", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "您确定要更改统计记录保留时间吗? 如果您减少间隔时间的值, 某些数据可能会丢失。", "statistics_cleared": "统计数据已成功清除", "statistics_enable": "启用统计数据", + "ignore_domains": "忽略的网域(以换行符分隔)", + "ignore_domains_title": "被忽略的网域", + "ignore_domains_desc_stats": "这些网域的查询不在统计信息", + "ignore_domains_desc_query": "这些网域的查询不在查询日志记录", "interval_hours": "{{count}} 小时", "interval_hours_plural": "{{count}} 小时", "filters_configuration": "过滤器配置", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>注意: IP 匿名化已启用。您可以在<1>常规设置中禁用它。", "confirm_dns_cache_clear": "您确定要清除 DNS 缓存吗?", "cache_cleared": "已成功清除 DNS 缓存", - "clear_cache": "清除缓存" + "clear_cache": "清除缓存", + "make_static": "静态化", + "theme_auto_desc": "自动(基于设备的配色方案)", + "theme_dark_desc": "暗黑主题", + "theme_light_desc": "浅色主题", + "disable_for_seconds": "{{count}} 秒", + "disable_for_seconds_plural": "{{count}} 秒", + "disable_for_minutes": "{{count}} 分钟", + "disable_for_minutes_plural": "{{count}} 分钟", + "disable_for_hours": "{{count}} 小时", + "disable_for_hours_plural": "{{count}} 小时", + "disable_until_tomorrow": "直到明天", + "disable_notify_for_seconds": "禁用保护 {{count}} 秒", + "disable_notify_for_seconds_plural": "禁用保护 {{count}} 秒", + "disable_notify_for_minutes": "禁用保护 {{count}} 分钟", + "disable_notify_for_minutes_plural": "禁用保护 {{count}} 分钟", + "disable_notify_for_hours": "禁用保护 {{count}} 小时", + "disable_notify_for_hours_plural": "禁用保护 {{count}} 小时", + "disable_notify_until_tomorrow": "禁用保护直到明天", + "enable_protection_timer": "保护将于 {{time}} 启用" } diff --git a/client/src/__locales/zh-tw.json b/client/src/__locales/zh-tw.json index 9701c49e1b7..80b156ff3ee 100644 --- a/client/src/__locales/zh-tw.json +++ b/client/src/__locales/zh-tw.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "已啟用家長控制", "disabled_safe_search_toast": "已禁用安全搜尋", "enabled_save_search_toast": "已啟用安全搜尋", + "updated_save_search_toast": "安全搜尋設定更新成功", "enabled_table_header": "已啟用", "name_table_header": "名稱", "list_url_table_header": "清單網址", @@ -290,6 +291,8 @@ "rate_limit": "速率限制", "edns_enable": "啟用對於 DNS 的擴充機制(EDNS)用戶端子網路", "edns_cs_desc": "新增對於 DNS 的擴充機制(EDNS)用戶端子網路選項到上游的請求,並在查詢記錄中記錄由用戶端傳送的數值。", + "edns_use_custom_ip": "為 EDNS 使用自訂的 IP", + "edns_use_custom_ip_desc": "允許為 EDNS 使用自訂的 IP", "rate_limit_desc": "每個用戶端被允許的每秒請求之數量。設定它為 0 表示無限制。", "blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址", "blocking_ipv6_desc": "要被返回給已封鎖的 AAAA 請求之 IP 位址", @@ -523,6 +526,10 @@ "statistics_retention_confirm": "您確定您想要更改統計資料保留嗎?如果您減少該間隔值,某些資料將被丟失", "statistics_cleared": "統計資料被成功地清除", "statistics_enable": "啟用統計資料", + "ignore_domains": "忽略的網域(以換行符分隔)", + "ignore_domains_title": "被忽略的網域", + "ignore_domains_desc_stats": "這些網域的查詢不在統計資料", + "ignore_domains_desc_query": "這些網域的查詢不在查詢記錄", "interval_hours": "{{count}} 小時", "interval_hours_plural": "{{count}} 小時", "filters_configuration": "過濾器配置", @@ -642,5 +649,24 @@ "anonymizer_notification": "<0>注意:IP 匿名化被啟用。您可在<1>一般設定中禁用它。", "confirm_dns_cache_clear": "您確定您想要清除 DNS 快取嗎?", "cache_cleared": "DNS 快取被成功地清除", - "clear_cache": "清除快取" + "clear_cache": "清除快取", + "make_static": "靜態化", + "theme_auto_desc": "自動(基於裝置的配色方案)", + "theme_dark_desc": "深色主題", + "theme_light_desc": "淺色主題", + "disable_for_seconds": "{{count}} 秒", + "disable_for_seconds_plural": "{{count}} 秒", + "disable_for_minutes": "{{count}} 分鐘", + "disable_for_minutes_plural": "{{count}} 分鐘", + "disable_for_hours": "{{count}} 小時", + "disable_for_hours_plural": "{{count}} 小時", + "disable_until_tomorrow": "直到明天", + "disable_notify_for_seconds": "計 {{count}} 秒禁用防護", + "disable_notify_for_seconds_plural": "計 {{count}} 秒禁用防護", + "disable_notify_for_minutes": "計 {{count}} 分鐘禁用防護", + "disable_notify_for_minutes_plural": "計 {{count}} 分鐘禁用防護", + "disable_notify_for_hours": "計 {{count}} 小時禁用防護", + "disable_notify_for_hours_plural": "計 {{count}} 小時禁用防護", + "disable_notify_until_tomorrow": "禁用防護直到明天", + "enable_protection_timer": "防護將於 {{time}} 被啟用" } diff --git a/client/src/helpers/filters/filters.js b/client/src/helpers/filters/filters.js index 68b3dd9c3d4..c8b2d0443c5 100644 --- a/client/src/helpers/filters/filters.js +++ b/client/src/helpers/filters/filters.js @@ -185,13 +185,13 @@ export default { "source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_32.txt" }, "oisd_basic": { - "name": "OISD Blocklist Basic", + "name": "OISD Blocklist Small", "categoryId": "general", "homepage": "https://oisd.nl/", "source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_5.txt" }, "oisd_full": { - "name": "OISD Blocklist Full", + "name": "OISD Blocklist Big", "categoryId": "general", "homepage": "https://oisd.nl/", "source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_27.txt" diff --git a/client/src/helpers/trackers/trackers.json b/client/src/helpers/trackers/trackers.json index 8afb5aeb63f..7f51485a7ce 100644 --- a/client/src/helpers/trackers/trackers.json +++ b/client/src/helpers/trackers/trackers.json @@ -1,5 +1,5 @@ { - "timeUpdated": "2023-03-08T00:09:48.692Z", + "timeUpdated": "2023-03-29T00:10:35.167Z", "categories": { "0": "audio_video_player", "1": "comments", @@ -19225,6 +19225,13 @@ "url": "http://www.zypmedia.com/", "companyId": "zypmedia" }, + "abc": { + "name": "Australian Broadcasting Corporation", + "categoryId": 8, + "url": "https://www.abc.net.au/", + "companyId": "abc", + "source": "AdGuard" + }, "adguard_dns": { "name": "AdGuard DNS", "categoryId": 8, @@ -19316,6 +19323,13 @@ "companyId": null, "source": "AdGuard" }, + "domainglass": { + "name": "Domain Glass", + "categoryId": 8, + "url": "https://domain.glass/", + "companyId": "domainglass", + "source": "AdGuard" + }, "edgio": { "name": "Edgio", "categoryId": 9, @@ -19344,6 +19358,13 @@ "companyId": "google", "source": "AdGuard" }, + "freeview": { + "name": "Freeview", + "categoryId": 0, + "url": "https://freeview.com.au/", + "companyId": "freeview", + "source": "AdGuard" + }, "gmail": { "name": "Gmail", "categoryId": 13, @@ -19358,6 +19379,13 @@ "companyId": "google", "source": "AdGuard" }, + "iqiyi": { + "name": "iQiyi", + "categoryId": 0, + "url": "https://www.iqiyi.com/", + "companyId": "iqiyi", + "source": "AdGuard" + }, "hockeyapp": { "name": "HockeyApp", "categoryId": 101, @@ -19365,6 +19393,13 @@ "companyId": null, "source": "AdGuard" }, + "karambasecurity": { + "name": "Karamba Security", + "categoryId": 8, + "url": "https://karambasecurity.com/", + "companyId": "karambasecurity", + "source": "AdGuard" + }, "kik": { "name": "Kik", "categoryId": 7, @@ -19379,6 +19414,13 @@ "companyId": "lets_encrypt", "source": "AdGuard" }, + "lgads": { + "name": "LG Ad Solutions", + "categoryId": 4, + "url": "https://lgads.tv/", + "companyId": "lgcorp", + "source": "AdGuard" + }, "lgtv": { "name": "LG TV", "categoryId": 8, @@ -19428,6 +19470,13 @@ "companyId": "nab", "source": "AdGuard" }, + "netify": { + "name": "Netify", + "categoryId": 8, + "url": "https://www.netify.ai/", + "companyId": "netify", + "source": "AdGuard" + }, "notion": { "name": "Notion", "categoryId": 8, @@ -19519,6 +19568,20 @@ "companyId": "solaredge", "source": "AdGuard" }, + "sonos": { + "name": "Sonos", + "categoryId": 8, + "url": "https://www.sonos.com/", + "companyId": "sonos", + "source": "AdGuard" + }, + "switchtv": { + "name": "Switch Media", + "categoryId": 8, + "url": "https://www.switch.tv/", + "companyId": "switchtv", + "source": "AdGuard" + }, "telstra": { "name": "Telstra", "categoryId": 8, @@ -19581,6 +19644,13 @@ "url": "https://appmetrica.yandex.com/", "companyId": "yandex", "source": "AdGuard" + }, + "3gpp": { + "name": "3GPP Network", + "categoryId": 5, + "url": "https://www.3gpp.org/", + "companyId": "3gpp", + "source": "AdGuard" } }, "trackerDomains": { @@ -23911,6 +23981,16 @@ "zwaar.net": "zwaar", "zwaar.org": "zwaar", "extend.tv": "zypmedia", + "abc.net.au": "abc", + "ab.co": "abc", + "abc-cdn.net.au": "abc", + "abc-host.net": "abc", + "abc-host.net.au": "abc", + "abc-prod.net.au": "abc", + "abc-stage.net.au": "abc", + "abc-test.net.au": "abc", + "abcaustralia.net.au": "abc", + "abcradio.net.au": "abc", "adtidy.org": "adguard", "agrd.io": "adguard", "adguard.app": "adguard", @@ -23985,6 +24065,7 @@ "cloudflare-dns.com": "cloudflare", "crashlytics.com": "crashlytics", "phicdn.net": "digicert_trust_seal", + "domain.glass": "domainglass", "alphacdn.net": "edgio", "edg.io": "edgio", "edgecast.com": "edgio", @@ -23996,6 +24077,9 @@ "app-measurement.com": "firebase", "flipboard.com": "flipboard", "flurry.com": "flurry", + "freeviewaustralia.tv": "freeview", + "freeview.com.au": "freeview", + "freeview.com": "freeview", "ghcr.io": "github", "github.dev": "github", "gmail.com": "gmail", @@ -24005,12 +24089,18 @@ "gvt3.com": "google_servers", "pki.goog": "google_trust_services", "hockeyapp.net": "hockeyapp", + "qy.net": "iqiyi", + "iqiyi.com": "iqiyi", + "iq.com": "iqiyi", + "karambasecurity.com": "karambasecurity", "kik.com": "kik", "apikik.com": "kik", "kik-live.com": "kik", "slatic.net": "lazada", "lencr.org": "lets_encrypt", "letsencrypt.org": "lets_encrypt", + "alphonso.tv": "lgads", + "lgads.tv": "lgads", "lgsmartad.com": "lgtv", "lgtvcommon.com": "lgtv", "lgtvsdp.com": "lgtv", @@ -24032,6 +24122,7 @@ "mozilla.net": "mozilla", "mozilla.org": "mozilla", "nflximg.com": "netflix", + "netify.ai": "netify", "nab.com": "nab", "nab.com.au": "nab", "nab.net": "nab", @@ -24074,7 +24165,9 @@ "snap-dev.net": "snap", "snapads.com": "snap", "snapkit.com": "snap", + "switch.tv": "switchtv", "solaredge.com": "solaredge", + "sonos.com": "sonos", "telstra.com.au": "telstra", "telstra.com": "telstra", "usertrust.com": "trustlogo", @@ -24095,6 +24188,8 @@ "yandex.com.tr": "yandex", "yandex.fr": "yandex", "yandex.kz": "yandex", - "appmetrica.yandex.com": "yandex_appmetrica" + "appmetrica.yandex.com": "yandex_appmetrica", + "3gppnetwork.org": "3gpp", + "3gpp.org": "3gpp" } } \ No newline at end of file diff --git a/go.mod b/go.mod index 9352c90ed38..455fd80456c 100644 --- a/go.mod +++ b/go.mod @@ -22,13 +22,13 @@ require ( github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 github.com/mdlayher/netlink v1.7.1 github.com/mdlayher/packet v1.1.1 - github.com/miekg/dns v1.1.50 + github.com/miekg/dns v1.1.53 github.com/quic-go/quic-go v0.33.0 github.com/stretchr/testify v1.8.2 github.com/ti-mo/netfilter v0.5.0 go.etcd.io/bbolt v1.3.7 - golang.org/x/crypto v0.6.0 - golang.org/x/exp v0.0.0-20230306221820-f0f767cdffd6 + golang.org/x/crypto v0.7.0 + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 golang.org/x/net v0.8.0 golang.org/x/sys v0.6.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 @@ -43,25 +43,25 @@ require ( github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 // indirect github.com/bluele/gcache v0.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect - github.com/google/pprof v0.0.0-20230207041349-798e818bf904 // indirect + github.com/google/pprof v0.0.0-20230323073829-e72429f035bd // indirect github.com/josharian/native v1.1.0 // indirect github.com/mdlayher/raw v0.1.0 // indirect github.com/mdlayher/socket v0.4.0 // indirect - github.com/onsi/ginkgo/v2 v2.8.3 // indirect + github.com/onsi/ginkgo/v2 v2.9.2 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.2.1 // indirect - github.com/quic-go/qtls-go1-20 v0.1.1 // indirect - github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect - golang.org/x/mod v0.8.0 // indirect + github.com/quic-go/qtls-go1-19 v0.3.0 // indirect + github.com/quic-go/qtls-go1-20 v0.2.0 // indirect + github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect + golang.org/x/mod v0.9.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/text v0.8.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.7.0 // indirect ) // TODO(a.garipov): Remove this and update github.com/ameshkov/dnscrypt when diff --git a/go.sum b/go.sum index 246eda98f64..69b104d8d33 100644 --- a/go.sum +++ b/go.sum @@ -39,11 +39,11 @@ github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw= github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +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/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -55,8 +55,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= +github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v1.0.1 h1:Lh/jXZmvZxb0BBeSY5VKEfidcbcbenKjZFzM/q0fSeU= github.com/google/renameio v1.0.1/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -104,13 +104,13 @@ github.com/mdlayher/socket v0.2.1/go.mod h1:QLlNPkFR88mRUNQIzRBMfXxwKal8H7u1h3bL github.com/mdlayher/socket v0.4.0 h1:280wsy40IC9M9q1uPGcLBwXpcTQDtoGwVt+BNoITxIw= github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46NlmWuVoc= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw= +github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.8.3 h1:RpbK1G8nWPNaCVFBWsOGnEQQGgASi6b8fxcWBvDYjxQ= -github.com/onsi/ginkgo/v2 v2.8.3/go.mod h1:6OaUA8BCi0aZfmzYT/q9AacwTzDpNbxILUT+TlBq6MY= -github.com/onsi/gomega v1.27.0 h1:QLidEla4bXUuZVFa4KX6JHCsuGgbi85LC/pCHrt/O08= +github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= +github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= +github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -123,10 +123,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.2.1 h1:aJcKNMkH5ASEJB9FXNeZCyTEIHU1J7MmHyz1Q1TSG1A= -github.com/quic-go/qtls-go1-19 v0.2.1/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.1.1 h1:KbChDlg82d3IHqaj2bn6GfKRj84Per2VGf5XV3wSwQk= -github.com/quic-go/qtls-go1-20 v0.1.1/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/qtls-go1-19 v0.3.0 h1:aUBoQdpHzUWtPw5tQZbsD2GnrWCNu7/RIX1PtqGeLYY= +github.com/quic-go/qtls-go1-19 v0.3.0/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.2.0 h1:jUHn+obJ6WI5JudqBO0Iy1ra5Vh5vsitQ1gXQvkmN+E= +github.com/quic-go/qtls-go1-20 v0.2.0/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= github.com/shirou/gopsutil/v3 v3.21.8 h1:nKct+uP0TV8DjjNiHanKf8SAuub+GNsbrOtM9Nl9biA= @@ -153,23 +153,23 @@ github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/u-root/uio v0.0.0-20221213070652-c3537552635f/go.mod h1:IogEAUBXDEwX7oR/BMmCctShYs80ql4hF0ySdzGxf7E= -github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA= -github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= +github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg= +github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/exp v0.0.0-20230306221820-f0f767cdffd6 h1:3p+wVC0x0TCIPgd3LCQlpgVlEtjziEC5v42w7+B8t8M= -golang.org/x/exp v0.0.0-20230306221820-f0f767cdffd6/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +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/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -184,7 +184,6 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= @@ -213,7 +212,6 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -235,9 +233,8 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= 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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/filtering/servicelist.go b/internal/filtering/servicelist.go index 112db94405b..e7222f1f9c3 100644 --- a/internal/filtering/servicelist.go +++ b/internal/filtering/servicelist.go @@ -1182,6 +1182,24 @@ var blockedServices = []blockedService{{ "||gog.com^", "||gogalaxy.com^", }, +}, { + ID: "hbomax", + Name: "HBO Max", + IconSVG: []byte(""), + Rules: []string{ + "||hbo.com^", + "||hbogo.co.th^", + "||hbogo.com^", + "||hbogo.eu^", + "||hbogoasia.com^", + "||hbogoasia.id^", + "||hbogoasia.ph^", + "||hbomax-images.warnermediacdn.com^", + "||hbomax.com^", + "||hbomaxcdn.com^", + "||hbonow.com^", + "||maxgo.com^", + }, }, { ID: "hulu", Name: "Hulu", @@ -1299,6 +1317,21 @@ var blockedServices = []blockedService{{ "||kakao.com^", "||kgslb.com^", }, +}, { + ID: "lazada", + Name: "Lazada", + IconSVG: []byte(""), + Rules: []string{ + "||k1-lazadasg-oversea.gslb.ksyuncdn.com^", + "||lazada.co.id^", + "||lazada.co.th^", + "||lazada.com.my^", + "||lazada.com.ph^", + "||lazada.com^", + "||lazada.sg^", + "||lazada.vn^", + "||slatic.net^", + }, }, { ID: "leagueoflegends", Name: "League of Legends", @@ -1383,7 +1416,6 @@ var blockedServices = []blockedService{{ "||mastodon.sdf.org^", "||mastodon.social^", "||mastodon.social^", - "||mastodon.top^", "||mastodon.uno^", "||mastodon.world^", "||mastodon.xyz^", @@ -1400,6 +1432,7 @@ var blockedServices = []blockedService{{ "||mstdn.jp^", "||mstdn.social^", "||muenchen.social^", + "||muenster.im^", "||newsie.social^", "||noc.social^", "||norden.social^", @@ -1428,6 +1461,7 @@ var blockedServices = []blockedService{{ "||techhub.social^", "||theblower.au^", "||tkz.one^", + "||todon.eu^", "||toot.aquilenet.fr^", "||toot.community^", "||toot.funami.tech^", @@ -1438,7 +1472,6 @@ var blockedServices = []blockedService{{ "||union.place^", "||universeodon.com^", "||urbanists.social^", - "||vocalodon.net^", "||wien.rocks^", "||wxw.moe^", }, @@ -1568,6 +1601,20 @@ var blockedServices = []blockedService{{ "||pinterest.vn^", "||pinterestmail.com^", }, +}, { + ID: "playstation", + Name: "PlayStation", + IconSVG: []byte(""), + Rules: []string{ + "||gaikai.com", + "||playstation-cloud.com", + "||playstation-cloud.net", + "||playstation.com", + "||playstation.net", + "||scea.com", + "||sonyentertainmentnetwork.com", + "||station.sony.com", + }, }, { ID: "qq", Name: "QQ", @@ -1597,6 +1644,18 @@ var blockedServices = []blockedService{{ "||redditmedia.com^", "||redditstatic.com^", }, +}, { + ID: "riot_games", + Name: "Riot Games", + IconSVG: []byte(""), + Rules: []string{ + "||dradis-prod.rdatasrv.net^", + "||pvp.net^", + "||rgpub.io^", + "||riotcdn.com^", + "||riotcdn.net^", + "||riotgames.com^", + }, }, { ID: "roblox", Name: "Roblox", @@ -1610,6 +1669,32 @@ var blockedServices = []blockedService{{ "||robloxcdn.com^", "||robloxdev.cn^", }, +}, { + ID: "shopee", + Name: "Shopee", + IconSVG: []byte(""), + Rules: []string{ + "||shopee.cl^", + "||shopee.cn^", + "||shopee.co.id^", + "||shopee.co.th^", + "||shopee.com.br^", + "||shopee.com.co^", + "||shopee.com.mx^", + "||shopee.com.my^", + "||shopee.com^", + "||shopee.es^", + "||shopee.fr^", + "||shopee.id^", + "||shopee.in^", + "||shopee.io^", + "||shopee.ph^", + "||shopee.sg^", + "||shopee.tw^", + "||shopee.vn^", + "||shopeemobile.com^", + "||shp.ee^", + }, }, { ID: "skype", Name: "Skype", @@ -1813,6 +1898,15 @@ var blockedServices = []blockedService{{ "||twvid.com^", "||vine.co^", }, +}, { + ID: "valorant", + Name: "Valorant", + IconSVG: []byte(""), + Rules: []string{ + "||playvalorant.com", + "||valorant.scd.riotcdn.net", + "||valorant.secure.dyn.riotcdn.net", + }, }, { ID: "viber", Name: "Viber", @@ -1869,6 +1963,13 @@ var blockedServices = []blockedService{{ "||vkuservideo.com^", "||vkuservideo.net^", }, +}, { + ID: "voot", + Name: "Voot", + IconSVG: []byte(""), + Rules: []string{ + "||voot.com^", + }, }, { ID: "wechat", Name: "WeChat", diff --git a/internal/tools/go.mod b/internal/tools/go.mod index d0f5245c118..5ccf495b260 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -9,25 +9,25 @@ require ( github.com/kisielk/errcheck v1.6.3 github.com/kyoh86/looppointer v0.2.1 github.com/securego/gosec/v2 v2.15.0 - golang.org/x/tools v0.6.1-0.20230217175706-3102dad5faf9 - golang.org/x/vuln v0.0.0-20230217204342-b91abcc5ae3c - honnef.co/go/tools v0.4.2 + golang.org/x/tools v0.7.0 + golang.org/x/vuln v0.0.0-20230325131008-9550759f8614 + honnef.co/go/tools v0.4.3 mvdan.cc/gofumpt v0.4.0 - mvdan.cc/unparam v0.0.0-20230125043941-70a0ce6e7b95 + mvdan.cc/unparam v0.0.0-20230312165513-e84e2d14e3b8 ) require ( github.com/BurntSushi/toml v1.2.1 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/gookit/color v1.5.2 // indirect + github.com/gookit/color v1.5.3 // indirect github.com/kyoh86/nolint v0.0.1 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb // indirect - golang.org/x/exp/typeparams v0.0.0-20230213192124-5e25df0256eb // indirect - golang.org/x/mod v0.8.0 // indirect + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect + golang.org/x/exp/typeparams v0.0.0-20230321023759-10a507213a29 // indirect + golang.org/x/mod v0.9.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect + golang.org/x/sys v0.6.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/tools/go.sum b/internal/tools/go.sum index e3c5d1aeefc..7cfd2d3f773 100644 --- a/internal/tools/go.sum +++ b/internal/tools/go.sum @@ -3,7 +3,6 @@ github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= @@ -16,8 +15,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gookit/color v1.5.2 h1:uLnfXcaFjlrDnQDT+NCBcfhrXqYTx/rcCa6xn01Y8yI= -github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= +github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= +github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbrhuD+9fLZ4iaAVwhlp5PEhmnBt7yvK2Oy5C1U= github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= @@ -38,13 +37,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/securego/gosec/v2 v2.15.0 h1:v4Ym7FF58/jlykYmmhZ7mTm7FQvN/setNm++0fgIAtw= github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -54,22 +48,22 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w= -golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp/typeparams v0.0.0-20230213192124-5e25df0256eb h1:WGs/bGIWYyAY5PVgGGMXqGGCxSJz4fpoUExb/vgqNCU= -golang.org/x/exp/typeparams v0.0.0-20230213192124-5e25df0256eb/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +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-20230321023759-10a507213a29 h1:e7LhZmJ631l59keHP9ssC3sgSn3/oiEHKHKXDkimURY= +golang.org/x/exp/typeparams v0.0.0-20230321023759-10a507213a29/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.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= 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= @@ -84,8 +78,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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= @@ -97,21 +91,20 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn 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.6.1-0.20230217175706-3102dad5faf9 h1:IuFp2CklNBim6OdHXn/1P4VoeKt5pA2jcDKWlboqtlQ= -golang.org/x/tools v0.6.1-0.20230217175706-3102dad5faf9/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/vuln v0.0.0-20230217204342-b91abcc5ae3c h1:7/jJkMpaKZMxdyOQ7IP7aPbJQaDk4cOUxtXtWHQ1cSk= -golang.org/x/vuln v0.0.0-20230217204342-b91abcc5ae3c/go.mod h1:LTLnfk/dpXDNKsX6aCg/cI4LyCVnTyrQhgV/yLJuly0= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/vuln v0.0.0-20230325131008-9550759f8614 h1:ioRvkxpf+3iq9xvzP6AWjaBuROUad9SmjLr0QWBzxKw= +golang.org/x/vuln v0.0.0-20230325131008-9550759f8614/go.mod h1:64LpnL2PuSMzFYeCmJjYiRbroOUG9aCZYznINnF5PHE= 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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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.2 h1:6qXr+R5w+ktL5UkwEbPp+fEvfyoMPche6GkOpGHZcLc= -honnef.co/go/tools v0.4.2/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= +honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= +honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= -mvdan.cc/unparam v0.0.0-20230125043941-70a0ce6e7b95 h1:n/xhncJPSt0YzfOhnyn41XxUdrWQNgmLBG72FE27Fqw= -mvdan.cc/unparam v0.0.0-20230125043941-70a0ce6e7b95/go.mod h1:2vU506e8nGWodqcci641NLi4im2twWSq4Lod756epHQ= +mvdan.cc/unparam v0.0.0-20230312165513-e84e2d14e3b8 h1:VuJo4Mt0EVPychre4fNlDWDuE5AjXtPJpRUWqZDQhaI= +mvdan.cc/unparam v0.0.0-20230312165513-e84e2d14e3b8/go.mod h1:Oh/d7dEtzsNHGOq1Cdv8aMm3KdKhVvPbRQcM8WFpBR8= From 1731ce9c6306ba90e3c721243f5d4d51bbdf30f8 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Fri, 31 Mar 2023 17:39:04 +0300 Subject: [PATCH 3/5] Pull request 1795: 5661-imp-querylog-logging Updates #5661. Squashed commit of the following: commit 3fac63fb4ac906e61f6bb2d2af5408771d93a206 Author: Ainar Garipov Date: Fri Mar 31 17:24:00 2023 +0300 querylog: imp locks even more commit bf14ab9a5ea1be83ac156dc5f3d7f3717d50767b Author: Ainar Garipov Date: Fri Mar 31 17:09:25 2023 +0300 querylog: imp locks more commit 40e885f39b4c38dcd387d4799529b0fa150ed520 Author: Ainar Garipov Date: Fri Mar 31 16:26:15 2023 +0300 querylog: imp locks, logs --- CHANGELOG.md | 10 ++-- go.mod | 4 -- go.sum | 4 +- internal/querylog/http.go | 78 ++++++++++++++++++------------- internal/querylog/qlog.go | 51 +++++++++++--------- internal/querylog/qlogreader.go | 1 + internal/querylog/querylogfile.go | 40 ++++++++++------ internal/querylog/search.go | 28 ++++++----- 8 files changed, 126 insertions(+), 90 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54ea69a17e5..3fc0cd683cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,7 @@ NOTE: Add new changes BELOW THIS COMMENT. is described in `openapi/openapi.yaml`. The duration of this pause could also be set with the config field `protection_disabled_until` in `dns` section of the YAML configuration file. -- Ability to create a static DHCP lease from a dynamic one more easily +- The ability to create a static DHCP lease from a dynamic one more easily ([#3459]). - Two new HTTP APIs, `PUT /control/stats/config/update` and `GET control/stats/config`, which can be used to set and receive the query log @@ -103,10 +103,10 @@ In this release, the schema version has changed from 17 to 20. - The `POST /control/safesearch/disable` HTTP API is deprecated. Use the new `PUT /control/safesearch/settings` API - The `safesearch_enabled` field is deprecated in the following HTTP APIs: - - `GET /control/clients` - - `POST /control/clients/add` - - `POST /control/clients/update` - - `GET /control/clients/find?ip0=...&ip1=...&ip2=...` + - `GET /control/clients`; + - `POST /control/clients/add`; + - `POST /control/clients/update`; + - `GET /control/clients/find?ip0=...&ip1=...&ip2=...`. Check `openapi/openapi.yaml` for more details. - The `GET /control/stats_info` HTTP API; use the new `GET diff --git a/go.mod b/go.mod index 455fd80456c..d2b9dc5b90e 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,3 @@ require ( golang.org/x/text v0.8.0 // indirect golang.org/x/tools v0.7.0 // indirect ) - -// TODO(a.garipov): Remove this and update github.com/ameshkov/dnscrypt when -// it's released. -replace github.com/ameshkov/dnscrypt/v2 => github.com/ainar-g/dnscrypt/v2 v2.0.1-0.20230315131826-cdb2bf61bda8 diff --git a/go.sum b/go.sum index 69b104d8d33..df72582ee9e 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,8 @@ github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmH github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw= github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635/go.mod h1:lmLxL+FV291OopO93Bwf9fQLQeLyt33VJRUg5VJ30us= -github.com/ainar-g/dnscrypt/v2 v2.0.1-0.20230315131826-cdb2bf61bda8 h1:jc3/aOQ01Yy3vxB/uqcuUi4F+6E/FKWaTCHq5J1ef2o= -github.com/ainar-g/dnscrypt/v2 v2.0.1-0.20230315131826-cdb2bf61bda8/go.mod h1:qPWhwz6FdSmuK7W4sMyvogrez4MWdtzosdqlr0Rg3ow= +github.com/ameshkov/dnscrypt/v2 v2.2.6 h1:rE7AFbPWebq7me7RVS66Cipd1m7ef1yf2+C8QzjQXXE= +github.com/ameshkov/dnscrypt/v2 v2.2.6/go.mod h1:qPWhwz6FdSmuK7W4sMyvogrez4MWdtzosdqlr0Rg3ow= github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1OYVo= github.com/ameshkov/dnsstamps v1.0.3/go.mod h1:Ii3eUu73dx4Vw5O4wjzmT5+lkCwovjzaEZZ4gKyIH5A= github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 h1:0b2vaepXIfMsG++IsjHiI2p4bxALD1Y2nQKGMR5zDQM= diff --git a/internal/querylog/http.go b/internal/querylog/http.go index d67c962cf53..e15c84858b0 100644 --- a/internal/querylog/http.go +++ b/internal/querylog/http.go @@ -60,41 +60,48 @@ type getConfigResp struct { // Register web handlers func (l *queryLog) initWeb() { l.conf.HTTPRegister(http.MethodGet, "/control/querylog", l.handleQueryLog) - l.conf.HTTPRegister(http.MethodGet, "/control/querylog_info", l.handleQueryLogInfo) l.conf.HTTPRegister(http.MethodPost, "/control/querylog_clear", l.handleQueryLogClear) - l.conf.HTTPRegister(http.MethodPost, "/control/querylog_config", l.handleQueryLogConfig) - l.conf.HTTPRegister(http.MethodGet, "/control/querylog/config", l.handleGetQueryLogConfig) l.conf.HTTPRegister( http.MethodPut, "/control/querylog/config/update", l.handlePutQueryLogConfig, ) + + // Deprecated handlers. + l.conf.HTTPRegister(http.MethodGet, "/control/querylog_info", l.handleQueryLogInfo) + l.conf.HTTPRegister(http.MethodPost, "/control/querylog_config", l.handleQueryLogConfig) } +// handleQueryLog is the handler for the GET /control/querylog HTTP API. func (l *queryLog) handleQueryLog(w http.ResponseWriter, r *http.Request) { - l.lock.Lock() - defer l.lock.Unlock() - - params, err := l.parseSearchParams(r) + params, err := parseSearchParams(r) if err != nil { - aghhttp.Error(r, w, http.StatusBadRequest, "failed to parse params: %s", err) + aghhttp.Error(r, w, http.StatusBadRequest, "parsing params: %s", err) return } - entries, oldest := l.search(params) - data := l.entriesToJSON(entries, oldest) + var resp map[string]any + func() { + l.lock.Lock() + defer l.lock.Unlock() - _ = aghhttp.WriteJSONResponse(w, r, data) + entries, oldest := l.search(params) + resp = l.entriesToJSON(entries, oldest) + }() + + _ = aghhttp.WriteJSONResponse(w, r, resp) } +// handleQueryLogClear is the handler for the POST /control/querylog/clear HTTP +// API. func (l *queryLog) handleQueryLogClear(_ http.ResponseWriter, _ *http.Request) { l.clear() } -// handleQueryLogInfo handles requests to the GET /control/querylog_info -// endpoint. +// handleQueryLogInfo is the handler for the GET /control/querylog_info HTTP +// API. // // Deprecated: Remove it when migration to the new API is over. func (l *queryLog) handleQueryLogInfo(w http.ResponseWriter, r *http.Request) { @@ -116,20 +123,25 @@ func (l *queryLog) handleQueryLogInfo(w http.ResponseWriter, r *http.Request) { }) } -// handleGetQueryLogConfig handles requests to the GET /control/querylog/config -// endpoint. +// handleGetQueryLogConfig is the handler for the GET /control/querylog/config +// HTTP API. func (l *queryLog) handleGetQueryLogConfig(w http.ResponseWriter, r *http.Request) { - l.lock.Lock() - defer l.lock.Unlock() + var resp *getConfigResp + func() { + l.lock.Lock() + defer l.lock.Unlock() + + resp = &getConfigResp{ + Interval: float64(l.conf.RotationIvl.Milliseconds()), + Enabled: aghalg.BoolToNullBool(l.conf.Enabled), + AnonymizeClientIP: aghalg.BoolToNullBool(l.conf.AnonymizeClientIP), + Ignored: l.conf.Ignored.Values(), + } - ignored := l.conf.Ignored.Values() - slices.Sort(ignored) - _ = aghhttp.WriteJSONResponse(w, r, getConfigResp{ - Ignored: ignored, - Interval: float64(l.conf.RotationIvl.Milliseconds()), - Enabled: aghalg.BoolToNullBool(l.conf.Enabled), - AnonymizeClientIP: aghalg.BoolToNullBool(l.conf.AnonymizeClientIP), - }) + slices.Sort(resp.Ignored) + }() + + _ = aghhttp.WriteJSONResponse(w, r, resp) } // AnonymizeIP masks ip to anonymize the client if the ip is a valid one. @@ -146,7 +158,8 @@ func AnonymizeIP(ip net.IP) { } } -// handleQueryLogConfig handles the POST /control/querylog_config queries. +// handleQueryLogConfig is the handler for the POST /control/querylog_config +// HTTP API. // // Deprecated: Remove it when migration to the new API is over. func (l *queryLog) handleQueryLogConfig(w http.ResponseWriter, r *http.Request) { @@ -198,8 +211,8 @@ func (l *queryLog) handleQueryLogConfig(w http.ResponseWriter, r *http.Request) l.conf = &conf } -// handlePutQueryLogConfig handles the PUT /control/querylog/config/update -// queries. +// handlePutQueryLogConfig is the handler for the PUT +// /control/querylog/config/update HTTP API. func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Request) { newConf := &getConfigResp{} err := json.NewDecoder(r.Body).Decode(newConf) @@ -268,7 +281,7 @@ func getDoubleQuotesEnclosedValue(s *string) bool { } // parseSearchCriterion parses a search criterion from the query parameter. -func (l *queryLog) parseSearchCriterion(q url.Values, name string, ct criterionType) ( +func parseSearchCriterion(q url.Values, name string, ct criterionType) ( ok bool, sc searchCriterion, err error, @@ -317,8 +330,9 @@ func (l *queryLog) parseSearchCriterion(q url.Values, name string, ct criterionT return true, sc, nil } -// parseSearchParams - parses "searchParams" from the HTTP request's query string -func (l *queryLog) parseSearchParams(r *http.Request) (p *searchParams, err error) { +// parseSearchParams parses search parameters from the HTTP request's query +// string. +func parseSearchParams(r *http.Request) (p *searchParams, err error) { p = newSearchParams() q := r.URL.Query() @@ -356,7 +370,7 @@ func (l *queryLog) parseSearchParams(r *http.Request) (p *searchParams, err erro }} { var ok bool var c searchCriterion - ok, c, err = l.parseSearchCriterion(q, v.urlField, v.ct) + ok, c, err = parseSearchCriterion(q, v.urlField, v.ct) if err != nil { return nil, err } diff --git a/internal/querylog/qlog.go b/internal/querylog/qlog.go index c46200c53f1..8d61727a62e 100644 --- a/internal/querylog/qlog.go +++ b/internal/querylog/qlog.go @@ -155,10 +155,13 @@ func (l *queryLog) clear() { l.fileFlushLock.Lock() defer l.fileFlushLock.Unlock() - l.bufferLock.Lock() - l.buffer = nil - l.flushPending = false - l.bufferLock.Unlock() + func() { + l.bufferLock.Lock() + defer l.bufferLock.Unlock() + + l.buffer = nil + l.flushPending = false + }() oldLogFile := l.logFile + ".1" err := os.Remove(oldLogFile) @@ -241,26 +244,30 @@ func (l *queryLog) Add(params *AddParams) { entry.OrigAnswer = a } - l.bufferLock.Lock() - l.buffer = append(l.buffer, &entry) needFlush := false - - if !l.conf.FileEnabled { - if len(l.buffer) > int(l.conf.MemSize) { - // writing to file is disabled - just remove the oldest entry from array - // - // TODO(a.garipov): This should be replaced by a proper ring buffer, - // but it's currently difficult to do that. - l.buffer[0] = nil - l.buffer = l.buffer[1:] + func() { + l.bufferLock.Lock() + defer l.bufferLock.Unlock() + + l.buffer = append(l.buffer, &entry) + + if !l.conf.FileEnabled { + if len(l.buffer) > int(l.conf.MemSize) { + // Writing to file is disabled, so just remove the oldest entry + // from the slices. + // + // TODO(a.garipov): This should be replaced by a proper ring + // buffer, but it's currently difficult to do that. + l.buffer[0] = nil + l.buffer = l.buffer[1:] + } + } else if !l.flushPending { + needFlush = len(l.buffer) >= int(l.conf.MemSize) + if needFlush { + l.flushPending = true + } } - } else if !l.flushPending { - needFlush = len(l.buffer) >= int(l.conf.MemSize) - if needFlush { - l.flushPending = true - } - } - l.bufferLock.Unlock() + }() // if buffer needs to be flushed to disk, do it now if needFlush { diff --git a/internal/querylog/qlogreader.go b/internal/querylog/qlogreader.go index 704dc5ca02b..3454a441335 100644 --- a/internal/querylog/qlogreader.go +++ b/internal/querylog/qlogreader.go @@ -106,6 +106,7 @@ func (r *QLogReader) SeekStart() error { r.currentFile = len(r.qFiles) - 1 _, err := r.qFiles[r.currentFile].SeekStart() + return err } diff --git a/internal/querylog/querylogfile.go b/internal/querylog/querylogfile.go index 23e750faa31..b526ca19073 100644 --- a/internal/querylog/querylogfile.go +++ b/internal/querylog/querylogfile.go @@ -11,8 +11,9 @@ import ( "github.com/AdguardTeam/golibs/log" ) -// flushLogBuffer flushes the current buffer to file and resets the current buffer -func (l *queryLog) flushLogBuffer(fullFlush bool) error { +// flushLogBuffer flushes the current buffer to file and resets the current +// buffer. +func (l *queryLog) flushLogBuffer(fullFlush bool) (err error) { if !l.conf.FileEnabled { return nil } @@ -20,31 +21,42 @@ func (l *queryLog) flushLogBuffer(fullFlush bool) error { l.fileFlushLock.Lock() defer l.fileFlushLock.Unlock() - // flush remainder to file - l.bufferLock.Lock() - needFlush := len(l.buffer) >= int(l.conf.MemSize) - if !needFlush && !fullFlush { - l.bufferLock.Unlock() + // Flush the remainder to file. + var flushBuffer []*logEntry + needFlush := fullFlush + func() { + l.bufferLock.Lock() + defer l.bufferLock.Unlock() + + needFlush = needFlush || len(l.buffer) >= int(l.conf.MemSize) + if needFlush { + flushBuffer = l.buffer + l.buffer = nil + l.flushPending = false + } + }() + if !needFlush { return nil } - flushBuffer := l.buffer - l.buffer = nil - l.flushPending = false - l.bufferLock.Unlock() - err := l.flushToFile(flushBuffer) + + err = l.flushToFile(flushBuffer) if err != nil { - log.Error("Saving querylog to file failed: %s", err) + log.Error("querylog: writing to file: %s", err) + return err } + return nil } // flushToFile saves the specified log entries to the query log file func (l *queryLog) flushToFile(buffer []*logEntry) (err error) { if len(buffer) == 0 { - log.Debug("querylog: there's nothing to write to a file") + log.Debug("querylog: nothing to write to a file") + return nil } + start := time.Now() var b bytes.Buffer diff --git a/internal/querylog/search.go b/internal/querylog/search.go index 332c2e81106..e371111de79 100644 --- a/internal/querylog/search.go +++ b/internal/querylog/search.go @@ -76,15 +76,20 @@ func (l *queryLog) searchMemory(params *searchParams, cache clientCache) (entrie // search - searches log entries in the query log using specified parameters // returns the list of entries found + time of the oldest entry func (l *queryLog) search(params *searchParams) (entries []*logEntry, oldest time.Time) { - now := time.Now() + start := time.Now() if params.limit == 0 { return []*logEntry{}, time.Time{} } cache := clientCache{} - fileEntries, oldest, total := l.searchFiles(params, cache) + memoryEntries, bufLen := l.searchMemory(params, cache) + log.Debug("querylog: got %d entries from memory", len(memoryEntries)) + + fileEntries, oldest, total := l.searchFiles(params, cache) + log.Debug("querylog: got %d entries from files", len(fileEntries)) + total += bufLen totalLimit := params.offset + params.limit @@ -123,7 +128,7 @@ func (l *queryLog) search(params *searchParams) (entries []*logEntry, oldest tim len(entries), total, params.olderThan, - time.Since(now), + time.Since(start), ) return entries, oldest @@ -145,13 +150,14 @@ func (l *queryLog) searchFiles( r, err := NewQLogReader(files) if err != nil { - log.Error("querylog: failed to open qlog reader: %s", err) + log.Error("querylog: opening qlog reader: %s", err) return entries, oldest, 0 } + defer func() { - derr := r.Close() - if derr != nil { + closeErr := r.Close() + if closeErr != nil { log.Error("querylog: closing file: %s", err) } }() @@ -161,8 +167,8 @@ func (l *queryLog) searchFiles( } else { err = r.seekTS(params.olderThan.UnixNano()) if err == nil { - // Read to the next record, because we only need the one - // that goes after it. + // Read to the next record, because we only need the one that goes + // after it. _, err = r.ReadNext() } } @@ -176,9 +182,9 @@ func (l *queryLog) searchFiles( totalLimit := params.offset + params.limit oldestNano := int64(0) - // By default, we do not scan more than maxFileScanEntries at once. - // The idea is to make search calls faster so that the UI could handle - // it and show something quicker. This behavior can be overridden if + // By default, we do not scan more than maxFileScanEntries at once. The + // idea is to make search calls faster so that the UI could handle it and + // show something quicker. This behavior can be overridden if // maxFileScanEntries is set to 0. for total < params.maxFileScanEntries || params.maxFileScanEntries <= 0 { var e *logEntry From f191cb07a5c7160ac6fede7ffa4573edcd914751 Mon Sep 17 00:00:00 2001 From: Eugene Burkov Date: Fri, 31 Mar 2023 18:07:00 +0300 Subject: [PATCH 4/5] Pull request 1794: 3290-kill-zombies Merge in DNS/adguard-home from 3290-kill-zombies to master Updates #3290. Squashed commit of the following: commit 3e0626024243e48e253451a322961e1011976ce3 Merge: 5aa7aa4e 1731ce9c Author: Eugene Burkov Date: Fri Mar 31 20:04:04 2023 +0500 Merge branch 'master' into 3290-kill-zombies commit 5aa7aa4e17c76d1226ba1d44639c67e12454e4e7 Author: Eugene Burkov Date: Fri Mar 31 16:38:00 2023 +0500 docker: add doc commit 52a0b671c3f229250988ecd32c0bf909b50fc59b Author: Eugene Burkov Date: Fri Mar 31 14:41:41 2023 +0500 docker: add init emulator --- docker/Dockerfile | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 38a34bcddfd..57ab408e2e0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -25,6 +25,8 @@ RUN apk --no-cache add ca-certificates libcap tzdata && \ mkdir -p /opt/adguardhome/conf /opt/adguardhome/work && \ chown -R nobody: /opt/adguardhome +RUN apk --no-cache add tini + ARG DIST_DIR ARG TARGETARCH ARG TARGETOS @@ -62,11 +64,22 @@ COPY --chown=nobody:nogroup\ ./${DIST_DIR}/docker/scripts\ /opt/adguardhome/scripts -ENTRYPOINT ["/opt/adguardhome/AdGuardHome"] +HEALTHCHECK \ + --interval=30s \ + --timeout=10s \ + --retries=3 \ + CMD [ "/opt/adguardhome/scripts/healthcheck.sh" ] -HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD [ "/opt/adguardhome/scripts/healthcheck.sh" ] +# It seems that the healthckech script sometimes spawns zombie processes, so we +# need a way to handle them, since AdGuard Home doesn't know how to keep track +# of the processes delegated to it by the OS. Use tini as entry point because +# it needs the PID=1 to be the default parent for orphaned processes. +# +# See https://github.com/adguardTeam/adGuardHome/issues/3290. +ENTRYPOINT [ "/sbin/tini", "--" ] CMD [ \ + "/opt/adguardhome/AdGuardHome", \ "--no-check-update", \ "-c", "/opt/adguardhome/conf/AdGuardHome.yaml", \ "-h", "0.0.0.0", \ From 3575aa057060ddaf8801a412e295db975fdc61e2 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Fri, 31 Mar 2023 18:44:51 +0300 Subject: [PATCH 5/5] Pull request 1796: 5661-opt-more-lock Updates #5661. Squashed commit of the following: commit 0a1425df0ea1278c73ac88cbee053897d3daaf1b Author: Ainar Garipov Date: Fri Mar 31 18:31:19 2023 +0300 querylog: opt locks more --- internal/querylog/http.go | 32 +++++++++++++++------------- internal/querylog/json.go | 18 +++++++++------- internal/querylog/qlog.go | 13 +++++++----- internal/querylog/qlog_test.go | 2 +- internal/querylog/querylog.go | 35 +++++++++++++------------------ internal/querylog/querylogfile.go | 4 ++-- 6 files changed, 54 insertions(+), 50 deletions(-) diff --git a/internal/querylog/http.go b/internal/querylog/http.go index e15c84858b0..1a29e23de34 100644 --- a/internal/querylog/http.go +++ b/internal/querylog/http.go @@ -82,15 +82,17 @@ func (l *queryLog) handleQueryLog(w http.ResponseWriter, r *http.Request) { return } - var resp map[string]any + var entries []*logEntry + var oldest time.Time func() { - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.RLock() + defer l.confMu.RUnlock() - entries, oldest := l.search(params) - resp = l.entriesToJSON(entries, oldest) + entries, oldest = l.search(params) }() + resp := entriesToJSON(entries, oldest, l.anonymizer.Load()) + _ = aghhttp.WriteJSONResponse(w, r, resp) } @@ -105,8 +107,8 @@ func (l *queryLog) handleQueryLogClear(_ http.ResponseWriter, _ *http.Request) { // // Deprecated: Remove it when migration to the new API is over. func (l *queryLog) handleQueryLogInfo(w http.ResponseWriter, r *http.Request) { - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.RLock() + defer l.confMu.RUnlock() ivl := l.conf.RotationIvl @@ -128,8 +130,8 @@ func (l *queryLog) handleQueryLogInfo(w http.ResponseWriter, r *http.Request) { func (l *queryLog) handleGetQueryLogConfig(w http.ResponseWriter, r *http.Request) { var resp *getConfigResp func() { - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.RLock() + defer l.confMu.RUnlock() resp = &getConfigResp{ Interval: float64(l.conf.RotationIvl.Milliseconds()), @@ -137,10 +139,10 @@ func (l *queryLog) handleGetQueryLogConfig(w http.ResponseWriter, r *http.Reques AnonymizeClientIP: aghalg.BoolToNullBool(l.conf.AnonymizeClientIP), Ignored: l.conf.Ignored.Values(), } - - slices.Sort(resp.Ignored) }() + slices.Sort(resp.Ignored) + _ = aghhttp.WriteJSONResponse(w, r, resp) } @@ -187,8 +189,8 @@ func (l *queryLog) handleQueryLogConfig(w http.ResponseWriter, r *http.Request) defer l.conf.ConfigModified() - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.Lock() + defer l.confMu.Unlock() conf := *l.conf if newConf.Enabled != aghalg.NBNull { @@ -251,8 +253,8 @@ func (l *queryLog) handlePutQueryLogConfig(w http.ResponseWriter, r *http.Reques defer l.conf.ConfigModified() - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.Lock() + defer l.confMu.Unlock() conf := *l.conf diff --git a/internal/querylog/json.go b/internal/querylog/json.go index 33fc997afdf..76a406eb4ef 100644 --- a/internal/querylog/json.go +++ b/internal/querylog/json.go @@ -19,12 +19,16 @@ import ( type jobject = map[string]any // entriesToJSON converts query log entries to JSON. -func (l *queryLog) entriesToJSON(entries []*logEntry, oldest time.Time) (res jobject) { +func entriesToJSON( + entries []*logEntry, + oldest time.Time, + anonFunc aghnet.IPMutFunc, +) (res jobject) { data := make([]jobject, 0, len(entries)) // The elements order is already reversed to be from newer to older. for _, entry := range entries { - jsonEntry := l.entryToJSON(entry, l.anonymizer.Load()) + jsonEntry := entryToJSON(entry, anonFunc) data = append(data, jsonEntry) } @@ -40,7 +44,7 @@ func (l *queryLog) entriesToJSON(entries []*logEntry, oldest time.Time) (res job } // entryToJSON converts a log entry's data into an entry for the JSON API. -func (l *queryLog) entryToJSON(entry *logEntry, anonFunc aghnet.IPMutFunc) (jsonEntry jobject) { +func entryToJSON(entry *logEntry, anonFunc aghnet.IPMutFunc) (jsonEntry jobject) { hostname := entry.QHost question := jobject{ "type": entry.QType, @@ -92,14 +96,14 @@ func (l *queryLog) entryToJSON(entry *logEntry, anonFunc aghnet.IPMutFunc) (json jsonEntry["service_name"] = entry.Result.ServiceName } - l.setMsgData(entry, jsonEntry) - l.setOrigAns(entry, jsonEntry) + setMsgData(entry, jsonEntry) + setOrigAns(entry, jsonEntry) return jsonEntry } // setMsgData sets the message data in jsonEntry. -func (l *queryLog) setMsgData(entry *logEntry, jsonEntry jobject) { +func setMsgData(entry *logEntry, jsonEntry jobject) { if len(entry.Answer) == 0 { return } @@ -122,7 +126,7 @@ func (l *queryLog) setMsgData(entry *logEntry, jsonEntry jobject) { } // setOrigAns sets the original answer data in jsonEntry. -func (l *queryLog) setOrigAns(entry *logEntry, jsonEntry jobject) { +func setOrigAns(entry *logEntry, jsonEntry jobject) { if len(entry.OrigAnswer) == 0 { return } diff --git a/internal/querylog/qlog.go b/internal/querylog/qlog.go index 8d61727a62e..97d5e80947a 100644 --- a/internal/querylog/qlog.go +++ b/internal/querylog/qlog.go @@ -25,9 +25,12 @@ const ( type queryLog struct { findClient func(ids []string) (c *Client, err error) - conf *Config - lock sync.Mutex - logFile string // path to the log file + // confMu protects conf. + confMu *sync.RWMutex + conf *Config + + // logFile is the path to the log file. + logFile string // bufferLock protects buffer. bufferLock sync.RWMutex @@ -279,8 +282,8 @@ func (l *queryLog) Add(params *AddParams) { // ShouldLog returns true if request for the host should be logged. func (l *queryLog) ShouldLog(host string, _, _ uint16) bool { - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.RLock() + defer l.confMu.RUnlock() return !l.isIgnored(host) } diff --git a/internal/querylog/qlog_test.go b/internal/querylog/qlog_test.go index d27c452ea4e..afb44152d44 100644 --- a/internal/querylog/qlog_test.go +++ b/internal/querylog/qlog_test.go @@ -259,11 +259,11 @@ func TestQueryLogShouldLog(t *testing.T) { set := stringutil.NewSet(ignored1, ignored2) l, err := newQueryLog(Config{ + Ignored: set, Enabled: true, RotationIvl: timeutil.Day, MemSize: 100, BaseDir: t.TempDir(), - Ignored: set, }) require.NoError(t, err) diff --git a/internal/querylog/querylog.go b/internal/querylog/querylog.go index fb1fb9b0e19..ee3edca2d29 100644 --- a/internal/querylog/querylog.go +++ b/internal/querylog/querylog.go @@ -4,6 +4,7 @@ import ( "fmt" "net" "path/filepath" + "sync" "time" "github.com/AdguardTeam/AdGuardHome/internal/aghhttp" @@ -33,11 +34,14 @@ type QueryLog interface { // Config is the query log configuration structure. type Config struct { + // Ignored is the list of host names, which should not be written to log. + Ignored *stringutil.Set + // Anonymizer processes the IP addresses to anonymize those if needed. Anonymizer *aghnet.IPMut - // ConfigModified is called when the configuration is changed, for - // example by HTTP requests. + // ConfigModified is called when the configuration is changed, for example + // by HTTP requests. ConfigModified func() // HTTPRegister registers an HTTP handler. @@ -49,20 +53,13 @@ type Config struct { // BaseDir is the base directory for log files. BaseDir string - // RotationIvl is the interval for log rotation. After that period, the - // old log file will be renamed, NOT deleted, so the actual log - // retention time is twice the interval. The value must be one of: - // - // 6 * time.Hour - // 1 * timeutil.Day - // 7 * timeutil.Day - // 30 * timeutil.Day - // 90 * timeutil.Day - // + // RotationIvl is the interval for log rotation. After that period, the old + // log file will be renamed, NOT deleted, so the actual log retention time + // is twice the interval. RotationIvl time.Duration - // MemSize is the number of entries kept in a memory buffer before they - // are flushed to disk. + // MemSize is the number of entries kept in a memory buffer before they are + // flushed to disk. MemSize uint32 // Enabled tells if the query log is enabled. @@ -74,10 +71,6 @@ type Config struct { // AnonymizeClientIP tells if the query log should anonymize clients' IP // addresses. AnonymizeClientIP bool - - // Ignored is the list of host names, which should not be written to - // log. - Ignored *stringutil.Set } // AddParams is the parameters for adding an entry. @@ -150,11 +143,13 @@ func newQueryLog(conf Config) (l *queryLog, err error) { l = &queryLog{ findClient: findClient, - logFile: filepath.Join(conf.BaseDir, queryLogFileName), + conf: &Config{}, + confMu: &sync.RWMutex{}, + logFile: filepath.Join(conf.BaseDir, queryLogFileName), + anonymizer: conf.Anonymizer, } - l.conf = &Config{} *l.conf = conf err = validateIvl(conf.RotationIvl) diff --git a/internal/querylog/querylogfile.go b/internal/querylog/querylogfile.go index b526ca19073..8fadcb623b6 100644 --- a/internal/querylog/querylogfile.go +++ b/internal/querylog/querylogfile.go @@ -167,8 +167,8 @@ func (l *queryLog) periodicRotate() { // checkAndRotate rotates log files if those are older than the specified // rotation interval. func (l *queryLog) checkAndRotate() { - l.lock.Lock() - defer l.lock.Unlock() + l.confMu.RLock() + defer l.confMu.RUnlock() oldest, err := l.readFileFirstTimeValue() if err != nil && !errors.Is(err, os.ErrNotExist) {