Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 14, 05:15 UTC
httpcaddyfile: Bring `enforce_origin` and `origins` to admin config (#3595)
* Bring `ensure_origin` and `origins` to caddyfile admin config * Add unit test for caddyfile admin config update * Add caddyfile adapt test for typical admin setup * httpcaddyfile: Replace admin config error message when there's more arguments than needed Replace d.Err() to d.ArgErr() since the latter provides similarly informative error message Co-authored-by: Matt Holt <mholt@users.noreply.github.com> Co-authored-by: Matt Holt <mholt@users.noreply.github.com>
Ye Zhihao committed
Aug 4, 2020 at 03:44 UTC
8b80a3201fcddda3fcf125116d33555cb385a803
4 files changed
+164
-14
caddyconfig/httpcaddyfile/httptype.go
+2
-6
@@ -261,12 +261,8 @@ func (st ServerType) Setup(inputServerBlocks []caddyfile.ServerBlock,
261
storageCvtr.(caddy.Module).CaddyModule().ID.Name(),
262
&warnings)
263
}
264
- if adminConfig, ok := options["admin"].(string); ok && adminConfig != "" {
265
- if adminConfig == "off" {
266
- cfg.Admin = &caddy.AdminConfig{Disabled: true}
267
- } else {
268
- cfg.Admin = &caddy.AdminConfig{Listen: adminConfig}
269
- }
264
+ if adminConfig, ok := options["admin"].(*caddy.AdminConfig); ok && adminConfig != nil {
265
+ cfg.Admin = adminConfig
266
}
267
if len(customLogs) > 0 {
268
if cfg.Logging == nil {
caddyconfig/httpcaddyfile/httptype_test.go
+52
@@ -164,6 +164,58 @@ func TestGlobalOptions(t *testing.T) {
164
expectWarn: false,
165
expectError: true,
166
},
167
+ {
168
+ input: `
169
+ {
170
+ admin {
171
+ enforce_origin
172
+ origins 192.168.1.1:2020 127.0.0.1:2020
173
+ }
174
+ }
175
+ :80
176
+ `,
177
+ expectWarn: false,
178
+ expectError: false,
179
+ },
180
+ {
181
+ input: `
182
+ {
183
+ admin 127.0.0.1:2020 {
184
+ enforce_origin
185
+ origins 192.168.1.1:2020 127.0.0.1:2020
186
+ }
187
+ }
188
+ :80
189
+ `,
190
+ expectWarn: false,
191
+ expectError: false,
192
+ },
193
+ {
194
+ input: `
195
+ {
196
+ admin 192.168.1.1:2020 127.0.0.1:2020 {
197
+ enforce_origin
198
+ origins 192.168.1.1:2020 127.0.0.1:2020
199
+ }
200
+ }
201
+ :80
202
+ `,
203
+ expectWarn: false,
204
+ expectError: true,
205
+ },
206
+ {
207
+ input: `
208
+ {
209
+ admin off {
210
+ enforce_origin
211
+ origins 192.168.1.1:2020 127.0.0.1:2020
212
+ }
213
+ }
214
+ :80
215
+ `,
216
+ expectWarn: false,
217
+ expectError: true,
218
+ },
219
} {
220
221
adapter := caddyfile.Adapter{
caddyconfig/httpcaddyfile/options.go
+30
-8
@@ -223,17 +223,39 @@ func parseOptSingleString(d *caddyfile.Dispenser) (interface{}, error) {
223
}
224
225
func parseOptAdmin(d *caddyfile.Dispenser) (interface{}, error) {
226
- if d.Next() {
227
- var listenAddress string
228
- if !d.AllArgs(&listenAddress) {
229
- return "", d.ArgErr()
226
+ adminCfg := new(caddy.AdminConfig)
227
+ for d.Next() {
228
+ if d.NextArg() {
229
+ listenAddress := d.Val()
230
+ if listenAddress == "off" {
231
+ adminCfg.Disabled = true
232
+ if d.Next() { // Do not accept any remaining options including block
233
+ return nil, d.Err("No more option is allowed after turning off admin config")
234
+ }
235
+ } else {
236
+ adminCfg.Listen = listenAddress
237
+ if d.NextArg() { // At most 1 arg is allowed
238
+ return nil, d.ArgErr()
239
+ }
240
+ }
241
}
231
- if listenAddress == "" {
232
- listenAddress = caddy.DefaultAdminListen
242
+ for nesting := d.Nesting(); d.NextBlock(nesting); {
243
+ switch d.Val() {
244
+ case "enforce_origin":
245
+ adminCfg.EnforceOrigin = true
246
+
247
+ case "origins":
248
+ adminCfg.Origins = d.RemainingArgs()
249
+
250
+ default:
251
+ return nil, d.Errf("unrecognized parameter '%s'", d.Val())
252
+ }
253
}
234
- return listenAddress, nil
254
}
236
- return "", nil
255
+ if adminCfg.Listen == "" && !adminCfg.Disabled {
256
+ adminCfg.Listen = caddy.DefaultAdminListen
257
+ }
258
+ return adminCfg, nil
259
}
260
261
func parseOptOnDemand(d *caddyfile.Dispenser) (interface{}, error) {
caddytest/integration/caddyfile_adapt/global_options_admin.txt
new
+80
@@ -0,0 +1,80 @@
1
+{
2
+ debug
3
+ http_port 8080
4
+ https_port 8443
5
+ default_sni localhost
6
+ order root first
7
+ storage file_system {
8
+ root /data
9
+ }
10
+ acme_ca https://example.com
11
+ acme_ca_root /path/to/ca.crt
12
+
13
+ email test@example.com
14
+ admin {
15
+ origins localhost:2019 [::1]:2019 127.0.0.1:2019 192.168.10.128
16
+ }
17
+ on_demand_tls {
18
+ ask https://example.com
19
+ interval 30s
20
+ burst 20
21
+ }
22
+ local_certs
23
+ key_type ed25519
24
+}
25
+
26
+:80
27
+----------
28
+{
29
+ "admin": {
30
+ "listen": "localhost:2019",
31
+ "origins": [
32
+ "localhost:2019",
33
+ "[::1]:2019",
34
+ "127.0.0.1:2019",
35
+ "192.168.10.128"
36
+ ]
37
+ },
38
+ "logging": {
39
+ "logs": {
40
+ "default": {
41
+ "level": "DEBUG"
42
+ }
43
+ }
44
+ },
45
+ "storage": {
46
+ "module": "file_system",
47
+ "root": "/data"
48
+ },
49
+ "apps": {
50
+ "http": {
51
+ "http_port": 8080,
52
+ "https_port": 8443,
53
+ "servers": {
54
+ "srv0": {
55
+ "listen": [
56
+ ":80"
57
+ ]
58
+ }
59
+ }
60
+ },
61
+ "tls": {
62
+ "automation": {
63
+ "policies": [
64
+ {
65
+ "issuer": {
66
+ "module": "internal"
67
+ }
68
+ }
69
+ ],
70
+ "on_demand": {
71
+ "rate_limit": {
72
+ "interval": 30000000000,
73
+ "burst": 20
74
+ },
75
+ "ask": "https://example.com"
76
+ }
77
+ }
78
+ }
79
+ }
80
+}