99
1010set -euo pipefail
1111
12+ CRED_PREFLIGHT_SYSTEM_PATH=" /usr/bin:/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin"
13+ PATH=" $CRED_PREFLIGHT_SYSTEM_PATH "
14+ export PATH
15+
1216CRED_PREFLIGHT_JSON=false
1317CRED_PREFLIGHT_ROOT=" "
1418CRED_PREFLIGHT_HOME=" ${HOME:- } "
@@ -23,6 +27,7 @@ CRED_PREFLIGHT_EXCLUDES=()
2327CRED_PREFLIGHT_FINDINGS=()
2428CRED_PREFLIGHT_SKIPPED=()
2529CRED_PREFLIGHT_FILES_SCANNED=0
30+ CRED_PREFLIGHT_JQ_BIN=" "
2631
2732credential_preflight_usage () {
2833 cat << 'EOF '
@@ -102,25 +107,49 @@ credential_preflight_parse_args() {
102107
103108credential_preflight_binary_path () {
104109 local name=" ${1:- } "
105- local path_value =" "
110+ local candidate =" "
106111
107112 [[ -n " $name " ]] || return 1
108113 case " $name " in
109- .|..|* /* ) return 1 ;;
114+ .|..|* /* | * [!A-Za-z0-9._+-] * ) return 1 ;;
110115 esac
111116
112- path_value=" $( command -v " $name " 2> /dev/null || true) "
113- [[ -n " $path_value " && -x " $path_value " ]] || return 1
114- printf ' %s\n' " $path_value "
117+ for candidate in \
118+ " /usr/bin/$name " \
119+ " /bin/$name " \
120+ " /usr/local/bin/$name " \
121+ " /usr/local/sbin/$name " \
122+ " /usr/sbin/$name " \
123+ " /sbin/$name "
124+ do
125+ [[ -x " $candidate " ]] || continue
126+ printf ' %s\n' " $candidate "
127+ return 0
128+ done
129+
130+ return 1
115131}
116132
117133credential_preflight_require_jq () {
118- if ! credential_preflight_binary_path jq > /dev/null 2>&1 ; then
134+ CRED_PREFLIGHT_JQ_BIN=" $( credential_preflight_binary_path jq 2> /dev/null || true) "
135+ if [[ -z " $CRED_PREFLIGHT_JQ_BIN " ]]; then
119136 echo " Error: jq is required for acfs credential-preflight" >&2
120137 return 2
121138 fi
122139}
123140
141+ credential_preflight_jq () {
142+ local jq_bin=" $CRED_PREFLIGHT_JQ_BIN "
143+
144+ if [[ -z " $jq_bin " || ! -x " $jq_bin " ]]; then
145+ jq_bin=" $( credential_preflight_binary_path jq 2> /dev/null || true) "
146+ [[ -n " $jq_bin " ]] || return 2
147+ CRED_PREFLIGHT_JQ_BIN=" $jq_bin "
148+ fi
149+
150+ " $jq_bin " " $@ "
151+ }
152+
124153credential_preflight_abs_path () {
125154 local path=" $1 "
126155 local dir=" "
@@ -253,7 +282,7 @@ credential_preflight_json_array_from_objects() {
253282 if [[ $# -eq 0 ]]; then
254283 printf ' []\n'
255284 else
256- printf ' %s\n' " $@ " | jq -s .
285+ printf ' %s\n' " $@ " | credential_preflight_jq -s .
257286 fi
258287}
259288
@@ -264,7 +293,7 @@ credential_preflight_add_skipped() {
264293 local reason=" $4 "
265294 local object=" "
266295
267- object=" $( jq -n \
296+ object=" $( credential_preflight_jq -n \
268297 --arg file " $( credential_preflight_display_path " $root " " $path " ) " \
269298 --arg source " $source " \
270299 --arg reason " $reason " \
@@ -293,7 +322,7 @@ credential_preflight_add_finding() {
293322 local evidence=" $6 "
294323 local object=" "
295324
296- object=" $( jq -n \
325+ object=" $( credential_preflight_jq -n \
297326 --arg category " $category " \
298327 --arg severity " warning" \
299328 --arg file " $( credential_preflight_display_path " $root " " $path " ) " \
@@ -508,7 +537,7 @@ credential_preflight_render_json() {
508537
509538 findings_json=" $( credential_preflight_json_array_from_objects " ${CRED_PREFLIGHT_FINDINGS[@]} " ) "
510539 skipped_json=" $( credential_preflight_json_array_from_objects " ${CRED_PREFLIGHT_SKIPPED[@]} " ) "
511- categories_json=" $( jq -n --argjson findings " $findings_json " '
540+ categories_json=" $( credential_preflight_jq -n --argjson findings " $findings_json " '
512541 $findings
513542 | group_by(.category)
514543 | map({category: .[0].category, count: length})
@@ -518,7 +547,7 @@ credential_preflight_render_json() {
518547 status=" warn"
519548 fi
520549
521- jq -n \
550+ credential_preflight_jq -n \
522551 --arg generated_at " $CRED_PREFLIGHT_GENERATED_AT " \
523552 --arg status " $status " \
524553 --argjson files_scanned " $CRED_PREFLIGHT_FILES_SCANNED " \
@@ -563,7 +592,7 @@ credential_preflight_render_human() {
563592 " ${# CRED_PREFLIGHT_FINDINGS[@]} " \
564593 " $CRED_PREFLIGHT_FILES_SCANNED "
565594 for object in " ${CRED_PREFLIGHT_FINDINGS[@]} " ; do
566- jq -r ' "\(.file):\(.line): \(.category) - \(.evidence)\n Remediation: \(.remediation)"' <<< " $object"
595+ credential_preflight_jq -r ' "\(.file):\(.line): \(.category) - \(.evidence)\n Remediation: \(.remediation)"' <<< " $object"
567596 done
568597 if [[ ${# CRED_PREFLIGHT_SKIPPED[@]} -gt 0 ]]; then
569598 printf ' Skipped %d file(s); use --json for reasons.\n' " ${# CRED_PREFLIGHT_SKIPPED[@]} "
0 commit comments