[pacman-dev] [PATCH 3/3] pacman-key: better handling of options and supressing gpg output

Allan McRae allan at archlinux.org
Sat Feb 19 09:33:13 EST 2011


On 19/02/11 11:30, Denis A. Altoé Falqueto wrote:
> The option --trus was changed to --edit-key, for better alignment
> with the underlying --edit-key of gnupg.
>
> The options --config and --gpgdir were not being handled correctly.
> They would not work if were not used as first arguments always.
> Now the handling is more flexible.
>
> The use of gpg for verification purposes was leaking inconvenient
> messages to the output, so they were quieted with --quiet,
> 1>/dev/null and 2>&1.
>
> Signed-off-by: Denis A. Altoé Falqueto<denisfalqueto at gmail.com>
> ---
>   doc/pacman-key.8.txt     |    4 +-
>   scripts/pacman-key.sh.in |   55 ++++++++++++++++++++++++++++++----------------
>   2 files changed, 38 insertions(+), 21 deletions(-)
>
> diff --git a/doc/pacman-key.8.txt b/doc/pacman-key.8.txt
> index 5ebbd0a..ba97b82 100644
> --- a/doc/pacman-key.8.txt
> +++ b/doc/pacman-key.8.txt
> @@ -59,8 +59,8 @@ Commands
>   *\--reload*::
>   	Reloads the keys from the keyring package
>
> -*-t*, *\--trust* 'keyid'::
> -	Set the trust level of the given key
> +*-t*, *\--edit-key* 'keyid ...'::
> +	Edit trust properties for the given keys
>
>   *-u*, *\--updatedb*::
>   	Equivalent to \--check-trustdb in GnuPG
> diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in
> index ccaf4b2..d97b071 100644
> --- a/scripts/pacman-key.sh.in
> +++ b/scripts/pacman-key.sh.in
> @@ -71,7 +71,7 @@ usage() {
>   	echo "$(gettext "  -l | --list                            - list keys")"
>   	echo "$(gettext "  -r | --receive<keyserver>  <keyid>  ... - fetch the keyids from the specified")"
>   	echo "$(gettext "                                           keyserver URL")"
> -	echo "$(gettext "  -t | --trust<keyid>  ...               - set the trust level of the given key")"
> +	echo "$(gettext "  -t | --edit-key<keyid>  ...            - edit trust properties for the given keys")"
>   	echo "$(gettext "  -u | --updatedb                        - update the trustdb of pacman")"
>   	echo "$(gettext "  -v | --version                         - displays the current version")"
>   	echo "$(gettext "  --adv<params>                          - use pacman's keyring as target for")"
> @@ -117,7 +117,7 @@ reload_keyring() {
>   	# Verify signatures of related files, if they exist
>   	if [[ -r "${ADDED_KEYS}" ]]; then
>   		msg "$(gettext "Verifying official keys file signature...")"
> -		if ! ${GPG_PACMAN} --quiet --batch --verify "${ADDED_KEYS}.sig" 1>/dev/null; then
> +		if ! ${GPG_PACMAN} --quiet --verify "${ADDED_KEYS}.sig" 1>/dev/null 2>&1; then

using "&>/dev/null" would be cleaner.  And given --quiet is obviously 
not doing much, should we just remove it?

As an aside, the man page for gpg says --verify should "verify it 
without generating any output".  Clearly there is output...

>   			error "$(gettext "The signature of file %s is not valid.")" "${ADDED_KEYS}"
>   			exit 1
>   		fi
> @@ -125,7 +125,7 @@ reload_keyring() {
>
>   	if [[ -r "${DEPRECATED_KEYS}" ]]; then
>   		msg "$(gettext "Verifying deprecated keys file signature...")"
> -		if ! ${GPG_PACMAN} --quiet --batch --verify "${DEPRECATED_KEYS}.sig" 1>/dev/null; then
> +		if ! ${GPG_PACMAN} --quiet --verify "${DEPRECATED_KEYS}.sig" 1>/dev/null 2>&1; then
>   			error "$(gettext "The signature of file %s is not valid.")" "${DEPRECATED_KEYS}"
>   			exit 1
>   		fi
> @@ -133,7 +133,7 @@ reload_keyring() {
>
>   	if [[ -r "${REMOVED_KEYS}" ]]; then
>   		msg "$(gettext "Verifying deleted keys file signature...")"
> -		if ! ${GPG_PACMAN} --quiet --batch --verify "${REMOVED_KEYS}.sig"; then
> +		if ! ${GPG_PACMAN} --quiet --verify "${REMOVED_KEYS}.sig" 1>/dev/null 2>&1; then
>   			error "$(gettext "The signature of file %s is not valid.")" "${REMOVED_KEYS}"
>   			exit 1
>   		fi
> @@ -229,15 +229,27 @@ if [[ $1 != "--version"&&  $1 != "-v"&&  $1 != "--help"&&  $1 != "-h"&&  $1 != "
>   	fi
>   fi
>
> -# Parse global options
> +# Iterate over the parameters to get --config and --gpgdir
> +# This time, the parameters will not be consumed. This is needed
> +# because the code needs to know where is pacman's keyring before
> +# signing or verifying any files.
>   CONFIG="@sysconfdir@/pacman.conf"
> -PACMAN_KEYRING_DIR="@sysconfdir@/pacman.d/gnupg"
> -while [[ $1 =~ ^--(config|gpgdir)$ ]]; do
> -	case "$1" in
> -		--config) shift; CONFIG="$1" ;;
> -		--gpgdir) shift; PACMAN_KEYRING_DIR="$1" ;;
> +GPGDIR=""
> +isconfig=0
> +isgpgdir=0
> +for arg in "$@"; do
> +	if (( isconfig )); then
> +		isconfig=0
> +		CONFIG="$arg"
> +	fi
> +	if (( isgpgdir )); then
> +		isgpgdir=0
> +		GPGDIR="$arg"
> +	fi
> +	case "$arg" in
> +		--config) isconfig=1;;
> +		--gpgdir) isgpgdir=1;;


This leaves --config and --gpgdir in "$@".  So if I run (e.g.)
"pacman-key --delete <keyid> --config <file>"

Then the command run will be:

${GPG_PACMAN} --quiet --batch --delete-key --yes "$@"

where "$@" is expanded to "<keyid> --config <file>", which clearly is 
bad...  So this needs to be slightly more clever.


Allan


More information about the pacman-dev mailing list