Skip to content

Commit 69a5e84

Browse files
feat: decode and reencode only placeholders instead of entire value
Signed-off-by: DziyanaT <dziyana.tsetserava@etu.umontpellier.fr>
1 parent 23cadcd commit 69a5e84

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

pkg/kube/util.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func (e *missingKeyError) Error() string {
2626

2727
var genericPlaceholder, _ = regexp.Compile(`(?mU)<(.*)>`)
2828
var specificPathPlaceholder, _ = regexp.Compile(`(?mU)<path:([^#]+)#([^#]+)(?:#([^#]+))?>`)
29+
var specificPathUrlEncodedPlaceholder, _ = regexp.Compile(`(?mU)%3Cpath%3A(.+)%23(.+)(?:%23(.+))?%3E`)
2930
var indivPlaceholderSyntax, _ = regexp.Compile(`(?mU)path:(?P<path>[^#]+?)#(?P<key>[^#]+?)(?:#(?P<version>.+?))??`)
3031

3132
// replaceInner recurses through the given map and replaces the placeholders by calling `replacerFunc`
@@ -107,12 +108,25 @@ func genericReplacement(key, value string, resource Resource) (_ interface{}, er
107108
var nonStringReplacement interface{}
108109
var placeholderRegex = specificPathPlaceholder
109110

110-
decoded, decodeError := url.QueryUnescape(value)
111-
if decodeError == nil && decoded != value && placeholderRegex.Match([]byte(decoded)) {
112-
res, err := genericReplacement(key, string(decoded), resource)
111+
decodedValue := specificPathUrlEncodedPlaceholder.ReplaceAllFunc([]byte(value), func(match []byte) []byte {
112+
decoded, decErr:= url.QueryUnescape(string(match))
113+
if decErr != nil || !placeholderRegex.Match([]byte(decoded)) {
114+
err = append(err, decErr)
115+
return match
116+
}
117+
118+
repl, replErr := genericReplacement(key, decoded, resource)
119+
if replErr != nil {
120+
err = append(err, replErr...)
121+
return match
122+
}
123+
124+
return []byte(url.QueryEscape(stringify(repl)))
125+
})
113126

114-
utils.VerboseToStdErr("key %s had URL encoded placeholder value, URL encoding value %s to fit", key, value)
115-
return url.QueryEscape(stringify(res)), err
127+
if string(decodedValue) != value {
128+
utils.VerboseToStdErr("key %s had value with URL encoded placeholder", key)
129+
value = string(decodedValue)
116130
}
117131

118132
// If the Vault path annotation is present, there may be placeholders with/without an explicit path

0 commit comments

Comments
 (0)