Skip to content

Commit 2de00c6

Browse files
authored
fix: Error on custom protocol value files which are not resolving into yaml files (#355)
1 parent 597afa4 commit 2de00c6

File tree

11 files changed

+255
-82
lines changed

11 files changed

+255
-82
lines changed

.github/workflows/ci.yaml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,6 @@ jobs:
7272
- os: macos-latest
7373
shell: bash 3.2 with coreutils
7474
jobs: 4
75-
- os: ubuntu-latest
76-
container: ubuntu:22.04
77-
shell: bash 5.1
78-
jobs: 4
7975
- os: ubuntu-latest
8076
container: centos:7
8177
shell: bash 4.2

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [Unreleased]
9+
10+
### Fixed
11+
- Error on custom protocol value files which are not resolving into yaml files
12+
813
## [4.4.1] - 2023-03-06
914

1015
### Fixed

scripts/commands/helm.sh

Lines changed: 69 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ Typical usage:
2424
EOF
2525
}
2626

27-
decrypted_files=$(_mktemp)
27+
decrypted_file_list=$(_mktemp)
2828

2929
_trap_hook() {
30-
if [ -s "${decrypted_files}" ]; then
30+
if [ -s "${decrypted_file_list}" ]; then
3131
if [ "${QUIET}" = "false" ]; then
3232
echo >&2
3333
# shellcheck disable=SC2016
34-
xargs -0 -n1 sh -c 'rm "$1" && printf "[helm-secrets] Removed: %s\n" "$1"' sh >&2 <"${decrypted_files}"
34+
xargs -0 -n1 sh -c 'rm "$1" && printf "[helm-secrets] Removed: %s\n" "$1"' sh >&2 <"${decrypted_file_list}"
3535
else
36-
xargs -0 rm >&2 <"${decrypted_files}"
36+
xargs -0 rm >&2 <"${decrypted_file_list}"
3737
fi
3838

39-
rm "${decrypted_files}"
39+
rm "${decrypted_file_list}"
4040
fi
4141
}
4242

@@ -70,6 +70,8 @@ helm_wrapper() {
7070
'
7171

7272
for literal in $(printf '%s' "${literals}" | sed -E 's/([^\\]),/\1\n/g'); do
73+
unset IFS
74+
7375
opt_prefix="${literal%%=*}="
7476
literal="${literal#*=}"
7577

@@ -96,83 +98,98 @@ helm_wrapper() {
9698
fi
9799
done
98100

99-
unset IFS
100-
101101
set -- "$@" "${decrypted_literals%*,}"
102102
;;
103103
-f | --values | --values=?* | --set-file | --set-file=?*)
104104
_1="${1}"
105105

106106
case "${_1}" in
107107
--values=* | --set-file=*)
108-
file="${_1#*=}"
108+
files="${_1#*=}"
109109

110110
set -- "$@" "${_1%%=*}"
111111
;;
112112
*)
113-
file="${2}"
113+
files="${2}"
114114

115115
set -- "$@" "$1"
116116
shift
117117
j=$((j + 1))
118118
;;
119119
esac
120120

121-
case "$_1" in
122-
-f | --values | --values=?*)
123-
double_escape_need=0
124-
sops_type="yaml"
125-
opt_prefix=""
126-
;;
127-
--set-file | --set-file=?*)
128-
double_escape_need=1
129-
sops_type="auto"
130-
opt_prefix="${file%%=*}="
131-
file="${file#*=}"
132-
;;
133-
esac
121+
decrypted_files=""
134122

135-
# Ignore error on files beginning with ?
136-
if [ "${file##\?}" != "${file}" ]; then
137-
file="${file##\?}"
138-
IGNORE_MISSING_VALUES=true
139-
fi
123+
IFS='
124+
'
140125

141-
# Force secret backend
142-
if [ "${file#*!}" != "${file}" ]; then
143-
load_secret_backend "${file%%\!*}"
144-
file="${file#*!}"
145-
else
146-
load_secret_backend "${DEFAULT_SECRET_BACKEND}"
147-
fi
126+
for file in $(printf '%s' "${files}" | sed -E 's/([^\\]),/\1\n/g'); do
127+
unset IFS
128+
129+
case "$_1" in
130+
-f | --values | --values=?*)
131+
double_escape_need=0
132+
sops_type="yaml"
133+
opt_prefix=""
134+
;;
135+
--set-file | --set-file=?*)
136+
double_escape_need=1
137+
sops_type="auto"
138+
opt_prefix="${file%%=*}="
139+
file="${file#*=}"
140+
;;
141+
esac
142+
143+
# Ignore error on files beginning with ?
144+
if [ "${file##\?}" != "${file}" ]; then
145+
file="${file##\?}"
146+
IGNORE_MISSING_VALUES=true
147+
fi
148148

149-
if ! real_file=$(_file_get "${file}"); then
150-
if [ "${IGNORE_MISSING_VALUES}" = "true" ]; then
151-
real_file="$(_mktemp)"
149+
# Force secret backend
150+
if [ "${file#*!}" != "${file}" ]; then
151+
if is_secret_backend "${file%%\!*}"; then
152+
load_secret_backend "${file%%\!*}"
153+
file="${file#*!}"
154+
else
155+
load_secret_backend "${DEFAULT_SECRET_BACKEND}"
156+
fi
152157
else
153-
fatal 'File does not exist: %s' "${file}"
158+
load_secret_backend "${DEFAULT_SECRET_BACKEND}"
154159
fi
155-
fi
156160

157-
file_dec="$(_file_dec_name "${real_file}")"
158-
if [ -f "${file_dec}" ]; then
159-
set -- "$@" "${opt_prefix}$(_helm_winpath "${file_dec}" "${double_escape_need}")"
160-
161-
if [ "${QUIET}" = "false" ]; then
162-
log 'Decrypt skipped: %s' "${file}"
161+
if ! real_file=$(_file_get "${file}"); then
162+
if [ "${IGNORE_MISSING_VALUES}" = "true" ]; then
163+
real_file="$(_mktemp)"
164+
else
165+
fatal 'File does not exist: %s' "${file}"
166+
fi
163167
fi
164-
else
165-
if decrypt_helper "${real_file}" "${sops_type}"; then
166-
set -- "$@" "${opt_prefix}$(_helm_winpath "${file_dec}" "${double_escape_need}")"
167-
printf '%s\0' "${file_dec}" >>"${decrypted_files}"
168+
169+
file_dec="$(_file_dec_name "${real_file}")"
170+
if [ -f "${file_dec}" ]; then
171+
decrypted_files="${decrypted_files}${opt_prefix}$(_helm_winpath "${file_dec}" "${double_escape_need}"),"
168172

169173
if [ "${QUIET}" = "false" ]; then
170-
log 'Decrypt: %s' "${file}"
174+
log 'Decrypt skipped: %s' "${file}"
171175
fi
172176
else
173-
set -- "$@" "${opt_prefix}$(_helm_winpath "${real_file}" "${double_escape_need}")"
177+
if decrypt_helper "${real_file}" "${sops_type}"; then
178+
printf '%s\0' "${file_dec}" >>"${decrypted_file_list}"
179+
180+
if [ "${QUIET}" = "false" ]; then
181+
log 'Decrypt: %s' "${file}"
182+
fi
183+
184+
decrypted_files="${decrypted_files}${opt_prefix}$(_helm_winpath "${file_dec}" "${double_escape_need}"),"
185+
else
186+
decrypted_files="${decrypted_files}${opt_prefix}$(_helm_winpath "${real_file}" "${double_escape_need}"),"
187+
fi
174188
fi
175-
fi
189+
done
190+
191+
set -- "$@" "${decrypted_files%*,}"
192+
176193
;;
177194
*)
178195
if [ -d "$1" ] || [ -f "$1" ]; then

scripts/lib/common.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ _winpath() { printf '%s' "${1}"; }
9797
_helm_winpath() { printf '%s' "${1}"; }
9898

9999
case "$(uname -s)" in
100-
CYGWIN*)
100+
CYGWIN* | MINGW64_NT*)
101101
on_cygwin() { true; }
102102
_winpath() {
103103
if [ "${2:-0}" = "1" ]; then

scripts/lib/file/custom.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ _file_custom_exists() {
99
_file_custom_get() {
1010
_tmp_file=$(_mktemp)
1111
GETTER_CHART_PATH="$(_helm_winpath "${SCRIPT_DIR}/lib/file/helm-values-getter")"
12-
VALUES="$(_helm_winpath "${1}")"
1312

14-
if ! "${HELM_BIN}" template "${GETTER_CHART_PATH}" --set-file "content=${VALUES}" >"${_tmp_file}"; then
15-
exit 1
13+
if ! CONTENT="$(env -u HELM_DEBUG "${HELM_BIN}" template "${GETTER_CHART_PATH}" --set-file "content=${1}")"; then
14+
fatal "helm template command errored on value '%s'" "${1}"
15+
fi
16+
17+
# shellcheck disable=SC2016
18+
if ! printf '%s' "${CONTENT}" | sed -e '1,3d' -e 's/^ //g' >"${_tmp_file}"; then
19+
fatal "sed command errored on value '%s'" "${1}"
1620
fi
1721

18-
_sed_i '/^# Source: /d' "${_tmp_file}"
1922
printf '%s' "${_tmp_file}"
2023
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
{{- .Values.content }}
1+
---
2+
content: |
3+
{{- .Values.content | nindent 2 -}}

tests/it/diff.bats

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,18 +186,18 @@ load '../bats/extensions/bats-file/load'
186186
}
187187

188188
@test "diff: helm diff upgrade w/ chart + secrets.yaml + special path" {
189-
FILE="!${SPECIAL_CHAR_DIR}/assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
189+
FILE="${SPECIAL_CHAR_DIR}/assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
190190
SEED="${RANDOM}"
191191
RELEASE="diff-$(date +%s)-${SEED}"
192192

193193
create_chart "${SPECIAL_CHAR_DIR}"
194194

195195
run "${HELM_BIN}" secrets diff upgrade --no-color --allow-unreleased "${RELEASE}" "${SPECIAL_CHAR_DIR}/chart" -f "${FILE}" 2>&1
196196
assert_success
197-
assert_output --partial "[helm-secrets] Decrypt: ${FILE##\!}"
197+
assert_output --partial "[helm-secrets] Decrypt: ${FILE}"
198198
assert_output --partial "port: 81"
199-
assert_output --partial "[helm-secrets] Removed: ${FILE##\!}.dec"
200-
assert_file_not_exists "${FILE##\!}.dec"
199+
assert_output --partial "[helm-secrets] Removed: ${FILE}.dec"
200+
assert_file_not_exists "${FILE}.dec"
201201
}
202202

203203
@test "diff: helm diff upgrade w/ chart + invalid yaml" {

tests/it/install.bats

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,15 @@ load '../bats/extensions/bats-file/load'
218218
}
219219

220220
@test "install: helm install w/ chart + secrets.yaml + special path" {
221-
FILE="!${SPECIAL_CHAR_DIR}/assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
221+
FILE="${SPECIAL_CHAR_DIR}/assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
222222
SEED="${RANDOM}"
223223
RELEASE="install-$(date +%s)-${SEED}"
224224
create_chart "${SPECIAL_CHAR_DIR}"
225225

226226
run "${HELM_BIN}" secrets install "${RELEASE}" "${SPECIAL_CHAR_DIR}/chart" --no-hooks -f "${FILE}" 2>&1
227-
assert_output --partial "[helm-secrets] Decrypt: ${FILE##\!}"
227+
assert_output --partial "[helm-secrets] Decrypt: ${FILE}"
228228
assert_output --partial "STATUS: deployed"
229-
assert_output --partial "[helm-secrets] Removed: ${FILE##\!}.dec"
229+
assert_output --partial "[helm-secrets] Removed: ${FILE}.dec"
230230
assert_file_not_exists "${FILE}.dec"
231231
assert_success
232232

tests/it/upgrade.bats

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,17 @@ load '../bats/extensions/bats-file/load'
218218
}
219219

220220
@test "upgrade: helm upgrade w/ chart + secrets.yaml + special path" {
221-
FILE="!${SPECIAL_CHAR_DIR}/assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
221+
FILE="${SPECIAL_CHAR_DIR}/assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
222222
SEED="${RANDOM}"
223223
RELEASE="upgrade-$(date +%s)-${SEED}"
224224
create_chart "${SPECIAL_CHAR_DIR}"
225225

226226
run "${HELM_BIN}" secrets upgrade -i "${RELEASE}" "${SPECIAL_CHAR_DIR}/chart" --no-hooks -f "${FILE}" 2>&1
227227
assert_success
228-
assert_output --partial "[helm-secrets] Decrypt: ${FILE##\!}"
228+
assert_output --partial "[helm-secrets] Decrypt: ${FILE}"
229229
assert_output --partial "STATUS: deployed"
230-
assert_output --partial "[helm-secrets] Removed: ${FILE##\!}.dec"
231-
assert_file_not_exists "${FILE##\!}.dec"
230+
assert_output --partial "[helm-secrets] Removed: ${FILE}.dec"
231+
assert_file_not_exists "${FILE}.dec"
232232

233233
run kubectl get svc -o yaml -l "app.kubernetes.io/name=${HELM_SECRETS_BACKEND},app.kubernetes.io/instance=${RELEASE}"
234234
assert_success

tests/unit/lint.bats

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ load '../bats/extensions/bats-file/load'
238238
fi
239239

240240
VALUES="assets/values/${HELM_SECRETS_BACKEND}/secrets.yaml"
241-
VALUES_PATH="!${SPECIAL_CHAR_DIR}/${VALUES}"
241+
VALUES_PATH="${SPECIAL_CHAR_DIR}/${VALUES}"
242242

243243
create_chart "${SPECIAL_CHAR_DIR}"
244244

0 commit comments

Comments
 (0)