diff lisp/w3/url-pgp.el @ 14:9ee227acff29 r19-15b90

Import from CVS: tag r19-15b90
author cvs
date Mon, 13 Aug 2007 08:48:42 +0200
parents
children 0293115a14e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/w3/url-pgp.el	Mon Aug 13 08:48:42 2007 +0200
@@ -0,0 +1,175 @@
+;;; url-pgp.el --- PGP encapsulation of HTTP
+;; Author: wmperry
+;; Created: 1996/10/09 19:00:59
+;; Version: 1.2
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993-1996 by William M. Perry (wmperry@cs.indiana.edu)
+;;; Copyright (c) 1996 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; UUencoding
+;;; ----------
+;;; These functions are needed for the (RI)PEM encoding.  PGP can
+;;; handle binary data, but (RI)PEM requires that it be uuencoded
+;;; first, or it will barf severely.  How rude.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-uuencode-buffer (&optional buff)
+  "UUencode buffer BUFF, with a default of the current buffer."
+  (setq buff (or buff (current-buffer)))
+  (save-excursion
+    (set-buffer buff)
+    (url-lazy-message "UUencoding...")
+    (call-process-region (point-min) (point-max)
+			 url-uuencode-program t t nil "url-temp-file")
+    (url-lazy-message "UUencoding... done.")))
+
+(defun url-uudecode-buffer (&optional buff)
+  "UUdecode buffer BUFF, with a default of the current buffer."
+  (setq buff (or buff (current-buffer)))
+  (let ((newname (url-generate-unique-filename)))
+    (save-excursion
+      (set-buffer buff)
+      (goto-char (point-min))
+      (re-search-forward "^begin [0-9][0-9][0-9] \\(.*\\)$" nil t)
+      (replace-match (concat "begin 600 " newname))
+      (url-lazy-message "UUdecoding...")
+      (call-process-region (point-min) (point-max) url-uudecode-program)
+      (url-lazy-message "UUdecoding...")
+      (erase-buffer)
+      (insert-file-contents-literally newname)
+      (url-lazy-message "UUdecoding... done.")
+      (condition-case ()
+	  (delete-file newname)
+	(error nil)))))
+      
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Decoding PGP/PEM responses
+;;; --------------------------
+;;; A PGP/PEM encrypted/signed response contains all the real headers,
+;;; so this is just a quick decrypt-then-reparse hack.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-decode-pgp/pem (arg)
+  "Decode a pgp/pem response from an HTTP/1.0 server.
+This expects the decoded message to contain all the necessary HTTP/1.0 headers
+to correctly act on the decoded message (new content-type, etc)."
+  (mc-decrypt-message)
+  (url-parse-mime-headers))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; PGP/PEM Encryption
+;;; ------------------
+;;; This implements the highly secure PGP/PEM encrypted requests, as
+;;; specified by NCSA and CERN.
+;;;
+;;; The complete online spec of this scheme was done by Tony Sanders
+;;; <sanders@bsdi.com>, and can be seen at
+;;; http://www.bsdi.com/HTTP:TNG/ripem-http.txt
+;;;
+;;; This section of code makes use of the EXCELLENT mailcrypt.el
+;;; package by Jin S Choi (jsc@mit.edu)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun url-public-key-exists (entity scheme)
+  "Return t iff a key for ENTITY exists using public key system SCHEME.
+ENTITY is the username/hostname combination we are checking for.
+SCHEME is a symbol representing what public key encryption program to use.
+       Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
+       recognized."
+  (let (retval)
+    (save-excursion
+      (cond
+       ((eq 'pgp scheme)			; PGP encryption
+	(set-buffer (get-buffer-create " *keytmp*"))
+	(erase-buffer)
+	(call-process mc-pgp-path nil t nil "+batchmode" "-kxaf" entity)
+	(goto-char (point-min))
+	(setq retval (search-forward mc-pgp-key-begin-line nil t)))
+       ((eq 'pem scheme)			; PEM encryption
+	(set-buffer (find-file-noselect mc-ripem-pubkeyfile))
+	(goto-char (point-min))
+	(setq retval (search-forward entity nil t)))
+       (t
+	(url-warn 'security
+		  (format
+		   "Bad value for SCHEME in url-public-key-exists %s"
+		   scheme))))
+      (kill-buffer (current-buffer)))
+    retval))
+
+(defun url-get-server-keys (entity &optional scheme)
+  "Make sure the key for ENTITY exists using SCHEME.
+ENTITY is the username/hostname combination to get the info for.  
+       This should be a string you could pass to 'finger'.
+SCHEME is a symbol representing what public key encryption program to use.
+       Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
+       recognized."
+  (or scheme (setq scheme mc-default-scheme))
+  (save-excursion
+    (cond
+     ((url-public-key-exists entity scheme) nil)
+     (t
+      (string-match "\\([^@]+\\)@\\(.*\\)" entity)
+      (let ((url-working-buffer " *url-get-keys*"))
+	(url-retrieve (format "gopher://%s:79/0%s/w" (url-match entity 1)
+			     (url-match entity 2)))
+	(mc-snarf-keys)
+	(kill-buffer url-working-buffer))))))
+   
+(defun url-fetch-with-pgp (url recipient type)
+  "Retrieve a document with public-key authentication.
+      URL is the url to request from the server.
+RECIPIENT is the server's entity name (usually webmaster@host)
+     TYPE is a symbol representing what public key encryption program to use.
+          Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
+          recognized."
+  (or noninteractive (require 'mailcrypt))
+  (let ((request (url-create-mime-request url "PGP-Redirect"))
+	(url-request-data nil)
+	(url-request-extra-headers nil))
+    (save-excursion
+      (url-get-server-keys recipient type)
+      (set-buffer (get-buffer-create " *url-encryption*"))
+      (erase-buffer)
+      (insert "\n\n" mail-header-separator "\n" request)
+      (mc-encrypt-message recipient type)
+      (goto-char (point-min))
+      (if (re-search-forward (concat "\n" mail-header-separator "\n") nil t)
+	  (delete-region (point-min) (point)))
+      (setq url-request-data (buffer-string)
+	    url-request-extra-headers
+	    (list (cons "Authorized" (format "%s entity=\"%s\""
+					     (cond
+					      ((eq type 'pgp) "PGP")
+					      ((eq type 'pem) "PEM"))
+					     url-pgp/pem-entity))
+		  (cons "Content-type" (format "application/x-www-%s-reply"
+					       (cond
+						((eq type 'pgp) "pgp")
+						((eq type 'pem) "pem")))))))
+    (kill-buffer " *url-encryption*")
+    (url-retrieve (url-expand-file-name "/") t)))
+     
+(provide 'url-pgp)