X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/c5fced388848b967f0ce076656cad5366517f981..742f67eaede80d2f9b3631d8697ebd63b8f95427:/test/integration/test-apt-update-rollback diff --git a/test/integration/test-apt-update-rollback b/test/integration/test-apt-update-rollback index c16e4f480..dc95627d7 100755 --- a/test/integration/test-apt-update-rollback +++ b/test/integration/test-apt-update-rollback @@ -19,167 +19,170 @@ create_fresh_archive() insertpackage 'unstable' 'old' 'all' '1.0' - setupaptarchive + setupaptarchive --no-update } add_new_package() { - insertpackage "unstable" "new" "all" "1.0" - insertsource "unstable" "new" "all" "1.0" - - setupaptarchive --no-update + insertpackage 'unstable' 'new' 'all' '1.0' + insertsource 'unstable' 'new' 'all' '1.0' - avoid_ims_hit + setupaptarchive --no-update "$@" } break_repository_sources_index() { - printf "xxx" > $APTARCHIVE/dists/unstable/main/source/Sources - gzip -c $APTARCHIVE/dists/unstable/main/source/Sources > \ - $APTARCHIVE/dists/unstable/main/source/Sources.gz - avoid_ims_hit + printf 'xxx' > "$APTARCHIVE/dists/unstable/main/source/Sources" + compressfile "$APTARCHIVE/dists/unstable/main/source/Sources" "$@" } -test_inrelease_to_new_inrelease() { - msgmsg "Test InRelease to new InRelease works fine" +start_with_good_inrelease() { create_fresh_archive - testequal "old/unstable 1.0 all" apt list -q - - add_new_package testsuccess aptget update + listcurrentlistsdirectory > lists.before + testsuccessequal 'old/unstable 1.0 all' apt list -qq +} - testequal "new/unstable 1.0 all -old/unstable 1.0 all" apt list -q +test_inrelease_to_new_inrelease() { + msgmsg 'Test InRelease to new InRelease works fine' + start_with_good_inrelease + + add_new_package '+1hour' + testsuccess aptget update -o Debug::Acquire::Transaction=1 + testsuccessequal 'new/unstable 1.0 all +old/unstable 1.0 all' apt list -qq } test_inrelease_to_broken_hash_reverts_all() { - msgmsg "Test InRelease to broken InRelease reverts everything" - create_fresh_archive - add_new_package + msgmsg 'Test InRelease to broken InRelease reverts everything' + start_with_good_inrelease + + add_new_package '+1hour' # break the Sources file - break_repository_sources_index + break_repository_sources_index '+1hour' # test the error condition - testequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease - -W: Failed to fetch copy:${APTARCHIVE}/dists/unstable/main/source/Sources Hash Sum mismatch - -W: Failed to fetch copy:${APTARCHIVE}/dists/unstable/main/binary-i386/Packages - + testfailureequal "E: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources.gz Hash Sum mismatch E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq # ensure that the Packages file is also rolled back - testequal "E: Unable to locate package new" aptget install new -s -qq + testfileequal lists.before "$(listcurrentlistsdirectory)" + testfailureequal "E: Unable to locate package new" aptget install new -s -qq } -test_inreleae_to_valid_release() { - msgmsg "Test InRelease to valid Release" - create_fresh_archive - add_new_package - # switch to a unsinged repo now - rm $APTARCHIVE/dists/unstable/InRelease - rm $APTARCHIVE/dists/unstable/Release.gpg - avoid_ims_hit +test_inrelease_to_valid_release() { + msgmsg 'Test InRelease to valid Release' + start_with_good_inrelease - # update works - testsuccess aptget update -o Debug::Acquire::Transaction=1 + add_new_package '+1hour' + # switch to a unsigned repo now + rm "$APTARCHIVE/dists/unstable/InRelease" + rm "$APTARCHIVE/dists/unstable/Release.gpg" - # test that we can install the new packages but do no longer have a sig + # update fails + testfailureequal "E: The repository 'file:${APTARCHIVE} unstable Release' is no longer signed." aptget update -qq + + # test that security downgrade was not successful + testfileequal lists.before "$(listcurrentlistsdirectory)" testsuccess aptget install old -s - testsuccess aptget install new -s - testfailure ls $ROOTDIR/var/lib/apt/lists/*_InRelease - testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release.gpg - testsuccess ls $ROOTDIR/var/lib/apt/lists/*_Release + testfailure aptget install new -s + testnotempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_InRelease' + testempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_Release' } -test_inreleae_to_release_reverts_all() { - msgmsg "Test InRelease to broken Release reverts everything" - create_fresh_archive +test_inrelease_to_release_reverts_all() { + msgmsg 'Test InRelease to broken Release reverts everything' + start_with_good_inrelease + + # switch to a unsigned repo now + add_new_package '+1hour' + rm "$APTARCHIVE/dists/unstable/InRelease" + rm "$APTARCHIVE/dists/unstable/Release.gpg" - # switch to a unsinged repo now - add_new_package - rm $APTARCHIVE/dists/unstable/InRelease - rm $APTARCHIVE/dists/unstable/Release.gpg # break it - break_repository_sources_index + break_repository_sources_index '+1hour' # ensure error - testequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease - -W: Failed to fetch file:$APTARCHIVE/dists/unstable/Release - -W: Failed to fetch file:$APTARCHIVE/dists/unstable/Release.gpg - -W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/source/Sources Hash Sum mismatch - -W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/binary-i386/Packages - -E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq # -o Debug::acquire::transaction=1 + testfailureequal "E: The repository 'file:${APTARCHIVE} unstable Release' is no longer signed." aptget update -qq # -o Debug::acquire::transaction=1 # ensure that the Packages file is also rolled back + testfileequal lists.before "$(listcurrentlistsdirectory)" testsuccess aptget install old -s testfailure aptget install new -s - testsuccess ls $ROOTDIR/var/lib/apt/lists/*_InRelease - testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release + testnotempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_InRelease' + testempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_Release' } test_unauthenticated_to_invalid_inrelease() { - msgmsg "Test UnAuthenticated to invalid InRelease reverts everything" + msgmsg 'Test UnAuthenticated to invalid InRelease reverts everything' create_fresh_archive - rm $APTARCHIVE/dists/unstable/InRelease - rm $APTARCHIVE/dists/unstable/Release.gpg - avoid_ims_hit - - testsuccess aptget update -qq - testequal "WARNING: The following packages cannot be authenticated! - old -E: There are problems and -y was used without --force-yes" aptget install -qq -y old - - # go to authenticated but not correct - add_new_package - break_repository_sources_index + rm "$APTARCHIVE/dists/unstable/InRelease" + rm "$APTARCHIVE/dists/unstable/Release.gpg" - testequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease - -W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/source/Sources Hash Sum mismatch + testwarning aptget update --allow-insecure-repositories + listcurrentlistsdirectory > lists.before + testfailureequal "WARNING: The following packages cannot be authenticated! + old +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y old -W: Failed to fetch copy:$APTARCHIVE/dists/unstable/main/binary-i386/Packages + # go to authenticated but not correct + add_new_package '+1hour' + break_repository_sources_index '+1hour' + testfailureequal "E: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources.gz Hash Sum mismatch E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq - testfailure ls rootdir/var/lib/apt/lists/*_InRelease - testequal "WARNING: The following packages cannot be authenticated! + testfileequal lists.before "$(listcurrentlistsdirectory)" + testempty find "${ROOTDIR}/var/lib/apt/lists" -maxdepth 1 -name '*_InRelease' + testfailureequal "WARNING: The following packages cannot be authenticated! old -E: There are problems and -y was used without --force-yes" aptget install -qq -y old +E: There were unauthenticated packages and -y was used without --allow-unauthenticated" aptget install -qq -y old } test_inrelease_to_unauth_inrelease() { - msgmsg "Test InRelease to InRelease without sig" - create_fresh_archive + msgmsg 'Test InRelease to InRelease without good sig' + start_with_good_inrelease + signreleasefiles 'Marvin Paranoid' - avoid_ims_hit - - testsuccess aptget update -qq - testequal "WARNING: The following packages cannot be authenticated! - old -E: There are problems and -y was used without --force-yes" aptget install -qq -y old + testwarningequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file:${APTARCHIVE} unstable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2 +W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2 +W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq + + testfileequal lists.before "$(listcurrentlistsdirectory)" + testnotempty find "${ROOTDIR}/var/lib/apt/lists" -name '*_InRelease' +} + +test_inrelease_to_broken_gzip() { + msgmsg "Test InRelease to broken gzip" + start_with_good_inrelease + + break_repository_sources_index '+1hour' + generatereleasefiles '+2hours' + signreleasefiles - testfailure ls rootdir/var/lib/apt/lists/*_InRelease - testsuccess ls rootdir/var/lib/apt/lists/*_Release + # append junk at the end of the compressed file + echo "lala" >> "$APTARCHIVE/dists/unstable/main/source/Sources.gz" + touch -d '+2min' "$APTARCHIVE/dists/unstable/main/source/Sources.gz" + # remove uncompressed file to avoid fallback + rm "$APTARCHIVE/dists/unstable/main/source/Sources" + + testfailure aptget update + testsuccess grep 'Hash Sum mismatch' rootdir/tmp/testfailure.output + testfileequal lists.before "$(listcurrentlistsdirectory)" } -TESTDIR=$(readlink -f $(dirname $0)) -. $TESTDIR/framework +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" setupenvironment configarchitecture "i386" # setup the archive and ensure we have a single package that installs fine setupaptarchive -APTARCHIVE=$(readlink -f ./aptarchive) -ROOTDIR=${TMPWORKINGDIRECTORY}/rootdir -APTARCHIVE_LISTS="$(echo $APTARCHIVE | tr "/" "_" )" +APTARCHIVE="$(readlink -f ./aptarchive)" +ROOTDIR="${TMPWORKINGDIRECTORY}/rootdir" +APTARCHIVE_LISTS="$(echo "$APTARCHIVE" | tr "/" "_" )" # test the following cases: -# - InRelease -> broken InRelease revert to previous state +# - InRelease -> broken InRelease revert to previous state # - empty lists dir and broken remote leaves nothing on the system # - InRelease -> hashsum mismatch for one file reverts all files to previous state # - Release/Release.gpg -> hashsum mismatch @@ -188,12 +191,14 @@ APTARCHIVE_LISTS="$(echo $APTARCHIVE | tr "/" "_" )" # going from Release/Release.gpg -> InRelease and vice versa # - unauthenticated -> invalid InRelease +# stuff to do: +# - ims-hit +# - gzip-index tests + test_inrelease_to_new_inrelease test_inrelease_to_broken_hash_reverts_all - -test_inreleae_to_valid_release -test_inreleae_to_release_reverts_all - +test_inrelease_to_valid_release +test_inrelease_to_release_reverts_all test_unauthenticated_to_invalid_inrelease - test_inrelease_to_unauth_inrelease +test_inrelease_to_broken_gzip