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

Eli Schwartz eschwartz at archlinux.org
Wed Mar 3 04:58:10 UTC 2021


On 2/24/21 7:57 AM, Allan McRae wrote:
> On 22/2/21 9:09 am, Morten Linderud 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.
>>
>> Co-authored-by: Jonas Witschel <diabonas at archlinux.org>
>> Signed-off-by: Morten Linderud <morten at linderud.pw>
>> ---
>>
>> * Done grep -vx
>>
>> * Removed the redundant error since it's caught by `check_keyids_exist`
>>
>> * Improved the error message with the keyid
>>
>>
>>  scripts/pacman-key.sh.in | 33 +++++++++++++++++++++++++++++----
>>  1 file changed, 29 insertions(+), 4 deletions(-)
>>
>> diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in
>> index c65669f5..e89d7af9 100644
>> --- a/scripts/pacman-key.sh.in
>> +++ b/scripts/pacman-key.sh.in
>> @@ -540,11 +540,36 @@ 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
>> -	fi
>> +
>> +	# 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 -vx "$masterkey")
>> +
>> +	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
>> +
>> +		# 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 "The following key could not be updated from WKD or keyserver: %s")" "$id"
> 
> This error message is verbose.  "The following key..."  is not needed.
> It would be strange if we listed the key id not associated with the
> message!  And the user does not care that both WKD and keyserver failed,
> just that there is a failure.
> 
> How about:
> 
> error "$(gettext "Could not update key: %s") "$id"

https://bugs.archlinux.org/task/69865

:p

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


-- 
Eli Schwartz
Bug Wrangler and Trusted User

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.archlinux.org/pipermail/pacman-dev/attachments/20210302/9a222800/attachment.sig>


More information about the pacman-dev mailing list