|
456 | 456 | (setf (available-versions-url dist) |
457 | 457 | (make-versions-url (distinfo-subscription-url dist)))) |
458 | 458 |
|
459 | | -(defun fetch-signed-index-file (url target) |
460 | | - (let ((signature-url (format nil "~A.asc" url)) |
461 | | - (temp-file (temp-output-file "index.txt")) |
462 | | - (temp-signature-file (temp-output-file "signature.asc"))) |
463 | | - (unwind-protect |
464 | | - (progn |
465 | | - (fetch signature-url temp-signature-file) |
466 | | - (fetch url temp-file) |
467 | | - (let* ((signature (ql-openpgp:load-signature temp-signature-file)) |
468 | | - (id (ql-openpgp:key-id-string signature)) |
469 | | - (key (ql-openpgp:find-key id))) |
470 | | - (unless key |
471 | | - (error "No key available for id ~S" id)) |
472 | | - (let ((result (ql-openpgp:verify-signature temp-file signature key))) |
473 | | - (unless result |
474 | | - (error "Signature failed for index file ~A" |
475 | | - target)) |
476 | | - (format t "~&; Signature check result: ~A~%" result))) |
477 | | - (rename-file temp-file target) |
478 | | - (delete-file temp-signature-file)) |
479 | | - (delete-file-if-exists temp-file) |
480 | | - (delete-file-if-exists temp-signature-file)))) |
481 | | - |
482 | 459 | (defmethod ensure-system-index-file ((dist dist)) |
483 | 460 | (let ((pathname (relative-to dist "systems.txt"))) |
484 | 461 | (or (probe-file pathname) |
485 | | - (fetch-signed-index-file (system-index-url dist) pathname)))) |
| 462 | + (fetch-openpgp-checked (system-index-url dist) pathname)))) |
486 | 463 |
|
487 | 464 | (defmethod ensure-system-cdb-file ((dist dist)) |
488 | 465 | (let* ((system-file (ensure-system-index-file dist)) |
|
495 | 472 | (defmethod ensure-release-index-file ((dist dist)) |
496 | 473 | (let ((pathname (relative-to dist "releases.txt"))) |
497 | 474 | (or (probe-file pathname) |
498 | | - (fetch-signed-index-file (release-index-url dist) pathname)))) |
| 475 | + (fetch-openpgp-checked (release-index-url dist) pathname)))) |
499 | 476 |
|
500 | 477 | (defmethod ensure-release-cdb-file ((dist dist)) |
501 | 478 | (let* ((release-file (ensure-release-index-file dist)) |
@@ -752,6 +729,21 @@ the given NAME." |
752 | 729 | (file-namestring (invalid-local-archive-file condition)) |
753 | 730 | (name (invalid-local-archive-release condition)))))) |
754 | 731 |
|
| 732 | +(defmethod archive-digest ((release release)) |
| 733 | + (let* ((dist (dist release)) |
| 734 | + (index (relative-to dist "digests.txt")) |
| 735 | + (cdb (relative-to dist "digests.cdb")) |
| 736 | + (key (format nil "release/~A" (name release)))) |
| 737 | + (unless (probe-file index) |
| 738 | + (error "Digest index file is missing")) |
| 739 | + (unless (probe-file cdb) |
| 740 | + (ql-cdb:convert-index-file index :cdb-file cdb)) |
| 741 | + (let ((value (ql-cdb:lookup key cdb))) |
| 742 | + (destructuring-bind (k sha256) |
| 743 | + (split-spaces value) |
| 744 | + (declare (ignore k)) |
| 745 | + sha256)))) |
| 746 | + |
755 | 747 | (defmethod check-local-archive-file ((release release)) |
756 | 748 | (let ((file (local-archive-file release))) |
757 | 749 | (unless (probe-file file) |
@@ -787,7 +779,9 @@ the given NAME." |
787 | 779 | (or (probe-file pathname) |
788 | 780 | (progn |
789 | 781 | (ensure-directories-exist pathname) |
790 | | - (fetch (archive-url release) pathname))) |
| 782 | + (fetch-digest-checked (archive-url release) |
| 783 | + pathname |
| 784 | + (archive-digest release)))) |
791 | 785 | (restart-case |
792 | 786 | (check-local-archive-file release) |
793 | 787 | (delete-and-retry (&optional v) |
@@ -871,16 +865,6 @@ the given NAME." |
871 | 865 | (unless (ignorable line) |
872 | 866 | (funcall fun line)))))) |
873 | 867 |
|
874 | | - |
875 | | -(defmethod archive-digest ((release release)) |
876 | | - (let ((entry (cdb-lookup (dist release) (name release) |
877 | | - "archive-digests.cdb"))) |
878 | | - (unless entry |
879 | | - (error "No digest indexed for ~S. That's pretty weird!" release)) |
880 | | - (let ((digest-position (position #\Space entry))) |
881 | | - (subseq entry (1+ digest-position))))) |
882 | | - |
883 | | - |
884 | 868 | (defmethod slot-unbound (class (dist dist) (slot (eql 'release-index))) |
885 | 869 | (declare (ignore class)) |
886 | 870 | (setf (slot-value dist 'release-index) |
@@ -1177,23 +1161,23 @@ FUN." |
1177 | 1161 | ;;; |
1178 | 1162 |
|
1179 | 1163 | (defmethod available-versions ((dist dist)) |
1180 | | - (let ((temp (qmerge "tmp/dist-versions.txt")) |
1181 | | - (versions '()) |
1182 | | - (url (available-versions-url dist))) |
1183 | | - (when url |
1184 | | - (ensure-directories-exist temp) |
1185 | | - (delete-file-if-exists temp) |
1186 | | - (handler-case |
1187 | | - (fetch url temp) |
1188 | | - (unexpected-http-status () |
1189 | | - (return-from available-versions nil))) |
1190 | | - (with-open-file (stream temp) |
1191 | | - (loop for line = (read-line stream nil) |
1192 | | - while line do |
1193 | | - (destructuring-bind (version url) |
1194 | | - (split-spaces line) |
1195 | | - (setf versions (acons version url versions))))) |
1196 | | - versions))) |
| 1164 | + (with-temp-output-file (temp "dist-versions.txt") |
| 1165 | + (let ((versions '()) |
| 1166 | + (url (available-versions-url dist))) |
| 1167 | + (when url |
| 1168 | + (ensure-directories-exist temp) |
| 1169 | + (delete-file-if-exists temp) |
| 1170 | + (handler-case |
| 1171 | + (fetch-openpgp-checked url temp) |
| 1172 | + (unexpected-http-status () |
| 1173 | + (return-from available-versions nil))) |
| 1174 | + (with-open-file (stream temp) |
| 1175 | + (loop for line = (read-line stream nil) |
| 1176 | + while line do |
| 1177 | + (destructuring-bind (version url) |
| 1178 | + (split-spaces line) |
| 1179 | + (setf versions (acons version url versions))))) |
| 1180 | + versions)))) |
1197 | 1181 |
|
1198 | 1182 |
|
1199 | 1183 | ;;; |
|
0 commit comments