From b68209b6d4dc0d245ac0fbb702a047287688f1ff Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Thu, 22 Dec 2016 12:39:28 -0500 Subject: [PATCH] daemon: start with one commit only when resolving versions During a deploy operation, we would fetch commit objects from the remote to resolve the version string. If gpg-verify was turned on, we would fail to pull them if some of the commits were not signed. This is because we pulled them in batches. We partially address this by only fetching the HEAD commit on the first pass. This allows `upgrade` operations to work just as well as `deploy` operations. Though there is still an issue if we have to traverse farther back than when signed commits become unsigned (unless they happen to fall on a batch boundary). We leave that unsolved for now, since that would likely require a more complex solution and it's not clear whether it's a real world issue (signers can just retroactively sign commits). Copy the gpghome from ostree so that we can test GPG-related cases in our suite. Closes: #527 Closes: #557 Approved by: cgwalters --- src/daemon/rpmostreed-utils.c | 14 +++++++++++--- tests/check/test-basic.sh | 28 ++++++++++++++++++++-------- tests/common/libtest.sh | 13 ++++++++++--- tests/compose | 2 ++ tests/gpghome/key1.asc | 30 ++++++++++++++++++++++++++++++ tests/gpghome/key2.asc | 30 ++++++++++++++++++++++++++++++ tests/gpghome/key3.asc | 30 ++++++++++++++++++++++++++++++ tests/gpghome/pubring.gpg | 1 + tests/gpghome/secring.gpg | Bin 0 -> 7480 bytes tests/gpghome/trustdb.gpg | Bin 0 -> 1440 bytes tests/gpghome/trusted/pubring.gpg | Bin 0 -> 3574 bytes 11 files changed, 134 insertions(+), 14 deletions(-) create mode 100644 tests/gpghome/key1.asc create mode 100644 tests/gpghome/key2.asc create mode 100644 tests/gpghome/key3.asc create mode 120000 tests/gpghome/pubring.gpg create mode 100644 tests/gpghome/secring.gpg create mode 100644 tests/gpghome/trustdb.gpg create mode 100644 tests/gpghome/trusted/pubring.gpg diff --git a/src/daemon/rpmostreed-utils.c b/src/daemon/rpmostreed-utils.c index 928f6f34..ecd26935 100644 --- a/src/daemon/rpmostreed-utils.c +++ b/src/daemon/rpmostreed-utils.c @@ -260,6 +260,10 @@ rpmostreed_repo_pull_ancestry (OstreeRepo *repo, int depth, ii; gboolean ret = FALSE; + /* Only fetch the HEAD on the first pass. See also: + * https://github.com/projectatomic/rpm-ostree/pull/557 */ + gboolean first_pass = TRUE; + g_return_val_if_fail (OSTREE_IS_REPO (repo), FALSE); g_return_val_if_fail (refspec != NULL, FALSE); @@ -288,7 +292,8 @@ rpmostreed_repo_pull_ancestry (OstreeRepo *repo, g_variant_new_strv ((const char * const *) refs_array, -1); g_variant_dict_init (&options, NULL); - g_variant_dict_insert (&options, "depth", "i", depth); + if (!first_pass) + g_variant_dict_insert (&options, "depth", "i", depth); g_variant_dict_insert (&options, "flags", "i", flags); g_variant_dict_insert_value (&options, "refs", refs_value); @@ -307,7 +312,7 @@ rpmostreed_repo_pull_ancestry (OstreeRepo *repo, if (visitor != NULL) { - for (ii = 0; ii < depth && checksum != NULL; ii++) + for (ii = 0; ii < (first_pass ? 1 : depth) && checksum != NULL; ii++) { g_autoptr(GVariant) commit = NULL; gboolean stop = FALSE; @@ -332,7 +337,10 @@ rpmostreed_repo_pull_ancestry (OstreeRepo *repo, /* Pull the next batch of commits, twice as many. */ refs_array[0] = checksum; - depth = depth * 2; + + if (!first_pass) + depth = depth * 2; + first_pass = FALSE; } ret = TRUE; diff --git a/tests/check/test-basic.sh b/tests/check/test-basic.sh index 2c6eebf2..1a6e9318 100755 --- a/tests/check/test-basic.sh +++ b/tests/check/test-basic.sh @@ -23,7 +23,7 @@ set -e ensure_dbus -echo "1..13" +echo "1..14" setup_os_repository "archive-z2" "syslinux" @@ -33,9 +33,12 @@ echo "ok setup" # --sysroot=sysroot to rpm-ostree commands as it will result # in a warning message. +OSTREE="ostree --repo=sysroot/ostree/repo" +REMOTE_OSTREE="ostree --repo=testos-repo --gpg-homedir=${test_tmpdir}/gpghome" + # This initial deployment gets kicked off with some kernel arguments -ostree --repo=sysroot/ostree/repo remote add --set=gpg-verify=false testos file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime -ostree --repo=sysroot/ostree/repo pull testos:testos/buildmaster/x86_64-runtime +$OSTREE remote add --set=gpg-verify=false testos file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime +$OSTREE pull testos:testos/buildmaster/x86_64-runtime ostree admin --sysroot=sysroot deploy --karg=root=LABEL=MOO --karg=quiet --os=testos testos:testos/buildmaster/x86_64-runtime rpm-ostree status | tee OUTPUT-status.txt @@ -53,7 +56,7 @@ fi os_repository_new_commit rpm-ostree upgrade --os=testos -ostree --repo=sysroot/ostree/repo remote add --set=gpg-verify=false otheros file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime +$OSTREE remote add --set=gpg-verify=false otheros file://$(pwd)/testos-repo testos/buildmaster/x86_64-runtime rpm-ostree rebase --os=testos otheros: rpm-ostree status | tee OUTPUT-status.txt @@ -77,7 +80,7 @@ assert_file_has_content OUTPUT-status.txt '1\.0\.9' echo "ok deploy older known version" # Remember the current revision for later. -revision=$(ostree rev-parse --repo=sysroot/ostree/repo otheros:testos/buildmaster/x86_64-runtime) +revision=$($OSTREE rev-parse otheros:testos/buildmaster/x86_64-runtime) # Jump forward to a locally known version. rpm-ostree deploy --os=testos 1.0.10 @@ -102,7 +105,7 @@ echo "ok deploy older version by revision" # Make a commit on a different branch and make sure that it doesn't let us # deploy it -other_rev=$(ostree --repo=${test_tmpdir}/testos-repo commit -b other-branch --tree=ref=$revision) +other_rev=$($REMOTE_OSTREE commit -b other-branch --tree=ref=$revision) if rpm-ostree deploy --os=testos REVISION=$other_rev 2>OUTPUT-err; then assert_not_reached "Deploying an out-of-branch commit unexpectedly succeeded." fi @@ -121,8 +124,8 @@ assert_file_has_content OUTPUT-status.txt $(date "+%Y%m%d\.2") echo "ok rebase onto other branch at specific version" branch=testos/buildmaster/x86_64-runtime -new_csum=$(ostree --repo=${test_tmpdir}/testos-repo commit -b $branch --tree=ref=$branch) -rpm-ostree rebase --os=testos otheros:testos/buildmaster/x86_64-runtime $new_csum +new_csum=$($REMOTE_OSTREE commit -b $branch --tree=ref=$branch) +rpm-ostree rebase --os=testos otheros:$branch $new_csum rpm-ostree status | head --lines 5 | tee OUTPUT-status.txt assert_file_has_content OUTPUT-status.txt otheros assert_file_has_content OUTPUT-status.txt $new_csum @@ -134,6 +137,15 @@ fi assert_file_has_content OUTPUT-err 'Checksum .* not found in .*' echo "ok error on rebasing onto commit on other branch" +# Make sure that we can deploy from a remote which has gone from unsigned to +# signed commits. +$REMOTE_OSTREE commit -b $branch --tree=ref=$branch \ + --gpg-sign=$TEST_GPG_KEYID --add-metadata-string version=gpg-signed +$OSTREE remote add secureos file://$(pwd)/testos-repo + +rpm-ostree rebase --os=testos secureos:$branch gpg-signed +echo "ok deploy from remote with unsigned and signed commits" + # Ensure it returns an error when passing a wrong option. rpm-ostree --help | awk '/^$/ {in_commands=0} {if(in_commands==1){print $0}} /^Builtin Commands:/ {in_commands=1}' > commands while read command; do diff --git a/tests/common/libtest.sh b/tests/common/libtest.sh index 04cd12e4..776fc400 100644 --- a/tests/common/libtest.sh +++ b/tests/common/libtest.sh @@ -28,7 +28,7 @@ LIBTEST_SH=1 self="$(realpath $0)" if test -z "${SRCDIR:-}"; then - SRCDIR=$(dirname $0) + SRCDIR=${topsrcdir}/tests fi _cleanup_tmpdir () { @@ -62,8 +62,15 @@ export G_DEBUG=fatal-warnings export OSTREE_SYSROOT_DEBUG=mutable-deployments export TEST_GPG_KEYID="472CDAFA" -export TEST_GPG_KEYHOME=${SRCDIR}/gpghome -export OSTREE_GPG_HOME=${TEST_GPG_KEYHOME}/trusted + +# GPG when creating signatures demands a writable +# homedir in order to create lockfiles. Work around +# this by copying locally. +echo "Copying gpghome to ${test_tmpdir}" +cp -a "${SRCDIR}/gpghome" ${test_tmpdir} +chmod -R u+w "${test_tmpdir}" +export TEST_GPG_KEYHOME=${test_tmpdir}/gpghome +export OSTREE_GPG_HOME=${test_tmpdir}/gpghome/trusted if test -n "${OT_TESTS_DEBUG:-}"; then set -x diff --git a/tests/compose b/tests/compose index 3524b00d..a81b25ac 100755 --- a/tests/compose +++ b/tests/compose @@ -3,6 +3,8 @@ set -euo pipefail dn=$(cd $(dirname $0) && pwd) +export topsrcdir=$(cd $dn/.. && pwd) + LOG=${LOG:-compose.log} date > ${LOG} diff --git a/tests/gpghome/key1.asc b/tests/gpghome/key1.asc new file mode 100644 index 00000000..17113b5d --- /dev/null +++ b/tests/gpghome/key1.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFIuhBYBCADTbnocQsJgMfOELkFt3wRrAZShijoBPYZT9BrIuIKZxAbaxZJr +Tbw8eIGgHZ51NCfdoikul0i82dt4hwtsACNVL5EGRmvTIKHPacb0yJMr1YBjcSwD +Slo+niLPb/oVtLTbDWFt/msYKREF/lGJT9dJyXkQ5UOwWdipDaHIlwb0IKUvL7cu +NpNthRFRm1M5d5M9OtqTCrCja6zckQ6OfvoStsbneHzfVWeH7vLcKBxxkfDhusVt +y1iVaDk1EYT8ZxsrAWw4S7nRK/bjr86IYpFPjG2aKMd9qxyIo7hcX4r8od24jzfM +v/ysOapnkTJuv8J6v7MakM1HkCz+TKF6gXxVABEBAAG0HU9zdHJlZSBUZXN0ZXIg +PHRlc3RAdGVzdC5jb20+iQE5BBMBAgAjBQJSLoQWAhsDBwsJCAcDAgEGFQgCCQoL +BBYCAwECHgECF4AACgkQf8oj2Ecs2vr/9wgAnme6WsWQy8CYeGH4q/5I6XFL6q1m +S0+qdeGnYRmR0jJAGJ84vqDhnKxjeQzp+8Nq81DHGEJBszCkMW2o22neFi2Mo95h +Dq3GWNZVldCDshjPs563AY6j7zACUN7Cy5XB3MK/vj5R/SrHBtJmSgPTx9WfmUgn +n5Udg+fzSsS8z8DUtJFtexgrSnEmwH+nOmIfrsjIYL5EPg+CTTalhygROrERjINr +pCYiShaFCKbuyt/XvyQ71y0JbB2yS7tDv0mL4SZjSuBQ1PkNE8ZQsymqBOJHA1Y3 +ppgPs1OenmtYgxaR8HQQv7uxHWZz0dmwQN93Qx8zMZwW40Odmdh1zLNQf7kBDQRS +LoQWAQgA9i9QWg28qmFrPIzn90ZlNlUtFzoZy/8/lIk34awge1uO5aHydYBzkuWU +jCDyBtQLWZQlwOKq8oHBbjENR2sfsmNkrYKcceQ02hSXqEJkc6jcDMCpB9eWy34K +sPZmdl76Eo/vIIgRqJ9JPeGoMPaIBg2ouEz6Ft6jcX3EriYIKebCEA9wPk29z40x +7D8mBZn06WrZ3JyePfbCdNJlQANEnrk7KDMNwPhhE1wcfPkiVtqBR0/FwIoUP0jn +PishIWOuFObYnXQQ2R8sxrw/V0hGqVTh+k+iNAjzEp4yPsAvB+LdMH9nCY5rU3Vo +1paEqVM1EHoBPu4NupRN0AjIJPr5UQARAQABiQEfBBgBAgAJBQJSLoQWAhsMAAoJ +EH/KI9hHLNr68i4IAMdc+EgAaPZFWZcXFGBfhnOKQFC/u/W6Cu1JjqIYkGO0HxSh +SfBkxArqlp37w4YVH4bUku6ja421bfGFNMtMfXjw2mU3HRdaDenP6OGv2jYmYmFt +6zi0JZZhvi8ZCcAQTStZ2Ms3hwstCMiBXPmYA7KW9Gzo4JQSKCW5haICGVSWl7kh +n0OkhOTVI9uzNr7+LhYn2ib/ynSaMKeI4hZ8v1HDuY0V1E63vFPGLFBTPaoRPpnm +9yBnXMWhrbV97L6eEoe7faurSyPcF11LEFC5x8oENnbH+wtAXOayQo3lld+JRa9C +JEZl8STdRU9o2NFwF8XM8BEOWntMS8aNpPoILC8= +=ZNNc +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/gpghome/key2.asc b/tests/gpghome/key2.asc new file mode 100644 index 00000000..3338329b --- /dev/null +++ b/tests/gpghome/key2.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFUIM4ABCADYBuvzGgzv5nMy2wICv79l+N4bN9/o9hTdFEOzyAeCEaF5Wugc +L9nfTgUS9NRHsSpGt9DeZVEzRm5XzccgHOPs7MlYH0Irhc4Hb9ycOO2vBZ7ZiBK/ +jbY+R5GN4Ut9XIRexbXWddOjJpRUTCWQeXw5iqV9Puqm1ge2Vcal+NZOi2AFRKKe +p/QI9EXIIx7ca6OWtH2SS/qE2p9obDYsMNrW+Dk623dbNKQiWaWyfRD+hB91UNbt +vK7agokTeU0hKr9C8dHrhepgl9B/Hz8SFibZQQiTxSiVH3fUu10eQsyuDC/01KHp +z0MR28Lc4VlCs6dsJBmGMBayHHVzbyXgw6uZABEBAAG0IU9zdHJlZSBUZXN0ZXIg +SUkgPHRlc3QyQHRlc3QuY29tPokBOAQTAQIAIgUCVQgzgAIbAwYLCQgHAwIGFQgC +CQoLBBYCAwECHgECF4AACgkQ2CKM/sqVDUFpJAgAirtYbbkvnlKtBxDsCu+A6qyl +7r+cW8IH5U1P4MqxqQwkAe1ZalfjuTSHVKYqt/K6gt0+4NvCee3A2JxXTvLq1hdR +DNMUFAjkbZv3Y6VS8Qtj3edsviNEB7s8uyWgR/EBB312YSZCwzk5uSLzM5E7AmvM +0/ZPIAAxjz8TpQKc8vJx1/4nqgt0Wjv5B74vuOQJT26zoFygCQM76YeN+ULzk/hN +hW7aNp/S2STasvEv7NgwqAe6eWy45xTrvxhEhQV760/toLbI0DuuBGr6Ue/G+Id4 +P/R604HAbMg3GdCztyoD3WTuvcsY6oXD7GlSEX4DZ0LA2TqQDZB+Pqe2yF7Gi7kB +DQRVCDOAAQgAsxH2E9JeQPbcdXGyxLCa4FyMeziCrxn7tOEsRkeqZmb76mAOn67Q +ZuZ6SXcAQDjKOBu7QNEcFQ+bAW/urohzD/sjr09vKqibLh6v8t81DE79GHI1UZ7F +SuYDLgcGUvOCJej8iftJcudWuzCW9SvoykNcgPcIOYEXbbJVRr2xvK4z2a34DyWL +jEXU2r6g1KNwtGyT6hZ7Ax99MKAzCFX3to0V51EXcrnUojwz/8i4Lal9t3d4P3lu +FZw3ITWh4e9zNxp8aSxsAN/vQ1EHccMPrNmO+d+yjhH7inTxf+vLErP3Cs5rPjxl +FgoLvBCSCT0jQ0xP+8Aa2TDyXDcMHg85QwARAQABiQEfBBgBAgAJBQJVCDOAAhsM +AAoJENgijP7KlQ1Bc68H/RBn5PpUe8CA1CJ8eN4LIfRee3DjacwvjGsdgiMzcLhb +Hp/ke42kentYjT+gF1ABPbeUERDlhnZ8BguKGZV+jOGDWRI2KFrQXL444aNznjn8 +aTOQY/d4LibwSaQ3qzf4Zp4CyZq2X2Vg3+B3HoUM6pkIL/r2ao5TnFqKubCE3sEo +St+LV4eHktoAS1GXmxYKo4Q67yMVekTZt7C/VQ2a20qfAXBn2U8UA3tUvNqKtyyJ +XrxeTJ+T4MMv60zdC/B/UPNjjHLNyB6culIzyiYFglGw3ctx2erJN2d+aQLrw78E +vIuMy+JcH6y3JlzVGdByWbC7628OcWWa+NL/CXnYMyQ= +=j9RC +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/gpghome/key3.asc b/tests/gpghome/key3.asc new file mode 100644 index 00000000..2ebdb6d3 --- /dev/null +++ b/tests/gpghome/key3.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFUIM6EBCACr57QUYEEuxvkX20yM1LVt2jyYZRKKQsqXx/xCF+Pg1MNz6mYx +Qz6R6+yZZmlADsfRdnEpRvl4Dq2g3cP0DqkjnIKwI7ffEsyXlves8OMlpwT2Vh4x +8Lx92eIEeqmb+PT8m88+x+EPVaR2R5KBHFkGXGyVgw+Ry8Oa9ZtJEKSkL/EQvzWv +5q+OR1Pm8rnIPe64XPh3yAx5SBJ2m7hykH/XMVrdGqaZvpuGBx77pmmqfMMjNWMC +U09hURyuyGWUsj9lFWYgpBvAzASmJNpAf7FZTjzCwLJwqpxCYm6a3sp76yyjuY7q +vgJOolRHp9F/XETsSLdy6966oBxclGNaD6gnABEBAAG0Ik9zdHJlZSBUZXN0ZXIg +SUlJIDx0ZXN0M0B0ZXN0LmNvbT6JATgEEwECACIFAlUIM6ECGwMGCwkIBwMCBhUI +AgkKCwQWAgMBAh4BAheAAAoJEA0V+uffRE1n0n4H/0Z8bC1cdr5cMFZ6YBaJlw4c +b61krhan2qCrwQupwaXi6LHt0zMwgljOcN+X2sAlZj9Jv0CabU5S1vM1fh9DZ6OY +2OQ/Pq2lXGk22JjrbPPq5o//xTzo92Uxptuxq6O4frVzuGCo1yPlrHJh+TxbXIc8 +XOz9C9KTfcb9OwidSSW5LlUBzQ2e3oQLSUQPsdB3TZP5zlqPIYerWn+LdETKcOTr +JyoaobFqX2BN223d3vkA1/GcuB17eBnzbnS0OWLJH+E3bsCqjtCJMEc1uTq97tyF +XStIk9i0gVbA+GiK/ZFMt+a5kagR5dOUwpNZ0BE+Kzf0CtkSaSWkAh1vQV/j2E65 +AQ0EVQgzoQEIAMeXa6sp5kdmJn/fVw0Pk5oluBXif7BiFt+T7K03RxCOKRpne6dI +SS98ruwZ1B5hn0lZO0UiL5RKpBQUrI9Y7251tz+oWohU2ZkUwwP3OcBlTXtErhe0 +LctcJ1nUA5NICVP5brhJR94durULiM+Rrhr12Ccs+a9bV268btNLN51z7ICMwNI6 +xuNxLt9orVJwP82a2eelQOgkPyFpiq7UxZ1erJg4aBVfWHP+rlxyQlzawVebbQMO +gwYW+gAawTxd2x7PV9CC3KsaM+HI6wBvDOtcWlbzo+TxzcVocd5oern4Mr5Y86Gt +lajuO9DVsuxxIfBrvHdRut613ShhOVlfy2MAEQEAAYkBHwQYAQIACQUCVQgzoQIb +DAAKCRANFfrn30RNZyPVB/9jNFOjcNCAZSrz9vylaO0xHsPhIn4osmkiU6BvodwO +n+qR4eEUw7BzoWC5QqGxUPYuDneQK7N7U31SFYjmY5Y1CDMsFtcYzjPgN5qWhtaN +iNTtE9pb5f97PyLSUwcdW1y/cfDfqoAY6rpRXieo7hJv1xBtlEzJIbSSTS1SUEd1 +4qwPCqNWMSM6qBcaFB5Yuw0Z/E6B1JfNTUw5J5jDxbGdOzkLx2mXCldte1axq9Lp +1V17jMTvn7Ml1QdoEAqzvt4VNQci/Su/qd3XjQ46b4dFFP03+jJv7mO6tHka2luZ +RX0zfsk5q8wqbtV2k0XZFRD+22ddKMf1j4wID157lNQs +=Dq+d +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/gpghome/pubring.gpg b/tests/gpghome/pubring.gpg new file mode 120000 index 00000000..3ada1d42 --- /dev/null +++ b/tests/gpghome/pubring.gpg @@ -0,0 +1 @@ +trusted/pubring.gpg \ No newline at end of file diff --git a/tests/gpghome/secring.gpg b/tests/gpghome/secring.gpg new file mode 100644 index 0000000000000000000000000000000000000000..ad88437ec50b7bfeed4a9d5484414d446905deb1 GIT binary patch literal 7480 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 YtnNd{Z!Pm&?`iO&Cu85bPnhNb0J{%BAOHXW literal 0 HcmV?d00001 diff --git a/tests/gpghome/trusted/pubring.gpg b/tests/gpghome/trusted/pubring.gpg new file mode 100644 index 0000000000000000000000000000000000000000..5461d9d4a39fda1da4cde504e6b43574d9fdafbb GIT binary patch literal 3574 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 literal 0 HcmV?d00001