@marcel91200 / caddy Mirror · read-only / commits / 8b80a320
Fork 0

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 +}