Final feedback implementation and fixes
This commit is contained in:
@@ -108,7 +108,7 @@ func handleRequest(ctx context.Context, w dns.ResponseWriter, request *dns.Msg)
|
||||
// Return with server failure if offline.
|
||||
if netenv.GetOnlineStatus() == netenv.StatusOffline &&
|
||||
!netenv.IsConnectivityDomain(q.FQDN) {
|
||||
tracer.Debugf("resolver: not resolving %s, device is offline", q.FQDN)
|
||||
tracer.Debugf("namserver: not resolving %s, device is offline", q.FQDN)
|
||||
return reply(nsutil.ServerFailure("resolving disabled, device is offline"))
|
||||
}
|
||||
|
||||
@@ -121,6 +121,7 @@ func handleRequest(ctx context.Context, w dns.ResponseWriter, request *dns.Msg)
|
||||
|
||||
// Handle request for localhost.
|
||||
if strings.HasSuffix(q.FQDN, "localhost.") {
|
||||
tracer.Tracef("namserver: returning localhost records")
|
||||
return reply(nsutil.Localhost(""))
|
||||
}
|
||||
|
||||
@@ -196,15 +197,23 @@ func handleRequest(ctx context.Context, w dns.ResponseWriter, request *dns.Msg)
|
||||
// React to special errors.
|
||||
switch {
|
||||
case errors.Is(err, resolver.ErrNotFound):
|
||||
return reply(nsutil.NxDomain(""), nil)
|
||||
tracer.Tracef("namserver: NXDomain via error")
|
||||
return reply(nsutil.NxDomain(""))
|
||||
case errors.Is(err, resolver.ErrBlocked):
|
||||
return reply(nsutil.ZeroIP(""), nil)
|
||||
tracer.Tracef("namserver: block via error")
|
||||
return reply(nsutil.ZeroIP(""))
|
||||
case errors.Is(err, resolver.ErrLocalhost):
|
||||
return reply(nsutil.Localhost(""), nil)
|
||||
tracer.Tracef("namserver: returning localhost records")
|
||||
return reply(nsutil.Localhost(""))
|
||||
default:
|
||||
return reply(nsutil.ServerFailure("internal error: "+err.Error()), nil)
|
||||
tracer.Warningf("nameserver: failed to resolve %s: %s", q.ID(), err)
|
||||
return reply(nsutil.ServerFailure("internal error: " + err.Error()))
|
||||
}
|
||||
}
|
||||
if rrCache == nil {
|
||||
tracer.Warning("nameserver: received successful, but empty reply from resolver")
|
||||
return reply(nsutil.ServerFailure("internal error: empty reply"))
|
||||
}
|
||||
|
||||
tracer.Trace("nameserver: deciding on resolved dns")
|
||||
rrCache = firewall.DecideOnResolvedDNS(ctx, conn, q, rrCache)
|
||||
|
||||
@@ -74,9 +74,7 @@ func ZeroIP(msgs ...string) ResponderFunc {
|
||||
reply.SetRcode(request, dns.RcodeSuccess)
|
||||
}
|
||||
|
||||
for _, msg := range msgs {
|
||||
AddMessageToReply(ctx, reply, log.InfoLevel, msg)
|
||||
}
|
||||
AddMessagesToReply(ctx, reply, log.InfoLevel, msgs...)
|
||||
|
||||
return reply
|
||||
}
|
||||
@@ -116,9 +114,7 @@ func Localhost(msgs ...string) ResponderFunc {
|
||||
reply.SetRcode(request, dns.RcodeSuccess)
|
||||
}
|
||||
|
||||
for _, msg := range msgs {
|
||||
AddMessageToReply(ctx, reply, log.InfoLevel, msg)
|
||||
}
|
||||
AddMessagesToReply(ctx, reply, log.InfoLevel, msgs...)
|
||||
|
||||
return reply
|
||||
}
|
||||
@@ -128,9 +124,7 @@ func Localhost(msgs ...string) ResponderFunc {
|
||||
func NxDomain(msgs ...string) ResponderFunc {
|
||||
return func(ctx context.Context, request *dns.Msg) *dns.Msg {
|
||||
reply := new(dns.Msg).SetRcode(request, dns.RcodeNameError)
|
||||
for _, msg := range msgs {
|
||||
AddMessageToReply(ctx, reply, log.InfoLevel, msg)
|
||||
}
|
||||
AddMessagesToReply(ctx, reply, log.InfoLevel, msgs...)
|
||||
return reply
|
||||
}
|
||||
}
|
||||
@@ -139,9 +133,7 @@ func NxDomain(msgs ...string) ResponderFunc {
|
||||
func Refused(msgs ...string) ResponderFunc {
|
||||
return func(ctx context.Context, request *dns.Msg) *dns.Msg {
|
||||
reply := new(dns.Msg).SetRcode(request, dns.RcodeRefused)
|
||||
for _, msg := range msgs {
|
||||
AddMessageToReply(ctx, reply, log.InfoLevel, msg)
|
||||
}
|
||||
AddMessagesToReply(ctx, reply, log.InfoLevel, msgs...)
|
||||
return reply
|
||||
}
|
||||
}
|
||||
@@ -150,9 +142,7 @@ func Refused(msgs ...string) ResponderFunc {
|
||||
func ServerFailure(msgs ...string) ResponderFunc {
|
||||
return func(ctx context.Context, request *dns.Msg) *dns.Msg {
|
||||
reply := new(dns.Msg).SetRcode(request, dns.RcodeServerFailure)
|
||||
for _, msg := range msgs {
|
||||
AddMessageToReply(ctx, reply, log.InfoLevel, msg)
|
||||
}
|
||||
AddMessagesToReply(ctx, reply, log.InfoLevel, msgs...)
|
||||
return reply
|
||||
}
|
||||
}
|
||||
@@ -174,18 +164,25 @@ func MakeMessageRecord(level log.Severity, msg string) (dns.RR, error) { //nolin
|
||||
return rr, nil
|
||||
}
|
||||
|
||||
// AddMessageToReply creates an information resource records using
|
||||
// MakeMessageRecord and immediately adds it the the extra section of the given
|
||||
// AddMessagesToReply creates information resource records using
|
||||
// MakeMessageRecord and immediately adds them to the extra section of the given
|
||||
// reply. If an error occurs, the resource record will not be added, and the
|
||||
// error will be logged.
|
||||
func AddMessageToReply(ctx context.Context, reply *dns.Msg, level log.Severity, msg string) {
|
||||
if msg != "" {
|
||||
func AddMessagesToReply(ctx context.Context, reply *dns.Msg, level log.Severity, msgs ...string) {
|
||||
for _, msg := range msgs {
|
||||
// Ignore empty messages.
|
||||
if msg == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
// Create resources record.
|
||||
rr, err := MakeMessageRecord(level, msg)
|
||||
if err != nil {
|
||||
log.Tracer(ctx).Warningf("nameserver: failed to add message to reply: %s", err)
|
||||
return
|
||||
continue
|
||||
}
|
||||
|
||||
// Add to extra section of the reply.
|
||||
reply.Extra = append(reply.Extra, rr)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,8 +29,10 @@ func sendResponse(
|
||||
|
||||
// Add extra RRs through a custom RRProvider.
|
||||
for _, rrProvider := range rrProviders {
|
||||
rrs := rrProvider.GetExtraRRs(ctx, request)
|
||||
reply.Extra = append(reply.Extra, rrs...)
|
||||
if rrProvider != nil {
|
||||
rrs := rrProvider.GetExtraRRs(ctx, request)
|
||||
reply.Extra = append(reply.Extra, rrs...)
|
||||
}
|
||||
}
|
||||
|
||||
// Write reply.
|
||||
|
||||
Reference in New Issue
Block a user