#!/bin/bash # ------------------------------------------------------------------------------ # Secret management functions # This file is part of the init.sh project # Copyright (c) 2025 Geoffray Levasseur # ------------------------------------------------------------------------------ # This file is distributed under 3-clause BSD license. # The complete license agreement can be obtained at: # https://opensource.org/licenses/BSD-3-Clause # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Passbolt get_passbolt_secret() { local name="$1" secret if ! command -v passbolt >/dev/null 2>&1; then prnt E "Passbolt CLI not found (required to fetch passbolt:$name)." die 22 fi # Exemple basé sur CLI Passbolt + jq secret=$(passbolt secret list --json 2>/dev/null | jq -r --arg NAME "$name" \ '.[] | select(.name == $NAME) | .secrets[0].data' 2>/dev/null) if [[ -z "$secret" || "$secret" == "null" ]]; then prnt E "Secret '$name' not found in Passbolt." die 23 fi printf '%s' "$secret" } export -f get_passbolt_secret # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # File get_file_secret() { local path="$1" secret if [[ -z "$path" ]]; then prnt E "get_file_secret: missing path" die 10 fi if [[ ! -r "$path" ]]; then prnt E "get_file_secret: '$path' not readable" die 24 fi secret=$(<"$path") secret="${secret%$'\r'}" secret="${secret%$'\n'}" printf '%s' "$secret" } export -f get_file_secret # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Environment variable get_var_secret() { local var="$1" secret if [[ -z "$var" ]]; then prnt E "get_var_secret: missing variable name" die 25 fi if ! printenv "$var" >/dev/null 2>&1; then prnt E "get_var_secret: variable '$var' not set" die 25 fi secret="$(printenv "$var")" secret="${secret%$'\r'}" secret="${secret%$'\n'}" printf '%s' "$secret" } export -f get_var_secret # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Main dispatcher # Usage: fetch_secret "scheme:identifier" fetch_secret() { local ref="$1" local scheme identifier func if [[ -z "$ref" ]]; then prnt E "fetch_secret: no reference provided" die 26 fi # par défaut, si pas de scheme -> "file" if [[ "$ref" != *:* ]]; then scheme="file" identifier="$ref" else scheme="${ref%%:*}" identifier="${ref#*:}" fi func="get_${scheme}_secret" if ! declare -f "$func" >/dev/null 2>&1; then prnt E "fetch_secret: unsupported scheme '$scheme' (no function $func)" die 27 fi "$func" "$identifier" } export -f fetch_secret # ------------------------------------------------------------------------------ # EOF