diff options
Diffstat (limited to 'plugin/rewrite/edns0.go')
-rw-r--r-- | plugin/rewrite/edns0.go | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/plugin/rewrite/edns0.go b/plugin/rewrite/edns0.go index 68084a773..074dd3ebf 100644 --- a/plugin/rewrite/edns0.go +++ b/plugin/rewrite/edns0.go @@ -2,12 +2,14 @@ package rewrite import ( + "context" "encoding/hex" "fmt" "net" "strconv" "strings" + "github.com/coredns/coredns/plugin/metadata" "github.com/coredns/coredns/request" "github.com/miekg/dns" @@ -46,7 +48,7 @@ func setupEdns0Opt(r *dns.Msg) *dns.OPT { } // Rewrite will alter the request EDNS0 NSID option -func (rule *edns0NsidRule) Rewrite(state request.Request) Result { +func (rule *edns0NsidRule) Rewrite(ctx context.Context, state request.Request) Result { o := setupEdns0Opt(state.Req) for _, s := range o.Option { @@ -74,7 +76,7 @@ func (rule *edns0NsidRule) Mode() string { return rule.mode } func (rule *edns0NsidRule) GetResponseRule() ResponseRule { return ResponseRule{} } // Rewrite will alter the request EDNS0 local options. -func (rule *edns0LocalRule) Rewrite(state request.Request) Result { +func (rule *edns0LocalRule) Rewrite(ctx context.Context, state request.Request) Result { o := setupEdns0Opt(state.Req) for _, s := range o.Option { @@ -174,7 +176,7 @@ func newEdns0VariableRule(mode, action, code, variable string) (*edns0VariableRu } // ruleData returns the data specified by the variable. -func (rule *edns0VariableRule) ruleData(state request.Request) ([]byte, error) { +func (rule *edns0VariableRule) ruleData(ctx context.Context, state request.Request) ([]byte, error) { switch rule.variable { case queryName: @@ -199,12 +201,17 @@ func (rule *edns0VariableRule) ruleData(state request.Request) ([]byte, error) { return []byte(state.Proto()), nil } + fetcher := metadata.ValueFunc(ctx, rule.variable[1:len(rule.variable)-1]) + if fetcher != nil { + return []byte(fetcher()), nil + } + return nil, fmt.Errorf("unable to extract data for variable %s", rule.variable) } // Rewrite will alter the request EDNS0 local options with specified variables. -func (rule *edns0VariableRule) Rewrite(state request.Request) Result { - data, err := rule.ruleData(state) +func (rule *edns0VariableRule) Rewrite(ctx context.Context, state request.Request) Result { + data, err := rule.ruleData(ctx, state) if err != nil || data == nil { return RewriteIgnored } @@ -249,6 +256,10 @@ func isValidVariable(variable string) bool { serverPort: return true } + // we cannot validate the labels of metadata - but we can verify it has the syntax of a label + if strings.HasPrefix(variable, "{") && strings.HasSuffix(variable, "}") && metadata.IsLabel(variable[1:len(variable)-1]) { + return true + } return false } @@ -310,7 +321,7 @@ func (rule *edns0SubnetRule) fillEcsData(state request.Request, ecs *dns.EDNS0_S } // Rewrite will alter the request EDNS0 subnet option. -func (rule *edns0SubnetRule) Rewrite(state request.Request) Result { +func (rule *edns0SubnetRule) Rewrite(ctx context.Context, state request.Request) Result { o := setupEdns0Opt(state.Req) for _, s := range o.Option { |