2019-12-09 20:25:38 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/miekg/dns"
|
|
|
|
)
|
|
|
|
|
|
|
|
type PluginBlockUnqualified struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (plugin *PluginBlockUnqualified) Name() string {
|
|
|
|
return "block_unqualified"
|
|
|
|
}
|
|
|
|
|
|
|
|
func (plugin *PluginBlockUnqualified) Description() string {
|
|
|
|
return "Block unqualified DNS names"
|
|
|
|
}
|
|
|
|
|
|
|
|
func (plugin *PluginBlockUnqualified) Init(proxy *Proxy) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (plugin *PluginBlockUnqualified) Drop() error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (plugin *PluginBlockUnqualified) Reload() error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (plugin *PluginBlockUnqualified) Eval(pluginsState *PluginsState, msg *dns.Msg) error {
|
|
|
|
questions := msg.Question
|
|
|
|
if len(questions) != 1 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
question := questions[0]
|
|
|
|
if question.Qclass != dns.ClassINET || (question.Qtype != dns.TypeA && question.Qtype != dns.TypeAAAA) {
|
|
|
|
return nil
|
|
|
|
}
|
2019-12-16 16:13:18 +01:00
|
|
|
qName := question.Name
|
2019-12-09 20:25:38 +01:00
|
|
|
idx := strings.IndexByte(qName, '.')
|
2019-12-10 00:03:41 +01:00
|
|
|
if idx == -1 || (idx == 0 || idx+1 != len(qName)) {
|
2019-12-09 20:25:38 +01:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
synth := EmptyResponseFromMessage(msg)
|
|
|
|
synth.Rcode = dns.RcodeNameError
|
|
|
|
pluginsState.synthResponse = synth
|
|
|
|
pluginsState.action = PluginsActionSynth
|
|
|
|
pluginsState.returnCode = PluginsReturnCodeSynth
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|