Skip to content

Commit

Permalink
caddyfile: check that matched key is not a substring of the replaceme…
Browse files Browse the repository at this point in the history
…nt key (#5685)
  • Loading branch information
WeidiDeng authored Aug 4, 2023
1 parent b07b198 commit 9f34383
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
10 changes: 10 additions & 0 deletions caddyconfig/caddyfile/importargs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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")
Expand Down
30 changes: 30 additions & 0 deletions caddyconfig/caddyfile/parse_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 9f34383

Please sign in to comment.