summaryrefslogtreecommitdiff
path: root/tests/git-authenticate.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2022-01-28 17:20:43 +0100
committerLudovic Courtès <ludo@gnu.org>2022-02-14 11:23:08 +0100
commitca87601dd97dd9d356409827802eb0f8a3a535f0 (patch)
treee3a6c9e4abb95e45c27aa80dcdc9d99a2f661a6e /tests/git-authenticate.scm
parent87d49346f3072f7b4343b6fb387ee5f9311493b7 (diff)
git-authenticate: Ensure the target is a descendant of the introductory commit.
Fixes a bug whereby authentication of a commit *not* descending from the introductory commit could succeed, provided the commit verifies the authorization invariant. In the example below, A is a common ancestor of the introductory commit I and of commit X. Authentication of X would succeed, even though it is not a descendant of I, as long as X is authorized according to the '.guix-authorizations' in A: X I \ / A This is because, 'authenticate-repository' would not check whether X descends from I, and the call (commit-difference X I) would return X. In practice that only affects forks because it means that ancestors of the introductory commit already contain a '.guix-authorizations' file. * guix/git-authenticate.scm (authenticate-repository): Add call to 'commit-descendant?'. * tests/channels.scm ("authenticate-channel, not a descendant of introductory commit"): New test. * tests/git-authenticate.scm ("authenticate-repository, target not a descendant of intro"): New test. * tests/guix-git-authenticate.sh: Expect earlier test to fail since 9549f0283a78fe36f2d4ff2a04ef8ad6b0c02604 is not a descendant of $intro_commit. Add new test targeting an ancestor of the introductory commit, and another test targeting the v1.2.0 commit. * doc/guix.texi (Specifying Channel Authorizations): Add a sentence.
Diffstat (limited to 'tests/git-authenticate.scm')
-rw-r--r--tests/git-authenticate.scm44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/git-authenticate.scm b/tests/git-authenticate.scm
index 6ec55fb2e59..c063920c123 100644
--- a/tests/git-authenticate.scm
+++ b/tests/git-authenticate.scm
@@ -431,4 +431,48 @@
431 #:keyring-reference "master" 431 #:keyring-reference "master"
432 #:cache-key (random-text))))))))) 432 #:cache-key (random-text)))))))))
433 433
434(unless (gpg+git-available?) (test-skip 1))
435(test-equal "authenticate-repository, target not a descendant of intro"
436 'target-commit-not-a-descendant-of-intro
437 (with-fresh-gnupg-setup (list %ed25519-public-key-file
438 %ed25519-secret-key-file)
439 (let ((fingerprint (key-fingerprint %ed25519-public-key-file)))
440 (with-temporary-git-repository directory
441 `((add "signer.key" ,(call-with-input-file %ed25519-public-key-file
442 get-string-all))
443 (add ".guix-authorizations"
444 ,(object->string
445 `(authorizations (version 0)
446 ((,(key-fingerprint
447 %ed25519-public-key-file)
448 (name "Charlie"))))))
449 (commit "zeroth commit" (signer ,fingerprint))
450 (branch "pre-intro-branch")
451 (checkout "pre-intro-branch")
452 (add "b.txt" "B")
453 (commit "alternate commit" (signer ,fingerprint))
454 (checkout "master")
455 (add "a.txt" "A")
456 (commit "first commit" (signer ,fingerprint))
457 (add "c.txt" "C")
458 (commit "second commit" (signer ,fingerprint)))
459 (with-repository directory repository
460 (let ((commit1 (find-commit repository "first"))
461 (commit-alt
462 (commit-lookup repository
463 (reference-target
464 (branch-lookup repository
465 "pre-intro-branch")))))
466 (guard (c ((formatted-message? c)
467 (and (equal? (formatted-message-arguments c)
468 (list (oid->string (commit-id commit-alt))
469 (oid->string (commit-id commit1))))
470 'target-commit-not-a-descendant-of-intro)))
471 (authenticate-repository repository
472 (commit-id commit1)
473 (openpgp-fingerprint fingerprint)
474 #:end (commit-id commit-alt)
475 #:keyring-reference "master"
476 #:cache-key (random-text)))))))))
477
434(test-end "git-authenticate") 478(test-end "git-authenticate")