From 38a2b0d0163f0476d51e5eb1adb03ce43825819c Mon Sep 17 00:00:00 2001 From: yamaoka Date: Fri, 1 Dec 2000 01:15:48 +0000 Subject: [PATCH] Synch with Gnus. --- lisp/ChangeLog | 67 ++++++++++++++++++++++ lisp/gnus-art.el | 44 +++++++-------- lisp/gnus-cite.el | 161 +++++++++++++++++++++++++++++------------------------ lisp/gnus-util.el | 22 ++++++++ lisp/mm-decode.el | 6 ++ lisp/mm-util.el | 6 +- lisp/mml-smime.el | 25 +++++++-- lisp/nnbabyl.el | 8 +++ lisp/nndraft.el | 1 + lisp/nnfolder.el | 10 +++- lisp/nnmbox.el | 8 +++ lisp/nnmh.el | 7 +++ lisp/smime.el | 87 +++++++++++++++++++++++------ texi/ChangeLog | 4 ++ texi/gnus.texi | 6 +- todo | 4 ++ 16 files changed, 345 insertions(+), 121 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8625fde..e2b23a9 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,70 @@ +2000-11-30 19:00:00 ShengHuo ZHU + + * gnus-util.el (gnus-add-text-properties-when): New function. + (gnus-remove-text-properties-when): Ditto. + + * gnus-cite.el (gnus-article-hide-citation): Use them. + (gnus-article-toggle-cited-text): Use them. + + * gnus-art.el (gnus-signature-toggle): Use them. + (gnus-article-show-hidden-text): Ditto. + (gnus-article-hide-text): Ditto. + +2000-11-30 14:00:00 ShengHuo ZHU + + * mm-util.el (mm-find-charset-region): Remove eight-bit-*. + +2000-11-30 Simon Josefsson + + * smime.el (smime-point-at-eol): New alias. + (smime-buffer-as-string-region): Use it. + +2000-11-29 21:00:00 ShengHuo ZHU + + * nndraft.el (nndraft-request-restore-buffer): Remove Date field. + +2000-11-29 20:00:00 ShengHuo ZHU + + * nnfolder.el (nnfolder-request-expire-articles): expiry-target. + + * nnbabyl.el (nnbabyl-request-expire-articles): Ditto. + + * nnmbox.el (nnmbox-request-expire-articles): Ditto. + +2000-11-22 Jan Nieuwenhuizen + + * nnmh.el (nnmh-request-expire-articles): Implemented + expiry-target for nnmh backend. + +2000-11-30 Simon Josefsson + + * mm-decode.el (mm-security-from): New variable. + (mm-possibly-verify-or-decrypt): Use it rather than `from'. + + * mml-smime.el (mml-smime-verify): Use `mm-security-from' rather + than `from'. + +2000-11-30 Simon Josefsson + + * mml-smime.el (mml-smime-verify): Verify that certificate mail + address match sender address. + + * mm-decode.el (mm-possibly-verify-or-decrypt): Bind sender address. + + * smime.el (smime-verify-region): Don't copy buffer. + (smime-decrypt-buffer): Use expand-file-name on keyfile. + (smime-pkcs7-region): New function. + (smime-pkcs7-certificates-region): Ditto. + (smime-pkcs7-email-region): Ditto. + (smime-buffer-as-string-region): Ditto. + + * gnus-art.el (gnus-mime-security-show-details): Goto beginning of + buffer. + +2000-11-23 Jens Krinke + + * smime.el (smime-decrypt-region): Fix keyfile argument. + 2000-11-29 00:00:00 ShengHuo ZHU * nnmail.el (nnmail-cache-accepted-message-ids): Add doc. diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index e137be3..6cd3774 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -1113,11 +1113,12 @@ Initialized from `text-mode-syntax-table.") (defsubst gnus-article-hide-text (b e props) "Set text PROPS on the B to E region, extending `intangible' 1 past B." - (add-text-properties b e props) + (gnus-add-text-properties-when 'article-type nil b e props) (when (memq 'intangible props) (put-text-property (max (1- b) (point-min)) b 'intangible (cddr (memq 'intangible props))))) + (defsubst gnus-article-unhide-text (b e) "Remove hidden text properties from region between B and E." (remove-text-properties b e gnus-hidden-properties) @@ -2149,24 +2150,16 @@ means show, 0 means toggle." 'hidden nil))) -(defun gnus-article-show-hidden-text (type &optional hide) +(defun gnus-article-show-hidden-text (type &optional dummy) "Show all hidden text of type TYPE. -If HIDE, hide the text instead." - (save-excursion - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (end (point-min)) - beg) - (while (setq beg (text-property-any end (point-max) 'article-type type)) - (goto-char beg) - (setq end (or - (text-property-not-all beg (point-max) 'article-type type) - (point-max))) - (if hide - (gnus-article-hide-text beg end gnus-hidden-properties) - (gnus-article-unhide-text beg end)) - (goto-char end)) - t))) +Originally it is hide instead of DUMMY." + (let ((buffer-read-only nil) + (inhibit-point-motion-hooks t)) + (gnus-remove-text-properties-when + 'article-type type + (point-min) (point-max) + (cons 'article-type (cons type + gnus-hidden-properties))))) (defconst article-time-units `((year . ,(* 365.25 24 60 60)) @@ -5226,9 +5219,15 @@ specified by `gnus-button-alist'." (inhibit-point-motion-hooks t) (limit (next-single-property-change end 'mime-view-entity nil (point-max)))) - (if (get-text-property end 'invisible) - (gnus-article-unhide-text end limit) - (gnus-article-hide-text end limit gnus-hidden-properties))))) + (if (text-property-any end limit 'article-type 'signature) + (gnus-remove-text-properties-when + 'article-type 'signature end limit + (cons 'article-type (cons 'signature + gnus-hidden-properties))) + (gnus-add-text-properties-when + 'article-type nil end limit + (cons 'article-type (cons 'signature + gnus-hidden-properties))))))) (defun gnus-button-entry () ;; Return the first entry in `gnus-button-alist' matching this place. @@ -5722,7 +5721,8 @@ For example: (setq gnus-mime-security-details-buffer (gnus-get-buffer-create "*MIME Security Details*"))) (with-current-buffer gnus-mime-security-details-buffer - (insert details)) + (insert details) + (goto-char (point-min))) (pop-to-buffer gnus-mime-security-details-buffer)) (gnus-message 5 "No details.")))) diff --git a/lisp/gnus-cite.el b/lisp/gnus-cite.el index f110927..f274248 100644 --- a/lisp/gnus-cite.el +++ b/lisp/gnus-cite.el @@ -458,57 +458,63 @@ always hide." (gnus-set-format 'cited-closed-text-button t) (save-excursion (set-buffer gnus-article-buffer) - (cond - ((gnus-article-check-hidden-text 'cite arg) - t) - ((gnus-article-text-type-exists-p 'cite) - (let ((buffer-read-only nil)) - (gnus-article-hide-text-of-type 'cite))) - (t (let ((buffer-read-only nil) - (marks (gnus-dissect-cited-text)) + marks (inhibit-point-motion-hooks t) (props (nconc (list 'article-type 'cite) gnus-hidden-properties)) - beg end start) - (while marks - (setq beg nil - end nil) - (while (and marks (string= (cdar marks) "")) - (setq marks (cdr marks))) - (when marks - (setq beg (caar marks))) - (while (and marks (not (string= (cdar marks) ""))) - (setq marks (cdr marks))) - (when marks + (point (point-min)) + found beg end start) + (while (setq point + (text-property-any point (point-max) + 'gnus-callback + 'gnus-article-toggle-cited-text)) + (setq found t) + (goto-char point) + (gnus-article-toggle-cited-text + (get-text-property point 'gnus-data) arg) + (forward-line 1) + (setq point (point))) + (unless found + (setq marks (gnus-dissect-cited-text)) + (while marks + (setq beg nil + end nil) + (while (and marks (string= (cdar marks) "")) + (setq marks (cdr marks))) + (when marks + (setq beg (caar marks))) + (while (and marks (not (string= (cdar marks) ""))) + (setq marks (cdr marks))) + (when marks (setq end (caar marks))) - ;; Skip past lines we want to leave visible. - (when (and beg end gnus-cited-lines-visible) - (goto-char beg) - (forward-line (if (consp gnus-cited-lines-visible) - (car gnus-cited-lines-visible) - gnus-cited-lines-visible)) - (if (>= (point) end) - (setq beg nil) - (setq beg (point-marker)) - (when (consp gnus-cited-lines-visible) - (goto-char end) - (forward-line (- (cdr gnus-cited-lines-visible))) - (if (<= (point) beg) - (setq beg nil) + ;; Skip past lines we want to leave visible. + (when (and beg end gnus-cited-lines-visible) + (goto-char beg) + (forward-line (if (consp gnus-cited-lines-visible) + (car gnus-cited-lines-visible) + gnus-cited-lines-visible)) + (if (>= (point) end) + (setq beg nil) + (setq beg (point-marker)) + (when (consp gnus-cited-lines-visible) + (goto-char end) + (forward-line (- (cdr gnus-cited-lines-visible))) + (if (<= (point) beg) + (setq beg nil) (setq end (point-marker)))))) - (when (and beg end) - ;; We use markers for the end-points to facilitate later - ;; wrapping and mangling of text. - (setq beg (set-marker (make-marker) beg) - end (set-marker (make-marker) end)) - (gnus-add-text-properties beg end props) - (goto-char beg) - (unless (save-excursion (search-backward "\n\n" nil t)) - (insert "\n")) - (put-text-property - (setq start (point-marker)) - (progn + (when (and beg end) + ;; We use markers for the end-points to facilitate later + ;; wrapping and mangling of text. + (setq beg (set-marker (make-marker) beg) + end (set-marker (make-marker) end)) + (gnus-add-text-properties-when 'article-type nil beg end props) + (goto-char beg) + (unless (save-excursion (search-backward "\n\n" nil t)) + (insert "\n")) + (put-text-property + (setq start (point-marker)) + (progn (gnus-article-add-button (point) (progn (eval gnus-cited-closed-text-button-line-format-spec) @@ -516,42 +522,51 @@ always hide." `gnus-article-toggle-cited-text (list (cons beg end) start)) (point)) - 'article-type 'annotation) - (set-marker beg (point))))))))) + 'article-type 'annotation) + (set-marker beg (point)))))))) -(defun gnus-article-toggle-cited-text (args) - "Toggle hiding the text in REGION." +(defun gnus-article-toggle-cited-text (args &optional arg) + "Toggle hiding the text in REGION. +ARG can be nil or a number. Positive means hide, negative +means show, nil means toggle." (let* ((region (car args)) (beg (car region)) (end (cdr region)) (start (cadr args)) (hidden - (text-property-any - beg (1- end) - (car gnus-hidden-properties) (cadr gnus-hidden-properties))) + (text-property-any beg (1- end) 'article-type 'cite)) (inhibit-point-motion-hooks t) buffer-read-only) - (funcall - (if hidden - 'remove-text-properties 'gnus-add-text-properties) - beg end gnus-hidden-properties) - (save-excursion - (goto-char start) - (gnus-delete-line) - (put-text-property - (point) - (progn - (gnus-article-add-button - (point) - (progn (eval - (if hidden - gnus-cited-opened-text-button-line-format-spec - gnus-cited-closed-text-button-line-format-spec)) - (point)) - `gnus-article-toggle-cited-text - args) - (point)) - 'article-type 'annotation)))) + (when (or (null arg) + (zerop arg) + (and (> arg 0) (not hidden)) + (and (< arg 0) hidden)) + (if hidden + (gnus-remove-text-properties-when + 'article-type 'cite beg end + (cons 'article-type (cons 'cite + gnus-hidden-properties))) + (gnus-add-text-properties-when + 'article-type nil beg end + (cons 'article-type (cons 'cite + gnus-hidden-properties)))) + (save-excursion + (goto-char start) + (gnus-delete-line) + (put-text-property + (point) + (progn + (gnus-article-add-button + (point) + (progn (eval + (if hidden + gnus-cited-opened-text-button-line-format-spec + gnus-cited-closed-text-button-line-format-spec)) + (point)) + `gnus-article-toggle-cited-text + args) + (point)) + 'article-type 'annotation))))) (defun gnus-article-hide-citation-maybe (&optional arg force) "Toggle hiding of cited text that has an attribution line. diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index e566243..5cdedd2 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -1040,6 +1040,28 @@ Entries without port tokens default to DEFAULTPORT." (pop l2)) l1)))) +(defun gnus-add-text-properties-when + (property value start end properties &optional object) + "Like `gnus-add-text-properties', only applied on where PROPERTY is VALUE." + (let (point) + (while (and start + (setq point (text-property-not-all start end property value))) + (gnus-add-text-properties start point properties object) + (setq start (text-property-any point end property value))) + (if start + (gnus-add-text-properties start end properties object)))) + +(defun gnus-remove-text-properties-when + (property value start end properties &optional object) + "Like `remove-text-properties', only applied on where PROPERTY is VALUE." + (let (point) + (while (and start + (setq point (text-property-not-all start end property value))) + (remove-text-properties start point properties object) + (setq start (text-property-any point end property value))) + (if start + (remove-text-properties start end properties object)))) + (provide 'gnus-util) ;;; gnus-util.el ends here diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 5ea7649..3a97573 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -1008,6 +1008,7 @@ If RECURSIVE, search recursively." result)) (defvar mm-security-handle nil) +(defvar mm-security-from nil) (defsubst mm-set-handle-multipart-parameter (handle parameter value) ;; HANDLE could be a CTL. @@ -1018,6 +1019,11 @@ If RECURSIVE, search recursively." (defun mm-possibly-verify-or-decrypt (parts ctl) (let ((subtype (cadr (split-string (car ctl) "/"))) (mm-security-handle ctl) ;; (car CTL) is the type. + (mm-security-from + (save-restriction + (mail-narrow-to-head) + (cadr (funcall gnus-extract-address-components + (or (mail-fetch-field "from") ""))))) protocol func functest) (cond ((equal subtype "signed") diff --git a/lisp/mm-util.el b/lisp/mm-util.el index d25b6aa..035ccf0 100644 --- a/lisp/mm-util.el +++ b/lisp/mm-util.el @@ -422,7 +422,11 @@ Mule4 only." ((and (mm-multibyte-p) (fboundp 'find-charset-region)) ;; Remove composition since the base charsets have been included. - (delq 'composition (find-charset-region b e))) + ;; Remove eight-bit-*, treat them as ascii. + (let ((css (find-charset-region b e))) + (mapcar (lambda (cs) (setq css (delq cs css))) + '(composition eight-bit-control eight-bit-graphic)) + css)) (t ;; We are in a unibyte buffer or XEmacs non-mule, so we futz around a bit. (save-excursion diff --git a/lisp/mml-smime.el b/lisp/mml-smime.el index 146ead4..16eff67 100644 --- a/lisp/mml-smime.el +++ b/lisp/mml-smime.el @@ -130,10 +130,27 @@ (when (get-buffer smime-details-buffer) (kill-buffer smime-details-buffer)) (if (smime-verify-buffer) - (progn - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (kill-buffer smime-details-buffer)) + ;; verify mail addresses in mail against those in certificate + (when (and (smime-pkcs7-region (point-min) (point-max)) + (smime-pkcs7-certificates-region (point-min) (point-max))) + (with-temp-buffer + (insert-buffer-substring (mm-handle-multipart-original-buffer ctl)) + (if (not (member mm-security-from + (and (smime-pkcs7-email-region + (point-min) (point-max)) + (smime-buffer-as-string-region + (point-min) (point-max))))) + (progn + (mm-set-handle-multipart-parameter + mm-security-handle 'gnus-info "Sender forged") + (mm-set-handle-multipart-parameter + mm-security-handle 'gnus-details + (with-current-buffer + (mm-handle-multipart-original-buffer ctl) + (buffer-string)))) + (mm-set-handle-multipart-parameter + mm-security-handle 'gnus-info "OK") + (kill-buffer smime-details-buffer)))) (mm-set-handle-multipart-parameter mm-security-handle 'gnus-info "Failed") (mm-set-handle-multipart-parameter diff --git a/lisp/nnbabyl.el b/lisp/nnbabyl.el index 0b6d87b..3118868 100644 --- a/lisp/nnbabyl.el +++ b/lisp/nnbabyl.el @@ -279,6 +279,14 @@ (buffer-substring (point) (progn (end-of-line) (point))) force)) (progn + (unless (eq nnmail-expiry-target 'delete) + (with-temp-buffer + (nnbabyl-request-article (car articles) + newsgroup server + (current-buffer)) + (let ((nnml-current-directory nil)) + (nnmail-expiry-target-group + nnmail-expiry-target newsgroup)))) (nnheader-message 5 "Deleting article %d in %s..." (car articles) newsgroup) (nnbabyl-delete-mail)) diff --git a/lisp/nndraft.el b/lisp/nndraft.el index 50b833c..71531ee 100644 --- a/lisp/nndraft.el +++ b/lisp/nndraft.el @@ -129,6 +129,7 @@ (when (nndraft-request-article article group server (current-buffer)) (message-remove-header "xref") (message-remove-header "lines") + (message-remove-header "date") t)) (deffoo nndraft-request-update-info (group info &optional server) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index c382a54..fb18a1c 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -35,6 +35,7 @@ (require 'nnoo) (eval-when-compile (require 'cl)) (require 'gnus-util) +(require 'gnus-range) (nnoo-declare nnfolder) @@ -373,7 +374,14 @@ all. This may very well take some time.") (buffer-substring (point) (progn (end-of-line) (point))) force nnfolder-inhibit-expiry)) - (nnheader-message 5 "Deleting article %d..." + (unless (eq nnmail-expiry-target 'delete) + (with-temp-buffer + (nnfolder-request-article (car maybe-expirable) + newsgroup server (current-buffer)) + (let ((nnml-current-directory nil)) + (nnmail-expiry-target-group + nnmail-expiry-target newsgroup)))) + (nnheader-message 5 "Deleting article %d in %s..." (car maybe-expirable) newsgroup) (nnfolder-delete-mail) (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) diff --git a/lisp/nnmbox.el b/lisp/nnmbox.el index 5c3a674..a064c93 100644 --- a/lisp/nnmbox.el +++ b/lisp/nnmbox.el @@ -269,6 +269,14 @@ (buffer-substring (point) (progn (end-of-line) (point))) force)) (progn + (unless (eq nnmail-expiry-target 'delete) + (with-temp-buffer + (nnmbox-request-article (car articles) + newsgroup server + (current-buffer)) + (let ((nnml-current-directory nil)) + (nnmail-expiry-target-group + nnmail-expiry-target newsgroup)))) (nnheader-message 5 "Deleting article %d in %s..." (car articles) newsgroup) (nnmbox-delete-mail)) diff --git a/lisp/nnmh.el b/lisp/nnmh.el index 6551b2f..934f67d 100644 --- a/lisp/nnmh.el +++ b/lisp/nnmh.el @@ -295,6 +295,13 @@ as unread by Gnus.") (setq is-old (nnmail-expired-article-p newsgroup mod-time force))) (progn + ;; Allow a special target group. -- jcn + (unless (eq nnmail-expiry-target 'delete) + (with-temp-buffer + (nnmh-request-article (car articles) + newsgroup server (current-buffer)) + (nnmail-expiry-target-group + nnmail-expiry-target newsgroup))) (nnheader-message 5 "Deleting article %s in %s..." article newsgroup) (condition-case () diff --git a/lisp/smime.el b/lisp/smime.el index 530ed8d..2f40b62 100644 --- a/lisp/smime.el +++ b/lisp/smime.el @@ -36,6 +36,11 @@ ;; Especially, don't expect this library to buy security for you. If ;; you don't understand what you are doing, you're as likely to lose ;; security than gain any by using this library. +;; +;; This library is not intended to provide a "raw" API for S/MIME, +;; PKCSx or similar, it's intended to perform common operations +;; done on messages encoded in these formats. The terminology chosen +;; reflect this. ;;; Quick introduction: @@ -156,7 +161,7 @@ If nil, use system defaults." string) :group 'dig) -(defvar smime-details-buffer "*S/MIME OpenSSL output*") +(defvar smime-details-buffer "*OpenSSL output*") ;; OpenSSL wrappers. @@ -240,28 +245,25 @@ nil." ;; Verify+decrypt region (defun smime-verify-region (b e) - (let ((buffer (generate-new-buffer (generate-new-buffer-name "*smime*"))) + (let ((buffer (get-buffer-create smime-details-buffer)) (CAs (cond (smime-CA-file (list "-CAfile" (expand-file-name smime-CA-file))) (smime-CA-directory (list "-CApath" (expand-file-name smime-CA-directory))) (t (error "No CA configured."))))) - (prog1 - (if (apply 'smime-call-openssl-region b e buffer "smime" "-verify" CAs) - (message "S/MIME message verified succesfully.") - (message "S/MIME message NOT verified successfully.") - nil) - (with-current-buffer (get-buffer-create smime-details-buffer) - (goto-char (point-max)) - (insert-buffer buffer)) - (kill-buffer buffer)))) - + (with-current-buffer buffer + (erase-buffer)) + (if (apply 'smime-call-openssl-region b e buffer "smime" "-verify" CAs) + (message "S/MIME message verified succesfully.") + (message "S/MIME message NOT verified successfully.") + nil))) + (defun smime-decrypt-region (b e keyfile) (let ((buffer (generate-new-buffer (generate-new-buffer-name "*smime*"))) CAs) (when (apply 'smime-call-openssl-region b e buffer "smime" "-decrypt" - "-recip" keyfile) + "-recip" (list keyfile)) ) (with-current-buffer (get-buffer-create smime-details-buffer) @@ -285,11 +287,60 @@ Uses current buffer if BUFFER is nil, queries user of KEYFILE is nil." (with-current-buffer (or buffer (current-buffer)) (smime-decrypt-region (point-min) (point-max) - (or keyfile - (smime-get-key-by-email - (completing-read "Decrypt with which key? " smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys)))))))) + (expand-file-name + (or keyfile + (smime-get-key-by-email + (completing-read "Decrypt with which key? " smime-keys nil nil + (and (listp (car-safe smime-keys)) + (caar smime-keys))))))))) + +;; Various operations + +(defun smime-pkcs7-region (b e) + "Convert S/MIME message between points B and E into a PKCS7 message." + (let ((buffer (get-buffer-create smime-details-buffer))) + (with-current-buffer buffer + (erase-buffer)) + (when (smime-call-openssl-region b e buffer "smime" "-pk7out") + (delete-region b e) + (insert-buffer-substring buffer) + t))) + +(defun smime-pkcs7-certificates-region (b e) + "Extract any certificates enclosed in PKCS7 message between points B and E." + (let ((buffer (get-buffer-create smime-details-buffer))) + (with-current-buffer buffer + (erase-buffer)) + (when (smime-call-openssl-region b e buffer "pkcs7" "-print_certs" "-text") + (delete-region b e) + (insert-buffer-substring buffer) + t))) + +(defun smime-pkcs7-email-region (b e) + "Get email addresses contained in certificate between points B and E. +A string or a list of strings is returned." + (let ((buffer (get-buffer-create smime-details-buffer))) + (with-current-buffer buffer + (erase-buffer)) + (when (smime-call-openssl-region b e buffer "x509" "-email" "-noout") + (delete-region b e) + (insert-buffer-substring buffer) + t))) + +(defalias 'smime-point-at-eol + (if (fboundp 'point-at-eol) + 'point-at-eol + 'line-end-position)) + +(defun smime-buffer-as-string-region (b e) + "Return each line in region between B and E as a list of strings." + (save-excursion + (goto-char b) + (let (res) + (while (< (point) e) + (push (buffer-substring (point) (smime-point-at-eol)) res) + (forward-line)) + res))) ;; Find certificates diff --git a/texi/ChangeLog b/texi/ChangeLog index a6581fb..df70d52 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,7 @@ +2000-11-29 20:00:00 ShengHuo ZHU + + * gnus.texi (Fancy Mail Splitting): Add. + 2000-11-20 08:00:00 ShengHuo ZHU * gnus.texi (Archived Messages): Add. diff --git a/texi/gnus.texi b/texi/gnus.texi index c78b215..293154d 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -11858,8 +11858,10 @@ specified by @code{nnmail-message-id-cache-file} for the message ids. When it has found a parent, it returns the corresponding group name. It is recommended that you set @code{nnmail-message-id-cache-length} to a somewhat higher number than the default so that the message ids are -still in the cache. (A value of 5000 appears to create a file some -300 kBytes in size.) +still in the cache. (A value of 5000 appears to create a file some 300 +kBytes in size.) When @code{nnmail-cache-accepted-message-ids} is +non-nil, Gnus also records the message ids of moved articles, so that +the followup messages goes into the new group. @node Group Mail Splitting diff --git a/todo b/todo index 3aded8c..be0bfb8 100644 --- a/todo +++ b/todo @@ -3,6 +3,8 @@ * Emphasis delimiters show when `W W c'. + [Fixed] + * Parsing of the common list confirmation requests so that Gnus can prepare the response with a single command. Including LISTSERV periodic ping messages and the like. @@ -1433,6 +1435,8 @@ exceeding lisp nesting on huge groups. into [-] buttons. (If I click on one of the [+] buttons, it does turn into a [-] button.) + [fixed] + * Perhaps there should be a command to "attach" a buffer of comments to a message? That is, `B WHATEVER', you're popped into a buffer, write something, end with `C-c C-c', and then the thing you've -- 1.7.10.4