[pacman-dev] [PATCH 6/7] pacman-key: fix parsing of command line options
Dan McGee
dpmcgee at gmail.com
Thu Apr 21 13:08:18 EDT 2011
On Thu, Apr 21, 2011 at 8:59 AM, <ivan.kanak at gmail.com> wrote:
> From: Ivan Kanakarakis <ivan.kanak at 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 at 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
-1 from me. This makes no sense other than confusion for the user. If
I specify a bogus or unreadable file, blow up on me. Fixing this to
not be magic also means you don't need CONFIG_DEF at all either.
> + [[ ! -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
> --
Looks OK to me otherwise, but I'll let Allan weigh in as well.
-Dan
More information about the pacman-dev
mailing list