[pacman-dev] [PATCH 3/3] makepkg: Introduce validpgpkeys array
Dave Reisner
d at falconindy.com
Sat Mar 8 12:20:08 EST 2014
On Sat, Mar 08, 2014 at 05:40:17PM +0100, Thomas Bächler wrote:
> If validpgpkeys is set in the PKGBUILD, signature checking fails if
> the fingerprint of the key used to create the signature is not listed
> in the array.
>
> The key's trust value is ignored.
> ---
> doc/PKGBUILD.5.txt | 7 +++++++
> scripts/makepkg.sh.in | 16 ++++++++++++++--
> 2 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt
> index 50d8347..7a1e924 100644
> --- a/doc/PKGBUILD.5.txt
> +++ b/doc/PKGBUILD.5.txt
> @@ -128,6 +128,13 @@ Files in the source array with extensions `.sig`, `.sign` or, `.asc` are
> recognized by makepkg as PGP signatures and will be automatically used to verify
> the integrity of the corresponding source file.
>
> +*validpgpkeys (array)*::
> + An array of PGP fingerprints. If this array is non-empty, makepkg will
> + only accept signatures from the keys listed here and will ignore the
> + trust values from the keyring.
> ++
> +Fingerprints must be uppercase and must not contain whitespace characters.
> +
> *noextract (array)*::
> An array of file names corresponding to those from the source array. Files
> listed here will not be extracted with the rest of the source files. This
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index 015bdd7..6eb6d11 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -1244,6 +1244,15 @@ check_checksums() {
> fi
> }
>
> +is_valid_pgpkey() {
> + local pubkey
> +
> + pubkey=$(grep VALIDSIG "$statusfile" | sed -nr 's/.* VALIDSIG ([A-Z0-9]*) .*/\1/p;')
I think you just want:
pubkey=$(sed -n '/VALIDSIG/ s/.* VALIDSIG \([[:alnum:]]*\) .*/\1/p' "$statusfile")
sed's -r flag isn't portable.
> + echo "$pubkey"
Don't you only want to echo this if the check that follows succeeds?
> + in_array "$pubkey" ${validpgpkeys[@]}
The array needs quoting.
> + return $?
Wholly redundant for this function in its current form.
> +}
> +
> check_pgpsigs() {
> (( SKIPPGPCHECK )) && return 0
> ! source_has_signatures && return 0
> @@ -1303,9 +1312,12 @@ check_pgpsigs() {
> if grep -q "REVKEYSIG" "$statusfile"; then
> printf '%s (%s)' "$(gettext "FAILED")" "$(gettext "the key has been revoked.")" >&2
> errors=1
> - elif grep -q -e "TRUST_UNDEFINED" -e "TRUST_NEVER" "$statusfile"; then
> + elif (( ${#validpgpkeys[@]} == 0 )) && grep -q -e "TRUST_UNDEFINED" -e "TRUST_NEVER" "$statusfile"; then
> printf '%s (%s)' "$(gettext "FAILED")" "$(gettext "the key is not trusted")" >&2
> errors=1
> + elif (( ${#validpgpkeys[@]} > 0 )) && ! pubkey=$(is_valid_pgpkey "$statusfile"); then
> + printf "%s (%s $pubkey)" "$(gettext "FAILED")" "$(gettext "invalid key")"
> + errors=1
Is there a decent way to extract the real status from the file once and
then do string comparisons in bash, rather than forking to grep all the
time?
> else
> printf '%s' "$(gettext "Passed")" >&2
> if grep -q "EXPSIG" "$statusfile"; then
> @@ -2810,7 +2822,7 @@ fi
>
> unset pkgname pkgbase pkgver pkgrel epoch pkgdesc url license groups provides
> unset md5sums replaces depends conflicts backup source install changelog build
> -unset makedepends optdepends options noextract
> +unset makedepends optdepends options noextract validpgpkeys
>
> BUILDFILE=${BUILDFILE:-$BUILDSCRIPT}
> if [[ ! -f $BUILDFILE ]]; then
> --
> 1.9.0
>
>
More information about the pacman-dev
mailing list