diff options
| author | WeidiDeng <weidi_deng@icloud.com> | 2023-08-05 00:44:38 +0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-04 10:44:38 -0600 | 
| commit | 9f34383c02f1691e54280285a6499893fcbbb4c7 (patch) | |
| tree | bf87ea45cb4e66dae2b5689f4a72231351dd888a /caddyconfig | |
| parent | b07b198764de738f3b473f416422eaf0619c654d (diff) | |
caddyfile: check that matched key is not a substring of the replacement key (#5685)
Diffstat (limited to 'caddyconfig')
| -rw-r--r-- | caddyconfig/caddyfile/importargs.go | 10 | ||||
| -rw-r--r-- | caddyconfig/caddyfile/parse_test.go | 30 | 
2 files changed, 40 insertions, 0 deletions
| diff --git a/caddyconfig/caddyfile/importargs.go b/caddyconfig/caddyfile/importargs.go index c6dcd85..54d648e 100644 --- a/caddyconfig/caddyfile/importargs.go +++ b/caddyconfig/caddyfile/importargs.go @@ -93,6 +93,11 @@ func makeArgsReplacer(args []string) *caddy.Replacer {  		// TODO: Remove the deprecated {args.*} placeholder  		// support at some point in the future  		if matches := argsRegexpIndexDeprecated.FindStringSubmatch(key); len(matches) > 0 { +			// What's matched may be a substring of the key +			if matches[0] != key { +				return nil, false +			} +  			value, err := strconv.Atoi(matches[1])  			if err != nil {  				caddy.Log().Named("caddyfile").Warn( @@ -111,6 +116,11 @@ func makeArgsReplacer(args []string) *caddy.Replacer {  		// Handle args[*] form  		if matches := argsRegexpIndex.FindStringSubmatch(key); len(matches) > 0 { +			// What's matched may be a substring of the key +			if matches[0] != key { +				return nil, false +			} +  			if strings.Contains(matches[1], ":") {  				caddy.Log().Named("caddyfile").Warn(  					"Variadic placeholder {args[" + matches[1] + "]} must be a token on its own") diff --git a/caddyconfig/caddyfile/parse_test.go b/caddyconfig/caddyfile/parse_test.go index bbae785..b1104ed 100644 --- a/caddyconfig/caddyfile/parse_test.go +++ b/caddyconfig/caddyfile/parse_test.go @@ -718,6 +718,36 @@ func TestEnvironmentReplacement(t *testing.T) {  	}  } +func TestImportReplacementInJSONWithBrace(t *testing.T) { +	for i, test := range []struct { +		args   []string +		input  string +		expect string +	}{ +		{ +			args:   []string{"123"}, +			input:  "{args[0]}", +			expect: "123", +		}, +		{ +			args:   []string{"123"}, +			input:  `{"key":"{args[0]}"}`, +			expect: `{"key":"123"}`, +		}, +		{ +			args:   []string{"123", "123"}, +			input:  `{"key":[{args[0]},{args[1]}]}`, +			expect: `{"key":[123,123]}`, +		}, +	} { +		repl := makeArgsReplacer(test.args) +		actual := repl.ReplaceKnown(test.input, "") +		if actual != test.expect { +			t.Errorf("Test %d: Expected: '%s' but got '%s'", i, test.expect, actual) +		} +	} +} +  func TestSnippets(t *testing.T) {  	p := testParser(`  		(common) { | 
