[pacman-dev] [PATCH] pacman-key: --refresh-keys queries WKD before keyserver

Allan McRae allan at archlinux.org
Mon Jan 11 01:29:46 UTC 2021


On 11/1/21 5:53 am, foxboron at archlinux.org wrote:
> From: Morten Linderud <morten at linderud.pw>
> 
> With the recent outages of the keyservers there is a possibility of
> `--refresh-keys` failing to fetch new keys. A lot of current key
> distribution is done over WKD these days, and `pacman-key` has the
> ability to use it for `--recv-key`.
> 
> There was a hope `gpg` would end up supporting WKD for the refresh
> functionality, but this seems to be limited to expired keys fetched
> through WKD. Since this functionality isn't yet available it makes sense
> to stuff it into `pacman-key`.
> 
> The current implementation looks over all available keyids in the
> keyring, attempts to fetch over WKD and then fall backs to keyservers if
> no email has a valid WKD available. The downside of this approach is
> that it takes a bit longer to refresh the keys, but it should be more
> robust as the distribution should be providing their own WKDs.
> 

I'm going to assume most keys will have WKD.  Otherwise a bit longer
becomes much, much longer as we no long fetch keys in parallel...


> Co-authored-by: Jonas Witschel <diabonas at archlinux.org>
> Signed-off-by: Morten Linderud <morten at linderud.pw>
> ---
>  scripts/pacman-key.sh.in | 36 +++++++++++++++++++++++++++++++++---
>  1 file changed, 33 insertions(+), 3 deletions(-)
> 
> diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in
> index c65669f5..3bd8ea3e 100644
> --- a/scripts/pacman-key.sh.in
> +++ b/scripts/pacman-key.sh.in
> @@ -540,11 +540,41 @@ receive_keys() {
>  }
>  
>  refresh_keys() {
> +	local ret=0 ids masterkey emails
> +
>  	check_keyids_exist "$@"
> -	if ! "${GPG_PACMAN[@]}" --refresh-keys "$@" ; then
> -		error "$(gettext "A specified local key could not be updated from a keyserver.")"
> -		exit 1
> +
> +	# don't try to refresh the user's local masterkey
> +	masterkey="$("${GPG_PACMAN[@]}" --list-keys --with-colons pacman at localhost |
> +		awk -F: '$1 == "pub" { print $5 }')"
> +
> +	mapfile -t ids < \
> +		<("${GPG_PACMAN[@]}" --list-keys --with-colons "$@" |
> +			awk -F: '$1 == "pub" { print $5 }' | grep -v "^$masterkey$")

Can we just use "grep -vx" here?

> +
> +	if (( ! ${#ids[*]} )); then
> +	    error "No keys in the keyring."

Error not translated, and incorrect if specifc key IDs are passed to
--refresh-keys

> +	    exit 1
>  	fi
> +
> +	for id in "${ids[@]}"; do
> +		mapfile -t emails < \
> +			<("${GPG_PACMAN[@]}" --list-keys --list-options show-only-fpr-mbox "$id" |
> +				awk '{print $2 }')
> +
> +		# first try looking up the key in a WKD (only works by email address)
> +		for email in "${emails[@]}"; do
> +			"${GPG_PACMAN[@]}" --locate-external-keys "$email" && break
> +		done

There is going to be so much error spam to the terminal with this.
Peoples distro IDs are rarely first.

> +
> +		# if no key was found, fall back to using the keyservers (with the key fingerprint instead)
> +		if (( $? )) &&  ! "${GPG_PACMAN[@]}" --refresh-keys "$id"; then
> +			error "$(gettext "A specified local key could not be updated from WKD or keyserver.")"

This error can be improved given we fetch the key one at a time now.

> +			ret=1
> +		fi
> +	done
> +
> +	exit $ret
>  }
>  
>  verify_sig() {
> 


More information about the pacman-dev mailing list