124 lines
3.4 KiB
Go
124 lines
3.4 KiB
Go
// Copyright 2015 ISRG. All rights reserved
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package mocks
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/miekg/dns"
|
|
)
|
|
|
|
// MockDNS is a mock
|
|
type MockDNS struct {
|
|
}
|
|
|
|
// ExchangeOne is a mock
|
|
func (mock *MockDNS) ExchangeOne(hostname string, qt uint16) (rsp *dns.Msg, rtt time.Duration, err error) {
|
|
return nil, 0, nil
|
|
}
|
|
|
|
// LookupTXT is a mock
|
|
func (mock *MockDNS) LookupTXT(hostname string) ([]string, time.Duration, error) {
|
|
if hostname == "_acme-challenge.servfail.com" {
|
|
return nil, 0, fmt.Errorf("SERVFAIL")
|
|
}
|
|
return []string{"hostname"}, 0, nil
|
|
}
|
|
|
|
// LookupHost is a mock
|
|
func (mock *MockDNS) LookupHost(hostname string) ([]net.IP, time.Duration, error) {
|
|
if hostname == "always.invalid" || hostname == "invalid.invalid" {
|
|
return []net.IP{}, 0, nil
|
|
}
|
|
ip := net.ParseIP("127.0.0.1")
|
|
return []net.IP{ip}, 0, nil
|
|
}
|
|
|
|
// LookupCNAME is a mock
|
|
func (mock *MockDNS) LookupCNAME(domain string) (string, time.Duration, error) {
|
|
switch strings.TrimRight(domain, ".") {
|
|
case "cname-absent.com":
|
|
return "absent.com.", 30, nil
|
|
case "cname-critical.com":
|
|
return "critical.com.", 30, nil
|
|
case "cname-present.com", "cname-and-dname.com":
|
|
return "cname-target.present.com.", 30, nil
|
|
case "cname2-present.com":
|
|
return "cname-present.com.", 30, nil
|
|
case "a.cname-loop.com":
|
|
return "b.cname-loop.com.", 30, nil
|
|
case "b.cname-loop.com":
|
|
return "a.cname-loop.com.", 30, nil
|
|
case "www.caa-loop.com":
|
|
// nothing wrong with CNAME, but prevents CAA algorithm from terminating
|
|
return "oops.www.caa-loop.com.", 30, nil
|
|
case "cname2servfail.com":
|
|
return "servfail.com.", 30, nil
|
|
case "cname-servfail.com":
|
|
return "", 0, fmt.Errorf("SERVFAIL")
|
|
case "cname2dname.com":
|
|
return "dname2cname.com.", 30, nil
|
|
default:
|
|
return "", 0, nil
|
|
}
|
|
}
|
|
|
|
// LookupDNAME is a mock
|
|
func (mock *MockDNS) LookupDNAME(domain string) (string, time.Duration, error) {
|
|
switch strings.TrimRight(domain, ".") {
|
|
case "cname-and-dname.com", "dname-present.com":
|
|
return "dname-target.present.com.", time.Minute, nil
|
|
case "a.dname-loop.com":
|
|
return "b.dname-loop.com.", time.Minute, nil
|
|
case "b.dname-loop.com":
|
|
return "a.dname-loop.com.", time.Minute, nil
|
|
case "dname2cname.com":
|
|
return "cname2-present.com.", time.Minute, nil
|
|
case "dname-servfail.com":
|
|
return "", time.Minute, fmt.Errorf("SERVFAIL")
|
|
default:
|
|
return "", 0, nil
|
|
}
|
|
}
|
|
|
|
// LookupCAA is a mock
|
|
func (mock *MockDNS) LookupCAA(domain string) ([]*dns.CAA, time.Duration, error) {
|
|
var results []*dns.CAA
|
|
var record dns.CAA
|
|
switch strings.TrimRight(domain, ".") {
|
|
case "reserved.com":
|
|
record.Tag = "issue"
|
|
record.Value = "symantec.com"
|
|
results = append(results, &record)
|
|
case "critical.com":
|
|
record.Flag = 1
|
|
record.Tag = "issue"
|
|
record.Value = "symantec.com"
|
|
results = append(results, &record)
|
|
case "present.com":
|
|
record.Tag = "issue"
|
|
record.Value = "letsencrypt.org"
|
|
results = append(results, &record)
|
|
case "servfail.com":
|
|
return results, 0, fmt.Errorf("SERVFAIL")
|
|
}
|
|
return results, 0, nil
|
|
}
|
|
|
|
// LookupMX is a mock
|
|
func (mock *MockDNS) LookupMX(domain string) ([]string, time.Duration, error) {
|
|
switch strings.TrimRight(domain, ".") {
|
|
case "letsencrypt.org":
|
|
fallthrough
|
|
case "email.com":
|
|
return []string{"mail.email.com"}, 0, nil
|
|
}
|
|
return nil, 0, nil
|
|
}
|