X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fspam.el;h=26c0f5b9fcc665185a3914e9160283ac965e3c0e;hb=3d85d98a62f648aad4e5509d3a9741091142030d;hp=cb7578be0e91cac3393cb123e95ca5753ff82404;hpb=82c6196c14fefc853a52e60cd67430915d52e612;p=gnus diff --git a/lisp/spam.el b/lisp/spam.el index cb7578be0..26c0f5b9f 100644 --- a/lisp/spam.el +++ b/lisp/spam.el @@ -43,6 +43,7 @@ (eval-when-compile (require 'cl)) (eval-when-compile (require 'spam-report)) (eval-when-compile (require 'hashcash)) +(eval-when-compile (require 'ietf-drums)) (require 'gnus-sum) @@ -109,6 +110,7 @@ a group through group/topic parameters overrides this mechanism." (defcustom spam-mark-new-messages-in-spam-group-as-spam t "Whether new messages in a spam group should get the spam-mark." :type 'boolean + ;; :version "22.1" ;; Gnus 5.10.8 / No Gnus 0.3 :group 'spam) (defcustom spam-log-to-registry nil @@ -1155,6 +1157,8 @@ backends)." (push 'X-Spam-Status list)) (when spam-use-bogofilter (push 'X-Bogosity list)) + (when spam-use-crm114 + (push 'X-CRM114-Status list)) list)) (defun spam-user-format-function-S (headers) @@ -1173,26 +1177,37 @@ backends)." (return)))) result)) +(defvar spam-spamassassin-score-regexp + ".*\\b\\(?:score\\|hits\\)=\\(-?[0-9.]+\\)" + "Regexp matching SpamAssassin score header. +The first group must match the number.") +;; "score" for Spamassassin 3.0 or later: +;; X-Spam-Status: Yes, score=13.1 required=5.0 tests=DNS_FROM_RFC_ABUSE, +;; [...],UNDISC_RECIPS autolearn=disabled version=3.0.3 + + (defun spam-extra-header-to-number (header headers) "Transform an extra HEADER to a number, using list of HEADERS. Note this has to be fast." - (if (gnus-extra-header header headers) - (cond - ((eq header 'X-Spam-Status) - (string-to-number (gnus-replace-in-string - (gnus-extra-header header headers) - ".*hits=" ""))) - ;; for CRM checking, it's probably faster to just do the string match - ((and spam-use-crm114 (string-match "( pR: \\([0-9.-]+\\)" header)) - (match-string 1 header)) - ((eq header 'X-Bogosity) - (string-to-number (gnus-replace-in-string - (gnus-replace-in-string - (gnus-extra-header header headers) - ".*spamicity=" "") - ",.*" ""))) - (t nil)) - nil)) + (let ((header-content (gnus-extra-header header headers))) + (if header-content + (cond + ((eq header 'X-Spam-Status) + (string-to-number (gnus-replace-in-string + header-content + spam-spamassassin-score-regexp + "\\1"))) + ;; for CRM checking, it's probably faster to just do the string match + ((and spam-use-crm114 (string-match "( pR: \\([0-9.-]+\\)" header-content)) + (string-to-number (match-string 1 header-content))) + ((eq header 'X-Bogosity) + (string-to-number (gnus-replace-in-string + (gnus-replace-in-string + header-content + ".*spamicity=" "") + ",.*" ""))) + (t nil)) + nil))) (defun spam-summary-score (headers &optional specific-header) "Score an article for the summary buffer, as fast as possible. @@ -2066,12 +2081,12 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." "Enter an address into the BBDB; implies ham (non-spam) sender" (dolist (from addresses) (when (stringp from) - (let* ((parsed-address (gnus-extract-address-components from)) - (name (or (nth 0 parsed-address) "Ham Sender")) + (let* ((parsed-address (ietf-drums-parse-address from)) + (name (or (nth 1 parsed-address) "Ham Sender")) (remove-function (if remove 'bbdb-delete-record-internal 'ignore)) - (net-address (nth 1 parsed-address)) + (net-address (nth 0 parsed-address)) (record (and net-address (bbdb-search-simple nil net-address)))) (when net-address @@ -2115,7 +2130,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." bbdb-hashtable)))) (puthash 'spam-use-BBDB bbdb-cache spam-caches))) (when who - (setq who (nth 1 (gnus-extract-address-components who))) + (setq who (car (ietf-drums-parse-address who))) (if (if spam-cache-lookups (intern-soft (downcase who) bbdb-cache) @@ -2365,7 +2380,7 @@ REMOVE not nil, remove the ADDRESSES." (forward-line 1) ;; insert the e-mail address if detected, otherwise the raw data (unless (zerop (length address)) - (let ((pure-address (nth 1 (gnus-extract-address-components address)))) + (let ((pure-address (car (ietf-drums-parse-address address)))) (push (or pure-address address) contents))))) (nreverse contents)))) @@ -2504,7 +2519,7 @@ REMOVE not nil, remove the ADDRESSES." (if db `("-d" ,db "-v") `("-v")))) (setq return (spam-check-bogofilter-headers score)))) return) - (gnus-error "`spam.el' doesnt support obsolete bogofilter versions"))) + (gnus-error 5 "`spam.el' doesn't support obsolete bogofilter versions"))) (defun spam-bogofilter-register-with-bogofilter (articles spam @@ -2530,7 +2545,7 @@ REMOVE not nil, remove the ADDRESSES." spam-bogofilter-path nil nil nil switch (if db `("-d" ,db "-v") `("-v"))))))) - (gnus-error "`spam.el' doesnt support obsolete bogofilter versions"))) + (gnus-error 5 "`spam.el' doesn't support obsolete bogofilter versions"))) (defun spam-bogofilter-register-spam-routine (articles &optional unregister) (spam-bogofilter-register-with-bogofilter articles t unregister)) @@ -2615,8 +2630,7 @@ REMOVE not nil, remove the ADDRESSES." (if score ; scoring mode (let ((header (message-fetch-field spam-spamassassin-spam-status-header))) (when header - (if (string-match "\\(?:score\\|hits\\)=\\(-?[0-9.]+\\)" header) - ;; "score" for Spamassassin 3.0 or later. + (if (string-match spam-spamassassin-score-regexp header) (match-string 1 header) "0"))) ;; spam detection mode