@@ -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/gosettings/reader"
10
12
"github.com/qdm12/gotree"
@@ -16,14 +18,18 @@ type DoT struct {
16
18
// and used. It defaults to true, and cannot be nil
17
19
// in the internal state.
18
20
Enabled * bool
19
- // UpdatePeriod is the period to update DNS block
20
- // lists and cryptographic files for DNSSEC validation.
21
+ // UpdatePeriod is the period to update DNS block lists.
21
22
// It can be set to 0 to disable the update.
22
23
// It defaults to 24h and cannot be nil in
23
24
// the internal state.
24
25
UpdatePeriod * time.Duration
25
- // Unbound contains settings to configure Unbound.
26
- Unbound Unbound
26
+ // Providers is a list of DNS over TLS providers
27
+ Providers []string `json:"providers"`
28
+ // Caching is true if the DoT server should cache
29
+ // DNS responses.
30
+ Caching * bool `json:"caching"`
31
+ // IPv6 is true if the DoT server should connect over IPv6.
32
+ IPv6 * bool `json:"ipv6"`
27
33
// Blacklist contains settings to configure the filter
28
34
// block lists.
29
35
Blacklist DNSBlacklist
@@ -40,9 +46,12 @@ func (d DoT) validate() (err error) {
40
46
ErrDoTUpdatePeriodTooShort , * d .UpdatePeriod , minUpdatePeriod )
41
47
}
42
48
43
- err = d .Unbound .validate ()
44
- if err != nil {
45
- return err
49
+ providers := provider .NewProviders ()
50
+ for _ , providerName := range d .Providers {
51
+ _ , err := providers .Get (providerName )
52
+ if err != nil {
53
+ return err
54
+ }
46
55
}
47
56
48
57
err = d .Blacklist .validate ()
@@ -57,7 +66,9 @@ func (d *DoT) copy() (copied DoT) {
57
66
return DoT {
58
67
Enabled : gosettings .CopyPointer (d .Enabled ),
59
68
UpdatePeriod : gosettings .CopyPointer (d .UpdatePeriod ),
60
- Unbound : d .Unbound .copy (),
69
+ Providers : gosettings .CopySlice (d .Providers ),
70
+ Caching : gosettings .CopyPointer (d .Caching ),
71
+ IPv6 : gosettings .CopyPointer (d .IPv6 ),
61
72
Blacklist : d .Blacklist .copy (),
62
73
}
63
74
}
@@ -68,18 +79,36 @@ func (d *DoT) copy() (copied DoT) {
68
79
func (d * DoT ) overrideWith (other DoT ) {
69
80
d .Enabled = gosettings .OverrideWithPointer (d .Enabled , other .Enabled )
70
81
d .UpdatePeriod = gosettings .OverrideWithPointer (d .UpdatePeriod , other .UpdatePeriod )
71
- d .Unbound .overrideWith (other .Unbound )
82
+ d .Providers = gosettings .OverrideWithSlice (d .Providers , other .Providers )
83
+ d .Caching = gosettings .OverrideWithPointer (d .Caching , other .Caching )
84
+ d .IPv6 = gosettings .OverrideWithPointer (d .IPv6 , other .IPv6 )
72
85
d .Blacklist .overrideWith (other .Blacklist )
73
86
}
74
87
75
88
func (d * DoT ) setDefaults () {
76
89
d .Enabled = gosettings .DefaultPointer (d .Enabled , true )
77
90
const defaultUpdatePeriod = 24 * time .Hour
78
91
d .UpdatePeriod = gosettings .DefaultPointer (d .UpdatePeriod , defaultUpdatePeriod )
79
- d .Unbound .setDefaults ()
92
+ d .Providers = gosettings .DefaultSlice (d .Providers , []string {
93
+ provider .Cloudflare ().Name ,
94
+ })
95
+ d .Caching = gosettings .DefaultPointer (d .Caching , true )
96
+ d .IPv6 = gosettings .DefaultPointer (d .IPv6 , false )
80
97
d .Blacklist .setDefaults ()
81
98
}
82
99
100
+ func (d DoT ) GetFirstPlaintextIPv4 () (ipv4 netip.Addr ) {
101
+ providers := provider .NewProviders ()
102
+ provider , err := providers .Get (d .Providers [0 ])
103
+ if err != nil {
104
+ // Settings should be validated before calling this function,
105
+ // so an error happening here is a programming error.
106
+ panic (err )
107
+ }
108
+
109
+ return provider .DoT .IPv4 [0 ].Addr ()
110
+ }
111
+
83
112
func (d DoT ) String () string {
84
113
return d .toLinesNode ().String ()
85
114
}
@@ -98,7 +127,14 @@ func (d DoT) toLinesNode() (node *gotree.Node) {
98
127
}
99
128
node .Appendf ("Update period: %s" , update )
100
129
101
- node .AppendNode (d .Unbound .toLinesNode ())
130
+ authServers := node .Appendf ("Authoritative servers:" )
131
+ for _ , provider := range d .Providers {
132
+ authServers .Appendf (provider )
133
+ }
134
+
135
+ node .Appendf ("Caching: %s" , gosettings .BoolToYesNo (d .Caching ))
136
+ node .Appendf ("IPv6: %s" , gosettings .BoolToYesNo (d .IPv6 ))
137
+
102
138
node .AppendNode (d .Blacklist .toLinesNode ())
103
139
104
140
return node
@@ -115,7 +151,14 @@ func (d *DoT) read(reader *reader.Reader) (err error) {
115
151
return err
116
152
}
117
153
118
- err = d .Unbound .read (reader )
154
+ d .Providers = reader .CSV ("DOT_PROVIDERS" )
155
+
156
+ d .Caching , err = reader .BoolPtr ("DOT_CACHING" )
157
+ if err != nil {
158
+ return err
159
+ }
160
+
161
+ d .IPv6 , err = reader .BoolPtr ("DOT_IPV6" )
119
162
if err != nil {
120
163
return err
121
164
}
0 commit comments