feat: add full Zonemaster stack with Docker and Spanish UI
- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI) - Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend - Dockerfile.gui: Astro static build served via nginx - docker-compose.yml: backend (internal) + frontend (port 5353) - nginx.conf: root redirects to /es/, /api/ proxied to backend - zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,320 @@
|
||||
# Specification of test zones for the CNAME functions in Recursor.pm
|
||||
|
||||
|
||||
## Table of contents
|
||||
|
||||
* [Background](#background)
|
||||
* [Test scenarios](#test-scenarios)
|
||||
* [Test zone names](#test-zone-names)
|
||||
* [Test scenarios and message tags](#test-scenarios-and-message-tags)
|
||||
* [Zone setup for test scenarios]
|
||||
|
||||
|
||||
## Background
|
||||
|
||||
See the [test zone README file] which is for test case base test zones. Since
|
||||
this specifies test zones for code it is not fully applicable.
|
||||
|
||||
## Test scenarios
|
||||
|
||||
The purpose of the test scenarios is to cover all reasonable contexts where
|
||||
the code should be tested.
|
||||
|
||||
|
||||
## Test zone name
|
||||
|
||||
The test zone for these scenarios is `cname.recursor.engine.xa`. Subdomain and
|
||||
subzones are created. The names are given in section
|
||||
"[Zone setup for test scenarios]" below.
|
||||
|
||||
|
||||
## Test scenarios
|
||||
|
||||
Scenario name | Expected output
|
||||
:----------------------------|:---------------------------------------------------------------------------------------------
|
||||
GOOD-CNAME-1 | True and tags `CNAME_START`, `CNAME_FOLLOWED_IN_ZONE`
|
||||
GOOD-CNAME-2 | True and tags `CNAME_START`, `CNAME_FOLLOWED_IN_ZONE`
|
||||
GOOD-CNAME-CHAIN | True and tags `CNAME_START`, `CNAME_FOLLOWED_IN_ZONE`
|
||||
GOOD-CNAME-OUT-OF-ZONE | True and tags `CNAME_START`, `CNAME_FOLLOWED_OUT_OF_ZONE`
|
||||
NXDOMAIN-VIA-CNAME | True and tags `CNAME_START`, `CNAME_FOLLOWED_OUT_OF_ZONE`
|
||||
NODATA-VIA-CNAME | True and tags `CNAME_START`, `CNAME_FOLLOWED_OUT_OF_ZONE`
|
||||
MULT-CNAME | Undefined and tags `CNAME_START`, `CNAME_MULTIPLE_FOR_NAME`
|
||||
LOOPED-CNAME-IN-ZONE-1 | Undefined and tags `CNAME_START`, `CNAME_LOOP_INNER`
|
||||
LOOPED-CNAME-IN-ZONE-2 | Undefined and tags `CNAME_START`, `CNAME_LOOP_INNER`
|
||||
LOOPED-CNAME-IN-ZONE-3 | Undefined and tags `CNAME_START`, `CNAME_LOOP_INNER`
|
||||
LOOPED-CNAME-OUT-OF-ZONE | Undefined and tags `CNAME_START`, `CNAME_LOOP_OUTER`
|
||||
TOO-LONG-CNAME-CHAIN | Undefined and tags `CNAME_START`, `CNAME_RECORDS_TOO_MANY`
|
||||
TARGET-NO-MATCH-CNAME | Undefined and tags `CNAME_START`, `CNAME_NO_MATCH`
|
||||
BROKEN-CNAME-CHAIN | Undefined and tags `CNAME_START`, `CNAME_RECORDS_CHAIN_BROKEN`
|
||||
WRONG-CNAME-OWNER-NAME | False and no tags
|
||||
EXTRA-CNAME-IN-ANSWER | False and no tags
|
||||
|
||||
## Zone setup for test scenarios
|
||||
|
||||
Assumptions for the scenario specifications, unless stated otherwise for the
|
||||
specific scenario:
|
||||
|
||||
* The `cname.recursor.engine.xa` zone is used for all scenarios.
|
||||
* Relative names are under `cname.recursor.engine.xa.`.
|
||||
* The query name is given by the scenario.
|
||||
* Query type is assumed to be `A`.
|
||||
* In the zone, the query name always has a `CNAME` record.
|
||||
* The zone is set up on one NS, ns1.
|
||||
* The [RCODE Name] in the response is NoError.
|
||||
|
||||
### GOOD-CNAME-1
|
||||
The query name will resolve to one `A` record via one CNAME.
|
||||
|
||||
* Query name: "good-cname-1.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
good-cname-1 CNAME good-cname-1-target
|
||||
good-cname-1-target A 127.0.0.1
|
||||
```
|
||||
|
||||
### GOOD-CNAME-2
|
||||
The query name will resolve to two `A` record via one CNAME.
|
||||
|
||||
* Query name: "good-cname-2.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
good-cname-2 CNAME good-cname-2-target
|
||||
good-cname-2-target A 127.0.0.1
|
||||
good-cname-2-target A 127.0.0.2
|
||||
```
|
||||
|
||||
### GOOD-CNAME-CHAIN
|
||||
The query name will resolve to two `A` record via three CNAME.
|
||||
|
||||
* Query name: "good-cname-chain.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
good-cname-chain CNAME good-cname-chain-two
|
||||
good-cname-chain-two CNAME good-cname-chain-three
|
||||
good-cname-chain-three CNAME good-cname-chain-target
|
||||
good-cname-chain-target A 127.0.0.1
|
||||
```
|
||||
|
||||
### GOOD-CNAME-OUT-OF-ZONE
|
||||
The query name will resolve to an `A` record via a CNAME in the zone with a
|
||||
target that points at a subzone, and a delegation to that sub zone.
|
||||
|
||||
* For all queries
|
||||
* The two zones, `cname.recursor.engine.xa` and
|
||||
`goodsub.cname.recursor.engine.xa`, are hosted on different IP addresses.
|
||||
* "x", "y" and "z" in the IP addresses in the configuration below are to be
|
||||
set in the configuration of the test zones.
|
||||
|
||||
* Query name: "good-cname-out-of-zone.cname.recursor.engine.xa"
|
||||
* Servers: NS of `cname.recursor.engine.xa`.
|
||||
* Answer, authority and additional sections, respectively, to be found in the
|
||||
response:
|
||||
```
|
||||
;; ANSWER SECTION:
|
||||
good-cname-out-of-zone CNAME target.goodsub
|
||||
|
||||
;; AUTHORITY SECTION:
|
||||
goodsub NS ns1.goodsub
|
||||
|
||||
;; ADDITIONAL SECTION:
|
||||
ns1.goodsub A 127.x.y.z
|
||||
ns1.goodsub AAAA fda1:b2:c3::127:x:y:z
|
||||
```
|
||||
* Query name: "target.goodsub.cname.recursor.engine.xa"
|
||||
* Servers: NS of `goodsub.cname.recursor.engine.xa`.
|
||||
* To be found in the answer section:
|
||||
```
|
||||
target.goodsub A 127.0.0.1
|
||||
```
|
||||
|
||||
### NXDOMAIN-VIA-CNAME
|
||||
The query name exists, but as CNAME record. The target name of CNAME does not
|
||||
exist.
|
||||
|
||||
* Query name: "nxdomain-via-cname.cname.recursor.engine.xa"
|
||||
* The [RCODE Name] in the response is NxDomain.
|
||||
* The target of the CNAME, `nxdomain-via-cname-target` does not exist in the
|
||||
zone and is not delegated.
|
||||
* SOA of "cname.recursor.engine.xa" to be found in authority section.
|
||||
* To be found in the answer section:
|
||||
```
|
||||
nxdomain-via-cname CNAME nxdomain-via-cname-target
|
||||
```
|
||||
|
||||
### NODATA-VIA-CNAME
|
||||
The query name exists, but as CNAME record. The target name of CNAME exists, but
|
||||
not with any A record.
|
||||
|
||||
* Query name: "nodata-via-cname.cname.recursor.engine.xa"
|
||||
* The target of the CNAME, `nodata-via-cname-target`, exists in the zone but
|
||||
has neither `A` or `CNAME` record, and is not delegated.
|
||||
* SOA of "cname.recursor.engine.xa" to be found in authority section.
|
||||
* To be found in the answer section:
|
||||
```
|
||||
nodata-via-cname CNAME nodata-via-cname-target
|
||||
```
|
||||
|
||||
### MULT-CNAME
|
||||
The query name exists, but as CNAME, as two CNAME records.
|
||||
|
||||
* Query name: "mult-cname.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
mult-cname CNAME mult-cname-target-1
|
||||
mult-cname CNAME mult-cname-target-2
|
||||
mult-cname-target-1 A 127.0.0.1
|
||||
mult-cname-target-2 A 127.0.0.2
|
||||
```
|
||||
|
||||
## LOOPED-CNAME-IN-ZONE-1
|
||||
The query name will point at a CNAME record with the same target as owner name.
|
||||
|
||||
* Query name: "looped-cname-in-zone-1.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
looped-cname-in-zone-1 CNAME looped-cname-in-zone-1
|
||||
```
|
||||
|
||||
## LOOPED-CNAME-IN-ZONE-2
|
||||
The query name will point at a CNAME, which points at a second CNAME,
|
||||
which points to a third CNAME whose target name is the same as the
|
||||
owner name of the second CNAME.
|
||||
|
||||
* Query name: "looped-cname-in-zone-2.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
looped-cname-in-zone-2 CNAME looped-cname-in-zone-2-a
|
||||
looped-cname-in-zone-2-a CNAME looped-cname-in-zone-2-b
|
||||
looped-cname-in-zone-2-b CNAME looped-cname-in-zone-2-a
|
||||
```
|
||||
|
||||
## LOOPED-CNAME-IN-ZONE-3
|
||||
The query name will point at a CNAME, which points at a second CNAME whose target
|
||||
name is the same as the owner name of the first CNAME.
|
||||
|
||||
* Query name: "looped-cname-in-zone-3.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
looped-cname-in-zone-3 CNAME looped-cname-in-zone-3-next
|
||||
looped-cname-in-zone-3-next CNAME looped-cname-in-zone-3
|
||||
```
|
||||
|
||||
## LOOPED-CNAME-OUT-OF-ZONE
|
||||
The query name will point at a CNAME record, but in a sub zone, and the target
|
||||
name of the CNAME record will point at another CNAME record in another sub zone,
|
||||
and the target name of the second CNAME record will point at the first.
|
||||
|
||||
* For all four queries
|
||||
* The three zones `cname.recursor.engine.xa`, `sub2.cname.recursor.engine.xa`
|
||||
and `sub3.cname.recursor.engine.xa` are hosted on different IP addresses.
|
||||
* "x", "y" and "z" in the IP addresses in the configuration below are to be
|
||||
set in the configuration of the test zones.
|
||||
|
||||
* Query name: "looped-cname-out-of-zone.sub2.cname.recursor.engine.xa"
|
||||
* Servers: NS of `cname.recursor.engine.xa`.
|
||||
* Authority and additional sections, respectively, to be found in the
|
||||
response:
|
||||
```
|
||||
;; AUTHORITY SECTION:
|
||||
sub2 NS ns1.sub2
|
||||
|
||||
;; ADDITIONAL SECTION:
|
||||
ns1.sub2 A 127.x.y.z
|
||||
ns1.sub2 AAAA fda1:b2:c3::127:x:y:z
|
||||
```
|
||||
* Query name: "looped-cname-out-of-zone.sub2.cname.recursor.engine.xa"
|
||||
* Servers: NS of `sub2.cname.recursor.engine.xa`.
|
||||
* To be found in the answer section:
|
||||
```
|
||||
looped-cname-out-of-zone.sub2 CNAME looped-cname-out-of-zone.sub3
|
||||
```
|
||||
* Query name: "looped-cname-out-of-zone.sub3.cname.recursor.engine.xa"
|
||||
* Servers: NS of `cname.recursor.engine.xa`.
|
||||
* Relative names are under `cname.recursor.engine.xa.`.
|
||||
* Authority and additional sections, respectively, to be found in the
|
||||
response:
|
||||
```
|
||||
;; AUTHORITY SECTION:
|
||||
sub3 NS ns1.sub3
|
||||
|
||||
;; ADDITIONAL SECTION:
|
||||
ns1.sub3 A 127.x.y.z
|
||||
ns1.sub3 AAAA fda1:b2:c3::127:x:y:z
|
||||
```
|
||||
* Query name: "looped-cname-out-of-zone.sub3.cname.recursor.engine.xa"
|
||||
* Servers: NS of `sub3.cname.recursor.engine.xa`.
|
||||
* To be found in the answer section:
|
||||
```
|
||||
looped-cname-out-of-zone.sub3 CNAME looped-cname-out-of-zone.sub2
|
||||
```
|
||||
|
||||
### TOO-LONG-CNAME-CHAIN
|
||||
The query name will resolve to one `A` record via ten CNAME records which is
|
||||
above the limit.
|
||||
|
||||
* Query name: "too-long-cname-chain.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
too-long-cname-chain CNAME too-long-cname-chain-two
|
||||
too-long-cname-chain-two CNAME too-long-cname-chain-three
|
||||
too-long-cname-chain-three CNAME too-long-cname-chain-four
|
||||
too-long-cname-chain-four CNAME too-long-cname-chain-five
|
||||
too-long-cname-chain-five CNAME too-long-cname-chain-six
|
||||
too-long-cname-chain-six CNAME too-long-cname-chain-seven
|
||||
too-long-cname-chain-seven CNAME too-long-cname-chain-eight
|
||||
too-long-cname-chain-eight CNAME too-long-cname-chain-nine
|
||||
too-long-cname-chain-nine CNAME too-long-cname-chain-ten
|
||||
too-long-cname-chain-ten CNAME too-long-cname-chain-target
|
||||
too-long-cname-chain-target A 127.0.0.1
|
||||
```
|
||||
|
||||
### TARGET-NO-MATCH-CNAME
|
||||
The CNAME target name does not match the owner name of the `A` record.
|
||||
|
||||
* Query name: "target-no-match-cname.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
target-no-match-cname CNAME target-no-match-cname-two
|
||||
target-no-match-cname-target A 127.0.0.1
|
||||
```
|
||||
|
||||
### BROKEN-CNAME-CHAIN
|
||||
The CNAME chain is broken between first and second CNAME records.
|
||||
|
||||
* Query name: "broken-cname-chain.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
broken-cname-chain CNAME broken-cname-chain-two
|
||||
broken-cname-chain-three CNAME broken-cname-chain-target
|
||||
broken-cname-chain-target A 127.0.0.1
|
||||
```
|
||||
|
||||
|
||||
### WRONG-CNAME-OWNER-NAME
|
||||
The owner name of the CNAME in the response does not match query name.
|
||||
|
||||
* Query name: "wrong-cname-owner-name.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
wrong-cname-owner-name-1 CNAME wrong-cname-owner-name-target
|
||||
wrong-cname-owner-name-target A 127.0.0.1
|
||||
```
|
||||
|
||||
|
||||
### EXTRA-CNAME-IN-ANSWER
|
||||
There is an extra CNAME record with an owner name not matching the query name
|
||||
besides the `A` record matching query name.
|
||||
|
||||
* Query name: "extra-cname-in-answer.cname.recursor.engine.xa"
|
||||
* To be found in the answer section:
|
||||
```
|
||||
extra-cname-in-answer A 127.0.0.1
|
||||
extra-cname-in-answer-1 CNAME extra-cname-in-answer-2
|
||||
```
|
||||
|
||||
|
||||
|
||||
[RCODE Name]: https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
|
||||
[Test zone README file]: ../../README.md
|
||||
[Zone setup for test scenarios]: #zone-setup-for-test-scenarios
|
||||
|
||||
Reference in New Issue
Block a user