Re: pkcs7-mime

Kazuhiro Ito <[email protected]> Mon, 24 Jun 2019 23:58:03 +0900
Newsgroups gmane.mail.wanderlust.general
Message-ID <86imsvqbd0.wl--xmue__22082.0677511924$1561388352$gmane$org@d1.dion.ne.jp>
> Content-Type: application/pkcs7-mime; smime-type=signed-data; name="smime.p7m"
> Content-Disposition: attachment; filename="smime.p7m"
> Content-Transfer-Encoding: base64

At present, Wanderlust (SEMI-EPG) does not support unencrypted
pkcs7-mime part.

As workaround, try the below code.  The content would be displayed
inline.  You still need " *epg-debug*" buffer for the result of
verification.

(eval-after-load "mime-pgp"
  '(progn
(defun mime-preview-application/pkcs7-mime (entity situation)
  (let ((smime-type (cdr (assoc "smime-type" situation)))
	p buffer decrypted-entity failed)
    (setq smime-type (or (and smime-type
			      (intern (downcase smime-type)))
			 'enveloped-data))
    (when (memq smime-type '(enveloped-data signed-data))
      (goto-char (setq p (point-max)))
      (save-restriction
	(narrow-to-region p p)
	(setq buffer (generate-new-buffer
		      (concat mime-temp-buffer-name "PKCS7*")))
	(with-current-buffer buffer
	  (condition-case error
	      (insert
	       (prog1
		   (decode-coding-string
		    (funcall
		     (cdr (assq smime-type
				'((enveloped-data . mime-pgp-decrypt-string)
				  (signed-data . mime-pgp-verify-string))))
		     (epg-make-context 'CMS) (mime-entity-content entity))
		    'raw-text)
		 ))
	    (error (setq failed error)))
	  (unless failed
	    (setq decrypted-entity
		  (mime-parse-message
		   (mm-expand-class-name 'buffer)
		   nil entity (mime-entity-node-id-internal entity))
		  buffer-read-only t)))
	(if failed
	    (progn
	      (insert (format "%s" (cdr failed)))
	      (kill-buffer buffer))
	  (add-hook 'kill-buffer-hook 'mime-pgp-kill-decrypted-buffers nil t)
	  (make-local-variable 'mime-pgp-decrypted-buffers)
	  (add-to-list 'mime-pgp-decrypted-buffers buffer)
	  (mime-display-entity
	   decrypted-entity nil '((header . visible)
				  (body . visible)
				  (entity-button . invisible))))))))

(defun mime-pgp-verify-string (context cipher)
  (let ((string (epg-verify-string context cipher)))
    ;; Remove CRs if header contains CR.
    (if (string-match "\\`.*\r\n" string)
	(let (inhibit-eol-conversion)
	  (decode-coding-string string 'raw-text-dos))
      string)))
))

-- 
Kazuhiro Ito