[pacman-dev] [PATCH 1/2] Add support for verifying pgp signatures to makepkg

Wieland Hoffmann themineo at googlemail.com
Thu Jun 23 03:36:56 EDT 2011


---
 scripts/makepkg.sh.in |   52 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 78cd4cf..cc4f152 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -516,7 +516,7 @@ download_sources() {
 	pushd "$SRCDEST" &>/dev/null
 
 	local netfile
-	for netfile in "${source[@]}"; do
+	for netfile in "${source[@]}" "${pgpsigs[@]}"; do
 		local file=$(get_filepath "$netfile" || true)
 		if [[ -n "$file" ]]; then
 			msg2 "$(gettext "Found %s")" "${file##*/}"
@@ -680,6 +680,49 @@ check_checksums() {
 	fi
 }
 
+check_pgpsigs() {
+	(( ! ${#source[@]} )) && return 0
+	(( ! ${#pgpsigs[@]})) && return 0
+
+	if ! type -p gpg >/dev/null; then
+		error "$(gettext "Cannot find the gpg binary! Is gnupg installed?")"
+		exit 1 # $E_MISSING_PROGRAM
+	fi
+
+	msg "$(gettext "Validating source files with gpg...")"
+
+	local file
+	local errors=0
+
+	for file in "${pgpsigs[@]}"; do
+		local valid
+		local found=1
+
+		file="$(get_filename "$file")"
+		echo -n "    ${file%.sig} ... " >&2
+
+		if ! file="$(get_filepath "$file")"; then
+			echo "$(gettext "NOT FOUND")" >&2
+			errors=1
+			found=0
+		fi
+
+		if (( found )); then
+			if ! gpg --quiet --batch --verify "$file" 2> /dev/null; then
+				echo "$(gettext "Verification failed")" >&2
+				errors=1
+			else
+				echo $(gettext "Verified") >&2
+			fi
+		fi
+	done
+
+	if (( errors )); then
+		error "$(gettext "One or more pgp signatures could not be verified!")"
+		exit 1
+	fi
+}
+
 extract_sources() {
 	msg "$(gettext "Extracting Sources...")"
 	local netfile
@@ -1614,6 +1657,7 @@ usage() {
 	echo "$(gettext "  --key <key>      Specify a key to use for gpg signing instead of the default")"
 	printf "$(gettext "  --nocheck        Do not run the check() function in the %s")\n" "$BUILDSCRIPT"
 	echo "$(gettext "  --nosign         Do not create a signature for the package")"
+	echo "$(gettext "  --pgp            Enable verification of source files with pgp signatures")"
 	echo "$(gettext "  --pkg <list>     Only build listed packages from a split package")"
 	echo "$(gettext "  --sign           Sign the resulting package with gpg")"
 	echo "$(gettext "  --skipinteg      Do not fail when integrity checks are missing")"
@@ -1651,7 +1695,7 @@ ARGLIST=("$@")
 # Parse Command Line Options.
 OPT_SHORT="AcCdefFghiLmop:rRsV"
 OPT_LONG="allsource,asroot,ignorearch,check,clean,cleancache,nodeps"
-OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver"
+OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver,pgp"
 OPT_LONG+=",install,key:,log,nocolor,nobuild,nocheck,nosign,pkg:,rmdeps"
 OPT_LONG+=",repackage,skipinteg,sign,source,syncdeps,version,config:"
 # Pacman Options
@@ -1694,6 +1738,7 @@ while true; do
 		--nosign)         SIGNPKG='n' ;;
 		-o|--nobuild)     NOBUILD=1 ;;
 		-p)               shift; BUILDFILE=$1 ;;
+		--pgp)            PGPSIGS=1;;
 		--pkg)            shift; PKGLIST=($1) ;;
 		-r|--rmdeps)      RMDEPS=1 ;;
 		-R|--repackage)   REPKG=1 ;;
@@ -2129,6 +2174,9 @@ else
 	download_sources
 	if (( ! SKIPINTEG )); then
 		check_checksums
+		if (( PGPSIGS )); then
+			check_pgpsigs
+		fi
 	else
 		warning "$(gettext "Skipping integrity checks.")"
 	fi
-- 
1.7.5.4



More information about the pacman-dev mailing list