deprecate Normalize and MustNormalize (#4648)

* deprecate normalize and mustnormalize

Signed-off-by: Chris O'Haver <cohaver@infoblox.com>

* add runtime warning

Signed-off-by: Chris O'Haver <cohaver@infoblox.com>

* elaborate runtime warning

Signed-off-by: Chris O'Haver <cohaver@infoblox.com>

* include caller info

Signed-off-by: Chris O'Haver <cohaver@infoblox.com>
This commit is contained in:
Chris O'Haver 2021-05-27 07:26:14 -04:00 committed by GitHub
parent b56f2efe54
commit d8a0d97df2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 61 additions and 11 deletions

View file

@ -93,7 +93,7 @@ func parseStanza(c *caddy.Controller) (*Forward, error) {
return f, c.ArgErr() return f, c.ArgErr()
} }
origFrom := f.from origFrom := f.from
f.from = plugin.Host(f.from).Normalize()[0] // there can only be one here, won't work with non-octet reverse f.from = plugin.Host(f.from).NormalizeExact()[0] // there can only be one here, won't work with non-octet reverse
if len(f.from) > 1 { if len(f.from) > 1 {
log.Warningf("Unsupported CIDR notation: '%s' expands to multiple zones. Using only '%s'.", origFrom, f.from) log.Warningf("Unsupported CIDR notation: '%s' expands to multiple zones. Using only '%s'.", origFrom, f.from)
@ -156,7 +156,7 @@ func parseBlock(c *caddy.Controller, f *Forward) error {
return c.ArgErr() return c.ArgErr()
} }
for i := 0; i < len(ignore); i++ { for i := 0; i < len(ignore); i++ {
f.ignored = append(f.ignored, plugin.Host(ignore[i]).Normalize()...) f.ignored = append(f.ignored, plugin.Host(ignore[i]).NormalizeExact()...)
} }
case "max_fails": case "max_fails":
if !c.NextArg() { if !c.NextArg() {

View file

@ -56,7 +56,7 @@ func parseStanza(c *caddy.Controller) (*GRPC, error) {
if !c.Args(&g.from) { if !c.Args(&g.from) {
return g, c.ArgErr() return g, c.ArgErr()
} }
g.from = plugin.Host(g.from).Normalize()[0] // only the first is used. g.from = plugin.Host(g.from).NormalizeExact()[0] // only the first is used.
to := c.RemainingArgs() to := c.RemainingArgs()
if len(to) == 0 { if len(to) == 0 {
@ -100,7 +100,7 @@ func parseBlock(c *caddy.Controller, g *GRPC) error {
return c.ArgErr() return c.ArgErr()
} }
for i := 0; i < len(ignore); i++ { for i := 0; i < len(ignore); i++ {
g.ignored = append(g.ignored, plugin.Host(ignore[i]).Normalize()...) g.ignored = append(g.ignored, plugin.Host(ignore[i]).NormalizeExact()...)
} }
case "tls": case "tls":
args := c.RemainingArgs() args := c.RemainingArgs()

View file

@ -70,7 +70,7 @@ func parse(c *caddy.Controller) (*Loop, error) {
} }
if len(c.ServerBlockKeys) > 0 { if len(c.ServerBlockKeys) > 0 {
zones = plugin.Host(c.ServerBlockKeys[0]).Normalize() zones = plugin.Host(c.ServerBlockKeys[0]).NormalizeExact()
} }
} }
return New(zones[0]), nil return New(zones[0]), nil

View file

@ -3,10 +3,12 @@ package plugin
import ( import (
"fmt" "fmt"
"net" "net"
"runtime"
"strconv" "strconv"
"strings" "strings"
"github.com/coredns/coredns/plugin/pkg/cidr" "github.com/coredns/coredns/plugin/pkg/cidr"
"github.com/coredns/coredns/plugin/pkg/log"
"github.com/coredns/coredns/plugin/pkg/parse" "github.com/coredns/coredns/plugin/pkg/parse"
"github.com/miekg/dns" "github.com/miekg/dns"
@ -63,8 +65,56 @@ type (
// Normalize will return the host portion of host, stripping // Normalize will return the host portion of host, stripping
// of any port or transport. The host will also be fully qualified and lowercased. // of any port or transport. The host will also be fully qualified and lowercased.
// An empty string is returned on failure
// Deprecated: use OriginsFromArgsOrServerBlock or NormalizeExact
func (h Host) Normalize() string {
var caller string
if _, file, line, ok := runtime.Caller(1); ok {
caller = fmt.Sprintf("(%v line %d) ", file, line)
}
log.Warning("An external plugin " + caller + "is using the deprecated function Normalize. " +
"This will be removed in a future versions of CoreDNS. The plugin should be updated to use " +
"OriginsFromArgsOrServerBlock or NormalizeExact instead.")
s := string(h)
_, s = parse.Transport(s)
// The error can be ignored here, because this function is called after the corefile has already been vetted.
hosts, _, err := SplitHostPort(s)
if err != nil {
return ""
}
return Name(hosts[0]).Normalize()
}
// MustNormalize will return the host portion of host, stripping
// of any port or transport. The host will also be fully qualified and lowercased.
// An error is returned on error
// Deprecated: use OriginsFromArgsOrServerBlock or NormalizeExact
func (h Host) MustNormalize() (string, error) {
var caller string
if _, file, line, ok := runtime.Caller(1); ok {
caller = fmt.Sprintf("(%v line %d) ", file, line)
}
log.Warning("An external plugin " + caller + "is using the deprecated function MustNormalize. " +
"This will be removed in a future versions of CoreDNS. The plugin should be updated to use " +
"OriginsFromArgsOrServerBlock or NormalizeExact instead.")
s := string(h)
_, s = parse.Transport(s)
// The error can be ignored here, because this function is called after the corefile has already been vetted.
hosts, _, err := SplitHostPort(s)
if err != nil {
return "", err
}
return Name(hosts[0]).Normalize(), nil
}
// NormalizeExact will return the host portion of host, stripping
// of any port or transport. The host will also be fully qualified and lowercased.
// An empty slice is returned on failure // An empty slice is returned on failure
func (h Host) Normalize() []string { func (h Host) NormalizeExact() []string {
// The error can be ignored here, because this function should only be called after the corefile has already been vetted. // The error can be ignored here, because this function should only be called after the corefile has already been vetted.
s := string(h) s := string(h)
_, s = parse.Transport(s) _, s = parse.Transport(s)
@ -126,13 +176,13 @@ func OriginsFromArgsOrServerBlock(args, serverblock []string) []string {
s := make([]string, len(serverblock)) s := make([]string, len(serverblock))
copy(s, serverblock) copy(s, serverblock)
for i := range s { for i := range s {
s[i] = Host(s[i]).Normalize()[0] // expansion of these already happened in dnsserver/registrer.go s[i] = Host(s[i]).NormalizeExact()[0] // expansion of these already happened in dnsserver/register.go
} }
return s return s
} }
s := []string{} s := []string{}
for i := range args { for i := range args {
sx := Host(args[i]).Normalize() sx := Host(args[i]).NormalizeExact()
if len(sx) == 0 { if len(sx) == 0 {
continue // silently ignores errors. continue // silently ignores errors.
} }

View file

@ -71,7 +71,7 @@ func TestNameNormalize(t *testing.T) {
} }
} }
func TestHostNormalize(t *testing.T) { func TestHostNormalizeExact(t *testing.T) {
tests := []struct { tests := []struct {
in string in string
out []string out []string
@ -85,7 +85,7 @@ func TestHostNormalize(t *testing.T) {
} }
for i := range tests { for i := range tests {
actual := Host(tests[i].in).Normalize() actual := Host(tests[i].in).NormalizeExact()
expected := tests[i].out expected := tests[i].out
sort.Strings(expected) sort.Strings(expected)
for j := range expected { for j := range expected {

View file

@ -33,7 +33,7 @@ func (f F) Through(qname string) bool {
func (f *F) setZones(zones []string) { func (f *F) setZones(zones []string) {
z := []string{} z := []string{}
for i := range zones { for i := range zones {
z = append(z, plugin.Host(zones[i]).Normalize()...) z = append(z, plugin.Host(zones[i]).NormalizeExact()...)
} }
f.Zones = z f.Zones = z
} }