From 65bb857041ed0f9c255ed18c99b3608ce2df110c Mon Sep 17 00:00:00 2001 From: Brian Cunnie Date: Sun, 16 Aug 2020 19:02:02 -0700 Subject: [PATCH] `NameToA()` accommodates hyphens ("-") in hostnames --- src/xip/xip.go | 4 +++- src/xip/xip_test.go | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/xip/xip.go b/src/xip/xip.go index 728856c..c2b895d 100644 --- a/src/xip/xip.go +++ b/src/xip/xip.go @@ -5,10 +5,11 @@ import ( "golang.org/x/net/dns/dnsmessage" "net" "regexp" + "strings" ) // https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses -var ipv4RE= regexp.MustCompile(`(^|\.)(((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))($|\.)`) +var ipv4RE= regexp.MustCompile(`(^|[.-])(((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])[.-]){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))($|[.-])`) func NameToA (fqdnString string) (dnsmessage.AResource, error) { fqdn:=[]byte(fqdnString) @@ -17,6 +18,7 @@ func NameToA (fqdnString string) (dnsmessage.AResource, error) { } match := string(ipv4RE.FindSubmatch(fqdn)[2]) + match = strings.Replace(match, "-", ".", -1) ipv4address := net.ParseIP(match).To4() return dnsmessage.AResource{A: [4]byte{ipv4address[0], ipv4address[1], ipv4address[2], ipv4address[3]}}, nil diff --git a/src/xip/xip_test.go b/src/xip/xip_test.go index e2df816..52c4771 100644 --- a/src/xip/xip_test.go +++ b/src/xip/xip_test.go @@ -17,13 +17,17 @@ var _ = Describe("Xip", func() { Expect(err).To(Not(HaveOccurred())) Expect(ipv4Answer).To(Equal(expectedA)) }, + // dots Entry("loopback", "127.0.0.1", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}), Entry("loopback with domain", "127.0.0.1.com", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}), Entry("loopback with domain and www", "www.127.0.0.1.com", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}), Entry("pre and post", "nono.io.10.0.9.30.sslip.io", dnsmessage.AResource{A: [4]byte{10, 0, 9, 30}}), Entry("pre and post", "nono.io.10.0.9.30.sslip.io", dnsmessage.AResource{A: [4]byte{10, 0, 9, 30}}), Entry("two IPs, grabs the leftmost", "nono.io.10.0.9.30.172.16.0.30.sslip.io", dnsmessage.AResource{A: [4]byte{10, 0, 9, 30}}), - Entry("two IPs, grabs the leftmost", "nono.io.10.0.9.30.172.16.0.30.sslip.io", dnsmessage.AResource{A: [4]byte{10, 0, 9, 30}}), + // dashes + Entry("loopback", "127-0-0-1", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}), + Entry("loopback with domain", "127-0-0-1-com", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}), + Entry("loopback with domain and www", "www-127-0-0-1-com", dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}), ) DescribeTable("when it does not match an IP address", func(fqdn string) { @@ -37,6 +41,7 @@ var _ = Describe("Xip", func() { Entry("canonical domain", "sslip.io"), Entry("www", "www.sslip.io"), Entry("a lone number", "538.sslip.io"), + Entry("too big", "256.255.255.255"), ) }) }) \ No newline at end of file