#!/bin/bash # omarchy:hidden=true # omarchy:summary=Provide internal helpers for command-scoped sudo authentication if [[ ${BASH_SOURCE[0]} == "$0" ]]; then echo "omarchy-security-functions is an internal function library." >&2 exit 64 fi omarchy_security_require_privileged_bash_startup() { [[ $- == *p* ]] || return 1 # The caller is this check's parent, under the number this /proc gives it. # arch-chroot runs the installer in a new PID namespace beneath the outer # /proc, where $$ names no process, or someone else's. /usr/bin/env -i /usr/bin/bash -p -c ' stat=$( 0 )); then exec /usr/bin/env "${unsets[@]}" /usr/bin/bash -p -- "$script" "$@" fi } omarchy_security_require_source_root() { local command_source command_name=${1##*/} command_source=$(/usr/bin/readlink -e -- "$1") || return 1 # A runtime root selects the code used by this invocation. Accept the # canonical checkout containing the entrypoint or the package's bin links. if [[ ${OMARCHY_PATH:-} != /* || $(/usr/bin/realpath -e -- "$OMARCHY_PATH") != "$OMARCHY_PATH" ]] || ! { [[ $command_source == "$OMARCHY_PATH/bin/$command_name" ]] || [[ $OMARCHY_PATH == "/usr/share/omarchy" && $command_source == "/usr/bin/$command_name" ]]; }; then echo "OMARCHY_PATH does not match this Omarchy command." >&2 return 1 fi } omarchy_security_sudo_supports_no_update() { local help help=$(LC_ALL=C /usr/bin/sudo -h 2>&1) || return 1 /usr/bin/grep -Eq '^usage: sudo .*\[[^]]*N[^]]*\]' <<< "$help" } omarchy_security_revoke_sudo_timestamp() { /usr/bin/sudo -k } omarchy_security_exit_with_revoked_sudo() { local status=$1 local message=${2:-Could not invalidate cached sudo authorization.} trap - EXIT HUP INT TERM if ! omarchy_security_revoke_sudo_timestamp; then echo "$message" >&2 (( status != 0 )) || status=1 fi exit "$status" } omarchy_security_install_signal_exit_traps() { trap 'exit 129' HUP trap 'exit 130' INT trap 'exit 143' TERM } omarchy_security_install_sudo_cleanup_traps() { OMARCHY_SECURITY_SUDO_CLEANUP_MESSAGE=${1:-Could not invalidate cached sudo authorization.} trap omarchy_security_run_sudo_cleanup_trap EXIT omarchy_security_install_signal_exit_traps } omarchy_security_enable_no_update_sudo() { local wrapper_dir="$OMARCHY_PATH/default/omarchy/sudo-no-update" if ! omarchy_security_sudo_supports_no_update; then echo "This sudo does not support --no-update; refusing mixed-trust work." >&2 return 1 fi if [[ ! -f $wrapper_dir/sudo || ! -x $wrapper_dir/sudo ]]; then echo "The command-scoped sudo wrapper is missing." >&2 return 1 fi PATH="$wrapper_dir:$OMARCHY_PATH/bin:/usr/bin:/usr/sbin:/bin:/sbin" OMARCHY_SUDO_NO_UPDATE=1 export PATH OMARCHY_SUDO_NO_UPDATE } omarchy_security_run_sudo_cleanup_trap() { local status=$? omarchy_security_exit_with_revoked_sudo "$status" \ "${OMARCHY_SECURITY_SUDO_CLEANUP_MESSAGE:-Could not invalidate cached sudo authorization.}" } omarchy_security_assert_root_directory() { local path=$1 expected_mode=$2 canonical owner actual_mode [[ $path == /* && -d $path && ! -L $path ]] || return 1 canonical=$(/usr/bin/realpath -e -- "$path") || return 1 [[ $canonical == "$path" ]] || return 1 read -r owner actual_mode < <(/usr/bin/stat -Lc '%u %a' -- "$path") || return 1 [[ $owner == "0" && $actual_mode == "$expected_mode" ]] } omarchy_security_prepare_private_root_directory() { local path=$1 parent=$2 omarchy_security_assert_root_directory "$parent" 755 || return 1 if [[ -e $path || -L $path ]]; then omarchy_security_assert_root_directory "$path" 700 else /usr/bin/install -d -o root -g root -m 0700 -- "$path" || return 1 omarchy_security_assert_root_directory "$path" 700 fi }