[lispy-cvs] CVS lispy

mkennedy mkennedy at common-lisp.net
Wed Apr 2 05:25:39 UTC 2008


Update of /p/lispy/cvsroot/lispy
In directory clnet:/tmp/cvs-serv12527

Modified Files:
	lispy.asd lispy.lisp utils.lisp 
Log Message:
Automatic GPG signature verification.


--- /p/lispy/cvsroot/lispy/lispy.asd	2008/02/04 14:42:42	1.6
+++ /p/lispy/cvsroot/lispy/lispy.asd	2008/04/02 05:25:39	1.7
@@ -18,7 +18,8 @@
                #:archive
                #:ironclad
                #:cl-fad
- 	       #:log5))
+ 	       #:log5
+	       #:trivial-shell))
 
 (defmethod perform :after ((o load-op) (c (eql (find-system 'lispy))))
   (let ((lispy-config (merge-pathnames #p".lispy.lisp"(user-homedir-pathname))))
--- /p/lispy/cvsroot/lispy/lispy.lisp	2008/02/04 15:15:08	1.13
+++ /p/lispy/cvsroot/lispy/lispy.lisp	2008/04/02 05:25:39	1.14
@@ -91,25 +91,49 @@
   "Returns the instance of MODULE described by NAME."
   (gethash name *lispy-map*))
 
-(defun read-map (map-url)
-  "Read the map at MAP-URL and merge the modules into *LISPY-MAP*."
-  (log5:log-for map "Reading ~A" (uri-to-string map-url))
-  (multiple-value-bind (stream status-code headers uri http-stream must-close)
-      (drakma:http-request map-url :want-stream t)
-    (declare (ignore status-code headers uri http-stream must-close))
-    (unwind-protect
-         (dolist (module (mapcar #'(lambda (m)
-                                     (parse-module m map-url))
-                                 (read-stream stream)))
-           (setf (gethash (name module) *lispy-map*)
-                 module))
-      (close stream))))
+(defun read-map (map-url map-pathname)
+  "Read the map at MAP-PATHNAME and merge the modules into *LISPY-MAP*."
+  (log5:log-for map "Reading ~A" map-pathname)
+  (with-open-file (stream map-pathname :direction :input)
+    (dolist (module (mapcar #'(lambda (m)
+				(parse-module m map-url))
+			    (read-stream stream)))
+      (setf (gethash (name module) *lispy-map*)
+	    module))))
+
+(defun download-map (map-url)
+  (log5:log-for map "Fetching ~A" (uri-to-string map-url))
+  (let* ((map-name (car (last (puri:uri-parsed-path map-url))))
+	 (map-pathname (merge-pathnames map-name
+					(merge-pathnames #p"maps/" *lispy-pathname*))))
+    (download-file map-url map-pathname)
+    map-pathname))
+
+(defun download-map-signature (map-url)
+  (let* ((map-signature-name (format nil "~A.asc" (car (last (puri:uri-parsed-path map-url)))))
+	 (map-signature-url (puri:merge-uris (puri:parse-uri map-signature-name) map-url))
+	 (map-signature-pathname (merge-pathnames map-signature-name
+						  (merge-pathnames #p"maps/" *lispy-pathname*))))
+    (log5:log-for map "Fetching ~A" (uri-to-string map-signature-url))
+    (download-file map-signature-url map-signature-pathname)
+    map-signature-pathname))
 
 (defun read-maps (&optional (map-urls *lispy-map-urls*))
   "Read all maps in the list MAP-URLS, merging each map into *LISPY-MAPS*.
 Returns the mutated *LISPY-MAPS*."
   (dolist (map-url map-urls)
-    (read-map map-url))
+    (let ((map (download-map map-url))
+	  (map-signature (download-map-signature map-url)))
+      (multiple-value-bind (success message)
+	  (verify-signature map map-signature)
+	(dolist (line (split-sequence:split-sequence #\Newline message :remove-empty-subseqs t))
+	  (log5:log-for map line))
+	(unless success
+	  (error "GPG verification of map ~A with signature ~A failed: ~A"
+		 map
+		 map-signature
+		 message)))
+      (read-map map-url map)))
   (log5:log-for map "Maps contain contains ~A entr~:@p" (hash-table-count *lispy-map*))
   *lispy-map*)
 
--- /p/lispy/cvsroot/lispy/utils.lisp	2008/02/04 15:15:08	1.6
+++ /p/lispy/cvsroot/lispy/utils.lisp	2008/04/02 05:25:39	1.7
@@ -53,3 +53,23 @@
 (defun read-stream (stream &rest args)
   (let ((*read-eval* nil))
     (apply #'read stream args)))
+
+(defun download-file (url destination-pathname)
+  (ensure-directories-exist destination-pathname)
+  (multiple-value-bind (stream status-code headers uri http-stream must-close)
+      (drakma:http-request url :want-stream t)
+    (declare (ignore status-code headers uri http-stream must-close))
+    (unwind-protect
+	 (with-open-file (output-stream destination-pathname
+					:direction :output
+					:element-type '(unsigned-byte 8)
+					:if-exists :supersede)
+	   (copy-stream stream output-stream))
+      (close stream))))
+
+(defun verify-signature (text-pathname signature-pathname)
+  (multiple-value-bind (output error status)
+       (trivial-shell:shell-command (format nil "gpg --verify ~A ~A" signature-pathname text-pathname))
+    (declare (ignore output))
+    (values (zerop status)
+	    error)))




More information about the Lispy-cvs mailing list