Pull request: all: use "ClientID" consistently

Closes #4242.
Updates #4244.

Squashed commit of the following:

commit 3a2296a7a70006cf6777e54ce1e2fc3559aec5be
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Wed Feb 9 21:23:43 2022 +0300

    client: imp more

commit 3aacc8696ac694ff459fd33ba7beeeabd2569a55
Merge: b28a120f 2a5b5f19
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Wed Feb 9 21:21:59 2022 +0300

    Merge branch 'master' into 4244-imp-i18n

commit b28a120fe9aa68507b173717059b7b259097d6a4
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Wed Feb 9 14:49:49 2022 +0300

    client: imp texts more

commit c1fa6ca336f2d5bdcc67836f348be4843a0a8f79
Author: Ainar Garipov <A.Garipov@AdGuard.COM>
Date:   Tue Feb 8 21:12:15 2022 +0300

    all: use "ClientID" consistently
This commit is contained in:
Ainar Garipov 2022-02-10 15:42:59 +03:00
parent 2a5b5f1927
commit f53f48cc33
21 changed files with 142 additions and 143 deletions

View File

@ -186,7 +186,7 @@ See also the [v0.107.0 GitHub milestone][ms-v0.107.0].
- Static IP address detection on FreeBSD ([#3289]). - Static IP address detection on FreeBSD ([#3289]).
- Optimistic cache ([#2145]). - Optimistic cache ([#2145]).
- New possible value of `6h` for `querylog_interval` setting ([#2504]). - New possible value of `6h` for `querylog_interval` setting ([#2504]).
- Blocking access using client IDs ([#2624], [#3162]). - Blocking access using ClientIDs ([#2624], [#3162]).
- `source` directives support in `/etc/network/interfaces` on Linux ([#3257]). - `source` directives support in `/etc/network/interfaces` on Linux ([#3257]).
- RFC 9000 support in DNS-over-QUIC. - RFC 9000 support in DNS-over-QUIC.
- Completely disabling statistics by setting the statistics interval to zero - Completely disabling statistics by setting the statistics interval to zero
@ -334,7 +334,7 @@ In this release, the schema version has changed from 10 to 12.
- Redundant hostname generating while loading static leases with empty hostname - Redundant hostname generating while loading static leases with empty hostname
([#3166]). ([#3166]).
- Domain name case in responses ([#3194]). - Domain name case in responses ([#3194]).
- Custom upstreams selection for clients with client IDs in DNS-over-TLS and - Custom upstreams selection for clients with ClientIDs in DNS-over-TLS and
DNS-over-HTTP ([#3186]). DNS-over-HTTP ([#3186]).
- Incorrect client-based filtering applying logic ([#2875]). - Incorrect client-based filtering applying logic ([#2875]).

View File

@ -1,7 +1,7 @@
{ {
"client_settings": "Client settings", "client_settings": "Client settings",
"example_upstream_reserved": "You can specify a DNS upstream <0>for the specific domain(s)</0>", "example_upstream_reserved": "an upstream <0>for specific domains</0>;",
"example_upstream_comment": "You can specify a comment", "example_upstream_comment": "a comment.",
"upstream_parallel": "Use parallel queries to speed up resolving by querying all upstream servers simultaneously.", "upstream_parallel": "Use parallel queries to speed up resolving by querying all upstream servers simultaneously.",
"parallel_requests": "Parallel requests", "parallel_requests": "Parallel requests",
"load_balancing": "Load-balancing", "load_balancing": "Load-balancing",
@ -143,7 +143,7 @@
"use_adguard_browsing_sec_hint": "AdGuard Home will check if the domain is blocked by the browsing security web service. It will use privacy-friendly lookup API to perform the check: only a short prefix of the domain name SHA256 hash is sent to the server.", "use_adguard_browsing_sec_hint": "AdGuard Home will check if the domain is blocked by the browsing security web service. It will use privacy-friendly lookup API to perform the check: only a short prefix of the domain name SHA256 hash is sent to the server.",
"use_adguard_parental": "Use AdGuard parental control web service", "use_adguard_parental": "Use AdGuard parental control web service",
"use_adguard_parental_hint": "AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.", "use_adguard_parental_hint": "AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.",
"enforce_safe_search": "Use safe search", "enforce_safe_search": "Use Safe Search",
"enforce_save_search_hint": "AdGuard Home will enforce safe search in the following search engines: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.", "enforce_save_search_hint": "AdGuard Home will enforce safe search in the following search engines: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "No servers specified", "no_servers_specified": "No servers specified",
"general_settings": "General settings", "general_settings": "General settings",
@ -165,10 +165,10 @@
"enabled_filtering_toast": "Enabled filtering", "enabled_filtering_toast": "Enabled filtering",
"disabled_safe_browsing_toast": "Disabled Safe Browsing", "disabled_safe_browsing_toast": "Disabled Safe Browsing",
"enabled_safe_browsing_toast": "Enabled Safe Browsing", "enabled_safe_browsing_toast": "Enabled Safe Browsing",
"disabled_parental_toast": "Disabled parental control", "disabled_parental_toast": "Disabled Parental Control",
"enabled_parental_toast": "Enabled parental control", "enabled_parental_toast": "Enabled Parental Control",
"disabled_safe_search_toast": "Disabled safe search", "disabled_safe_search_toast": "Disabled Safe Search",
"enabled_save_search_toast": "Enabled safe search", "enabled_save_search_toast": "Enabled Safe Search",
"enabled_table_header": "Enabled", "enabled_table_header": "Enabled",
"name_table_header": "Name", "name_table_header": "Name",
"list_url_table_header": "List URL", "list_url_table_header": "List URL",
@ -202,19 +202,19 @@
"custom_filter_rules_hint": "Enter one rule on a line. You can use either adblock rules or hosts files syntax.", "custom_filter_rules_hint": "Enter one rule on a line. You can use either adblock rules or hosts files syntax.",
"system_host_files": "System hosts files", "system_host_files": "System hosts files",
"examples_title": "Examples", "examples_title": "Examples",
"example_meaning_filter_block": "block access to the example.org domain and all its subdomains", "example_meaning_filter_block": "block access to example.org and all its subdomains;",
"example_meaning_filter_whitelist": "unblock access to the example.org domain and all its subdomains", "example_meaning_filter_whitelist": "unblock access to example.org and all its subdomains;",
"example_meaning_host_block": "AdGuard Home will now return 127.0.0.1 address for the example.org domain (but not its subdomains).", "example_meaning_host_block": "respond with 127.0.0.1 for example.org (but not for its subdomains);",
"example_comment": "! Here goes a comment", "example_comment": "! Here goes a comment.",
"example_comment_meaning": "just a comment", "example_comment_meaning": "just a comment;",
"example_comment_hash": "# Also a comment", "example_comment_hash": "# Also a comment.",
"example_regex_meaning": "block access to the domains matching the specified regular expression", "example_regex_meaning": "block access to domains matching the specified regular expression.",
"example_upstream_regular": "regular DNS (over UDP)", "example_upstream_regular": "regular DNS (over UDP);",
"example_upstream_dot": "encrypted <0>DNS-over-TLS</0>", "example_upstream_dot": "encrypted <0>DNS-over-TLS</0>;",
"example_upstream_doh": "encrypted <0>DNS-over-HTTPS</0>", "example_upstream_doh": "encrypted <0>DNS-over-HTTPS</0>;",
"example_upstream_doq": "encrypted <0>DNS-over-QUIC</0>", "example_upstream_doq": "encrypted <0>DNS-over-QUIC</0> (experimental);",
"example_upstream_sdns": "you can use <0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers", "example_upstream_sdns": "<0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers;",
"example_upstream_tcp": "regular DNS (over TCP)", "example_upstream_tcp": "regular DNS (over TCP);",
"all_lists_up_to_date_toast": "All lists are already up-to-date", "all_lists_up_to_date_toast": "All lists are already up-to-date",
"updated_upstream_dns_toast": "Upstream servers successfully saved", "updated_upstream_dns_toast": "Upstream servers successfully saved",
"dns_test_ok_toast": "Specified DNS servers are working correctly", "dns_test_ok_toast": "Specified DNS servers are working correctly",
@ -259,10 +259,10 @@
"query_log_strict_search": "Use double quotes for strict search", "query_log_strict_search": "Use double quotes for strict search",
"query_log_retention_confirm": "Are you sure you want to change query log retention? If you decrease the interval value, some data will be lost", "query_log_retention_confirm": "Are you sure you want to change query log retention? If you decrease the interval value, some data will be lost",
"anonymize_client_ip": "Anonymize client IP", "anonymize_client_ip": "Anonymize client IP",
"anonymize_client_ip_desc": "Don't save the full IP address of the client in logs and statistics", "anonymize_client_ip_desc": "Don't save the client's full IP address to logs or statistics.",
"dns_config": "DNS server configuration", "dns_config": "DNS server configuration",
"dns_cache_config": "DNS cache configuration", "dns_cache_config": "DNS cache configuration",
"dns_cache_config_desc": "Here you can configure DNS cache", "dns_cache_config_desc": "Here you can configure DNS cache.",
"blocking_mode": "Blocking mode", "blocking_mode": "Blocking mode",
"default": "Default", "default": "Default",
"nxdomain": "NXDOMAIN", "nxdomain": "NXDOMAIN",
@ -276,8 +276,8 @@
"dns_over_tls": "DNS-over-TLS", "dns_over_tls": "DNS-over-TLS",
"dns_over_quic": "DNS-over-QUIC", "dns_over_quic": "DNS-over-QUIC",
"client_id": "ClientID", "client_id": "ClientID",
"client_id_placeholder": "Enter client ID", "client_id_placeholder": "Enter a ClientID",
"client_id_desc": "Different clients can be identified by a special client ID. <a>Here</a> you can learn more about how to identify clients.", "client_id_desc": "Clients can be identified by ClientID. Learn more about how to identify clients <a>here</a>.",
"download_mobileconfig_doh": "Download .mobileconfig for DNS-over-HTTPS", "download_mobileconfig_doh": "Download .mobileconfig for DNS-over-HTTPS",
"download_mobileconfig_dot": "Download .mobileconfig for DNS-over-TLS", "download_mobileconfig_dot": "Download .mobileconfig for DNS-over-TLS",
"download_mobileconfig": "Download configuration file", "download_mobileconfig": "Download configuration file",
@ -334,12 +334,12 @@
"install_devices_router_list_4": "On some router types, a custom DNS server cannot be set up. In that case, setting up AdGuard Home as a <0>DHCP server</0> may help. Otherwise, you should check the router manual on how to customize DNS servers on your specific router model.", "install_devices_router_list_4": "On some router types, a custom DNS server cannot be set up. In that case, setting up AdGuard Home as a <0>DHCP server</0> may help. Otherwise, you should check the router manual on how to customize DNS servers on your specific router model.",
"install_devices_windows_list_1": "Open Control Panel through Start menu or Windows search.", "install_devices_windows_list_1": "Open Control Panel through Start menu or Windows search.",
"install_devices_windows_list_2": "Go to Network and Internet category and then to Network and Sharing Center.", "install_devices_windows_list_2": "Go to Network and Internet category and then to Network and Sharing Center.",
"install_devices_windows_list_3": "On the left side of the screen find \"Change adapter settings\" and click on it.", "install_devices_windows_list_3": "In the left panel, click \"Change adapter settings\".",
"install_devices_windows_list_4": "Select your active connection, right-click on it and choose Properties.", "install_devices_windows_list_4": "Right-click your active connection and select Properties.",
"install_devices_windows_list_5": "Find \"Internet Protocol Version 4 (TCP/IPv4)\" (or, for IPv6, \"Internet Protocol Version 6 (TCP/IPv6)\") in the list, select it and then click on Properties again.", "install_devices_windows_list_5": "Find \"Internet Protocol Version 4 (TCP/IPv4)\" (or, for IPv6, \"Internet Protocol Version 6 (TCP/IPv6)\") in the list, select it and then click on Properties again.",
"install_devices_windows_list_6": "Choose \"Use the following DNS server addresses\" and enter your AdGuard Home server addresses.", "install_devices_windows_list_6": "Choose \"Use the following DNS server addresses\" and enter your AdGuard Home server addresses.",
"install_devices_macos_list_1": "Click on Apple icon and go to System Preferences.", "install_devices_macos_list_1": "Click the Apple icon and go to System Preferences.",
"install_devices_macos_list_2": "Click on Network.", "install_devices_macos_list_2": "Click Network.",
"install_devices_macos_list_3": "Select the first connection in your list and click Advanced.", "install_devices_macos_list_3": "Select the first connection in your list and click Advanced.",
"install_devices_macos_list_4": "Select the DNS tab and enter your AdGuard Home server addresses.", "install_devices_macos_list_4": "Select the DNS tab and enter your AdGuard Home server addresses.",
"install_devices_android_list_1": "From the Android Menu home screen, tap Settings.", "install_devices_android_list_1": "From the Android Menu home screen, tap Settings.",
@ -356,7 +356,7 @@
"open_dashboard": "Open Dashboard", "open_dashboard": "Open Dashboard",
"install_saved": "Saved successfully", "install_saved": "Saved successfully",
"encryption_title": "Encryption", "encryption_title": "Encryption",
"encryption_desc": "Encryption (HTTPS/TLS) support for both DNS and admin web interface", "encryption_desc": "Encryption (HTTPS/TLS) support for both DNS and admin web interface.",
"encryption_config_saved": "Encryption configuration saved", "encryption_config_saved": "Encryption configuration saved",
"encryption_server": "Server name", "encryption_server": "Server name",
"encryption_server_enter": "Enter your domain name", "encryption_server_enter": "Enter your domain name",
@ -367,7 +367,7 @@
"encryption_https_desc": "If HTTPS port is configured, AdGuard Home admin interface will be accessible via HTTPS, and it will also provide DNS-over-HTTPS on '/dns-query' location.", "encryption_https_desc": "If HTTPS port is configured, AdGuard Home admin interface will be accessible via HTTPS, and it will also provide DNS-over-HTTPS on '/dns-query' location.",
"encryption_dot": "DNS-over-TLS port", "encryption_dot": "DNS-over-TLS port",
"encryption_dot_desc": "If this port is configured, AdGuard Home will run a DNS-over-TLS server on this port.", "encryption_dot_desc": "If this port is configured, AdGuard Home will run a DNS-over-TLS server on this port.",
"encryption_doq": "DNS-over-QUIC port", "encryption_doq": "DNS-over-QUIC port (experimental)",
"encryption_doq_desc": "If this port is configured, AdGuard Home will run a DNS-over-QUIC server on this port. It's experimental and may not be reliable. Also, there are not too many clients that support it at the moment.", "encryption_doq_desc": "If this port is configured, AdGuard Home will run a DNS-over-QUIC server on this port. It's experimental and may not be reliable. Also, there are not too many clients that support it at the moment.",
"encryption_certificates": "Certificates", "encryption_certificates": "Certificates",
"encryption_certificates_desc": "In order to use encryption, you need to provide a valid SSL certificates chain for your domain. You can get a free certificate on <0>{{link}}</0> or you can buy it from one of the trusted Certificate Authorities.", "encryption_certificates_desc": "In order to use encryption, you need to provide a valid SSL certificates chain for your domain. You can get a free certificate on <0>{{link}}</0> or you can buy it from one of the trusted Certificate Authorities.",
@ -405,8 +405,8 @@
"update_failed": "Auto-update failed. Please <a>follow these steps</a> to update manually.", "update_failed": "Auto-update failed. Please <a>follow these steps</a> to update manually.",
"manual_update": "Please <a>follow these steps</a> to update manually.", "manual_update": "Please <a>follow these steps</a> to update manually.",
"processing_update": "Please wait, AdGuard Home is being updated", "processing_update": "Please wait, AdGuard Home is being updated",
"clients_title": "Clients", "clients_title": "Persistent clients",
"clients_desc": "Configure devices connected to AdGuard Home", "clients_desc": "Configure persistent client records for devices connected to AdGuard Home.",
"settings_global": "Global", "settings_global": "Global",
"settings_custom": "Custom", "settings_custom": "Custom",
"table_client": "Client", "table_client": "Client",
@ -417,7 +417,7 @@
"client_edit": "Edit Client", "client_edit": "Edit Client",
"client_identifier": "Identifier", "client_identifier": "Identifier",
"ip_address": "IP address", "ip_address": "IP address",
"client_identifier_desc": "Clients can be identified by the IP address, CIDR, MAC address, or a special client ID (can be used for DoT/DoH/DoQ). <0>Here</0> you can learn more about how to identify clients.", "client_identifier_desc": "Clients can be identified by their IP address, CIDR, MAC address, or ClientID (can be used for DoT/DoH/DoQ). Learn more about how to identify clients <0>here</0>.",
"form_enter_ip": "Enter IP", "form_enter_ip": "Enter IP",
"form_enter_subnet_ip": "Enter an IP address in the subnet \"{{cidr}}\"", "form_enter_subnet_ip": "Enter an IP address in the subnet \"{{cidr}}\"",
"form_enter_mac": "Enter MAC", "form_enter_mac": "Enter MAC",
@ -432,14 +432,14 @@
"clients_not_found": "No clients found", "clients_not_found": "No clients found",
"client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?", "client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?",
"list_confirm_delete": "Are you sure you want to delete this list?", "list_confirm_delete": "Are you sure you want to delete this list?",
"auto_clients_title": "Clients (runtime)", "auto_clients_title": "Runtime clients",
"auto_clients_desc": "Data on the clients that use AdGuard Home, but not stored in the configuration", "auto_clients_desc": "Devices not on the list of Persistent clients that may still use AdGuard Home.",
"access_title": "Access settings", "access_title": "Access settings",
"access_desc": "Here you can configure access rules for the AdGuard Home DNS server.", "access_desc": "Here you can configure access rules for the AdGuard Home DNS server.",
"access_allowed_title": "Allowed clients", "access_allowed_title": "Allowed clients",
"access_allowed_desc": "A list of CIDRs, IP addresses, or client IDs. If configured, AdGuard Home will accept requests only from these clients.", "access_allowed_desc": "A list of CIDRs, IP addresses, or <a>ClientIDs</a>. If this list has entries, AdGuard Home will accept requests only from these clients.",
"access_disallowed_title": "Disallowed clients", "access_disallowed_title": "Disallowed clients",
"access_disallowed_desc": "A list of CIDRs, IP addresses, or client IDs. If configured, AdGuard Home will drop requests from these clients. If allowed clients are configured, this field is ignored.", "access_disallowed_desc": "A list of CIDRs, IP addresses, or <a>ClientIDs</a>. If this list has entries, AdGuard Home will drop requests from these clients. This field is ignored if there are entries in Allowed clients.",
"access_blocked_title": "Disallowed domains", "access_blocked_title": "Disallowed domains",
"access_blocked_desc": "Not to be confused with filters. AdGuard Home drops DNS queries matching these domains, and these queries don't even appear in the query log. You can specify exact domain names, wildcards, or URL filter rules, e.g. \"example.org\", \"*.example.org\", or \"||example.org^\" correspondingly.", "access_blocked_desc": "Not to be confused with filters. AdGuard Home drops DNS queries matching these domains, and these queries don't even appear in the query log. You can specify exact domain names, wildcards, or URL filter rules, e.g. \"example.org\", \"*.example.org\", or \"||example.org^\" correspondingly.",
"access_settings_saved": "Access settings successfully saved", "access_settings_saved": "Access settings successfully saved",
@ -507,7 +507,7 @@
"filter_updated": "The list has been successfully updated", "filter_updated": "The list has been successfully updated",
"statistics_configuration": "Statistics configuration", "statistics_configuration": "Statistics configuration",
"statistics_retention": "Statistics retention", "statistics_retention": "Statistics retention",
"statistics_retention_desc": "If you decrease the interval value, some data will be lost", "statistics_retention_desc": "If you decrease the interval value, some data will be lost.",
"statistics_clear": "Clear statistics", "statistics_clear": "Clear statistics",
"statistics_clear_confirm": "Are you sure you want to clear statistics?", "statistics_clear_confirm": "Are you sure you want to clear statistics?",
"statistics_retention_confirm": "Are you sure you want to change statistics retention? If you decrease the interval value, some data will be lost", "statistics_retention_confirm": "Are you sure you want to change statistics retention? If you decrease the interval value, some data will be lost",
@ -532,7 +532,7 @@
"netname": "Network name", "netname": "Network name",
"network": "Network", "network": "Network",
"descr": "Description", "descr": "Description",
"whois": "Whois", "whois": "WHOIS",
"filtering_rules_learn_more": "<0>Learn more</0> about creating your own hosts lists.", "filtering_rules_learn_more": "<0>Learn more</0> about creating your own hosts lists.",
"blocked_by_response": "Blocked by CNAME or IP in response", "blocked_by_response": "Blocked by CNAME or IP in response",
"blocked_by_cname_or_ip": "Blocked by CNAME or IP", "blocked_by_cname_or_ip": "Blocked by CNAME or IP",
@ -552,10 +552,10 @@
"autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>", "autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
"autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.", "autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.",
"tags_title": "Tags", "tags_title": "Tags",
"tags_desc": "You can select the tags that correspond to the client. Tags can be included in the filtering rules and allow you to apply them more accurately. <0>Learn more</0>", "tags_desc": "You can select tags that correspond to the client. Include tags in filtering rules to apply them more precisely. <0>Learn more</0>.",
"form_select_tags": "Select client tags", "form_select_tags": "Select client tags",
"check_title": "Check the filtering", "check_title": "Check the filtering",
"check_desc": "Check if the host name is filtered", "check_desc": "Check if a host name is filtered.",
"check": "Check", "check": "Check",
"form_enter_host": "Enter a host name", "form_enter_host": "Enter a host name",
"filtered_custom_rules": "Filtered by Custom filtering rules", "filtered_custom_rules": "Filtered by Custom filtering rules",
@ -594,19 +594,19 @@
"allowed": "Allowed", "allowed": "Allowed",
"filtered": "Filtered", "filtered": "Filtered",
"rewritten": "Rewritten", "rewritten": "Rewritten",
"safe_search": "Safe search", "safe_search": "Safe Search",
"blocklist": "Blocklist", "blocklist": "Blocklist",
"milliseconds_abbreviation": "ms", "milliseconds_abbreviation": "ms",
"cache_size": "Cache size", "cache_size": "Cache size",
"cache_size_desc": "DNS cache size (in bytes)", "cache_size_desc": "DNS cache size (in bytes).",
"cache_ttl_min_override": "Override minimum TTL", "cache_ttl_min_override": "Override minimum TTL",
"cache_ttl_max_override": "Override maximum TTL", "cache_ttl_max_override": "Override maximum TTL",
"enter_cache_size": "Enter cache size (bytes)", "enter_cache_size": "Enter cache size (bytes)",
"enter_cache_ttl_min_override": "Enter minimum TTL (seconds)", "enter_cache_ttl_min_override": "Enter minimum TTL (seconds)",
"enter_cache_ttl_max_override": "Enter maximum TTL (seconds)", "enter_cache_ttl_max_override": "Enter maximum TTL (seconds)",
"cache_ttl_min_override_desc": "Extend short time-to-live values (seconds) received from the upstream server when caching DNS responses", "cache_ttl_min_override_desc": "Extend short time-to-live values (seconds) received from the upstream server when caching DNS responses.",
"cache_ttl_max_override_desc": "Set a maximum time-to-live value (seconds) for entries in the DNS cache", "cache_ttl_max_override_desc": "Set a maximum time-to-live value (seconds) for entries in the DNS cache.",
"ttl_cache_validation": "Minimum cache TTL value must be less than or equal to the maximum value", "ttl_cache_validation": "Minimum cache TTL override must be less than or equal to the maximum.",
"cache_optimistic": "Optimistic caching", "cache_optimistic": "Optimistic caching",
"cache_optimistic_desc": "Make AdGuard Home respond from the cache even when the entries are expired and also try to refresh them.", "cache_optimistic_desc": "Make AdGuard Home respond from the cache even when the entries are expired and also try to refresh them.",
"filter_category_general": "General", "filter_category_general": "General",
@ -624,7 +624,6 @@
"adg_will_drop_dns_queries": "AdGuard Home will be dropping all DNS queries from this client.", "adg_will_drop_dns_queries": "AdGuard Home will be dropping all DNS queries from this client.",
"filter_allowlist": "WARNING: This action also will exclude the rule \"{{disallowed_rule}}\" from the list of allowed clients.", "filter_allowlist": "WARNING: This action also will exclude the rule \"{{disallowed_rule}}\" from the list of allowed clients.",
"last_rule_in_allowlist": "Cannot disallow this client because excluding the rule \"{{disallowed_rule}}\" will DISABLE \"Allowed clients\" list.", "last_rule_in_allowlist": "Cannot disallow this client because excluding the rule \"{{disallowed_rule}}\" will DISABLE \"Allowed clients\" list.",
"experimental": "Experimental",
"use_saved_key": "Use the previously saved key", "use_saved_key": "Use the previously saved key",
"parental_control": "Parental Control", "parental_control": "Parental Control",
"safe_browsing": "Safe Browsing", "safe_browsing": "Safe Browsing",

View File

@ -7,27 +7,27 @@ const Examples = () => (
<Trans>examples_title</Trans>: <Trans>examples_title</Trans>:
<ol className="leading-loose"> <ol className="leading-loose">
<li> <li>
<code>||example.org^</code> &nbsp; <code>||example.org^</code>:
<Trans>example_meaning_filter_block</Trans> <Trans>example_meaning_filter_block</Trans>
</li> </li>
<li> <li>
<code> @@||example.org^</code> &nbsp; <code> @@||example.org^</code>:
<Trans>example_meaning_filter_whitelist</Trans> <Trans>example_meaning_filter_whitelist</Trans>
</li> </li>
<li> <li>
<code>127.0.0.1 example.org</code> &nbsp; <code>127.0.0.1 example.org</code>:
<Trans>example_meaning_host_block</Trans> <Trans>example_meaning_host_block</Trans>
</li> </li>
<li> <li>
<code><Trans>example_comment</Trans></code> &nbsp; <code><Trans>example_comment</Trans></code>:
<Trans>example_comment_meaning</Trans> <Trans>example_comment_meaning</Trans>
</li> </li>
<li> <li>
<code><Trans>example_comment_hash</Trans></code> &nbsp; <code><Trans>example_comment_hash</Trans></code>:
<Trans>example_comment_meaning</Trans> <Trans>example_comment_meaning</Trans>
</li> </li>
<li> <li>
<code>/REGEX/</code> &nbsp; <code>/REGEX/</code>:
<Trans>example_regex_meaning</Trans> <Trans>example_regex_meaning</Trans>
</li> </li>
</ol> </ol>

View File

@ -19,7 +19,7 @@ import {
renderServiceField, renderServiceField,
} from '../../../helpers/form'; } from '../../../helpers/form';
import { validateClientId, validateRequiredValue } from '../../../helpers/validators'; import { validateClientId, validateRequiredValue } from '../../../helpers/validators';
import { FORM_NAME, SERVICES } from '../../../helpers/constants'; import { CLIENT_ID_LINK, FORM_NAME, SERVICES } from '../../../helpers/constants';
import './Service.css'; import './Service.css';
const settingsCheckboxes = [ const settingsCheckboxes = [
@ -281,11 +281,11 @@ let Form = (props) => {
</div> </div>
<div className="form__desc mt-0"> <div className="form__desc mt-0">
<Trans <Trans
components={[ components={{
<a href="https://github.com/AdguardTeam/AdGuardHome/wiki/Clients#idclient" key="0" target="_blank" rel="noopener noreferrer"> a: <a href={CLIENT_ID_LINK} target="_blank" rel="noopener noreferrer">
link text
</a>, </a>,
]} }}
> >
client_identifier_desc client_identifier_desc
</Trans> </Trans>

View File

@ -9,7 +9,7 @@ import {
trimMultilineString, trimMultilineString,
removeEmptyLines, removeEmptyLines,
} from '../../../../helpers/helpers'; } from '../../../../helpers/helpers';
import { FORM_NAME } from '../../../../helpers/constants'; import { CLIENT_ID_LINK, FORM_NAME } from '../../../../helpers/constants';
const fields = [ const fields = [
{ {
@ -48,7 +48,7 @@ let Form = (props) => {
</>} </>}
</label> </label>
<div className="form__desc form__desc--top"> <div className="form__desc form__desc--top">
<Trans>{subtitle}</Trans> <Trans components={{ a: <a href={CLIENT_ID_LINK} target="_blank" rel="noopener noreferrer">text</a> }}>{subtitle}</Trans>
</div> </div>
<Field <Field
id={id} id={id}

View File

@ -8,10 +8,10 @@ const Examples = (props) => (
<Trans>examples_title</Trans>: <Trans>examples_title</Trans>:
<ol className="leading-loose"> <ol className="leading-loose">
<li> <li>
<code>94.140.14.140</code> - {props.t('example_upstream_regular')} <code>94.140.14.140</code>: {props.t('example_upstream_regular')}
</li> </li>
<li> <li>
<code>tls://dns-unfiltered.adguard.com</code> &nbsp; <code>tls://dns-unfiltered.adguard.com</code>:
<span> <span>
<Trans <Trans
components={[ components={[
@ -30,7 +30,7 @@ const Examples = (props) => (
</span> </span>
</li> </li>
<li> <li>
<code>https://dns-unfiltered.adguard.com/dns-query</code> &nbsp; <code>https://dns-unfiltered.adguard.com/dns-query</code>:
<span> <span>
<Trans <Trans
components={[ components={[
@ -49,7 +49,7 @@ const Examples = (props) => (
</span> </span>
</li> </li>
<li> <li>
<code>quic://dns-unfiltered.adguard.com:784</code> &nbsp; <code>quic://dns-unfiltered.adguard.com:784</code>:
<span> <span>
<Trans <Trans
components={[ components={[
@ -65,15 +65,13 @@ const Examples = (props) => (
> >
example_upstream_doq example_upstream_doq
</Trans> </Trans>
&nbsp;
<span className="text-lowercase">(<Trans>experimental</Trans>)</span>
</span> </span>
</li> </li>
<li> <li>
<code>tcp://94.140.14.140</code> <Trans>example_upstream_tcp</Trans> <code>tcp://94.140.14.140</code>: <Trans>example_upstream_tcp</Trans>
</li> </li>
<li> <li>
<code>sdns://...</code> &nbsp; <code>sdns://...</code>:
<span> <span>
<Trans <Trans
components={[ components={[
@ -108,7 +106,7 @@ const Examples = (props) => (
</span> </span>
</li> </li>
<li> <li>
<code>[/example.local/]94.140.14.140</code> &nbsp; <code>[/example.local/]94.140.14.140</code>:
<span> <span>
<Trans <Trans
components={[ components={[
@ -127,7 +125,7 @@ const Examples = (props) => (
</span> </span>
</li> </li>
<li> <li>
<code>{COMMENT_LINE_DEFAULT_TOKEN} comment</code> &nbsp; <code>{COMMENT_LINE_DEFAULT_TOKEN} comment</code>:
<span> <span>
<Trans>example_upstream_comment</Trans> <Trans>example_upstream_comment</Trans>
</span> </span>

View File

@ -201,8 +201,6 @@ let Form = (props) => {
<div className="form__group form__group--settings"> <div className="form__group form__group--settings">
<label className="form__label" htmlFor="port_dns_over_quic"> <label className="form__label" htmlFor="port_dns_over_quic">
<Trans>encryption_doq</Trans> <Trans>encryption_doq</Trans>
&nbsp;
<span className="text-lowercase">(<Trans>experimental</Trans>)</span>
</label> </label>
<Field <Field
id="port_dns_over_quic" id="port_dns_over_quic"

View File

@ -7,7 +7,12 @@ import i18next from 'i18next';
import cn from 'classnames'; import cn from 'classnames';
import { getPathWithQueryString } from '../../../helpers/helpers'; import { getPathWithQueryString } from '../../../helpers/helpers';
import { FORM_NAME, MOBILE_CONFIG_LINKS, STANDARD_HTTPS_PORT } from '../../../helpers/constants'; import {
CLIENT_ID_LINK,
FORM_NAME,
MOBILE_CONFIG_LINKS,
STANDARD_HTTPS_PORT,
} from '../../../helpers/constants';
import { import {
renderInputField, renderInputField,
renderSelectField, renderSelectField,
@ -62,7 +67,7 @@ const MobileConfigForm = ({ invalid }) => {
const githubLink = ( const githubLink = (
<a <a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Clients#idclient" href={CLIENT_ID_LINK}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >

View File

@ -55,10 +55,11 @@ export const REPOSITORY = {
ISSUES: 'https://github.com/AdguardTeam/AdGuardHome/issues/new/choose', ISSUES: 'https://github.com/AdguardTeam/AdGuardHome/issues/new/choose',
}; };
export const PRIVACY_POLICY_LINK = 'https://adguard.com/privacy/home.html'; export const CLIENT_ID_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/Clients#clientid';
export const PORT_53_FAQ_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/FAQ#bindinuse';
export const UPSTREAM_CONFIGURATION_WIKI_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#upstreams';
export const MANUAL_UPDATE_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/FAQ#manual-update'; export const MANUAL_UPDATE_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/FAQ#manual-update';
export const PORT_53_FAQ_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/FAQ#bindinuse';
export const PRIVACY_POLICY_LINK = 'https://adguard.com/privacy/home.html';
export const UPSTREAM_CONFIGURATION_WIKI_LINK = 'https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#upstreams';
export const FILTERS_RELATIVE_LINK = '#filters'; export const FILTERS_RELATIVE_LINK = '#filters';

View File

@ -119,8 +119,8 @@ func (a *accessCtx) allowlistMode() (ok bool) {
func (a *accessCtx) isBlockedClientID(id string) (ok bool) { func (a *accessCtx) isBlockedClientID(id string) (ok bool) {
allowlistMode := a.allowlistMode() allowlistMode := a.allowlistMode()
if id == "" { if id == "" {
// In allowlist mode, consider requests without client IDs // In allowlist mode, consider requests without ClientIDs blocked by
// blocked by default. // default.
return allowlistMode return allowlistMode
} }

View File

@ -12,12 +12,12 @@ import (
"github.com/lucas-clemente/quic-go" "github.com/lucas-clemente/quic-go"
) )
// ValidateClientID returns an error if clientID is not a valid client ID. // ValidateClientID returns an error if id is not a valid ClientID.
func ValidateClientID(clientID string) (err error) { func ValidateClientID(id string) (err error) {
err = netutil.ValidateDomainNameLabel(clientID) err = netutil.ValidateDomainNameLabel(id)
if err != nil { if err != nil {
// Replace the domain name label wrapper with our own. // Replace the domain name label wrapper with our own.
return fmt.Errorf("invalid client id %q: %w", clientID, errors.Unwrap(err)) return fmt.Errorf("invalid clientid %q: %w", id, errors.Unwrap(err))
} }
return nil return nil
@ -33,7 +33,7 @@ func hasLabelSuffix(s, suffix string) (ok bool) {
return strings.HasSuffix(s, suffix) && s[len(s)-len(suffix)-1] == '.' return strings.HasSuffix(s, suffix) && s[len(s)-len(suffix)-1] == '.'
} }
// clientIDFromClientServerName extracts and validates a client ID. hostSrvName // clientIDFromClientServerName extracts and validates a ClientID. hostSrvName
// is the server name of the host. cliSrvName is the server name as sent by the // is the server name of the host. cliSrvName is the server name as sent by the
// client. When strict is true, and client and host server name don't match, // client. When strict is true, and client and host server name don't match,
// clientIDFromClientServerName will return an error. // clientIDFromClientServerName will return an error.
@ -91,7 +91,7 @@ func clientIDFromDNSContextHTTPS(pctx *proxy.DNSContext) (clientID string, err e
switch len(parts) { switch len(parts) {
case 1: case 1:
// Just /dns-query, no client ID. // Just /dns-query, no ClientID.
return "", nil return "", nil
case 2: case 2:
clientID = parts[1] clientID = parts[1]

View File

@ -65,7 +65,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
wantErrMsg: "", wantErrMsg: "",
strictSNI: false, strictSNI: false,
}, { }, {
name: "tls_no_client_id", name: "tls_no_clientid",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: "example.com", cliSrvName: "example.com",
@ -90,7 +90,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
wantErrMsg: "", wantErrMsg: "",
strictSNI: false, strictSNI: false,
}, { }, {
name: "tls_client_id", name: "tls_clientid",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: "cli.example.com", cliSrvName: "cli.example.com",
@ -98,7 +98,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
wantErrMsg: "", wantErrMsg: "",
strictSNI: true, strictSNI: true,
}, { }, {
name: "tls_client_id_hostname_error", name: "tls_clientid_hostname_error",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: "cli.example.net", cliSrvName: "cli.example.net",
@ -107,7 +107,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
`doesn't match host server name "example.com"`, `doesn't match host server name "example.com"`,
strictSNI: true, strictSNI: true,
}, { }, {
name: "tls_invalid_client_id", name: "tls_invalid_clientid",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: "!!!.example.com", cliSrvName: "!!!.example.com",
@ -116,7 +116,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
`bad domain name label rune '!'`, `bad domain name label rune '!'`,
strictSNI: true, strictSNI: true,
}, { }, {
name: "tls_client_id_too_long", name: "tls_clientid_too_long",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: `abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmno` + cliSrvName: `abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmno` +
@ -127,7 +127,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
`domain name label is too long: got 72, max 63`, `domain name label is too long: got 72, max 63`,
strictSNI: true, strictSNI: true,
}, { }, {
name: "quic_client_id", name: "quic_clientid",
proto: proxy.ProtoQUIC, proto: proxy.ProtoQUIC,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: "cli.example.com", cliSrvName: "cli.example.com",
@ -135,7 +135,7 @@ func TestServer_clientIDFromDNSContext(t *testing.T) {
wantErrMsg: "", wantErrMsg: "",
strictSNI: true, strictSNI: true,
}, { }, {
name: "tls_client_id_issue3437", name: "tls_clientid_issue3437",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
hostSrvName: "example.com", hostSrvName: "example.com",
cliSrvName: "cli.myexample.com", cliSrvName: "cli.myexample.com",
@ -191,22 +191,22 @@ func TestClientIDFromDNSContextHTTPS(t *testing.T) {
wantClientID string wantClientID string
wantErrMsg string wantErrMsg string
}{{ }{{
name: "no_client_id", name: "no_clientid",
path: "/dns-query", path: "/dns-query",
wantClientID: "", wantClientID: "",
wantErrMsg: "", wantErrMsg: "",
}, { }, {
name: "no_client_id_slash", name: "no_clientid_slash",
path: "/dns-query/", path: "/dns-query/",
wantClientID: "", wantClientID: "",
wantErrMsg: "", wantErrMsg: "",
}, { }, {
name: "client_id", name: "clientid",
path: "/dns-query/cli", path: "/dns-query/cli",
wantClientID: "cli", wantClientID: "cli",
wantErrMsg: "", wantErrMsg: "",
}, { }, {
name: "client_id_slash", name: "clientid_slash",
path: "/dns-query/cli/", path: "/dns-query/cli/",
wantClientID: "cli", wantClientID: "cli",
wantErrMsg: "", wantErrMsg: "",
@ -221,11 +221,10 @@ func TestClientIDFromDNSContextHTTPS(t *testing.T) {
wantClientID: "", wantClientID: "",
wantErrMsg: `clientid check: invalid path "/dns-query/cli/foo": extra parts`, wantErrMsg: `clientid check: invalid path "/dns-query/cli/foo": extra parts`,
}, { }, {
name: "invalid_client_id", name: "invalid_clientid",
path: "/dns-query/!!!", path: "/dns-query/!!!",
wantClientID: "", wantClientID: "",
wantErrMsg: `client id check: invalid client id "!!!": ` + wantErrMsg: `clientid check: invalid clientid "!!!": bad domain name label rune '!'`,
`bad domain name label rune '!'`,
}} }}
for _, tc := range testCases { for _, tc := range testCases {

View File

@ -150,8 +150,8 @@ type TLSConfig struct {
CertificateChainData []byte `yaml:"-" json:"-"` CertificateChainData []byte `yaml:"-" json:"-"`
PrivateKeyData []byte `yaml:"-" json:"-"` PrivateKeyData []byte `yaml:"-" json:"-"`
// ServerName is the hostname of the server. Currently, it is only // ServerName is the hostname of the server. Currently, it is only being
// being used for client ID checking. // used for ClientID checking.
ServerName string `yaml:"-" json:"-"` ServerName string `yaml:"-" json:"-"`
cert tls.Certificate cert tls.Certificate

View File

@ -35,7 +35,7 @@ type dnsContext struct {
// err is the error returned from a processing function. // err is the error returned from a processing function.
err error err error
// clientID is the clientID from DoH, DoQ, or DoT, if provided. // clientID is the ClientID from DoH, DoQ, or DoT, if provided.
clientID string clientID string
// origQuestion is the question received from the client. It is set // origQuestion is the question received from the client. It is set
@ -546,7 +546,7 @@ func (s *Server) processUpstream(dctx *dnsContext) (rc resultCode) {
} }
if pctx.Addr != nil && s.conf.GetCustomUpstreamByClient != nil { if pctx.Addr != nil && s.conf.GetCustomUpstreamByClient != nil {
// Use the clientID first, since it has a higher priority. // Use the ClientID first, since it has a higher priority.
id := stringutil.Coalesce(dctx.clientID, ipStringFromAddr(pctx.Addr)) id := stringutil.Coalesce(dctx.clientID, ipStringFromAddr(pctx.Addr))
upsConf, err := s.conf.GetCustomUpstreamByClient(id) upsConf, err := s.conf.GetCustomUpstreamByClient(id)
if err != nil { if err != nil {

View File

@ -28,7 +28,7 @@ import (
// DefaultTimeout is the default upstream timeout // DefaultTimeout is the default upstream timeout
const DefaultTimeout = 10 * time.Second const DefaultTimeout = 10 * time.Second
// defaultClientIDCacheCount is the default count of items in the LRU client ID // defaultClientIDCacheCount is the default count of items in the LRU ClientID
// cache. The assumption here is that there won't be more than this many // cache. The assumption here is that there won't be more than this many
// requests between the BeforeRequestHandler stage and the actual processing. // requests between the BeforeRequestHandler stage and the actual processing.
const defaultClientIDCacheCount = 1024 const defaultClientIDCacheCount = 1024
@ -88,8 +88,8 @@ type Server struct {
tableIPToHost *netutil.IPMap tableIPToHost *netutil.IPMap
tableIPToHostLock sync.Mutex tableIPToHostLock sync.Mutex
// clientIDCache is a temporary storage for clientIDs that were // clientIDCache is a temporary storage for ClientIDs that were extracted
// extracted during the BeforeRequestHandler stage. // during the BeforeRequestHandler stage.
clientIDCache cache.Cache clientIDCache cache.Cache
// DNS proxy instance for internal usage // DNS proxy instance for internal usage

View File

@ -66,7 +66,7 @@ func TestProcessQueryLogsAndStats(t *testing.T) {
reason: filtering.NotFilteredNotFound, reason: filtering.NotFilteredNotFound,
wantStatResult: stats.RNotFiltered, wantStatResult: stats.RNotFiltered,
}, { }, {
name: "success_tls_client_id", name: "success_tls_clientid",
proto: proxy.ProtoTLS, proto: proxy.ProtoTLS,
addr: &net.TCPAddr{IP: net.IP{1, 2, 3, 4}, Port: 1234}, addr: &net.TCPAddr{IP: net.IP{1, 2, 3, 4}, Port: 1234},
clientID: "cli42", clientID: "cli42",

View File

@ -318,7 +318,7 @@ func applyAdditionalFiltering(clientAddr net.IP, clientID string, setts *filteri
} }
} }
log.Debug("using settings for client %s with ip %s and id %q", c.Name, clientAddr, clientID) log.Debug("using settings for client %s with ip %s and clientid %q", c.Name, clientAddr, clientID)
if c.UseOwnBlockedServices { if c.UseOwnBlockedServices {
Context.dnsFilter.ApplyBlockedServices(setts, c.BlockedServices, false) Context.dnsFilter.ApplyBlockedServices(setts, c.BlockedServices, false)

View File

@ -8,7 +8,7 @@ import (
"github.com/AdguardTeam/golibs/log" "github.com/AdguardTeam/golibs/log"
) )
// client finds the client info, if any, by its client ID and IP address, // client finds the client info, if any, by its ClientID and IP address,
// optionally checking the provided cache. It will use the IP address // optionally checking the provided cache. It will use the IP address
// regardless of if the IP anonymization is enabled now, because the // regardless of if the IP anonymization is enabled now, because the
// anonymization could have been disabled in the past, and client will try to // anonymization could have been disabled in the past, and client will try to
@ -216,8 +216,8 @@ func (f quickMatchClientFinder) findClient(clientID, ip string) (c *Client) {
var err error var err error
c, err = f.client(clientID, ip, f.cache) c, err = f.client(clientID, ip, f.cache)
if err != nil { if err != nil {
log.Error("querylog: enriching file record for quick search:"+ log.Error(
" for client %q (client id %q): %s", "querylog: enriching file record for quick search: for client %q (clientid %q): %s",
ip, ip,
clientID, clientID,
err, err,
@ -259,8 +259,7 @@ func (l *queryLog) readNextEntry(
e.client, err = l.client(e.ClientID, e.IP.String(), cache) e.client, err = l.client(e.ClientID, e.IP.String(), cache)
if err != nil { if err != nil {
log.Error( log.Error(
"querylog: enriching file record at time %s"+ "querylog: enriching file record at time %s for client %q (clientid %q): %s",
" for client %q (client id %q): %s",
e.Time, e.Time,
e.IP, e.IP,
e.ClientID, e.ClientID,

View File

@ -71,7 +71,7 @@
### ClientIDs in Access Settings ### ClientIDs in Access Settings
* The `POST /control/access/set` HTTP API now accepts client IDs in * The `POST /control/access/set` HTTP API now accepts ClientIDs in
`"allowed_clients"` and `"disallowed_clients"` fields. `"allowed_clients"` and `"disallowed_clients"` fields.
### The new field `"unicode_name"` in `DNSQuestion` ### The new field `"unicode_name"` in `DNSQuestion`

View File

@ -822,12 +822,12 @@
- 'clients' - 'clients'
'operationId': 'clientsFind' 'operationId': 'clientsFind'
'summary': > 'summary': >
Get information about clients by their IP addresses or client IDs. Get information about clients by their IP addresses or ClientIDs.
'parameters': 'parameters':
- 'name': 'ip0' - 'name': 'ip0'
'in': 'query' 'in': 'query'
'description': > 'description': >
Filter by IP address or client IDs. Parameters with names `ip1`, Filter by IP address or ClientIDs. Parameters with names `ip1`,
`ip2`, and so on are also accepted and interpreted as "ip0 OR ip1 OR `ip2`, and so on are also accepted and interpreted as "ip0 OR ip1 OR
ip2". ip2".
@ -1890,7 +1890,7 @@
'type': 'string' 'type': 'string'
'client_id': 'client_id':
'description': > 'description': >
The client ID, if provided in DoH, DoQ, or DoT. The ClientID, if provided in DoH, DoQ, or DoT.
'example': 'cli123' 'example': 'cli123'
'type': 'string' 'type': 'string'
'client_info': 'client_info':
@ -2276,7 +2276,7 @@
'example': 'localhost' 'example': 'localhost'
'ids': 'ids':
'type': 'array' 'type': 'array'
'description': 'IP, CIDR, MAC, or client ID.' 'description': 'IP, CIDR, MAC, or ClientID.'
'items': 'items':
'type': 'string' 'type': 'string'
'use_global_settings': 'use_global_settings':
@ -2381,13 +2381,13 @@
'properties': 'properties':
'allowed_clients': 'allowed_clients':
'description': > 'description': >
The allowlist of clients: IP addresses, CIDRs, or client IDs. The allowlist of clients: IP addresses, CIDRs, or ClientIDs.
'items': 'items':
'type': 'string' 'type': 'string'
'type': 'array' 'type': 'array'
'disallowed_clients': 'disallowed_clients':
'description': > 'description': >
The blocklist of clients: IP addresses, CIDRs, or client IDs. The blocklist of clients: IP addresses, CIDRs, or ClientIDs.
'items': 'items':
'type': 'string' 'type': 'string'
'type': 'array' 'type': 'array'
@ -2411,7 +2411,7 @@
'example': 'localhost' 'example': 'localhost'
'ids': 'ids':
'type': 'array' 'type': 'array'
'description': 'IP, CIDR, MAC, or client ID.' 'description': 'IP, CIDR, MAC, or ClientID.'
'items': 'items':
'type': 'string' 'type': 'string'
'use_global_settings': 'use_global_settings':