#!/usr/bin/env bash # CASAN Plan-16 SEC-23 (MT-01) — tenant-scoped state path resolver. SOURCE this. # # When CASAN_TENANT_ID is set, exports per-tenant locations for state that would # otherwise be global (control-plane settings + its audit chain, telemetry, audit), # so each subsystem writes under its own tenant partition. Each var is only set if # not already overridden (explicit env wins). An invalid tenant id fails CLOSED. # # Usage: source tenant-paths.sh # (control-plane-settings.py is tenant-aware on its own via CASAN_TENANT_ID; this # resolver covers the bash subsystems that read path env vars.) _CASAN_TP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" _CASAN_TS="$_CASAN_TP_DIR/tenant-store.sh" _casan_tp_set() { # local var="$1" name="$2" path [[ -n "${!var:-}" ]] && return 0 # explicit override wins path="$(bash "$_CASAN_TS" resolve "$name" 2>/dev/null)" || return 1 export "$var=$path" } if [[ -n "${CASAN_TENANT_ID:-}" ]]; then if ! bash "$_CASAN_TS" id >/dev/null 2>&1; then echo "TENANT_PATHS_DENIED invalid or missing tenant id" >&2 return 1 2>/dev/null || exit 1 fi _casan_tp_set CASAN_CP_STORE_FILE control-plane/settings.json _casan_tp_set CASAN_CP_KEY_DIR control-plane/keys _casan_tp_set CASAN_METRICS_DIR telemetry/cost _casan_tp_set CASAN_TENANT_AUDIT_DIR audit fi