]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-key.in
all errors should be printed to stderr
[apt.git] / cmdline / apt-key.in
index 779872b4c3184f7defff598932ddaf2e278bf17b..e592925d657e5914d0c568cff612c6214accad9a 100644 (file)
@@ -5,26 +5,30 @@ unset GREP_OPTIONS
 
 GPG_CMD="gpg --ignore-time-conflict --no-options --no-default-keyring"
 
-# gpg needs a trustdb to function, but it can't be invalid (not even empty)
-# so we create a temporary directory to store our fresh readable trustdb in
-TRUSTDBDIR="$(mktemp -d)"
-CURRENTTRAP="${CURRENTTRAP} rm -rf '${TRUSTDBDIR}';"
+# gpg needs (in different versions more or less) files to function correctly,
+# so we give it its own homedir and generate some valid content for it
+GPGHOMEDIR="$(mktemp -d)"
+CURRENTTRAP="${CURRENTTRAP} rm -rf '${GPGHOMEDIR}';"
 trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
-chmod 700 "$TRUSTDBDIR"
-# We also don't use a secret keyring, of course, but gpg panics and
+chmod 700 "$GPGHOMEDIR"
+# We don't use a secret keyring, of course, but gpg panics and
 # implodes if there isn't one available - and writeable for imports
-SECRETKEYRING="${TRUSTDBDIR}/secring.gpg"
+SECRETKEYRING="${GPGHOMEDIR}/secring.gpg"
 touch $SECRETKEYRING
-GPG_CMD="$GPG_CMD --secret-keyring $SECRETKEYRING"
-GPG_CMD="$GPG_CMD --trustdb-name ${TRUSTDBDIR}/trustdb.gpg"
-
-# now create the trustdb with an (empty) dummy keyring
-$GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING
-# and make sure that gpg isn't trying to update the file
+GPG_CMD="$GPG_CMD --homedir $GPGHOMEDIR"
+# create the trustdb with an (empty) dummy keyring
+# older gpgs required it, newer gpgs even warn that it isn't needed,
+# but require it nonetheless for some commands, so we just play safe
+# here for the foreseeable future and create a dummy one
+$GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING >/dev/null 2>&1
+# tell gpg that it shouldn't try to maintain a trustdb file
 GPG_CMD="$GPG_CMD --no-auto-check-trustdb --trust-model always"
 
 GPG="$GPG_CMD"
 
+APT_DIR="/"
+eval $(apt-config shell APT_DIR Dir)
+
 MASTER_KEYRING='&keyring-master-filename;'
 eval $(apt-config shell MASTER_KEYRING APT::Key::MasterKeyring)
 ARCHIVE_KEYRING='&keyring-filename;'
@@ -33,11 +37,13 @@ REMOVED_KEYS='&keyring-removed-filename;'
 eval $(apt-config shell REMOVED_KEYS APT::Key::RemovedKeys)
 ARCHIVE_KEYRING_URI='&keyring-uri;'
 eval $(apt-config shell ARCHIVE_KEYRING_URI APT::Key::ArchiveKeyringURI)
-TMP_KEYRING=/var/lib/apt/keyrings/maybe-import-keyring.gpg
+TMP_KEYRING=${APT_DIR}/var/lib/apt/keyrings/maybe-import-keyring.gpg
+
+aptkey_echo() { echo "$@"; }
 
 requires_root() {
        if [ "$(id -u)" -ne 0 ]; then
-               echo >&1 "ERROR: This command can only be used by root."
+               echo >&2 "ERROR: This command can only be used by root."
                exit 1
        fi
 }
@@ -57,11 +63,11 @@ add_keys_with_verify_against_master_keyring() {
     MASTER=$2
 
     if [ ! -f "$ADD_KEYRING" ]; then
-       echo "ERROR: '$ADD_KEYRING' not found"
+       echo >&2 "ERROR: '$ADD_KEYRING' not found"
        return
-    fi 
+    fi
     if [ ! -f "$MASTER" ]; then
-       echo "ERROR: '$MASTER' not found"
+       echo >&2 "ERROR: '$MASTER' not found"
        return
     fi
 
@@ -107,7 +113,11 @@ add_keys_with_verify_against_master_keyring() {
 # (otherwise it does not make sense from a security POV)
 net_update() {
     # Disabled for now as code is insecure (LP: #1013639 (and 857472, 1013128))
-    exit 1
+    APT_KEY_NET_UPDATE_ENABLED=""
+    eval $(apt-config shell APT_KEY_NET_UPDATE_ENABLED APT::Key::Net-Update-Enabled)
+    if [ -z "$APT_KEY_NET_UPDATE_ENABLED" ]; then
+        exit 1
+    fi
 
     if [ -z "$ARCHIVE_KEYRING_URI" ]; then
        echo >&2 "ERROR: Your distribution is not supported in net-update as no uri for the archive-keyring is set"
@@ -120,21 +130,21 @@ net_update() {
        echo >&2 "ERROR: an installed wget is required for a network-based update"
        exit 1
     fi
-    if [ ! -d /var/lib/apt/keyrings ]; then
-       mkdir -p /var/lib/apt/keyrings
+    if [ ! -d ${APT_DIR}/var/lib/apt/keyrings ]; then
+       mkdir -p ${APT_DIR}/var/lib/apt/keyrings
     fi
-    keyring=/var/lib/apt/keyrings/$(basename $ARCHIVE_KEYRING)
+    keyring=${APT_DIR}/var/lib/apt/keyrings/$(basename $ARCHIVE_KEYRING_URI)
     old_mtime=0
     if [ -e $keyring ]; then
        old_mtime=$(stat -c %Y $keyring)
     fi
-    (cd  /var/lib/apt/keyrings; wget --timeout=90 -q -N $ARCHIVE_KEYRING_URI)
+    (cd  ${APT_DIR}/var/lib/apt/keyrings; wget --timeout=90 -q -N $ARCHIVE_KEYRING_URI)
     if [ ! -e $keyring ]; then
        return
     fi
     new_mtime=$(stat -c %Y $keyring)
     if [ $new_mtime -ne $old_mtime ]; then
-       echo "Checking for new archive signing keys now"
+       aptkey_echo "Checking for new archive signing keys now"
        add_keys_with_verify_against_master_keyring $keyring $MASTER_KEYRING
     fi
 }
@@ -165,7 +175,7 @@ update() {
            fi
        done
     else
-       echo "Warning: removed keys keyring  $REMOVED_KEYS missing or not readable" >&2
+       echo >&2 "Warning: removed keys keyring  $REMOVED_KEYS missing or not readable"
     fi
 }
 
@@ -179,7 +189,7 @@ remove_key_from_keyring() {
        echo >&2 "Key ${2} is in keyring ${1}, but can't be removed as it is read only."
        return
     fi
-    # check if it is the only key in the keyring and if so remove the keyring alltogether
+    # check if it is the only key in the keyring and if so remove the keyring altogether
     if [ '1' = "$($GPG --with-colons --list-keys | grep "^pub:[^:]*:[^:]*:[^:]*:[0-9A-F]\+:" | wc -l)" ]; then
        mv -f "$1" "${1}~" # behave like gpg
        return
@@ -190,7 +200,6 @@ remove_key_from_keyring() {
        REALTARGET="$(readlink -f "$1")"
        mv -f "$1" "${1}.dpkg-tmp"
        cp -a "$REALTARGET" "$1"
-       ls "$(dirname $1)"
     fi
     # delete the key from the keyring
     $GPG --batch --delete-key --yes "$2"
@@ -220,7 +229,7 @@ remove_key() {
            done
        fi
     fi
-    echo "OK"
+    aptkey_echo "OK"
 }
 
 
@@ -260,6 +269,10 @@ while [ -n "$1" ]; do
         requires_root() { true; }
         shift
         ;;
+      --quiet)
+        aptkey_echo() { true; }
+        shift
+        ;;
       --*)
         echo >&2 "Unknown option: $1"
         usage
@@ -309,7 +322,7 @@ case "$command" in
         requires_root
         init_keyring "$TRUSTEDFILE"
         $GPG --quiet --batch --import "$1"
-        echo "OK"
+        aptkey_echo "OK"
         ;;
     del|rm|remove)
         init_keyring "$TRUSTEDFILE"
@@ -341,7 +354,7 @@ case "$command" in
         ;;
     adv*)
         init_keyring "$TRUSTEDFILE"
-        echo "Executing: $GPG $*"
+        aptkey_echo "Executing: $GPG $*"
         $GPG $*
         ;;
     help)