;;; Code:
(require 'path-util)
+(eval-when-compile (require 'static))
(defgroup smime ()
"S/MIME interface"
(with-current-buffer (get-buffer-create smime-output-buffer)
(buffer-disable-undo)
(erase-buffer)
- (insert-file-contents cert-file)
- (apply #'call-process-region
- (point-min)(point-max) (car smime-x509-program)
- t t nil (cons "-hash" (cdr smime-x509-program)))
+ (apply #'call-process (car smime-x509-program) nil t nil
+ (append (cdr smime-x509-program)
+ (list "-hash" "-in" cert-file)))
(if (zerop (buffer-size)) nil
(buffer-substring (point-min) (1- (point-max))))))
(with-current-buffer (get-buffer-create smime-output-buffer)
(buffer-disable-undo)
(erase-buffer)
- (insert-file-contents cert-file)
- (apply #'call-process-region
- (point-min)(point-max) (car smime-x509-program)
- t t nil (cons "-subject" (cdr smime-x509-program)))
+ (apply #'call-process (car smime-x509-program) nil t nil
+ (append (cdr smime-x509-program)
+ (list "-subject" "-in" cert-file)))
(if (zerop (buffer-size)) nil
(goto-char (point-min))
(when (re-search-forward "^subject=" nil t)
(smime-parse-attribute
(buffer-substring (point)(progn (end-of-line)(point))))))))
-(defsubst smime-search-certificate (attr)
+(static-condition-case nil
+ (directory-files nil nil nil nil nil)
+ (wrong-number-of-arguments
+ (defmacro smime-directory-files
+ (directory &optional full match nosort files-only)
+ (if files-only
+ `(delq nil (mapcar
+ (lambda (file)
+ ,(if (eq files-only t)
+ `(if (file-directory-p file) nil file)
+ `(if (file-directory-p file) file nil)))
+ (directory-files ,directory ,full ,match ,nosort)))
+ `(directory-files ,directory ,full ,match ,nosort))))
+ (error
+ (defalias 'smime-directory-files 'directory-files)))
+
+(defsubst smime-find-certificate (attr)
(let ((files (if (file-directory-p smime-certificate-directory)
- (directory-files smime-certificate-directory)
+ (delq nil (mapcar (lambda (file)
+ (if (file-directory-p file) nil
+ file))
+ (directory-files
+ smime-certificate-directory
+ 'full)))
nil)))
(catch 'found
(while files
(expand-file-name (read-file-name "Public key file: "))))
(args (list "-e" key-file)))
(smime-process-region start end smime-program args)
- (smime-process-when-success nil)))
+ (smime-process-when-success
+ (goto-char (point-min))
+ (delete-region (point-min) (progn
+ (re-search-forward "^$" nil t)
+ (1+ (point)))))))
;;;###autoload
(defun smime-decrypt-region (start end)
(args (list "-ds" key-file passphrase)))
(smime-process-region start end smime-program args)
(smime-process-when-success
+ (goto-char (point-min))
+ (delete-region (point-min) (progn
+ (re-search-forward "^$" nil t)
+ (1+ (point))))
(when smime-cache-passphrase
(smime-add-passphrase-cache hash passphrase)))))
(let* ((basename (expand-file-name "smime" temporary-file-directory))
(orig-file (make-temp-name basename))
(args (list "-qs" signature))
- (orig-mode (default-file-modes))
- cert-file)
+ (orig-mode (default-file-modes)))
(unwind-protect
(progn
(set-default-file-modes 448)
(with-temp-buffer
(insert-file-contents-as-binary signature)
(goto-char (point-max))
- (insert "\n")
(insert-file-contents-as-binary
- (or (smime-search-certificate
+ (or (smime-find-certificate
(smime-query-signer (point-min)(point-max)))
(expand-file-name
(read-file-name "Certificate file: "))))
- (smime-process-region (point-min)(point-max) smime-program args))
- (smime-process-when-success
- (when smime-cache-passphrase
- (smime-add-passphrase-cache hash passphrase)))
- ))
+ (smime-process-region (point-min)(point-max) smime-program
+ (list "-dv" orig-file)))
+ (smime-process-when-success nil)))
(provide 'smime)