X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-pgp.el;h=67fbb6e0f9d17f91b41a4bac40d65875b3a0a34a;hb=af2762f5768fe78ff79efca6b4bbc0bab0f23b5b;hp=5819e83832e1b762a4d9220748bc40716289f364;hpb=733a7f1055d340edda1991228ebf62596b699d96;p=elisp%2Fsemi.git diff --git a/mime-pgp.el b/mime-pgp.el index 5819e83..67fbb6e 100644 --- a/mime-pgp.el +++ b/mime-pgp.el @@ -41,30 +41,39 @@ ;; by Kazuhiko Yamamoto (1995/10; ;; expired) -;; PGP/MIME and PGP-kazu may be contrary to each other. You should -;; decide which you support (Maybe you should not use PGP-kazu). - ;;; Code: (require 'mime-play) +;;; @ Internal method for multipart/signed +;;; +;;; It is based on RFC 1847 (security-multipart). + +(defun mime-verify-multipart/signed (entity situation) + "Internal method to verify multipart/signed." + (mime-raw-play-entity + (nth 1 (mime-entity-children entity)) ; entity-info of signature + (cdr (assq 'mode situation)) ; play-mode + )) + + ;;; @ internal method for application/pgp ;;; ;;; It is based on draft-kazu-pgp-mime-00.txt (PGP-kazu). -(defun mime-method-for-application/pgp (start end cal) - (let* ((entity-number (mime-raw-point-to-entity-number start)) - (p-win (or (get-buffer-window mime-preview-buffer) +(defun mime-view-application/pgp (entity situation) + (let* ((p-win (or (get-buffer-window mime-preview-buffer) (get-largest-window))) - (new-name (format "%s-%s" (buffer-name) entity-number)) + (new-name + (format "%s-%s" (buffer-name) (mime-entity-number entity))) (the-buf (current-buffer)) (mother mime-preview-buffer) - (mode major-mode) - text-decoder) + representation-type) (set-buffer (get-buffer-create new-name)) (erase-buffer) - (insert-buffer-substring the-buf start end) + (insert-buffer-substring + the-buf (mime-entity-point-min entity) (mime-entity-point-max entity)) (cond ((progn (goto-char (point-min)) (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE-+$" nil t)) @@ -83,9 +92,8 @@ (while (re-search-forward "^- -" nil t) (replace-match "-") ) - (setq text-decoder - (cdr (or (assq mode mime-text-decoder-alist) - (assq t mime-text-decoder-alist)))) + (setq representation-type (if (mime-entity-cooked-p entity) + 'cooked)) ) ((progn (goto-char (point-min)) @@ -96,41 +104,14 @@ (and (search-forward "\n\n") (match-end 0))) - (setq text-decoder (function mime-text-decode-buffer)) + (setq representation-type 'binary) )) (setq major-mode 'mime-show-message-mode) - (setq mime-text-decoder text-decoder) - (save-window-excursion (mime-view-mode mother)) + (save-window-excursion (mime-view-buffer nil nil mother + nil representation-type)) (set-window-buffer p-win mime-preview-buffer) )) -(set-atype 'mime-acting-condition - '((type . application)(subtype . pgp) - (method . mime-method-for-application/pgp))) - -(set-atype 'mime-acting-condition - '((type . text)(subtype . x-pgp) - (method . mime-method-for-application/pgp))) - - -;;; @ Internal method for multipart/signed -;;; -;;; It is based on RFC 1847 (security-multipart). - -(defun mime-method-to-verify-multipart/signed (start end cal) - "Internal method to verify multipart/signed." - (mime-raw-play-entity - ;; entity-info of signature - (mime-raw-entity-node-id-to-entity-info - ;; entity-node-id of signature - (cons 1 (mime-raw-point-to-entity-node-id start))) - (cdr (assq 'mode cal)) ; play-mode - )) - -(set-atype 'mime-acting-condition - '((type . multipart)(subtype . signed) - (method . mime-method-to-verify-multipart/signed))) - ;;; @ Internal method for application/pgp-signature ;;; @@ -173,25 +154,23 @@ It should be ISO 639 2 letter language code such as en, ja, ...") (t "Bad signature"))) )))) -(defun mime-method-to-verify-application/pgp-signature (start end cal) +(defun mime-verify-application/pgp-signature (entity situation) "Internal method to check PGP/MIME signature." - (let* ((encoding (cdr (assq 'encoding cal))) + (let* ((start (mime-entity-point-min entity)) + (end (mime-entity-point-max entity)) + (encoding (cdr (assq 'encoding situation))) (entity-node-id (mime-raw-point-to-entity-node-id start)) - (mother-node-id (cdr entity-node-id)) + (mother (mime-entity-parent entity)) (knum (car entity-node-id)) (onum (if (> knum 0) (1- knum) (1+ knum))) - (raw-buf (current-buffer)) - (oinfo (mime-raw-entity-node-id-to-entity-info - (cons onum mother-node-id) mime-raw-message-info)) + (orig-entity (nth onum (mime-entity-children mother))) (basename (expand-file-name "tm" mime-temp-directory)) (orig-file (make-temp-name basename)) (sig-file (concat orig-file ".sig")) ) - (write-region-as-binary (mime-entity-info-point-min oinfo) - (mime-entity-info-point-max oinfo) - orig-file) + (mime-write-entity orig-entity orig-file) (save-excursion (mime-show-echo-buffer)) (mime-write-decoded-region (save-excursion (goto-char start) @@ -231,43 +210,33 @@ It should be ISO 639 2 letter language code such as en, ja, ...") (delete-file sig-file) )) -(set-atype 'mime-acting-condition - '((type . application)(subtype . pgp-signature) - (method . mime-method-to-verify-application/pgp-signature))) - ;;; @ Internal method for application/pgp-encrypted ;;; ;;; It is based on RFC 2015 (PGP/MIME). -(defun mime-method-to-decrypt-application/pgp-encrypted (start end cal) - (let* ((entity-node-id (mime-raw-point-to-entity-node-id start)) - (mother-node-id (cdr entity-node-id)) +(defun mime-decrypt-application/pgp-encrypted (entity situation) + (let* ((entity-node-id (mime-entity-node-id entity)) + (mother (mime-entity-parent entity)) (knum (car entity-node-id)) (onum (if (> knum 0) (1- knum) (1+ knum))) - (oinfo (mime-raw-entity-node-id-to-entity-info - (cons onum mother-node-id) mime-raw-message-info)) - (obeg (mime-entity-info-point-min oinfo)) - (oend (mime-entity-info-point-max oinfo)) - ) - (mime-method-for-application/pgp obeg oend cal) + (orig-entity (nth onum (mime-entity-children mother)))) + (mime-view-application/pgp orig-entity situation) )) -(set-atype 'mime-acting-condition - '((type . application)(subtype . pgp-encrypted) - (method . mime-method-to-decrypt-application/pgp-encrypted))) - ;;; @ Internal method for application/pgp-keys ;;; ;;; It is based on RFC 2015 (PGP/MIME). -(defun mime-method-to-add-application/pgp-keys (start end cal) - (let* ((entity-number (mime-raw-point-to-entity-number start)) +(defun mime-add-application/pgp-keys (entity situation) + (let* ((start (mime-entity-point-min entity)) + (end (mime-entity-point-max entity)) + (entity-number (mime-raw-point-to-entity-number start)) (new-name (format "%s-%s" (buffer-name) entity-number)) - (encoding (cdr (assq 'encoding cal))) + (encoding (cdr (assq 'encoding situation))) str) (setq str (buffer-substring start end)) (switch-to-buffer new-name) @@ -283,10 +252,6 @@ It should be ISO 639 2 letter language code such as en, ja, ...") (kill-buffer (current-buffer)) )) -(set-atype 'mime-acting-condition - '((type . application)(subtype . pgp-keys) - (method . mime-method-to-add-application/pgp-keys))) - ;;; @ end ;;;