(smime-directory-files): Abolish.
[elisp/semi.git] / smime.el
index 9df2468..d01ee0d 100644 (file)
--- a/smime.el
+++ b/smime.el
@@ -39,6 +39,7 @@
 ;;; 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)
-  (let ((files (if (file-directory-p smime-certificate-directory)
-                  (directory-files smime-certificate-directory)
-                nil)))
+(defsubst smime-find-certificate (attr)
+  (let ((files
+        (and (file-directory-p smime-certificate-directory)
+             (delq nil (mapcar (lambda (file) 
+                                 (if (file-directory-p file) nil
+                                   file))
+                               (directory-files 
+                                smime-certificate-directory
+                                'full))))))
     (catch 'found
       (while files
        (if (or (string-equal 
              (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)
@@ -275,6 +283,10 @@ a detached signature."
         (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)))))
 
@@ -285,29 +297,23 @@ If the optional 3rd argument SIGNATURE is non-nil, it is treated as
 the detached signature of the current region."
   (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)
-         (write-region-as-binary start end orig-file)
-         )
+         (write-region-as-binary start end orig-file))
       (set-default-file-modes orig-mode))
     (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)