🐞 Ignore case when comparing customized records

This fixes an error when procuring Let's Encrypt certs using HTTP-01
challenge--my server didn't recognize, when queried with `SsLiP.iO`,
that it's the same as `sslip.io`, and so it doesn't reply with the
correct A/AAAA records.

fixes:
```
sudo /usr/local/bin/certbot renew
  No valid IP addresses found for sslip.io
```

log messages from `/var/vcap/sys/log/sslip.io-dns-server/sslip.io-dns-server.stderr.log`:
```
2021/01/30 21:45:49 3.122.55.230.22713 TypeA SsliP.IO. ? nil, SOA SsliP.IO. briancunnie.gmail.com. 2021011400 900 900 1800 300
2021/01/30 21:45:49 54.187.227.254.16621 TypeAAAA SslIP.io. ? nil, SOA SslIP.io. briancunnie.gmail.com. 2021011400 900 900 1800 300
```
This commit is contained in:
Brian Cunnie
2021-01-30 13:47:50 -08:00
parent 64df830d91
commit 1614f574bc
2 changed files with 12 additions and 12 deletions

View File

@@ -573,7 +573,7 @@ func ResponseHeader(query dnsmessage.Header, rcode dnsmessage.RCode) dnsmessage.
func NameToA(fqdnString string) []dnsmessage.AResource {
fqdn := []byte(fqdnString)
// is it a customized A record? If so, return early
if domain, ok := Customizations[fqdnString]; ok && len(domain.A) > 0 {
if domain, ok := Customizations[strings.ToLower(fqdnString)]; ok && len(domain.A) > 0 {
return domain.A
}
for _, ipv4RE := range []*regexp.Regexp{ipv4REDashes, ipv4REDots} {
@@ -593,7 +593,7 @@ func NameToA(fqdnString string) []dnsmessage.AResource {
func NameToAAAA(fqdnString string) []dnsmessage.AAAAResource {
fqdn := []byte(fqdnString)
// is it a customized AAAA record? If so, return early
if domain, ok := Customizations[fqdnString]; ok && len(domain.AAAA) > 0 {
if domain, ok := Customizations[strings.ToLower(fqdnString)]; ok && len(domain.AAAA) > 0 {
return domain.AAAA
}
if !ipv6RE.Match(fqdn) {
@@ -618,7 +618,7 @@ func NameToAAAA(fqdnString string) []dnsmessage.AAAAResource {
// CNAMEResource returns the CNAME via Customizations, otherwise nil
func CNAMEResource(fqdnString string) *dnsmessage.CNAMEResource {
if domain, ok := Customizations[fqdnString]; ok && domain.CNAME != (dnsmessage.CNAMEResource{}) {
if domain, ok := Customizations[strings.ToLower(fqdnString)]; ok && domain.CNAME != (dnsmessage.CNAMEResource{}) {
return &domain.CNAME
}
return nil
@@ -627,7 +627,7 @@ func CNAMEResource(fqdnString string) *dnsmessage.CNAMEResource {
// MXResources returns either 1 or more MX records set via Customizations or
// an MX record pointing to the queried record
func MXResources(fqdnString string) []dnsmessage.MXResource {
if domain, ok := Customizations[fqdnString]; ok && len(domain.MX) > 0 {
if domain, ok := Customizations[strings.ToLower(fqdnString)]; ok && len(domain.MX) > 0 {
return domain.MX
}
mx, _ := dnsmessage.NewName(fqdnString)
@@ -661,7 +661,7 @@ func NSResources(fqdnString string) []dnsmessage.NSResource {
// TXTResources returns TXT records from Customizations
func TXTResources(fqdnString string) []dnsmessage.TXTResource {
if domain, ok := Customizations[fqdnString]; ok {
if domain, ok := Customizations[strings.ToLower(fqdnString)]; ok {
return domain.TXT
}
return nil

View File

@@ -55,7 +55,7 @@ var _ = Describe("Xip", func() {
})
When("querying one of sslip.io's DKIM CNAME's", func() {
It("returns the CNAME", func() {
cname := xip.CNAMEResource("protonmail._domainkey.sslip.io.")
cname := xip.CNAMEResource("protonmail._domainkey.SSlip.Io.")
Expect(cname.CNAME.String()).To(MatchRegexp("^protonmail\\.domainkey.*.domains\\.proton\\.ch\\.$"))
})
})
@@ -99,7 +99,7 @@ var _ = Describe("Xip", func() {
})
When("sslip.io is the domain being queried", func() {
It("returns sslip.io's custom MX records", func() {
mx := xip.MXResources("sslip.io.")
mx := xip.MXResources("sslIP.iO.")
Expect(len(mx)).To(Equal(2))
Expect(mx[0].MX.Data).To(Equal(xip.Customizations["sslip.io."].MX[0].MX.Data))
})
@@ -155,7 +155,7 @@ var _ = Describe("Xip", func() {
})
When("queried for the sslip.io domain", func() {
It("returns mail-related TXT resources for the sslip.io domain", func() {
domain := "sslip.io."
domain := "ssLip.iO."
txts := xip.TXTResources(domain)
Expect(err).To(Not(HaveOccurred()))
Expect(len(txts)).To(Equal(2))
@@ -182,7 +182,7 @@ var _ = Describe("Xip", func() {
Expect(ipv4Answers[0]).To(Equal(expectedA))
},
// sslip.io website
Entry("sslip.io", "sslip.io.", dnsmessage.AResource{A: [4]byte{78, 46, 204, 247}}),
Entry("sslip.io", "ssLIP.io.", dnsmessage.AResource{A: [4]byte{78, 46, 204, 247}}),
// nameservers
Entry("ns-aws", "ns-aws.nono.io.", dnsmessage.AResource{A: [4]byte{52, 0, 56, 137}}),
Entry("ns-azure", "ns-azure.nono.io.", dnsmessage.AResource{A: [4]byte{52, 187, 42, 158}}),
@@ -190,7 +190,7 @@ var _ = Describe("Xip", func() {
// dots
Entry("loopback", "127.0.0.1", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}),
Entry("255 with domain", "255.254.253.252.com", dnsmessage.AResource{A: [4]byte{255, 254, 253, 252}}),
Entry(`"This" network, pre-and-post`, "nono.io.0.1.2.3.sslip.io", dnsmessage.AResource{A: [4]byte{0, 1, 2, 3}}),
Entry(`"This" network, pre-and-post`, "nono.io.0.1.2.3.ssLIp.IO", dnsmessage.AResource{A: [4]byte{0, 1, 2, 3}}),
Entry("private network, two IPs, grabs the leftmost", "nono.io.172.16.0.30.172.31.255.255.sslip.io", dnsmessage.AResource{A: [4]byte{172, 16, 0, 30}}),
// dashes
Entry("shared address with dashes", "100-64-1-2", dnsmessage.AResource{A: [4]byte{100, 64, 1, 2}}),
@@ -199,7 +199,7 @@ var _ = Describe("Xip", func() {
// dots-and-dashes, mix-and-matches
Entry("Pandaxin's paradox", "minio-01.192-168-1-100.sslip.io", dnsmessage.AResource{A: [4]byte{192, 168, 1, 100}}),
)
DescribeTable("when it does not match an IP address",
DescribeTable("when it does NOT match an IP address",
func(fqdn string) {
ipv4Answers := xip.NameToA(fqdn)
Expect(len(ipv4Answers)).To(Equal(0))
@@ -294,7 +294,7 @@ var _ = Describe("Xip", func() {
Expect(ipv6Answers[0]).To(Equal(expectedAAAA))
},
// sslip.io website
Entry("sslip.io", "sslip.io.", xip.Customizations["sslip.io."].AAAA[0]),
Entry("sslip.io", "SSLip.io.", xip.Customizations["sslip.io."].AAAA[0]),
// dashes only
Entry("loopback", "--1", dnsmessage.AAAAResource{AAAA: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}),
Entry("ff with domain", "fffe-fdfc-fbfa-f9f8-f7f6-f5f4-f3f2-f1f0.com", dnsmessage.AAAAResource{AAAA: [16]byte{255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240}}),