}
command_available() {
+ if [ -x "$1" ]; then return 0; fi
# command -v "$1" >/dev/null 2>&1 # not required by policy, see #747320
# which "$1" >/dev/null 2>&1 # is in debianutils (essential) but not on non-debian systems
local OLDIFS="$IFS"
}
update() {
+ if [ -z "$APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE" ]; then
+ echo >&2 "Warning: 'apt-key update' is deprecated and should not be used anymore!"
+ if [ -z "$ARCHIVE_KEYRING" ]; then
+ echo >&2 "Note: In your distribution this command is a no-op and can therefore be removed safely."
+ exit 0
+ fi
+ fi
if [ ! -f "$ARCHIVE_KEYRING" ]; then
echo >&2 "ERROR: Can't find the archive-keyring"
echo >&2 "Is the &keyring-package; package installed?"
local FINGERPRINTS="${GPGHOMEDIR}/keyringfile.keylst"
get_fingerprints_of_keyring "$KEYRINGFILE" > "$FINGERPRINTS"
- # strip leading 0x, if present:
- KEY="${KEY#0x}"
+ # strip leading 0x, if present:
+ KEY="$(echo "${KEY#0x}" | tr -d ' ')"
# check if the key is in this keyring
if ! grep -iq "^[0-9A-F]*${KEY}$" "$FINGERPRINTS"; then
local TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
eval "$(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d)"
if [ -d "$TRUSTEDPARTS" ]; then
- # strip / suffix as gpg will double-slash in that case (#665411)
- local STRIPPED_TRUSTEDPARTS="${TRUSTEDPARTS%/}"
- if [ "${STRIPPED_TRUSTEDPARTS}/" = "$TRUSTEDPARTS" ]; then
- TRUSTEDPARTS="$STRIPPED_TRUSTEDPARTS"
- fi
- for trusted in $(find "$TRUSTEDPARTS" -mindepth 1 -maxdepth 1 -regex '^.*\.gpg$' | sort); do
+ TRUSTEDPARTS="$(readlink -f "$TRUSTEDPARTS")"
+ local TRUSTEDPARTSLIST="$(cd /; find "$TRUSTEDPARTS" -mindepth 1 -maxdepth 1 -name '*.gpg')"
+ for trusted in $(echo "$TRUSTEDPARTSLIST" | sort); do
if [ -s "$trusted" ]; then
$ACTION "$trusted" "$@"
fi
# does the same as:
# foreach_keyring_do 'import_keys_from_keyring' "${GPGHOMEDIR}/pubring.gpg"
# but without using gpg, just cat and find
- local PUBRING="${GPGHOMEDIR}/pubring.gpg"
+ local PUBRING="$(readlink -f "${GPGHOMEDIR}/pubring.gpg")"
# if a --keyring was given, just use this one
if [ -n "$FORCED_KEYRING" ]; then
if [ -s "$FORCED_KEYRING" ]; then
local TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d)
if [ -d "$TRUSTEDPARTS" ]; then
- # ignore errors mostly for non-existing $TRUSTEDFILE
- {
- cat "$TRUSTEDFILE" || true
- for parts in $(find -L "$TRUSTEDPARTS" -type f -name '*.gpg'); do
- cat "$parts" || true
- done
- } > "$PUBRING" 2>/dev/null
+ rm -f "$PUBRING"
+ if [ -s "$TRUSTEDFILE" ]; then
+ cat "$TRUSTEDFILE" > "$PUBRING"
+ fi
+ TRUSTEDPARTS="$(readlink -f "$TRUSTEDPARTS")"
+ (cd /; find "$TRUSTEDPARTS" -mindepth 1 -maxdepth 1 -name '*.gpg' -exec cat {} + >> "$PUBRING";)
elif [ -s "$TRUSTEDFILE" ]; then
cp --dereference "$TRUSTEDFILE" "$PUBRING"
fi
fi
shift
+cleanup_gpg_home() {
+ if [ -z "$GPGHOMEDIR" ]; then return; fi
+ if command_available 'gpgconf'; then
+ GNUPGHOME="${GPGHOMEDIR}" gpgconf --kill gpg-agent >/dev/null 2>&1 || true
+ fi
+ rm -rf "$GPGHOMEDIR"
+}
+
create_gpg_home() {
# 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 later on
fi
fi
GPGHOMEDIR="$(mktemp -d)"
- CURRENTTRAP="${CURRENTTRAP} rm -rf '$(escape_shell "${GPGHOMEDIR}")';"
+ CURRENTTRAP="${CURRENTTRAP} cleanup_gpg_home;"
trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
+ if [ -z "$GPGHOMEDIR" ]; then
+ echo "ERROR: Could not create temporary gpg home directory in apt-key ($TMPDIR)"
+ exit 28
+ fi
chmod 700 "$GPGHOMEDIR"
}
# package depends on gnupg or not. We accept recommends here as
# well as the script hopefully uses apt-key optionally then like e.g.
# debian-archive-keyring for (upgrade) cleanup did
- if [ -n "$DPKG_MAINTSCRIPT_PACKAGE" ]; then
- if ! dpkg-query --show --showformat '${Pre-Depends}${Depends}${Recommends}' "$DPKG_MAINTSCRIPT_PACKAGE" 2>/dev/null | grep -q gnupg; then
+ if [ -n "$DPKG_MAINTSCRIPT_PACKAGE" ] && [ -z "$APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE" ]; then
+ if ! dpkg-query --show --showformat '${Pre-Depends}${Depends}${Recommends}\n' "$DPKG_MAINTSCRIPT_PACKAGE" 2>/dev/null | grep -q gnupg; then
cat >&2 <<EOF
Warning: The $DPKG_MAINTSCRIPT_NAME maintainerscript of the package $DPKG_MAINTSCRIPT_PACKAGE
Warning: seems to use apt-key (provided by apt) without depending on gnupg or gnupg2.
GPG_EXE="gpg"
elif command_available 'gpg2'; then
GPG_EXE="gpg2"
+ elif command_available 'gpg1'; then
+ GPG_EXE="gpg1"
else
- echo >&2 "Error: gnupg or gnupg2 do not seem to be installed,"
- echo >&2 "Error: but apt-key requires gnupg or gnupg2 for this operation."
+ echo >&2 "Error: gnupg, gnupg2 and gnupg1 do not seem to be installed,"
+ echo >&2 "Error: but apt-key requires gnupg, gnupg2 or gnupg1 for this operation."
echo >&2
exit 255
fi
fi
}
+warn_on_script_usage() {
+ if [ -n "$APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE" ]; then
+ return
+ fi
+ # (Maintainer) scripts should not be using apt-key
+ if [ -n "$DPKG_MAINTSCRIPT_PACKAGE" ]; then
+ echo >&2 "Warning: apt-key should not be used in scripts (called from $DPKG_MAINTSCRIPT_NAME maintainerscript of the package ${DPKG_MAINTSCRIPT_PACKAGE})"
+ elif [ ! -t 1 ]; then
+ echo >&2 "Warning: apt-key output should not be parsed (stdout is not a terminal)"
+ fi
+}
+
if [ "$command" != 'help' ] && [ "$command" != 'verify' ]; then
prepare_gpg_home
fi
case "$command" in
add)
+ warn_on_script_usage
requires_root
setup_merged_keyring
aptkey_execute "$GPG" --quiet --batch --import "$@"
aptkey_echo "OK"
;;
del|rm|remove)
+ # no script warning here as removing 'add' usage needs 'del' for cleanup
requires_root
foreach_keyring_do 'remove_key_from_keyring' "$@"
aptkey_echo "OK"
;;
update)
+ warn_on_script_usage
requires_root
setup_merged_keyring
update
net_update
merge_back_changes
;;
- list)
- foreach_keyring_do 'run_cmd_on_keyring' --list-keys "$@"
- ;;
- finger*)
+ list|finger*)
+ warn_on_script_usage
foreach_keyring_do 'run_cmd_on_keyring' --fingerprint "$@"
;;
export|exportall)
+ warn_on_script_usage
merge_all_trusted_keyrings_into_pubring
aptkey_execute "$GPG_SH" --keyring "${GPGHOMEDIR}/pubring.gpg" --armor --export "$@"
;;
adv*)
+ warn_on_script_usage
setup_merged_keyring
aptkey_echo "Executing: $GPG $*"
aptkey_execute "$GPG" "$@"
if [ -n "$GPGV" ] && command_available "$GPGV"; then true;
elif command_available 'gpgv'; then GPGV='gpgv';
elif command_available 'gpgv2'; then GPGV='gpgv2';
+ elif command_available 'gpgv1'; then GPGV='gpgv1';
else
- echo >&2 'ERROR: gpgv or gpgv2 required for verification'
+ echo >&2 'ERROR: gpgv, gpgv2 or gpgv1 required for verification'
exit 29
fi
# for a forced keyid we need gpg --export, so full wrapping required