2002-01-22 Josh Huber <huber@alum.wpi.edu>
authorJosh Huber <huber@alum.wpi.edu>
Tue, 22 Jan 2002 22:18:46 +0000 (22:18 +0000)
committerJosh Huber <huber@alum.wpi.edu>
Tue, 22 Jan 2002 22:18:46 +0000 (22:18 +0000)
* message.el (message-font-lock-keywords): Added the secure tag.
* mml-sec.el: Added functions to generate/modify/remove the secure
tag while in message mode.
* mml-sec.el (mml-secure-message): New.
* mml-sec.el (mml-unsecure-message): New.
* mml-sec.el (mml-secure-message-sign-smime): New.
* mml-sec.el (mml-secure-message-sign-pgp): New.
* mml-sec.el (mml-secure-message-sign-pgpmime): New.
* mml-sec.el (mml-secure-message-encrypt-smime): New.
* mml-sec.el (mml-secure-message-encrypt-pgp): New.
* mml-sec.el (mml-secure-message-encrypt-pgpmime): New.
* mml.el (mml-parse-1): Added code to recognise the secure tag and
convert it to either a part or multipart depending on if there are
other parts in the message.
* mml.el (mml-mode-map): Changed default sign/encrypt keybindings
to use the secure tag, rather than the part tag.
* mml.el (mml-preview): Added a save-excursion to keep cursor
position after doing an MML preview.

lisp/ChangeLog
lisp/message.el
lisp/mml-sec.el
lisp/mml.el

index 86afab2..17a5f46 100644 (file)
@@ -1,3 +1,24 @@
+2002-01-22  Josh Huber  <huber@alum.wpi.edu>
+
+       * message.el (message-font-lock-keywords): Added the secure tag.
+       * mml-sec.el: Added functions to generate/modify/remove the secure
+       tag while in message mode.
+       * mml-sec.el (mml-secure-message): New.
+       * mml-sec.el (mml-unsecure-message): New.
+       * mml-sec.el (mml-secure-message-sign-smime): New.
+       * mml-sec.el (mml-secure-message-sign-pgp): New.
+       * mml-sec.el (mml-secure-message-sign-pgpmime): New.
+       * mml-sec.el (mml-secure-message-encrypt-smime): New.
+       * mml-sec.el (mml-secure-message-encrypt-pgp): New.
+       * mml-sec.el (mml-secure-message-encrypt-pgpmime): New.
+       * mml.el (mml-parse-1): Added code to recognise the secure tag and
+       convert it to either a part or multipart depending on if there are
+       other parts in the message.
+       * mml.el (mml-mode-map): Changed default sign/encrypt keybindings
+       to use the secure tag, rather than the part tag.
+       * mml.el (mml-preview): Added a save-excursion to keep cursor
+       position after doing an MML preview.
+
 2002-01-22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * nnheader.el (nnheader-parse-overview-file): New function.
index 090a505..82e8d68 100644 (file)
@@ -970,7 +970,7 @@ candidates:
          nil)
       (,(concat "^\\(" message-cite-prefix-regexp "\\).*")
        (0 'message-cited-text-face))
-      ("<#/?\\(multipart\\|part\\|external\\|mml\\).*>"
+      ("<#/?\\(multipart\\|part\\|external\\|mml\\|secure\\).*>"
        (0 'message-mml-face))))
   "Additional expressions to highlight in Message mode.")
 
index 3d30602..0230e0f 100644 (file)
   (interactive)
   (mml-secure-part "smime"))
 
+;; defuns that add the proper <#secure ...> tag to the top of the message body
+(defun mml-secure-message (method &optional sign)
+  (let ((mode (if sign "sign" "encrypt"))
+       insert-loc)
+    (mml-unsecure-message)
+    (save-excursion
+      (goto-char (point-max))
+      (cond ((re-search-backward
+             (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
+            (goto-char (setq insert-loc (match-end 0)))
+            (unless (looking-at "<#secure")
+              (mml-insert-tag
+               'secure 'method method 'mode mode)))
+           (t (error
+               "The message is corrupted. No mail header separator"))))
+    (when (eql insert-loc (point))
+      (forward-line 1))))
+
+(defun mml-unsecure-message ()
+  (interactive)
+  (save-excursion
+    (goto-char (point-max))
+    (when (re-search-backward "^<#secure.*>\n" nil t)
+      (kill-region (match-beginning 0) (match-end 0)))))
+
+(defun mml-secure-message-sign-smime ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "smime" 'sign))
+
+(defun mml-secure-message-sign-pgp ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "pgp" 'sign))
+
+(defun mml-secure-message-sign-pgpmime ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "pgpmime" 'sign))
+
+(defun mml-secure-message-encrypt-smime ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "smime"))
+
+(defun mml-secure-message-encrypt-pgp ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "pgp"))
+
+(defun mml-secure-message-encrypt-pgpmime ()
+  "Add MML tag to encrypt/sign the entire message."
+  (interactive)
+  (mml-secure-message "pgpmime"))
+
 (provide 'mml-sec)
 
 ;;; mml-sec.el ends here
index eb43ea2..02e1d8c 100644 (file)
@@ -143,6 +143,32 @@ one charsets.")
     (while (and (not (eobp))
                (not (looking-at "<#/multipart")))
       (cond
+       ((looking-at "<#secure")
+       ;; The secure part is essentially a meta-meta tag, which
+       ;; expands to either a part tag if there are no other parts in
+       ;; the document or a multipart tag if there are other parts
+       ;; included in the message
+       (let* (secure-mode
+              (taginfo (mml-read-tag))
+              (recipient (cdr (assq 'recipient taginfo)))
+              (location (cdr (assq 'tag-location taginfo))))
+         (save-excursion
+           (if
+               (re-search-forward
+                "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t)
+               (setq secure-mode "multipart")
+             (setq secure-mode "part")))
+         (save-excursion
+           (goto-char location)
+           (re-search-forward "<#secure[^\n]*>\n"))
+         (delete-region (match-beginning 0) (match-end 0))
+         (mml-insert-tag secure-mode
+                         (cdr (assq 'mode taginfo))
+                         (cdr (assq 'method taginfo))
+                         (and recipient 'recipient)
+                         recipient)
+         ;; restart the parse
+         (goto-char location)))
        ((looking-at "<#multipart")
        (push (nconc (mml-read-tag) (mml-parse-1)) struct))
        ((looking-at "<#external")
@@ -750,12 +776,12 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
        (encrypt (make-sparse-keymap))
        (map (make-sparse-keymap))
        (main (make-sparse-keymap)))
-    (define-key sign "p" 'mml-secure-sign-pgpmime)
-    (define-key sign "o" 'mml-secure-sign-pgp)
-    (define-key sign "s" 'mml-secure-sign-smime)
-    (define-key encrypt "p" 'mml-secure-encrypt-pgpmime)
-    (define-key encrypt "o" 'mml-secure-encrypt-pgp)
-    (define-key encrypt "s" 'mml-secure-encrypt-smime)
+    (define-key sign "p" 'mml-secure-message-sign-pgpmime)
+    (define-key sign "o" 'mml-secure-message-sign-pgp)
+    (define-key sign "s" 'mml-secure-message-sign-smime)
+    (define-key encrypt "p" 'mml-secure-message-encrypt-pgpmime)
+    (define-key encrypt "o" 'mml-secure-message-encrypt-pgp)
+    (define-key encrypt "s" 'mml-secure-message-encrypt-smime)
     (define-key map "f" 'mml-attach-file)
     (define-key map "b" 'mml-attach-buffer)
     (define-key map "e" 'mml-attach-external)
@@ -782,12 +808,12 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
     ["Attach External" mml-attach-external t]
     ["Insert Part" mml-insert-part t]
     ["Insert Multipart" mml-insert-multipart t]
-    ["PGP/MIME Sign" mml-secure-sign-pgpmime t]
-    ["PGP/MIME Encrypt" mml-secure-encrypt-pgpmime t]
-    ["PGP Sign" mml-secure-sign-pgp t]
-    ["PGP Encrypt" mml-secure-encrypt-pgp t]
-    ["S/MIME Sign" mml-secure-sign-smime t]
-    ["S/MIME Encrypt" mml-secure-encrypt-smime t]
+    ["PGP/MIME Sign" mml-secure-message-sign-pgpmime t]
+    ["PGP/MIME Encrypt" mml-secure-message-encrypt-pgpmime t]
+    ["PGP Sign" mml-secure-message-sign-pgp t]
+    ["PGP Encrypt" mml-secure-message-encrypt-pgp t]
+    ["S/MIME Sign" mml-secure-message-sign-smime t]
+    ["S/MIME Encrypt" mml-secure-message-encrypt-smime t]
     ;;["Narrow" mml-narrow-to-part t]
     ["Quote MML" mml-quote-region t]
     ["Validate MML" mml-validate t]
@@ -947,42 +973,43 @@ TYPE is the MIME type to use."
   "Display current buffer with Gnus, in a new buffer.
 If RAW, don't highlight the article."
   (interactive "P")
-  (let* ((buf (current-buffer))
-        (message-options message-options)
-        (message-this-is-news (message-news-p))
-        (message-posting-charset (or (gnus-setup-posting-charset
-                                      (save-restriction
-                                        (message-narrow-to-headers-or-head)
-                                        (message-fetch-field "Newsgroups")))
-                                     message-posting-charset)))
-    (message-options-set-recipient)
-    (switch-to-buffer (generate-new-buffer
-                      (concat (if raw "*Raw MIME preview of "
-                                "*MIME preview of ") (buffer-name))))
-    (erase-buffer)
-    (insert-buffer buf)
-    (if (re-search-forward
-        (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
-       (replace-match "\n"))
-    (let ((mail-header-separator "")) ;; mail-header-separator is removed.
-      (mml-to-mime))
-    (if raw
-       (when (fboundp 'set-buffer-multibyte)
-         (let ((s (buffer-string)))
-           ;; Insert the content into unibyte buffer.
-           (erase-buffer)
-           (mm-disable-multibyte)
-           (insert s)))
-      (let ((gnus-newsgroup-charset (car message-posting-charset))
-           gnus-article-prepare-hook gnus-original-article-buffer)
-       (run-hooks 'gnus-article-decode-hook)
-       (let ((gnus-newsgroup-name "dummy"))
-         (gnus-article-prepare-display))))
-    ;; Disable article-mode-map.
-    (use-local-map nil)
-    (setq buffer-read-only t)
-    (local-set-key "q" (lambda () (interactive) (kill-buffer nil)))
-    (goto-char (point-min))))
+  (save-excursion
+    (let* ((buf (current-buffer))
+          (message-options message-options)
+          (message-this-is-news (message-news-p))
+          (message-posting-charset (or (gnus-setup-posting-charset
+                                        (save-restriction
+                                          (message-narrow-to-headers-or-head)
+                                          (message-fetch-field "Newsgroups")))
+                                       message-posting-charset)))
+      (message-options-set-recipient)
+      (switch-to-buffer (generate-new-buffer
+                        (concat (if raw "*Raw MIME preview of "
+                                  "*MIME preview of ") (buffer-name))))
+      (erase-buffer)
+      (insert-buffer buf)
+      (if (re-search-forward
+          (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
+         (replace-match "\n"))
+      (let ((mail-header-separator ""));; mail-header-separator is removed.
+       (mml-to-mime))
+      (if raw
+         (when (fboundp 'set-buffer-multibyte)
+           (let ((s (buffer-string)))
+             ;; Insert the content into unibyte buffer.
+             (erase-buffer)
+             (mm-disable-multibyte)
+             (insert s)))
+       (let ((gnus-newsgroup-charset (car message-posting-charset))
+             gnus-article-prepare-hook gnus-original-article-buffer)
+         (run-hooks 'gnus-article-decode-hook)
+         (let ((gnus-newsgroup-name "dummy"))
+           (gnus-article-prepare-display))))
+      ;; Disable article-mode-map.
+      (use-local-map nil)
+      (setq buffer-read-only t)
+      (local-set-key "q" (lambda () (interactive) (kill-buffer nil)))
+      (goto-char (point-min)))))
 
 (defun mml-validate ()
   "Validate the current MML document."