mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-01-07 16:09:10 +08:00
e563c53658
* Handle IPv4 "Classless in-addr.arpa delegation" RFC2317 (partial). * Validate PTR name when in RFC2317 "Classless in-addr.arpa delegation" domains. * Update docs * Set CanUsePTR for Route53 and Google CloudDNS. * BIND: Replace "/" with "_" in filenames.
84 lines
3.8 KiB
Go
84 lines
3.8 KiB
Go
package transform
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
// ptrmagic(name, domain string, al int) (string, error)
|
|
|
|
func TestPtrMagic(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
domain string
|
|
output string
|
|
fail bool
|
|
}{
|
|
// Magic IPv4:
|
|
{"1.2.3.4", "3.2.1.in-addr.arpa", "4", false},
|
|
{"1.2.3.4", "2.1.in-addr.arpa", "4.3", false},
|
|
{"1.2.3.4", "1.in-addr.arpa", "4.3.2", false},
|
|
|
|
// No magic IPv4:
|
|
{"1", "2.3.4.in-addr.arpa", "1", false},
|
|
{"1.2", "3.4.in-addr.arpa", "1.2", false},
|
|
{"1.2.3", "4.in-addr.arpa", "1.2.3", false},
|
|
{"1.2.3.4", "in-addr.arpa", "1.2.3.4", false}, // Not supported, but it works.
|
|
|
|
// Magic IPv6:
|
|
{"1", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1", false},
|
|
{"1.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0", false},
|
|
{"1.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0", false},
|
|
{"1.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0", false},
|
|
{"1.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0", false},
|
|
{"1.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0.0.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0.0.0.0.0.0.0", "0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0.0.0.0.0.0", false},
|
|
|
|
// RFC2317 (Classless)
|
|
// 172.20.18.160/27 is .160 - .191:
|
|
{"172.20.18.159", "160/27.18.20.172.in-addr.arpa", "", true},
|
|
{"172.20.18.160", "160/27.18.20.172.in-addr.arpa", "160", false},
|
|
{"172.20.18.191", "160/27.18.20.172.in-addr.arpa", "191", false},
|
|
{"172.20.18.192", "160/27.18.20.172.in-addr.arpa", "", true},
|
|
|
|
// If it doesn't end in .arpa, the magic is disabled:
|
|
{"1.2.3.4", "example.com", "1.2.3.4", false},
|
|
{"1", "example.com", "1", false},
|
|
{"1.0.0.0", "example.com", "1.0.0.0", false},
|
|
{"1.0.0.0.0.0.0.0", "example.com", "1.0.0.0.0.0.0.0", false},
|
|
|
|
// User manually reversed addresses:
|
|
{"1.1.1.1.in-addr.arpa.", "1.1.in-addr.arpa", "1.1", false},
|
|
{"1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.",
|
|
"0.2.ip6.arpa", "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0", false},
|
|
|
|
// Error cases:
|
|
{"1.1.1.1.in-addr.arpa.", "2.2.in-addr.arpa", "", true},
|
|
{"1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.", "9.9.ip6.arpa", "", true},
|
|
{"3.3.3.3", "4.4.in-addr.arpa", "", true},
|
|
{"2001:db8::1", "9.9.ip6.arpa", "", true},
|
|
|
|
// These should be errors but we don't check for them at this time:
|
|
//{"blurg", "3.4.in-addr.arpa", "blurg", true},
|
|
//{"1", "3.4.in-addr.arpa", "1", true},
|
|
}
|
|
for _, tst := range tests {
|
|
t.Run(fmt.Sprintf("%s %s", tst.name, tst.domain), func(t *testing.T) {
|
|
o, errs := PtrNameMagic(tst.name, tst.domain)
|
|
if errs != nil && !tst.fail {
|
|
t.Errorf("Got error but expected none (%v)", errs)
|
|
} else if errs == nil && tst.fail {
|
|
t.Errorf("Expected error but got none (%v)", o)
|
|
} else if errs == nil && o != tst.output {
|
|
t.Errorf("Got (%v) expected (%v)", o, tst.output)
|
|
}
|
|
})
|
|
}
|
|
}
|