diff --git a/README.md b/README.md
index a2666953b9f..86862dc5f87 100644
--- a/README.md
+++ b/README.md
@@ -124,9 +124,9 @@ See our [Wiki][wiki].
### API
-If you want to integrate with AdGuard Home, you can use our [REST API][openapi]. Alternatively, you can use this [python client][pyclient], which is used to build the [AdGuard Home Hass.io Add-on][hassio].
+If you want to integrate with AdGuard Home, you can use our [REST API][openapi]. Alternatively, you can use this [python client][pyclient], which can be used to build the [AdGuard Home Assistant integration][assistant-integration].
-[hassio]: https://www.home-assistant.io/integrations/adguard/
+[assistant-integration]: https://www.home-assistant.io/integrations/adguard/
[openapi]: https://github.com/AdguardTeam/AdGuardHome/tree/master/openapi
[pyclient]: https://pypi.org/project/adguardhome/
diff --git a/client/src/__locales/da.json b/client/src/__locales/da.json
index 70ddcee69fb..df798c311eb 100644
--- a/client/src/__locales/da.json
+++ b/client/src/__locales/da.json
@@ -1,5 +1,5 @@
{
- "access_allowed_desc": "En liste over CIDR'er, IP-adresser eller KlientID'er. Har listen poster, accepterer AdGuard Home kun forespørgsler fra disse klienter.",
+ "access_allowed_desc": "En liste over CIDR'er, IP-adresser eller ClientID'er. Indeholder listen poster, accepterer AdGuard Home kun forespørgsler fra disse klienter.",
"access_allowed_title": "Tilladte klienter",
"access_blocked_desc": "Ikke at forveksle med filtre. AdGuard Home dropper DNS-forespørgsler matchende disse domæner, ej heller vil forespørgslerne optræde i forespørgselsloggen. Der kan angives præcise domænenavne, jokertegn eller URL-filterregler, f.eks. \"eksempel.org\", \"*.eksempel.org\", \"||eksempel.org^\" eller tilsvarende.",
"access_blocked_title": "Ikke tilladte domæner",
@@ -386,7 +386,7 @@
"form_enter_id": "Angiv identifikator",
"form_enter_ip": "Angiv IP",
"form_enter_mac": "Angiv MAC",
- "form_enter_rate_limit": "Angiv hyppighedsgrænse",
+ "form_enter_rate_limit": "Angiv antalsgrænse",
"form_enter_rate_limit_subnet_len": "Angiv længden på undernetpræfiks til hastighedsbegrænsning",
"form_enter_subnet_ip": "Indtast en IP-adresse i subnettet \"{{cidr}}\"",
"form_enter_upstream_timeout": "Angiv varigheden af upstream-server timeout i sekunder",
@@ -579,7 +579,7 @@
"rate_limit_subnet_len_ipv6_desc": "Længde på undernetpræfiks for IPv6-adresser til hastighedsbegrænsning. Standard er 56",
"rate_limit_subnet_len_ipv6_error": "Længden på IPv6-undernetpræfiks skal være mellem 0 og 128",
"rate_limit_whitelist": "Hvidliste til hastighedsbegrænsning",
- "rate_limit_whitelist_desc": "IP-adresser undtaget fra hastighedsbegrænsning",
+ "rate_limit_whitelist_desc": "IP-adresser undtaget fra antalsbegrænsning",
"rate_limit_whitelist_placeholder": "Angiv én IP-adresse pr. linje",
"refresh_btn": "Opdatér",
"refresh_statics": "Opdatér statistikerne",
@@ -749,7 +749,7 @@
"use_adguard_parental": "Brug AdGuards forældrekontrolwebtjeneste",
"use_adguard_parental_hint": "AdGuard Home vil tjekke, om domænet indeholder voksenindhold vha. den samme fortrolighedsvenlige API som browsingsikkerhedswebtjenesten.",
"use_private_ptr_resolvers_desc": "Opløs PTR-, SOA- og NS-forespørgsler til ARPA-domæner indeholdende private adresser vha. private upstream-servere, DHCP, /etc/hosts mv. Hvis deaktiveret, besvarer AdGuard Home sådanne forespørgsler med NXDOMAIN.",
- "use_private_ptr_resolvers_title": "Brug private reverse DNS-opløsere",
+ "use_private_ptr_resolvers_title": "Brug private reverse-DNS-opløsere",
"use_saved_key": "Brug den tidligere gemte nøgle",
"username_label": "Brugernavn",
"username_placeholder": "Angiv brugernavn",
diff --git a/client/src/__locales/de.json b/client/src/__locales/de.json
index 7a0d5533470..c56bfc31b53 100644
--- a/client/src/__locales/de.json
+++ b/client/src/__locales/de.json
@@ -172,7 +172,7 @@
"dhcp_new_static_lease": "Neue statische Zuweisung",
"dhcp_not_found": "Es ist sicherer, den integrierten DHCP-Server zu aktivieren, da AdGuard Home keine aktiven DHCP-Server im Netzwerk vorgefunden hat. Sie sollten dies jedoch noch einmal manuell überprüfen, da die automatische Überprüfung derzeit keine 100%ige Garantie bietet.",
"dhcp_reset": "Möchten Sie die DHCP-Konfiguration wirklich zurücksetzen?",
- "dhcp_reset_leases": "Alle Zuweisungen zurücksetzen",
+ "dhcp_reset_leases": "Alle Leases zurücksetzen",
"dhcp_reset_leases_confirm": "Möchten Sie wirklich alle Zuweisungen zurücksetzen?",
"dhcp_reset_leases_success": "DHCP-Zuweisungen erfolgreich zurückgesetzt",
"dhcp_settings": "DHCP-Einstellungen",
@@ -182,7 +182,7 @@
"dhcp_table_expires": "Gültig bis",
"dhcp_table_hostname": "Hostname",
"dhcp_title": "DHCP-Server (experimental!)",
- "dhcp_warning": "Wenn Sie den DHCP-Server trotzdem aktivieren möchten, stellen Sie sicher, dass sich in Ihrem Netzwerk kein anderer aktiver DHCP-Server befindet. Andernfalls kann es bei angeschlossenen Geräten zu einem Ausfall des Internets kommen!",
+ "dhcp_warning": "Wenn Sie den DHCP-Server dennoch aktivieren möchten, stellen Sie sicher, dass kein anderer aktiver DHCP-Server in Ihrem Netzwerk vorhanden ist, da dies die Internetverbindung für Geräte im Netzwerk unterbrechen kann!",
"disable_for_hours": "Für {{count}} Stunde",
"disable_for_hours_plural": "Für {{count}} Stunden",
"disable_for_minutes": "Für {{count}} Minute",
@@ -357,7 +357,7 @@
"filter_category_regional": "Regional",
"filter_category_regional_desc": "Listen, die sich auf regionale Werbeanzeigen und Tracking-Server konzentrieren",
"filter_category_security": "Sicherheit",
- "filter_category_security_desc": "Listen, die auf das Sperren von Malware-, Phishing- oder Scam-Domains spezialisiert sind",
+ "filter_category_security_desc": "Listen, die speziell zum Blockieren von bösartigen, Phishing- und Betrugsdomains entwickelt wurden",
"filter_removed_successfully": "Der Filter wurde erfolgreich entfernt",
"filter_updated": "Der Filter wurde erfolgreich aktualisiert",
"filtered": "Gefiltert",
@@ -380,7 +380,7 @@
"form_answer": "IP-Adresse oder Domainname eingeben",
"form_client_name": "Clientnamen eingeben",
"form_domain": "Domain eingeben",
- "form_enter_blocked_response_ttl": "Geben Sie die Gültigkeitsdauer für blockierte Antworten ein (in Sekunden)",
+ "form_enter_blocked_response_ttl": "TTL für blockierte Antworten eingeben (Sekunden)",
"form_enter_host": "Gerätenamen eingeben",
"form_enter_hostname": "Gerätenamen eingeben",
"form_enter_id": "Kennung eingeben",
@@ -402,7 +402,7 @@
"form_error_mac_format": "Ungültige MAC-Adresse",
"form_error_password": "Passwörter stimmen nicht überein",
"form_error_password_length": "Das Passwort muss zwischen {{min}} und {{max}} Zeichen enthalten",
- "form_error_port": "Geben Sie eine gültige Portnummer ein",
+ "form_error_port": "Gültige Portnummer eingeben",
"form_error_port_range": "Geben Sie die Portnummer zwischen 80 und 65535 ein",
"form_error_port_unsafe": "Unsicherer Port",
"form_error_positive": "Muss größer als 0 sein",
diff --git a/client/src/__locales/nl.json b/client/src/__locales/nl.json
index fa20e745bda..ee738326571 100644
--- a/client/src/__locales/nl.json
+++ b/client/src/__locales/nl.json
@@ -208,7 +208,7 @@
"disabled_protection": "Bescherming uitgeschakeld",
"disabled_safe_browsing_toast": "Veilig browsen uitgeschakeld",
"disabled_safe_search_toast": "Uitgeschakeld Veilig zoeken",
- "disallow_this_client": "Toepassing/systeem niet toelaten",
+ "disallow_this_client": "Deze cliënt niet toelaten",
"dns_addresses": "DNS adressen",
"dns_allowlists": "DNS-toelatingslijsten",
"dns_allowlists_desc": "Domeinen van DNS-toelatingslijsten zijn toegestaan, zelfs als ze op een van de blokkeerlijsten staan.",
diff --git a/client/src/__locales/tr.json b/client/src/__locales/tr.json
index a61292f579a..a209d1294da 100644
--- a/client/src/__locales/tr.json
+++ b/client/src/__locales/tr.json
@@ -26,11 +26,11 @@
"apply_btn": "Uygula",
"auto_clients_desc": "AdGuard Home'u kullanan veya kullanabilecek cihazların IP adresleri hakkında bilgiler. Bu bilgiler, ana bilgisayar dosyaları, ters DNS sorguları ve çeşitli diğer kaynaklardan toplanmaktadır.",
"auto_clients_title": "Bilinen istemciler",
- "autofix_warning_list": "Bu görevleri gerçekleştirir: <0>Sistem DNSStubListener'ı devre dışı bırakır0> <0>DNS sunucu adresini 127.0.0.1 olarak ayarlar0> <0>/etc/resolv.conf'un sembolik bağlantı hedefini /run/systemd/resolve/resolv.conf ile değiştirir<0> <0>DNSStubListener'ı durdurur (systemd-resolved hizmeti yeniden yükler)0>",
+ "autofix_warning_list": "Şu görevleri gerçekleştirir: <0>Sistem DNSStubListener'ı devre dışı bırakır0> <0>DNS sunucu adresini 127.0.0.1 olarak ayarlar0> <0>/etc/resolv.conf'un sembolik bağlantı hedefini /run/systemd/resolve/resolv.conf ile değiştirir<0> <0>DNSStubListener'ı durdurur (systemd-resolved hizmeti yeniden yükler)0>",
"autofix_warning_result": "Sonuç olarak, sisteminizden gelen tüm DNS istekleri varsayılan olarak AdGuard Home tarafından işlenecektir.",
"autofix_warning_text": "\"Düzelt\" öğesine tıklarsanız, AdGuard Home, sisteminizi AdGuard Home DNS sunucusunu kullanacak şekilde yapılandıracaktır.",
"average_processing_time": "Ortalama işlem süresi",
- "average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
+ "average_processing_time_hint": "Bir DNS isteğinin işlenmesi için milisaniye cinsinden ortalama süre",
"average_upstream_response_time": "Ortalama üst kaynak yanıt süresi",
"back": "Geri",
"block": "Engelle",
@@ -329,7 +329,7 @@
"example_rewrite_wildcard": "tüm <0>example.org0> alt alan adları için yanıtları yeniden yazar.",
"example_upstream_comment": "bir yorum.",
"example_upstream_doh": "şifrelenmiş <0>DNS-over-HTTPS0>;",
- "example_upstream_doh3": "<0>HTTP/30> uygulanmış ve HTTP/2 veya aşağısı için yedek olmayan şifrelenmiş DNS-over-HTTPS;",
+ "example_upstream_doh3": "<0>HTTP/30> uygulanmış ve HTTP/2 veya aşağısı için yedeği olmayan şifrelenmiş DNS-over-HTTPS;",
"example_upstream_doq": "şifrelenmiş <0>DNS-over-QUIC0>;",
"example_upstream_dot": "şifrelenmiş <0>DNS-over-TLS0>;",
"example_upstream_regular": "normal DNS (UDP üzerinden);",
@@ -346,7 +346,7 @@
"fallback_dns_title": "Yedek DNS sunucuları",
"faq": "SSS",
"fastest_addr": "En hızlı IP adresi",
- "fastest_addr_desc": "Tüm DNS sunucularından yanıt bekler, her sunucu için TCP bağlantı hızını ölçer ve en hızlı bağlantı hızına sahip sunucunun IP adresini döndürür.
Bu yapılandırma, bir veya daha fazla üst kaynak sunucusu yanıt vermediğinde, DNS sorgularını önemli ölçüde yavaşlatabilir. Üst kaynak sunucularınızın kararlı olduğundan ve üst kaynak zaman aşım sürenizin düşük olduğundan emin olun.",
+ "fastest_addr_desc": "Tüm DNS sunucularından yanıt bekler, her sunucu için TCP bağlantı hızını ölçer ve en hızlı bağlantı hızına sahip sunucunun IP adresini döndürür.
Bu mod, bir veya daha fazla üst kaynak sunucusu yanıt vermediğinde, DNS sorgularını önemli ölçüde yavaşlatabilir. Üst kaynak sunucularınızın kararlı olduğundan ve üst kaynak zaman aşım sürenizin düşük olduğundan emin olun.",
"filter": "Filtre",
"filter_added_successfully": "Liste başarıyla eklendi",
"filter_allowlist": "UYARI: Bu işlem ayrıca \"{{disallowed_rule}}\" kuralını izin verilen istemciler listesinden hariç tutar.",
@@ -496,7 +496,7 @@
"list_updated_plural": "{{count}} liste güncellendi",
"list_url_table_header": "Liste URL'si",
"load_balancing": "Yük dengeleme",
- "load_balancing_desc": "Üst kaynak sunucuları aynı anda sorgulanır.
AdGuard Home, en düşük başarısız sorgu sayısına ve en düşük ortalama sorgu süresine sahip sunucuları seçmek için ağırlıklı rastgele algoritma kullanır.",
+ "load_balancing_desc": "Aynı anda tek bir üst kaynak sunucusu sorgulanır.
AdGuard Home, en az başarısız sorgu sayısına ve en düşük ortalama sorgu süresine sahip sunucuları seçmek için ağırlıklı rastgele bir algoritma kullanır.",
"loading_table_status": "Yükleniyor...",
"local_ptr_default_resolver": "AdGuard Home, varsayılan olarak aşağıdaki ters DNS çözümleyicilerini kullanır: {{ip}}.",
"local_ptr_desc": "AdGuard Home tarafından özel PTR, SOA ve NS istekleri için kullanılan DNS sunucuları. Bir istek, özel IP aralıklarında (örneğin \"192.168.12.34\" gibi) bir alt ağ içeren bir ARPA alanı soruyorsa ve özel bir IP adresine sahip bir istemciden geliyorsa özel kabul edilir. Ayarlanmadığı durumda AdGuard Home IP adresleri hariç, işletim sisteminizin varsayılan DNS çözümleyicileri kullanılır.",
@@ -589,8 +589,8 @@
"request_table_header": "İstek",
"requests_count": "İstek sayısı",
"reset_settings": "Ayarları sıfırla",
- "resolve_clients_desc": "Belirtilen çözümleyicilere (yerel istemciler için özel DNS sunucuları, genel IP adresi olan istemciler için üst kaynak sunucuları) PTR sorguları göndererek istemcilerin IP adreslerinin ana makine adlarına tersine çözülmesini sağlar.",
- "resolve_clients_title": "İstemcilerin IP adreslerinin ters çözümlenmesini etkinleştir",
+ "resolve_clients_desc": "Belirtilen çözümleyicilere (yerel istemciler için özel DNS sunucuları, genel IP adresine sahip istemciler için üst kaynak sunucuları) PTR sorguları göndererek istemcilerin IP adreslerinin ana makine adlarına tersine çözülmesini sağlar.",
+ "resolve_clients_title": "İstemci IP adreslerinin tersine çözülmesini etkinleştir",
"response_code": "Yanıt kodu",
"response_details": "Yanıt ayrıntıları",
"response_table_header": "Yanıt",
@@ -671,7 +671,7 @@
"show_blocked_responses": "Engellendi",
"show_filtered_type": "Filtrelenenleri göster",
"show_processed_responses": "İşlendi",
- "show_whitelisted_responses": "İzin verilen",
+ "show_whitelisted_responses": "İzin verildi",
"sign_in": "Giriş yap",
"sign_out": "Çıkış yap",
"source_label": "Kaynak",
@@ -708,12 +708,12 @@
"theme_light_desc": "Açık tema",
"thursday": "Perşembe",
"thursday_short": "Per",
- "time_table_header": "Süre",
+ "time_table_header": "Zaman",
"top_blocked_domains": "Başlıca engellenen alan adları",
"top_clients": "Başlıca istemciler",
"top_upstreams": "Başlıca üst kaynaklar",
"topline_expired_certificate": "SSL sertifikanızın süresi sona erdi. <0>Şifreleme ayarlarını0> güncelleyin.",
- "topline_expiring_certificate": "SSL sertifikanızın süresi sona üzere. <0>Şifreleme ayarlarını0> güncelleyin.",
+ "topline_expiring_certificate": "SSL sertifikanızın süresi sona ermek üzere. <0>Şifreleme ayarlarını0> güncelleyin.",
"tracker_source": "İzleyici kaynağı",
"try_again": "Tekrar dene",
"ttl_cache_validation": "Önbellek kullanım değeri belirleme alt sınırı, üst sınıra eşit veya ondan küçük olmalıdır",
@@ -731,7 +731,7 @@
"update_now": "Şimdi güncelle",
"updated_custom_filtering_toast": "Özel kurallar başarıyla kaydedildi",
"updated_save_search_toast": "Güvenli Arama ayarları güncellendi",
- "updated_upstream_dns_toast": "Üst sunucular başarıyla kaydedildi",
+ "updated_upstream_dns_toast": "Üst kaynak sunucuları başarıyla kaydedildi",
"updates_checked": "AdGuard Home'un yeni bir sürümü mevcut",
"updates_version_equal": "AdGuard Home güncel",
"upstream": "Üst kaynak",
@@ -748,7 +748,7 @@
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.",
"use_adguard_parental": "AdGuard ebeveyn denetimi web hizmetini kullan",
"use_adguard_parental_hint": "AdGuard Home, alan adının yetişkin içerik bulundurup bulundurmadığını kontrol eder. Gezinti koruması web hizmeti ile kullandığımız aynı gizlilik dostu API'yi kullanır.",
- "use_private_ptr_resolvers_desc": "Özel üst kaynak sunucuları, DHCP, /etc/hosts, vb. aracılığıyla özel IP adresleri içeren ARPA alan adları için PTR, SOA ve NS isteklerini çözümleyin. Devre dışı bırakılırsa, AdGuard Home bu tür tüm isteklere NXDOMAIN ile yanıt verir.",
+ "use_private_ptr_resolvers_desc": "Özel IP adresleri içeren ARPA alan adlarına yönelik PTR, SOA ve NS sorgularını; özel üst kaynak sunucuları, DHCP, /etc/hosts vb. aracılığıyla çözümler. Devre dışı bırakılırsa, AdGuard Home bu tür tüm sorgulara NXDOMAIN ile yanıt verir.",
"use_private_ptr_resolvers_title": "Özel ters DNS çözümleyicileri kullan",
"use_saved_key": "Önceden kaydedilmiş anahtarı kullan",
"username_label": "Kullanıcı adı",
diff --git a/go.mod b/go.mod
index 2eb4434ccae..4da5294076f 100644
--- a/go.mod
+++ b/go.mod
@@ -3,10 +3,10 @@ module github.com/AdguardTeam/AdGuardHome
go 1.26.4
require (
- github.com/AdguardTeam/dnscrypt v0.0.1
- github.com/AdguardTeam/dnsproxy v0.82.1
- github.com/AdguardTeam/golibs v0.35.13
- github.com/AdguardTeam/urlfilter v0.23.2
+ github.com/AdguardTeam/dnscrypt v0.0.2
+ github.com/AdguardTeam/dnsproxy v0.83.0
+ github.com/AdguardTeam/golibs v0.35.14
+ github.com/AdguardTeam/urlfilter v0.23.4
github.com/NYTimes/gziphandler v1.1.1
github.com/bluele/gcache v0.0.2
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500
@@ -48,7 +48,7 @@ require (
cloud.google.com/go/compute/metadata v0.9.0 // indirect
github.com/BurntSushi/toml v1.6.0 // indirect
github.com/ameshkov/dnsstamps v1.0.3 // indirect
- github.com/anthropics/anthropic-sdk-go v1.51.1 // indirect
+ github.com/anthropics/anthropic-sdk-go v1.56.0 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 // indirect
github.com/buger/jsonparser v1.2.0 // indirect
@@ -99,16 +99,16 @@ require (
golang.org/x/exp/typeparams v0.0.0-20260611194520-c48552f49976 // indirect
golang.org/x/mod v0.37.0 // indirect
golang.org/x/sync v0.21.0 // indirect
- golang.org/x/telemetry v0.0.0-20260623180514-3eaace186e0a // indirect
+ golang.org/x/telemetry v0.0.0-20260626140120-b709645a9e92 // indirect
golang.org/x/term v0.44.0 // indirect
golang.org/x/text v0.38.0 // indirect
- golang.org/x/tools v0.46.0 // indirect
- golang.org/x/vuln v1.4.0 // indirect
+ golang.org/x/tools v0.47.0 // indirect
+ golang.org/x/vuln v1.5.0 // indirect
gonum.org/v1/gonum v0.17.0 // indirect
- google.golang.org/api v0.286.0 // indirect
+ google.golang.org/api v0.287.0 // indirect
google.golang.org/genai v1.62.0 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d // indirect
- google.golang.org/grpc v1.81.1 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect
+ google.golang.org/grpc v1.82.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.7.0 // indirect
diff --git a/go.sum b/go.sum
index 16beb10149f..03da609620f 100644
--- a/go.sum
+++ b/go.sum
@@ -4,18 +4,14 @@ cloud.google.com/go/auth v0.20.0 h1:kXTssoVb4azsVDoUiF8KvxAqrsQcQtB53DcSgta74CA=
cloud.google.com/go/auth v0.20.0/go.mod h1:942/yi/itH1SsmpyrbnTMDgGfdy2BUqIKyd0cyYLc5Q=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
-github.com/AdguardTeam/dnscrypt v0.0.1 h1:TWaEbHjuKkMCNpXANv70aPlTQsLFrjRFdIwdJUtzmPM=
-github.com/AdguardTeam/dnscrypt v0.0.1/go.mod h1:qCFs51rLfNzEDZqb6nz1tocVLnEearJ1zng6O3I6ecA=
-github.com/AdguardTeam/dnsproxy v0.82.0 h1:a2HUCIM0UBQWh2t97xSAcdKP0TJK5/3tL449Sy67yFA=
-github.com/AdguardTeam/dnsproxy v0.82.0/go.mod h1:ZXZIte3oksofqsFNmEfRr34fAL7xg8Pw+sj91HEGQ58=
-github.com/AdguardTeam/dnsproxy v0.82.1-0.20260701081753-a2215046020c h1:xPVadjGX8exYIN3JiPeXL1AtCeLmBnrYr1aflAAlca4=
-github.com/AdguardTeam/dnsproxy v0.82.1-0.20260701081753-a2215046020c/go.mod h1:ZXZIte3oksofqsFNmEfRr34fAL7xg8Pw+sj91HEGQ58=
-github.com/AdguardTeam/dnsproxy v0.82.1 h1:9O9eKH1M+75k7Ge2lpAvZF+mfSwYZEc6gGQTRASZ7kU=
-github.com/AdguardTeam/dnsproxy v0.82.1/go.mod h1:ZXZIte3oksofqsFNmEfRr34fAL7xg8Pw+sj91HEGQ58=
-github.com/AdguardTeam/golibs v0.35.13 h1:sflm5/sWhiGwUXNAZObiqVMkdg8HeYVFK2A0oJ27hbU=
-github.com/AdguardTeam/golibs v0.35.13/go.mod h1:8EEGG4auTDd8HV3tBETXLkuxDH9lk9vvFbJn+wbmypg=
-github.com/AdguardTeam/urlfilter v0.23.2 h1:EiS/PQZO/X2S6cduFW6BBoRLyjd6SqZj1ZiFbU1KaFE=
-github.com/AdguardTeam/urlfilter v0.23.2/go.mod h1:JteAKoeka1Yr2oZ3P94dqYBfPOHWyFaOcu3uZa9Yl+I=
+github.com/AdguardTeam/dnscrypt v0.0.2 h1:kIFCyjYofKHug7RwPGOjVga81P0/zOQdbUN+7p+I95M=
+github.com/AdguardTeam/dnscrypt v0.0.2/go.mod h1:qCFs51rLfNzEDZqb6nz1tocVLnEearJ1zng6O3I6ecA=
+github.com/AdguardTeam/dnsproxy v0.83.0 h1:dvI6KLeaTc3FLzXnlmMDASnHJhldbneqqBLkSepaI84=
+github.com/AdguardTeam/dnsproxy v0.83.0/go.mod h1:cpOsqBcb8XR+2SjcPxpqPvFKvTmJ9SciwfCdAWf18HM=
+github.com/AdguardTeam/golibs v0.35.14 h1:LGqoRMbuxUgZyhOjlkmPxy5t1/XPuFpDcG5RBIDcskA=
+github.com/AdguardTeam/golibs v0.35.14/go.mod h1:FL470ALCuUs7cwk88ltBgTZ6JYCUG2NpNzp3EOMirxo=
+github.com/AdguardTeam/urlfilter v0.23.4 h1:3cwt5xj7lpK2t3sWtr9WI8mmsKP+RtpkdnEy7lrn8cg=
+github.com/AdguardTeam/urlfilter v0.23.4/go.mod h1:TgF1iQSfmuDVNCbbymZetj+8KsrhAin9sPwxJFZZg34=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE=
@@ -24,8 +20,8 @@ github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cq
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1OYVo=
github.com/ameshkov/dnsstamps v1.0.3/go.mod h1:Ii3eUu73dx4Vw5O4wjzmT5+lkCwovjzaEZZ4gKyIH5A=
-github.com/anthropics/anthropic-sdk-go v1.51.1 h1:V6VJb6lHMXw25i0bITGCj2fHHCq1WCg76s7XAQYOgSs=
-github.com/anthropics/anthropic-sdk-go v1.51.1/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI=
+github.com/anthropics/anthropic-sdk-go v1.56.0 h1:idVU14wOZ06D0GBNEvuhn927xXmBVEquo0469iDwLsc=
+github.com/anthropics/anthropic-sdk-go v1.56.0/go.mod h1:3EfIfmFqxH6rbiLcIP4tPFyXL/IHakx2wDG4OU+TIEI=
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 h1:0b2vaepXIfMsG++IsjHiI2p4bxALD1Y2nQKGMR5zDQM=
@@ -257,8 +253,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
-golang.org/x/telemetry v0.0.0-20260623180514-3eaace186e0a h1:NnWsOWfcdbui6Pf+0o70Q0tvBB02FzTO7USR+P7opJQ=
-golang.org/x/telemetry v0.0.0-20260623180514-3eaace186e0a/go.mod h1:3AWMyWHS+caVoiEXpiq6+tzKA40J4vQT3MYr80ZtQpc=
+golang.org/x/telemetry v0.0.0-20260626140120-b709645a9e92 h1:NqOK030/LCJf9q8SYF7NAtorXKpwpV8DmjBJcstScnU=
+golang.org/x/telemetry v0.0.0-20260626140120-b709645a9e92/go.mod h1:3AWMyWHS+caVoiEXpiq6+tzKA40J4vQT3MYr80ZtQpc=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
@@ -268,30 +264,30 @@ golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.46.0 h1:7jTurBkPZu4moS/Uy4OQT1M+QBlsj3wejyZwsT8Z7rk=
-golang.org/x/tools v0.46.0/go.mod h1:FrD85F8l+NWL+9XWBSyVSHO6Ne4jutsfIFba7AWQ5Ys=
+golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=
+golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=
golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM=
golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM=
golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8=
-golang.org/x/vuln v1.4.0 h1:FpmTZiV4PyqY3lFfuCkz1JftEXb/+8M2NEkjJM5TF4g=
-golang.org/x/vuln v1.4.0/go.mod h1:FJ7XyKs83nAdxQ7PMsia2PoynwZMJ/QajXVMBBIgFe8=
+golang.org/x/vuln v1.5.0 h1:jGVVuNZ7NrBJlFB7IBkZ/R9c8gYCja+SWqrHpBCYJZA=
+golang.org/x/vuln v1.5.0/go.mod h1:Ujq+7kg+6B5HsCgDFbMmP0+gAV1zGf05mkh4uF5YEXY=
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=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
-google.golang.org/api v0.286.0 h1:TdTXMvzYKnWV1/lPbCdbXRqBrkDqjPto22H2xeZZ8LI=
-google.golang.org/api v0.286.0/go.mod h1:NlOlUIr8MPoIhT9Bb/oUnRuHbJOLwxb6JSYJM8Yz+jQ=
+google.golang.org/api v0.287.0 h1:CQDMqUiqZZ0U/Yge3zyjAhNQ0OSYEH0PaA7l4xtEen4=
+google.golang.org/api v0.287.0/go.mod h1:pPW85yt3Iuc3unkpaMhFtMmOqnTdCwCqEOaUlnuxRlQ=
google.golang.org/genai v1.62.0 h1:PaBju84orf4Vbcc6OfHe4vxhxhjwulKTgOpEc3iIc00=
google.golang.org/genai v1.62.0/go.mod h1:mDdPDFXo1Ats7f1WXVyZgWb/CkMzFWTWJruIMy7hGIU=
google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 h1:XzmzkmB14QhVhgnawEVsOn6OFsnpyxNPRY9QV01dNB0=
google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:L43LFes82YgSonw6iTXTxXUX1OlULt4AQtkik4ULL/I=
-google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
-google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d h1:mpAgMyM9vQHxycBlDq50y1VHpfSfVwzXvrQKtYbXuUY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
-google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
-google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
+google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw=
+google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:KdNqO+rCIWgFumrNBSEDlDNrkrQnpkax7Tv1WxNY8V4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
+google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU=
+google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/internal/dnsforward/msg.go b/internal/dnsforward/msg.go
index c26ea55947b..5dba5927aef 100644
--- a/internal/dnsforward/msg.go
+++ b/internal/dnsforward/msg.go
@@ -428,6 +428,12 @@ func (s *Server) NewMsgNODATA(req *dns.Msg) (resp *dns.Msg) {
return resp
}
+// NewMsgFORMERR implements the [proxy.MessageConstructor] interface for
+// *Server.
+func (s *Server) NewMsgFORMERR(req *dns.Msg) (resp *dns.Msg) {
+ return s.reply(req, dns.RcodeFormatError)
+}
+
func (s *Server) genSOA(req *dns.Msg) []dns.RR {
zone := ""
if len(req.Question) > 0 {
diff --git a/internal/home/middlewares.go b/internal/home/middlewares.go
index 2a6c3a8ec61..afb44aaff25 100644
--- a/internal/home/middlewares.go
+++ b/internal/home/middlewares.go
@@ -8,22 +8,6 @@ import (
"github.com/c2h5oh/datasize"
)
-// middlerware is a wrapper function signature.
-type middleware func(http.Handler) http.Handler
-
-// withMiddlewares consequently wraps h with all the middlewares.
-//
-// TODO(e.burkov): Use [httputil.Wrap].
-func withMiddlewares(h http.Handler, middlewares ...middleware) (wrapped http.Handler) {
- wrapped = h
-
- for _, mw := range middlewares {
- wrapped = mw(wrapped)
- }
-
- return wrapped
-}
-
const (
// defaultReqBodySzLim is the default maximum request body size.
defaultReqBodySzLim datasize.ByteSize = 64 * datasize.KB
diff --git a/internal/home/web.go b/internal/home/web.go
index c1bdbb50a2c..fffddbdad41 100644
--- a/internal/home/web.go
+++ b/internal/home/web.go
@@ -192,7 +192,11 @@ func newWebAPI(ctx context.Context, conf *webAPIConfig) (w *webAPI) {
mux := conf.mux
// if not configured, redirect / to /install.html, otherwise redirect /install.html to /
- mux.Handle("/", withMiddlewares(clientFS, gziphandler.GzipHandler, w.postInstallHandler))
+ mux.Handle("/", httputil.Wrap(
+ clientFS,
+ httputil.MiddlewareFunc(w.postInstallHandler),
+ httputil.MiddlewareFunc(gziphandler.GzipHandler),
+ ))
// add handlers for /install paths, we only need them when we're not configured yet
if conf.firstRun {
@@ -305,7 +309,7 @@ func (web *webAPI) start(ctx context.Context) {
// wrapMux wraps mux with common middlewares. l must not be nil.
func (web *webAPI) wrapMux(l *slog.Logger) (h http.Handler) {
- h = withMiddlewares(web.conf.mux, limitRequestBody)
+ h = httputil.Wrap(web.conf.mux, httputil.MiddlewareFunc(limitRequestBody))
// TODO(a.garipov): Remove other logs like this in other code.
logMw := httputil.NewLogMiddleware(l, slog.LevelDebug)