Skip to content

Commit 42a2d80

Browse files
openapi3: improve ipv6 validation (#971)
1 parent fe47dca commit 42a2d80

File tree

2 files changed

+18
-22
lines changed

2 files changed

+18
-22
lines changed

openapi3/schema_formats.go

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ package openapi3
22

33
import (
44
"fmt"
5-
"net"
5+
"net/netip"
66
"regexp"
7-
"strings"
87
)
98

109
const (
@@ -43,23 +42,15 @@ func DefineStringFormatCallback(name string, callback FormatCallback) {
4342
SchemaStringFormats[name] = Format{callback: callback}
4443
}
4544

46-
func validateIP(ip string) error {
47-
parsed := net.ParseIP(ip)
48-
if parsed == nil {
45+
func validateIPv4(ip string) error {
46+
addr, err := netip.ParseAddr(ip)
47+
if err != nil {
4948
return &SchemaError{
5049
Value: ip,
5150
Reason: "Not an IP address",
5251
}
5352
}
54-
return nil
55-
}
56-
57-
func validateIPv4(ip string) error {
58-
if err := validateIP(ip); err != nil {
59-
return err
60-
}
61-
62-
if !(strings.Count(ip, ":") < 2) {
53+
if !addr.Is4() {
6354
return &SchemaError{
6455
Value: ip,
6556
Reason: "Not an IPv4 address (it's IPv6)",
@@ -69,11 +60,15 @@ func validateIPv4(ip string) error {
6960
}
7061

7162
func validateIPv6(ip string) error {
72-
if err := validateIP(ip); err != nil {
73-
return err
63+
addr, err := netip.ParseAddr(ip)
64+
if err != nil {
65+
return &SchemaError{
66+
Value: ip,
67+
Reason: "Not an IP address",
68+
Origin: err,
69+
}
7470
}
75-
76-
if !(strings.Count(ip, ":") >= 2) {
71+
if !addr.Is6() {
7772
return &SchemaError{
7873
Value: ip,
7974
Reason: "Not an IPv6 address (it's IPv4)",

openapi3/schema_formats_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func TestIssue430(t *testing.T) {
3939
"::FFFF:192.168.0.1": false,
4040
// "[::FFFF:C0A8:1]:80" doesn't parse per net.ParseIP()
4141
// "[::FFFF:C0A8:1%1]:80" doesn't parse per net.ParseIP()
42+
"2001:db8::": false,
4243
}
4344

4445
for datum := range data {
@@ -53,11 +54,11 @@ func TestIssue430(t *testing.T) {
5354
err = schema.VisitJSON(datum)
5455
require.NoError(t, err)
5556
if isV4 {
56-
require.Nil(t, validateIPv4(datum), "%q should be IPv4", datum)
57-
require.NotNil(t, validateIPv6(datum), "%q should not be IPv6", datum)
57+
assert.Nil(t, validateIPv4(datum), "%q should be IPv4", datum)
58+
assert.NotNil(t, validateIPv6(datum), "%q should not be IPv6", datum)
5859
} else {
59-
require.NotNil(t, validateIPv4(datum), "%q should not be IPv4", datum)
60-
require.Nil(t, validateIPv6(datum), "%q should be IPv6", datum)
60+
assert.NotNil(t, validateIPv4(datum), "%q should not be IPv4", datum)
61+
assert.Nil(t, validateIPv6(datum), "%q should be IPv6", datum)
6162
}
6263
}
6364
}

0 commit comments

Comments
 (0)