From: Ivan Kanakarakis <ivan.kanak@gmail.com> This commit fixes handling of --help/-h --version/-V options. Previously $ pacman-key --help would return errors if the configuration file was missing or the user did not have root privileges. Same was for --version switch. Moreover this fixes a bug that caused the command line specified gpgdir (PACMAN_KEYRING_DIR) to be overridden by the values from the configuration file. The parsing now happens as follows: a. The script parses --config and/or --gpgdir if those are specified. These options should be the first arguments given to the script. b. The script reads the first command, that is the first argument after the --config and/or --gpgdir parsing is done. If no command was provided the script exits with an error. If the command is one of --help -h --version -V then it skip the checks that would otherwise be needed, executes those and exits. If the command is other, the script checks by order: - the dependencies are met (currently existence of gpg executable) - the user has root privileges - the configuration file is readable - the gpgdir is set and exists c. If all checks pass the command is matched to a case and the appropriate set of commands is executed. Signed-off-by: Ivan Kanakarakis <ivan.kanak@gmail.com> --- scripts/pacman-key.sh.in | 66 +++++++++++++++++++++++++--------------------- 1 files changed, 36 insertions(+), 30 deletions(-) diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in index b5fca2b..1d0229b 100644 --- a/scripts/pacman-key.sh.in +++ b/scripts/pacman-key.sh.in @@ -217,20 +217,11 @@ if ! type gettext &>/dev/null; then } fi -if [[ $1 != "--version" && $1 != "-V" && $1 != "--help" && $1 != "-h" && $1 != "" ]]; then - if ! type -p gpg &>/dev/null; then - error "$(gettext "gnupg does not seem to be installed.")" - msg2 "$(gettext "pacman-key requires gnupg for most operations.")" - exit 1 - elif (( EUID != 0 )); then - error "$(gettext "pacman-key needs to be run as root.")" - exit 1 - fi -fi +# Set default values +CONFIG_DEF="@sysconfdir@/pacman.conf" +PACMAN_KEYRING_DIR_DEF="@sysconfdir@/pacman.d/gnupg" -# Parse global options -CONFIG="@sysconfdir@/pacman.conf" -PACMAN_KEYRING_DIR="@sysconfdir@/pacman.d/gnupg" +# Parse command line options while [[ $1 =~ ^--(config|gpgdir)$ ]]; do case "$1" in --config) shift; CONFIG="$1" ;; @@ -239,23 +230,7 @@ while [[ $1 =~ ^--(config|gpgdir)$ ]]; do shift done -if [[ ! -r "${CONFIG}" ]]; then - error "$(gettext "%s not found.")" "$CONFIG" - exit 1 -fi - -# Read GPGDIR from $CONFIG. -if [[ GPGDIR="$(get_from "$CONFIG" "GPGDir")" == 0 ]]; then - PACMAN_KEYRING_DIR="${GPGDIR}" -fi -GPG_PACMAN="gpg --homedir ${PACMAN_KEYRING_DIR} --no-permission-warning" - -# Try to create $PACMAN_KEYRING_DIR if non-existent -# Check for simple existence rather than for a directory as someone may want -# to use a symlink here -[[ -e ${PACMAN_KEYRING_DIR} ]] || mkdir -p -m 755 "${PACMAN_KEYRING_DIR}" - -# Parse and execute command +# Parse the command command="$1" if [[ -z "${command}" ]]; then usage @@ -263,6 +238,37 @@ if [[ -z "${command}" ]]; then fi shift +# If command is --help/-h or --version/-V then skip checks and execute those +if [[ ! ${command} =~ ^(--help|-h|--version|-V)$ ]]; then + # check dependencies + if ! type -p gpg &>/dev/null; then + error "$(gettext "gnupg does not seem to be installed.")" + msg2 "$(gettext "pacman-key requires gnupg for most operations.")" + exit 1 + fi + # check permissions + if (( ! EUID )); then + error "$(gettext "pacman-key needs to be run as root.")" + exit 1 + fi + # Use the default CONFIG if the user didn't specify one + # If configuration file is not readable use the default + # even if it was specified by the user with --config + [[ ! -r $CONFIG ]] && CONFIG="$CONFIG_DEF" + # if the user didn't specify PACMAN_KEYRING_DIR + # then read GPGDir from the configuration file + [[ -z $PACMAN_KEYRING_DIR ]] && PACMAN_KEYRING_DIR="$(get_from "$CONFIG" "GPGDir")" + # if no such setting exists, use the default value + [[ -z $PACMAN_KEYRING_DIR ]] && PACMAN_KEYRING_DIR="$PACMAN_KEYRING_DIR_DEF" + # Try to create $PACMAN_KEYRING_DIR if non-existent + # Check for simple existence rather than a directory + # as someone may want to use a symlink here + [[ ! -e ${PACMAN_KEYRING_DIR} ]] && mkdir -p -m 755 "${PACMAN_KEYRING_DIR}" +fi + +GPG_PACMAN="gpg --homedir ${PACMAN_KEYRING_DIR} --no-permission-warning" + +# Execute the command case "${command}" in -a|--add) # If there is no extra parameter, gpg will read stdin -- 1.7.4.4