Skip to content

[pull] main from jason5ng32:main - #125

Merged
pull[bot] merged 27 commits into
Cosr-Backup:mainfrom
jason5ng32:main
Aug 24, 2026
Merged

pull[bot] merged 27 commits into
Cosr-Backup:mainfrom
jason5ng32:main

Conversation

@pull

@pull pull Bot commented Aug 24, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

fly1d and others added 27 commits August 24, 2026 10:22
Replace the since-discontinued Quad101 with two verified Taiwan resolvers (issue #391 was rescoped to reachable public resolvers):

- HiNet (Chunghwa Telecom) 168.95.1.1
- GIGA (Taiwan Fixed Network) 203.133.1.6

Both are UDP-only (no JSON DoH endpoint). Also add a contributor rule to the data-file header requiring that a resolver actually answer with the ra flag before a PR, so future additions verify reachability instead of trusting published docs.

Co-authored-by: OpenAI Codex <codex@openai.com>
Retarget the rescoped Europe-resolver issue (#392) to CZ.NIC's ODVR (193.17.47.1), a verified reachable European public resolver run by the .cz registry. UDP-only: its DoH endpoint does not serve the JSON API.

Co-authored-by: OpenAI Codex <codex@openai.com>
Add Yandex.DNS (77.88.8.8), a reachable Russian public resolver, to the curated list. UDP-only: Yandex's DoH endpoint speaks RFC 8484 wire format rather than the application/dns-json API this endpoint queries.

Co-authored-by: OpenAI Codex <codex@openai.com>
Feat(dns): add HiNet and GIGA (Taiwan) resolvers
Feat(dns): add Yandex.DNS (Russia) resolver
Feat(dns): add CZ.NIC ODVR (Czechia) resolver
Run a daily and dev-push probe for every curated UDP resolver, checking recursive answers and honest NXDOMAIN responses. Add mocked unit coverage and publish a machine-readable report in the Actions summary.

Co-authored-by: OpenAI Codex <codex@openai.com>
Add SOA and CAA to the DNS resolver's record types, resolved through the
existing backend switch. The DoH path is unchanged.

SOA is formatted in DNS presentation order. CAA property tags are derived
from each record's own key rather than a fixed whitelist, so a
provider-specific tag renders as itself instead of collapsing to a
placeholder. Node's Resolver returns `critical` and `type` as metadata
alongside that one extensible tag, so both are excluded when picking it.

Eight record types no longer fit one row on a phone, where the control
previously pushed past its parent. The selector is now a four-column grid
on narrow viewports and stays a single row from `md` up.

Formatting is exported and covered offline by unit tests, including a
provider-specific CAA tag. No test performs a real DNS lookup.

Closes #400

Co-Authored-By: Claude <noreply@anthropic.com>
Completes the 53-key privacy dataset for pt-BR.

Co-authored-by: Codex <codex@openai.com>
Route DNS resolver requests through the shared domain guard so hostname presence, syntax, and canonical lowercasing follow the same contract as other domain-taking APIs.

Co-Authored-By: GPT-5 <noreply@openai.com>
Feat(i18n): add Brazilian Portuguese privacy policy
Align the telemetry disclosure with the English source so the named Sentry recipient does not contradict a broader claim that data is never shared with third parties.

Co-Authored-By: GPT-5 <noreply@openai.com>
RFC 8659 allows any alphanumeric property tag, `type` and `critical`
included. Node writes the tag onto the record under its own name, so such
a tag overwrites the metadata field of the same name and the scan for a
non-metadata key finds nothing. Destructuring undefined then threw, and
the surrounding handler turned an otherwise valid answer into N/A for
that resolver.

The tag is now recovered from whichever field stopped holding a metadata
value: `type` is otherwise always the constant 'CAA', and `critical` is
otherwise always a number. A tag named `critical` displaces the flag
itself, which Node has already lost by that point, so it falls back to 0.

Reported by review on #442. The suggested fix there was to stop excluding
`type`, which would break every ordinary record: a live google.com answer
is `{critical: 0, type: 'CAA', issue: 'pki.goog'}`, and without the
exclusion the scan picks `type` and renders `0 type "CAA"` instead of
`0 issue "pki.goog"`.

Co-Authored-By: Claude <noreply@anthropic.com>
Keep resolver health checks on demand and surface actionable runtime availability failures through the shared logger. Remove the GitHub Actions workflow so transient resolver connectivity does not affect code CI.

Co-authored-by: OpenAI Codex <codex@openai.com>
Chore(dns): add scheduled resolver health checks
Feat(dnsresolver): support SOA and CAA record lookups
Needed to join the DNS resolver's record-type Select and its input into
one bordered control. Added through the shadcn-vue CLI, so the files stay
verbatim upstream output and can be re-synced.

The same run resynced ui/separator, which still carried a hand-written
early-refactor version, to current upstream — data-slot and
data-[orientation] variants instead of a JS ternary, behaviourally the
same for all three existing callers. It also refreshed one transitive
postcss patch in the lockfile.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The pattern rejected any name containing an underscore, so the DNS
resolver could not look up `_dmarc.example.com` or a `_domainkey`
selector — the two most common TXT lookups there are — even though TXT
has been a supported record type all along.

Underscore is allowed as a label prefix only, per RFC 8552, and never in
the TLD: `_dmarc.example.com` passes, `has_underscore.com` and
`example._com` still do not.

Widening the shared helper rather than adding a DNS-only variant also
lets Whois and the OONI route reach the same names; both simply fail
upstream on a name their provider has nothing for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every provider contributes two rows to the results table, and the whole
premise of the tool is that a difference between rows means something
happened. Three cosmetic mismatches were reading as real disagreements:

- SOA dropped the trailing root dots that the DoH path returns, though
  the MX branch had appended them for that exact reason.
- CNAME and NS had the same gap; both transports now normalize through
  withRootDot, which also covers a DoH endpoint that strips them.
- A SOA query below the zone apex returned N/A on every row, because the
  answer arrives in the authority section. dohRecords now falls back to
  it, filtered to the SOA type so a stray NS never leaks in.

Also drops the CAA tag-collision fallback that arrived with #442: it
guessed at a record shape that cannot occur, and admitted in its own
comment that the flag was unrecoverable in the case it handled.

The shared record-type list lands here because withRootDot needs to know
which types are name-valued; the guard and the picker read it next.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`?type=` was never validated. The UDP branch fell through to a throw and
returned N/A, but the DoH branch interpolated whatever arrived straight
into the upstream URL, which made the route a query proxy for record
types we never intended to support.

requireValidRecordType checks it against DNS_RECORD_TYPES and uppercases
it in place, the same way requireValidDomain lowercases its param — so
`?type=caa` now works as well.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Eight record types no longer fit one line as toggle buttons, and the
region filter grows every time a resolver from a new country is added —
both were solved by wrapping, which is what the connected ToggleGroup
form is worst at: its border-l-0 seam only reads as one bar on a single
line and breaks apart the moment it wraps.

So the record type becomes a Select joined to the input inside a
ButtonGroup, with the run button beside it — one row at every width, the
trigger floored at CNAME's width so switching type does not jolt the row.
The region filter becomes detached pills, the same shape IPHistory uses,
which wraps cleanly at any number of countries.

The type list now comes from common/, so the picker cannot drift from
what the backend guard accepts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The old text was written years ago for one audience: it led with
operators contaminating domains for political reasons and warned that
some built-in providers were Chinese. Naming a country in product copy
is not something we do any more, and it buried what the tool is.

The new copy answers three questions instead — what it does, what a
difference between providers usually means, and how to run it. Filtering
and redirection are still named as a cause, just as a phenomenon rather
than as anyone's fault.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every common/ helper re-exported through frontend/utils/ is supposed to
ship a spec that imports both paths and asserts they agree — that is what
stops a bridge from quietly regrowing a second implementation. The
dns-record-types bridge shipped without one.

Also pins the two invariants that would otherwise fail silently: the
lookup set matching the ordered list, and every name-valued type actually
being a supported one, since a type missing from the list would skip
withRootDot and surface as punctuation noise rather than an error.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A SOA query for an aliased name returns the CNAME chain in Answer with
the zone SOA in Authority; taking Answer verbatim rendered the CNAME
target as the SOA value and made the row disagree with its UDP twin.
Filter SOA answers by record type on both sections.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Node DNS errors carry the looked-up name in err.message, and warn-level
logs mirror to telemetry; the availability branch now logs only the
error code, which is the whole signal for a timeout anyway. The
local-only debug branch keeps the full error for diagnosis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The provider-id comment block sat above requireValidRecordType; move it
back over requireValidProviderId. Also drop needless quote escapes in
the resolver-check script and match the ui/ double-quote style in
ButtonGroupSeparator.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@pull pull Bot locked and limited conversation to collaborators Aug 24, 2026
@pull pull Bot added the ⤵️ pull label Aug 24, 2026
@pull
pull Bot merged commit 6eb5aad into Cosr-Backup:main Aug 24, 2026
3 of 4 checks passed
@4everland
4everland Bot requested a deployment to production August 24, 2026 12:27 Abandoned

This branch had an error being deployed

1 abandoned deployment
production 6eb5aad4 Deployed Aug 24, 2026 by 4everland[bot]
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants