(smime-dns-server): New variable.
authorSimon Josefsson <jas@extundo.com>
Sat, 28 Oct 2000 17:23:49 +0000 (17:23 +0000)
committerSimon Josefsson <jas@extundo.com>
Sat, 28 Oct 2000 17:23:49 +0000 (17:23 +0000)
(smime-mail-to-domain):
(smime-cert-by-dns): New functions.

lisp/ChangeLog
lisp/smime.el

index 3655713..05f1798 100644 (file)
@@ -1,5 +1,9 @@
 2000-10-28  Simon Josefsson  <sj@extundo.com>
 
+       * smime.el (smime-dns-server): New variable.
+       (smime-mail-to-domain):
+       (smime-cert-by-dns): New functions.
+
        * dig.el: New file.
 
 2000-10-28 10:09:41  ShengHuo ZHU  <zsh@cs.rochester.edu>
index 364b4d9..0d3bbe9 100644 (file)
 
 ;;; Code:
 
+(require 'dig)
+(eval-when-compile (require 'cl))
+
 (defgroup smime nil
   "S/MIME configuration.")
 
@@ -142,6 +145,13 @@ manually."
   :type 'string
   :group 'smime)
 
+(defcustom smime-dns-server nil
+  "DNS server to query certificates from.
+If nil, use system defaults."
+  :type '(choice (const :tag "System defaults")
+                string)
+  :group 'dig)
+
 ;; OpenSSL wrappers.
 
 (defun smime-call-openssl-region (b e buf &rest args)
@@ -263,6 +273,34 @@ Uses current buffer if BUFFER is nil, queries user of KEYFILE is nil."
                           (and (listp (car-safe smime-keys)) 
                                (caar smime-keys))))))))
 
+;; Find certificates
+
+(defun smime-mail-to-domain (mailaddr)
+  (if (string-match "@" mailaddr)
+      (replace-match "." 'fixedcase 'literal mailaddr)
+    mailaddr))
+
+(defun smime-cert-by-dns (mail)
+  (let* ((dig-dns-server smime-dns-server)
+        (digbuf (dig-invoke (smime-mail-to-domain mail) "cert" nil nil "+vc"))
+        (retbuf (generate-new-buffer (format "*certificate for %s*" mail)))
+        (certrr (with-current-buffer digbuf
+                  (dig-extract-rr (smime-mail-to-domain mail) "cert")))
+        (cert (and certrr (dig-rr-get-pkix-cert certrr))))
+      (if cert
+         (with-current-buffer retbuf
+           (insert "-----BEGIN CERTIFICATE-----\n")
+           (let ((i 0) (len (length cert)))
+             (while (> (- len 64) i)
+               (insert (substring cert i (+ i 64)) "\n")
+               (setq i (+ i 64)))
+             (insert (substring cert i len) "\n"))
+           (insert "-----END CERTIFICATE-----\n"))
+       (kill-buffer retbuf)
+       (setq retbuf nil))
+      (kill-buffer digbuf)
+      retbuf))
+
 ;; User interface.
 
 (defvar smime-buffer "*SMIME*")