diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2024-05-07 15:54:44 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2024-05-25 16:23:56 +0200 |
| commit | 73b3f941d7d911a1b2bb2bf77d37cb3a12ed4291 (patch) | |
| tree | e9bad56f9dd556a77c7fe52ade2a418b14d49716 | |
| parent | 0efa1daad354216e9ce2adb078eb4d5254792e49 (diff) | |
maint: Suggest ‘guix git authenticate’ for initial authentication.
The previous recommendation, running ‘make authenticate’, was insecure
because it led users to run code from the very repository they want to
authenticate:
https://lists.gnu.org/archive/html/guix-devel/2024-04/msg00252.html
* Makefile.am (commit_v1_0_0, channel_intro_commit)
(channel_intro_signer, GUIX_GIT_KEYRING, authenticate): Remove.
* Makefile.am (.git/hooks/%): New target, generalization of previous
‘.git/hooks/pre-push’ target.
(nodist_noinst_DATA): Add ‘.git/hooks/post-merge’.
* doc/contributing.texi (Building from Git): Suggest ‘guix git
authenticate’ instead of ‘make authenticate’.
* etc/git/post-merge: New file.
* etc/git/pre-push: Run ‘guix git authenticate’ instead of ‘make
authenticate’.
Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Reported-by: Skyler Ferris <skyvine@protonmail.com>
Change-Id: Ia415aa8375013d0dd095e891116f6ce841d93efd
| -rw-r--r-- | Makefile.am | 30 | ||||
| -rw-r--r-- | doc/contributing.texi | 30 | ||||
| -rwxr-xr-x | etc/git/post-merge | 3 | ||||
| -rwxr-xr-x | etc/git/pre-push | 4 |
4 files changed, 38 insertions, 29 deletions
diff --git a/Makefile.am b/Makefile.am index b4a06a52b8e..d0364e9dad8 100644 --- a/Makefile.am +++ b/Makefile.am | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | # GNU Guix --- Functional package management for GNU | 1 | # GNU Guix --- Functional package management for GNU |
| 2 | # Copyright © 2012-2023 Ludovic Courtès <ludo@gnu.org> | 2 | # Copyright © 2012-2024 Ludovic Courtès <ludo@gnu.org> |
| 3 | # Copyright © 2013 Andreas Enge <andreas@enge.fr> | 3 | # Copyright © 2013 Andreas Enge <andreas@enge.fr> |
| 4 | # Copyright © 2015, 2017 Alex Kost <alezost@gmail.com> | 4 | # Copyright © 2015, 2017 Alex Kost <alezost@gmail.com> |
| 5 | # Copyright © 2016, 2018 Mathieu Lirzin <mthl@gnu.org> | 5 | # Copyright © 2016, 2018 Mathieu Lirzin <mthl@gnu.org> |
| @@ -899,22 +899,6 @@ $(guix_install_go_files): install-nobase_dist_guilemoduleDATA | |||
| 899 | install-data-hook: | 899 | install-data-hook: |
| 900 | touch "$(DESTDIR)$(guileobjectdir)/guix/config.go" | 900 | touch "$(DESTDIR)$(guileobjectdir)/guix/config.go" |
| 901 | 901 | ||
| 902 | # Commit corresponding to the 'v1.0.0' tag. | ||
| 903 | commit_v1_0_0 = 6298c3ffd9654d3231a6f25390b056483e8f407c | ||
| 904 | |||
| 905 | # Introduction of the 'guix' channel. Keep in sync with (guix channels)! | ||
| 906 | channel_intro_commit = 9edb3f66fd807b096b48283debdcddccfea34bad | ||
| 907 | channel_intro_signer = BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA | ||
| 908 | |||
| 909 | # Authenticate the current Git checkout by checking signatures on every commit. | ||
| 910 | GUIX_GIT_KEYRING = origin/keyring | ||
| 911 | authenticate: | ||
| 912 | $(AM_V_at)echo "Authenticating Git checkout..." ; \ | ||
| 913 | guix git authenticate \ | ||
| 914 | --keyring=$(GUIX_GIT_KEYRING) \ | ||
| 915 | --cache-key=channels/guix --stats \ | ||
| 916 | "$(channel_intro_commit)" "$(channel_intro_signer)" | ||
| 917 | |||
| 918 | # Assuming Guix is already installed and the daemon is up and running, this | 902 | # Assuming Guix is already installed and the daemon is up and running, this |
| 919 | # rule builds from $(srcdir), creating and building derivations. | 903 | # rule builds from $(srcdir), creating and building derivations. |
| 920 | as-derivation: | 904 | as-derivation: |
| @@ -1231,13 +1215,13 @@ cuirass-jobs: $(GOBJECTS) | |||
| 1231 | .PHONY: gen-ChangeLog gen-AUTHORS gen-tarball-version | 1215 | .PHONY: gen-ChangeLog gen-AUTHORS gen-tarball-version |
| 1232 | .PHONY: assert-no-store-file-names assert-binaries-available | 1216 | .PHONY: assert-no-store-file-names assert-binaries-available |
| 1233 | .PHONY: assert-final-inputs-self-contained check-channel-news | 1217 | .PHONY: assert-final-inputs-self-contained check-channel-news |
| 1234 | .PHONY: clean-go make-go as-derivation authenticate | 1218 | .PHONY: clean-go make-go as-derivation |
| 1235 | .PHONY: update-guix-package update-NEWS cuirass-jobs release | 1219 | .PHONY: update-guix-package update-NEWS cuirass-jobs release |
| 1236 | 1220 | ||
| 1237 | # Git auto-configuration. | 1221 | # Git auto-configuration. |
| 1238 | .git/hooks/pre-push: etc/git/pre-push | 1222 | .git/hooks/%: etc/git/% |
| 1239 | $(AM_V_at)if test -d .git; then \ | 1223 | $(AM_V_at)if test -d .git; then \ |
| 1240 | cp etc/git/pre-push .git/hooks/pre-push; \ | 1224 | cp "$<" "$@"; \ |
| 1241 | fi | 1225 | fi |
| 1242 | 1226 | ||
| 1243 | .git/config: etc/git/gitconfig | 1227 | .git/config: etc/git/gitconfig |
| @@ -1260,7 +1244,11 @@ COMMIT_MSG_MAGIC = VGhpcyBpcyB0aGUgY29tbWl0LW1zZyBob29rIG9mIEd1aXg= | |||
| 1260 | # from a tarball. Do not add dependencies on these to *_DATA when building | 1244 | # from a tarball. Do not add dependencies on these to *_DATA when building |
| 1261 | # from a tarball, as that breaks the build. | 1245 | # from a tarball, as that breaks the build. |
| 1262 | if in_git_p | 1246 | if in_git_p |
| 1263 | nodist_noinst_DATA = .git/hooks/pre-push .git/config .git/hooks/commit-msg | 1247 | nodist_noinst_DATA = \ |
| 1248 | .git/hooks/pre-push \ | ||
| 1249 | .git/hooks/post-merge \ | ||
| 1250 | .git/config \ | ||
| 1251 | .git/hooks/commit-msg | ||
| 1264 | endif | 1252 | endif |
| 1265 | 1253 | ||
| 1266 | # Downloading up-to-date PO files. | 1254 | # Downloading up-to-date PO files. |
diff --git a/doc/contributing.texi b/doc/contributing.texi index ecff6300bf3..a0d6b5304ab 100644 --- a/doc/contributing.texi +++ b/doc/contributing.texi | |||
| @@ -276,25 +276,41 @@ From there on, you can authenticate all the commits included in your | |||
| 276 | checkout by running: | 276 | checkout by running: |
| 277 | 277 | ||
| 278 | @example | 278 | @example |
| 279 | make authenticate | 279 | guix git authenticate \ |
| 280 | 9edb3f66fd807b096b48283debdcddccfea34bad \ | ||
| 281 | "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA" | ||
| 280 | @end example | 282 | @end example |
| 281 | 283 | ||
| 282 | The first run takes a couple of minutes, but subsequent runs are faster. | 284 | The first run takes a couple of minutes, but subsequent runs are faster. |
| 285 | On subsequent runs, you can run the command without any arguments since | ||
| 286 | the @dfn{introduction} (the commit ID and OpenPGP fingerprints above) | ||
| 287 | will have been recorded@footnote{This requires a recent version of Guix, | ||
| 288 | from May 2024 or more recent.}: | ||
| 283 | 289 | ||
| 284 | Or, when your configuration for your local Git repository doesn't match | 290 | @example |
| 291 | guix git authenticate | ||
| 292 | @end example | ||
| 293 | |||
| 294 | When your configuration for your local Git repository doesn't match | ||
| 285 | the default one, you can provide the reference for the @code{keyring} | 295 | the default one, you can provide the reference for the @code{keyring} |
| 286 | branch through the variable @code{GUIX_GIT_KEYRING}. The following | 296 | branch @i{via} the @option{-k} option. The following |
| 287 | example assumes that you have a Git remote called @samp{myremote} | 297 | example assumes that you have a Git remote called @samp{myremote} |
| 288 | pointing to the official repository: | 298 | pointing to the official repository: |
| 289 | 299 | ||
| 290 | @example | 300 | @example |
| 291 | make authenticate GUIX_GIT_KEYRING=myremote/keyring | 301 | guix git authenticate \ |
| 302 | -k myremote/keyring \ | ||
| 303 | 9edb3f66fd807b096b48283debdcddccfea34bad \ | ||
| 304 | "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA" | ||
| 292 | @end example | 305 | @end example |
| 293 | 306 | ||
| 307 | @xref{Invoking guix git authenticate}, for more information on this | ||
| 308 | command. | ||
| 309 | |||
| 294 | @quotation Note | 310 | @quotation Note |
| 295 | You are advised to run @command{make authenticate} after every | 311 | By default, hooks are installed such that @command{guix git |
| 296 | @command{git pull} invocation. This ensures you keep receiving valid | 312 | authenticate} is invoked anytime you run @command{git pull} or |
| 297 | changes to the repository. | 313 | @command{git push}. |
| 298 | @end quotation | 314 | @end quotation |
| 299 | 315 | ||
| 300 | After updating the repository, @command{make} might fail with an error | 316 | After updating the repository, @command{make} might fail with an error |
diff --git a/etc/git/post-merge b/etc/git/post-merge new file mode 100755 index 00000000000..f2ad37d35c4 --- /dev/null +++ b/etc/git/post-merge | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Authenticate the repo upon 'git pull' and similar. | ||
| 3 | exec guix git authenticate | ||
diff --git a/etc/git/pre-push b/etc/git/pre-push index 59671b0d583..325b23854bb 100755 --- a/etc/git/pre-push +++ b/etc/git/pre-push | |||
| @@ -32,7 +32,9 @@ do | |||
| 32 | # Only use the hook when pushing to Savannah. | 32 | # Only use the hook when pushing to Savannah. |
| 33 | case "$2" in | 33 | case "$2" in |
| 34 | *.gnu.org*) | 34 | *.gnu.org*) |
| 35 | exec make authenticate check-channel-news | 35 | set -e |
| 36 | make check-channel-news | ||
| 37 | exec guix git authenticate | ||
| 36 | exit 127 | 38 | exit 127 |
| 37 | ;; | 39 | ;; |
| 38 | *) | 40 | *) |
