diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2022-01-28 17:20:43 +0100 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2022-02-14 11:23:08 +0100 |
| commit | ca87601dd97dd9d356409827802eb0f8a3a535f0 (patch) | |
| tree | e3a6c9e4abb95e45c27aa80dcdc9d99a2f661a6e /tests/git-authenticate.scm | |
| parent | 87d49346f3072f7b4343b6fb387ee5f9311493b7 (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.scm | 44 |
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") |
