From aab4ada723d5aa5d4f32aec50942955f18f8dec5 Mon Sep 17 00:00:00 2001 From: thatmattlove Date: Sat, 1 Jun 2024 15:25:41 -0400 Subject: [PATCH] add support for any DoH provider; closes #254; closes #256 --- docs/pages/configuration/config/web-ui.mdx | 7 ++++--- hyperglass/models/config/web.py | 8 +++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/pages/configuration/config/web-ui.mdx b/docs/pages/configuration/config/web-ui.mdx index a9b8cd2..7613447 100644 --- a/docs/pages/configuration/config/web-ui.mdx +++ b/docs/pages/configuration/config/web-ui.mdx @@ -15,9 +15,10 @@ hyperglass provides extensive customization options for the look and feel of the [DNS over HTTPS](https://www.rfc-editor.org/rfc/rfc8484) is used to look up an FQDN query target from the perspective of the user's browser. -| Parameter | Type | Default Value | Description | -| :------------------ | :----- | :------------ | :-------------------------------------- | -| `dns_provider.name` | String | cloudflare | Cloudflare or Google DNS are supported. | +| Parameter | Type | Default Value | Description | +| :------------------ | :----- | :------------------------------------- | :-------------------------------------------------------------------------- | +| `dns_provider.name` | String | cloudflare | If `cloudflare` or `google` are provided, no URL is necessary. | +| `dns_provider.url` | String | `https://cloudflare-dns.com/dns-query` | Provide a custom DNS over HTTPS URL if you'd like to use your own resolver. | ### Logo diff --git a/hyperglass/models/config/web.py b/hyperglass/models/config/web.py index f2a8a35..72a528e 100644 --- a/hyperglass/models/config/web.py +++ b/hyperglass/models/config/web.py @@ -186,13 +186,19 @@ class Theme(HyperglassModel): class DnsOverHttps(HyperglassModel): """Validation model for DNS over HTTPS resolution.""" - name: str = Field(default="cloudflare", pattern=DOH_PROVIDERS_PATTERN) + name: str = "cloudflare" url: str = "" @model_validator(mode="before") def validate_dns(cls, data: "DnsOverHttps") -> t.Dict[str, str]: """Assign url field to model based on selected provider.""" name = data.get("name", "cloudflare") + url = data.get("url", DNS_OVER_HTTPS["cloudflare"]) + if url not in DNS_OVER_HTTPS.values(): + return { + "name": "custom", + "url": url, + } url = DNS_OVER_HTTPS[name] return { "name": name,