@@ -3,8 +3,10 @@ package settings
3
3
import (
4
4
"errors"
5
5
"fmt"
6
+ "net/netip"
6
7
"time"
7
8
9
+ "github.com/qdm12/dns/v2/pkg/provider"
8
10
"github.com/qdm12/gosettings"
9
11
"github.com/qdm12/gotree"
10
12
)
@@ -15,14 +17,18 @@ type DoT struct {
15
17
// and used. It defaults to true, and cannot be nil
16
18
// in the internal state.
17
19
Enabled * bool
18
- // UpdatePeriod is the period to update DNS block
19
- // lists and cryptographic files for DNSSEC validation.
20
+ // UpdatePeriod is the period to update DNS block lists.
20
21
// It can be set to 0 to disable the update.
21
22
// It defaults to 24h and cannot be nil in
22
23
// the internal state.
23
24
UpdatePeriod * time.Duration
24
- // Unbound contains settings to configure Unbound.
25
- Unbound Unbound
25
+ // Providers is a list of DNS over TLS providers
26
+ Providers []string `json:"providers"`
27
+ // Caching is true if the DoT server should cache
28
+ // DNS responses.
29
+ Caching * bool `json:"caching"`
30
+ // IPv6 is true if the DoT server should connect over IPv6.
31
+ IPv6 * bool `json:"ipv6"`
26
32
// Blacklist contains settings to configure the filter
27
33
// block lists.
28
34
Blacklist DNSBlacklist
@@ -39,9 +45,11 @@ func (d DoT) validate() (err error) {
39
45
ErrDoTUpdatePeriodTooShort , * d .UpdatePeriod , minUpdatePeriod )
40
46
}
41
47
42
- err = d .Unbound .validate ()
43
- if err != nil {
44
- return err
48
+ for _ , s := range d .Providers {
49
+ _ , err := provider .Parse (s )
50
+ if err != nil {
51
+ return err
52
+ }
45
53
}
46
54
47
55
err = d .Blacklist .validate ()
@@ -56,7 +64,9 @@ func (d *DoT) copy() (copied DoT) {
56
64
return DoT {
57
65
Enabled : gosettings .CopyPointer (d .Enabled ),
58
66
UpdatePeriod : gosettings .CopyPointer (d .UpdatePeriod ),
59
- Unbound : d .Unbound .copy (),
67
+ Providers : gosettings .CopySlice (d .Providers ),
68
+ Caching : gosettings .CopyPointer (d .Caching ),
69
+ IPv6 : gosettings .CopyPointer (d .IPv6 ),
60
70
Blacklist : d .Blacklist .copy (),
61
71
}
62
72
}
@@ -66,7 +76,9 @@ func (d *DoT) copy() (copied DoT) {
66
76
func (d * DoT ) mergeWith (other DoT ) {
67
77
d .Enabled = gosettings .MergeWithPointer (d .Enabled , other .Enabled )
68
78
d .UpdatePeriod = gosettings .MergeWithPointer (d .UpdatePeriod , other .UpdatePeriod )
69
- d .Unbound .mergeWith (other .Unbound )
79
+ d .Providers = gosettings .MergeWithSlice (d .Providers , other .Providers )
80
+ d .Caching = gosettings .MergeWithPointer (d .Caching , other .Caching )
81
+ d .IPv6 = gosettings .MergeWithPointer (d .IPv6 , other .IPv6 )
70
82
d .Blacklist .mergeWith (other .Blacklist )
71
83
}
72
84
@@ -76,18 +88,36 @@ func (d *DoT) mergeWith(other DoT) {
76
88
func (d * DoT ) overrideWith (other DoT ) {
77
89
d .Enabled = gosettings .OverrideWithPointer (d .Enabled , other .Enabled )
78
90
d .UpdatePeriod = gosettings .OverrideWithPointer (d .UpdatePeriod , other .UpdatePeriod )
79
- d .Unbound .overrideWith (other .Unbound )
91
+ d .Providers = gosettings .OverrideWithSlice (d .Providers , other .Providers )
92
+ d .Caching = gosettings .OverrideWithPointer (d .Caching , other .Caching )
93
+ d .IPv6 = gosettings .OverrideWithPointer (d .IPv6 , other .IPv6 )
80
94
d .Blacklist .overrideWith (other .Blacklist )
81
95
}
82
96
83
97
func (d * DoT ) setDefaults () {
84
98
d .Enabled = gosettings .DefaultPointer (d .Enabled , true )
85
99
const defaultUpdatePeriod = 24 * time .Hour
86
100
d .UpdatePeriod = gosettings .DefaultPointer (d .UpdatePeriod , defaultUpdatePeriod )
87
- d .Unbound .setDefaults ()
101
+ d .Providers = gosettings .DefaultSlice (d .Providers , []string {
102
+ provider .Cloudflare ().Name ,
103
+ })
104
+ d .Caching = gosettings .DefaultPointer (d .Caching , true )
105
+ d .IPv6 = gosettings .DefaultPointer (d .IPv6 , false )
88
106
d .Blacklist .setDefaults ()
89
107
}
90
108
109
+ func (d DoT ) GetFirstPlaintextIPv4 () (ipv4 netip.Addr ) {
110
+ s := d .Providers [0 ]
111
+ provider , err := provider .Parse (s )
112
+ if err != nil {
113
+ // Settings should be validated before calling this function,
114
+ // so an error happening here is a programming error.
115
+ panic (err )
116
+ }
117
+
118
+ return provider .DNS .IPv4 [0 ]
119
+ }
120
+
91
121
func (d DoT ) String () string {
92
122
return d .toLinesNode ().String ()
93
123
}
@@ -106,7 +136,14 @@ func (d DoT) toLinesNode() (node *gotree.Node) {
106
136
}
107
137
node .Appendf ("Update period: %s" , update )
108
138
109
- node .AppendNode (d .Unbound .toLinesNode ())
139
+ authServers := node .Appendf ("Authoritative servers:" )
140
+ for _ , provider := range d .Providers {
141
+ authServers .Appendf (provider )
142
+ }
143
+
144
+ node .Appendf ("Caching: %s" , gosettings .BoolToYesNo (d .Caching ))
145
+ node .Appendf ("IPv6: %s" , gosettings .BoolToYesNo (d .IPv6 ))
146
+
110
147
node .AppendNode (d .Blacklist .toLinesNode ())
111
148
112
149
return node
0 commit comments