# Environment configuration for Xcode script phases # Create `.xcode.env.local` for local customizations (not versioned) # Dynamic Node.js binary detection with security validation find_node_binary() { # Check PATH first (safest option) if command -v node >/dev/null 2>&1; then local node_path=$(command -v node) # Validate it's actually executable if [ -x "$node_path" ] && [ -f "$node_path" ]; then echo "$node_path" return 0 fi fi # Common installation paths (hardcoded for security) local paths=( "/opt/homebrew/bin/node" "/usr/local/bin/node" "/opt/node/bin/node" "/usr/bin/node" ) for path in "${paths[@]}"; do # Validate path is absolute and executable if [ -x "$path" ] && [ -f "$path" ] && [[ "$path" = /* ]]; then echo "$path" return 0 fi done # Check NVM installation with validation if [ -n "$NVM_DIR" ] && [ -f "$NVM_DIR/nvm.sh" ] && [[ "$NVM_DIR" = /* ]]; then local nvmrc_file="$HOME/.nvmrc" if [ -f "$nvmrc_file" ] && [ -r "$nvmrc_file" ]; then # Read and sanitize version string local nvmrc_version nvmrc_version=$(head -n1 "$nvmrc_file" 2>/dev/null | tr -cd 'a-zA-Z0-9.-_' || echo "v18.17.0") # Validate version format (should start with 'v' and contain only safe chars) if [[ "$nvmrc_version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then local nvm_node="$HOME/.nvm/versions/node/$nvmrc_version/bin/node" # Validate the constructed path is safe if [ -x "$nvm_node" ] && [ -f "$nvm_node" ] && [[ "$nvm_node" = /* ]] && [[ "$nvm_node" = "$HOME/.nvm/versions/node/"* ]]; then echo "$nvm_node" return 0 fi fi fi fi # Fallback to system node (least secure but necessary) echo "node" return 1 } export NODE_BINARY=$(find_node_binary)