* spam.el (spam-use-crm114, spam-crm114, spam-crm114-program)
authorTeodor Zlatanov <tzz@lifelogs.com>
Thu, 20 May 2004 18:53:28 +0000 (18:53 +0000)
committerTeodor Zlatanov <tzz@lifelogs.com>
Thu, 20 May 2004 18:53:28 +0000 (18:53 +0000)
(spam-crm114-header, spam-crm114-spam-switch)
(spam-crm114-spam-strong-switch, spam-crm114-ham-strong-switch)
(spam-crm114-positive-spam-header)
(spam-crm114-database-directory, spam-list-of-processors)
(spam-group-spam-processor-crm114-p)
(spam-group-ham-processor-crm114-p, spam-extra-header-to-number)
(spam-generic-score, spam-list-of-checks)
(spam-list-of-statistical-checks, spam-registration-functions)
(spam-check-crm114-headers, spam-crm114-score)
(spam-check-crm114, spam-crm114-register-with-crm114)
(spam-crm114-register-spam-routine)
(spam-crm114-unregister-spam-routine)
(spam-crm114-register-ham-routine)
(spam-crm114-unregister-ham-routine): add CRM114 support.  From
asjo@koldfront.dk (Adam Sjøgren).

* gnus.el: added spam-use-crm114

lisp/ChangeLog
lisp/gnus.el
lisp/spam.el

index ed737f8..c25b084 100644 (file)
@@ -1,5 +1,24 @@
 2004-05-20  Teodor Zlatanov  <tzz@lifelogs.com>
 
+       * spam.el (spam-use-crm114, spam-crm114, spam-crm114-program)
+       (spam-crm114-header, spam-crm114-spam-switch)
+       (spam-crm114-spam-strong-switch, spam-crm114-ham-strong-switch)
+       (spam-crm114-positive-spam-header)
+       (spam-crm114-database-directory, spam-list-of-processors)
+       (spam-group-spam-processor-crm114-p)
+       (spam-group-ham-processor-crm114-p, spam-extra-header-to-number)
+       (spam-generic-score, spam-list-of-checks)
+       (spam-list-of-statistical-checks, spam-registration-functions)
+       (spam-check-crm114-headers, spam-crm114-score)
+       (spam-check-crm114, spam-crm114-register-with-crm114)
+       (spam-crm114-register-spam-routine)
+       (spam-crm114-unregister-spam-routine)
+       (spam-crm114-register-ham-routine)
+       (spam-crm114-unregister-ham-routine): add CRM114 support.  From
+       asjo@koldfront.dk (Adam Sj\e,Ax\e(Bgren).
+
+       * gnus.el: added spam-use-crm114
+
        * spam.el (spam-list-of-processors, spam-registration-functions):
        add spam-use-resend
        (spam-group-spam-processor-report-resend-p): utility wrapper
index 747e3fb..8bc84e6 100644 (file)
@@ -1901,6 +1901,7 @@ Only applicable to non-spam (unclassified and ham) groups.")
            (const :tag "Spam: Spam Oracle"   (spam spam-use-spamoracle))
            (const :tag "Spam: Spam-stat"     (spam spam-use-stat))
            (const :tag "Spam: SpamAssassin"  (spam spam-use-spamassassin))
+           (const :tag "Spam: CRM114"        (spam spam-use-crm114))
            (const :tag "Ham: BBDB"           (ham spam-use-BBDB))
            (const :tag "Ham: Bogofilter"     (ham spam-use-bogofilter))
            (const :tag "Ham: Bsfilter"       (ham spam-use-bsfilter))
@@ -1909,6 +1910,7 @@ Only applicable to non-spam (unclassified and ham) groups.")
            (const :tag "Ham: Spam Oracle"    (ham spam-use-spamoracle))
            (const :tag "Ham: Spam-stat"      (ham spam-use-stat))
            (const :tag "Ham: SpamAssassin"   (ham spam-use-spamassassin))
+           (const :tag "Ham: CRM114"         (ham spam-use-crm114))
            (const :tag "Ham: Whitelist"      (ham spam-use-whitelist)))))
    :function-document
    "Which spam or ham processors will be applied when the summary is exited."
@@ -1947,6 +1949,7 @@ spam processing, associated with the appropriate processor."
                   (const :tag "Spam: Spam-stat"     (spam spam-use-stat))
                   (const :tag "Spam: Spam Oracle"   (spam spam-use-spamoracle))
                   (const :tag "Spam: SpamAssassin"  (spam spam-use-spamassassin))
+                  (const :tag "Spam: CRM114"        (spam spam-use-crm114))
                   (const :tag "Ham: BBDB"           (ham spam-use-BBDB))
                   (const :tag "Ham: Bogofilter"     (ham spam-use-bogofilter))
                   (const :tag "Ham: Bsfilter"       (ham spam-use-bsfilter))
@@ -1955,6 +1958,7 @@ spam processing, associated with the appropriate processor."
                   (const :tag "Ham: Spam-stat"      (ham spam-use-stat))
                   (const :tag "Ham: Spam Oracle"    (ham spam-use-spamoracle))
                   (const :tag "Ham: SpamAssassin"   (ham spam-use-spamassassin))
+                  (const :tag "Ham: CRM114"         (ham spam-use-crm114))
                   (const :tag "Ham: Whitelist"      (ham spam-use-whitelist)))))
 
    :parameter-document
@@ -2001,6 +2005,7 @@ spam-autodetect-recheck-messages is set.")
          (variable-item spam-use-BBDB)
          (variable-item spam-use-ifile)
          (variable-item spam-use-spamoracle)
+         (variable-item spam-use-crm114)
          (variable-item spam-use-spamassassin)
          (variable-item spam-use-spamassassin-headers)
          (variable-item spam-use-bsfilter)
@@ -2037,6 +2042,7 @@ set."
        (variable-item spam-use-BBDB)
        (variable-item spam-use-ifile)
        (variable-item spam-use-spamoracle)
+       (variable-item spam-use-crm114)
        (variable-item spam-use-stat)
        (variable-item spam-use-blackholes)
        (variable-item spam-use-hashcash)
index 49fc504..c24be26 100644 (file)
@@ -276,6 +276,11 @@ them."
   :type 'boolean
   :group 'spam)
 
+(defcustom spam-use-crm114 nil
+  "Whether the CRM114 Mailfilter should be used by `spam-split'."
+  :type 'boolean
+  :group 'spam)
+
 (defcustom spam-install-hooks (or
                               spam-use-dig
                               spam-use-gmane-xref
@@ -296,7 +301,8 @@ them."
                               spam-use-BBDB-exclusive
                               spam-use-ifile
                               spam-use-stat
-                              spam-use-spamoracle)
+                              spam-use-spamoracle
+                              spam-use-crm114)
   "Whether the spam hooks should be installed.
 Default to t if one of the spam-use-* variables is set."
   :group 'spam
@@ -577,6 +583,53 @@ order for SpamAssassin to recognize the new registered spam."
   :type 'string
   :group 'spam-spamassassin)
 
+(defgroup spam-crm114 nil
+  "Spam CRM114 Mailfilter configuration."
+  :group 'spam)
+
+(defcustom spam-crm114-program (executable-find "mailfilter.crm")
+  "File path of the CRM114 Mailfilter executable program."
+  :type '(choice (file :tag "Location of CRM114 Mailfilter")
+        (const :tag "CRM114 Mailfilter is not installed"))
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-header "X-CRM114-Status"
+  "The header that CRM114 Mailfilter inserts in messages."
+  :type 'string
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-spam-switch "--learnspam"
+  "The switch that CRM114 Mailfilter uses to register spam messages."
+  :type 'string
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-ham-switch "--learnnonspam"
+  "The switch that CRM114 Mailfilter uses to register ham messages."
+  :type 'string
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-spam-strong-switch "--UNKNOWN"
+  "The switch that CRM114 Mailfilter uses to unregister ham messages."
+  :type 'string
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-ham-strong-switch "--UNKNOWN"
+  "The switch that CRM114 Mailfilter uses to unregister spam messages."
+  :type 'string
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-positive-spam-header "^SPAM"
+  "The regex on `spam-crm114-header' for positive spam identification."
+  :type 'regexp
+  :group 'spam-crm114)
+
+(defcustom spam-crm114-database-directory nil
+  "Directory path of the CRM114 Mailfilter databases."
+  :type '(choice (directory
+         :tag "Location of the CRM114 Mailfilter database directory")
+        (const :tag "Use the default"))
+  :group 'spam-crm114)
+
 ;;; Key bindings for spam control.
 
 (gnus-define-keys gnus-summary-mode-map
@@ -660,7 +713,7 @@ finds ham or spam.")
     nil))
 
 (defvar spam-list-of-processors
-  ;; note the resend and gmane processors are not defined in gnus.el
+  ;; note the CRM114, resend and gmane processors are not defined in gnus.el
   '((gnus-group-spam-exit-processor-report-gmane spam spam-use-gmane)
     (gnus-group-spam-exit-processor-report-resend spam spam-use-resend)
     (gnus-group-spam-exit-processor-bogofilter   spam spam-use-bogofilter)
@@ -669,6 +722,7 @@ finds ham or spam.")
     (gnus-group-spam-exit-processor-ifile        spam spam-use-ifile)
     (gnus-group-spam-exit-processor-stat         spam spam-use-stat)
     (gnus-group-spam-exit-processor-spamoracle   spam spam-use-spamoracle)
+    (gnus-group-spam-exit-processor-crm114       spam spam-use-crm114)
     (gnus-group-spam-exit-processor-spamassassin spam spam-use-spamassassin)
     (gnus-group-ham-exit-processor-ifile         ham spam-use-ifile)
     (gnus-group-ham-exit-processor-bogofilter    ham spam-use-bogofilter)
@@ -678,7 +732,8 @@ finds ham or spam.")
     (gnus-group-ham-exit-processor-BBDB          ham spam-use-BBDB)
     (gnus-group-ham-exit-processor-copy          ham spam-use-ham-copy)
     (gnus-group-ham-exit-processor-spamassassin  ham spam-use-spamassassin)
-    (gnus-group-ham-exit-processor-spamoracle    ham spam-use-spamoracle))
+    (gnus-group-ham-exit-processor-spamoracle    ham spam-use-spamoracle)
+    (gnus-group-ham-exit-processor-crm114        ham spam-use-crm114))
   "The `spam-list-of-processors' list.
 This list contains pairs associating a ham/spam exit processor
 variable with a classification and a spam-use-* variable.")
@@ -726,6 +781,9 @@ variable with a classification and a spam-use-* variable.")
 (defun spam-group-spam-processor-spamoracle-p (group)
   (spam-group-processor-p group 'gnus-group-spam-exit-processor-spamoracle))
 
+(defun spam-group-spam-processor-crm114-p (group)
+  (spam-group-processor-p group 'gnus-group-spam-exit-processor-crm114))
+
 (defun spam-group-ham-processor-bogofilter-p (group)
   (spam-group-processor-p group 'gnus-group-ham-exit-processor-bogofilter))
 
@@ -747,6 +805,9 @@ variable with a classification and a spam-use-* variable.")
 (defun spam-group-ham-processor-spamoracle-p (group)
   (spam-group-processor-p group 'gnus-group-ham-exit-processor-spamoracle))
 
+(defun spam-group-ham-processor-crm114-p (group)
+  (spam-group-processor-p group 'gnus-group-ham-exit-processor-crm114))
+
 (defun spam-report-articles-gmane (n)
   "Report the current message as spam via Gmane.
 Respects the process/prefix convention."
@@ -797,6 +858,9 @@ Respects the process/prefix convention.  Also see
        (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))
        (t nil))
     nil))
 
@@ -823,6 +887,8 @@ Will not return a nil score."
     (spam-spamassassin-score recheck))
    ((or spam-use-bsfilter spam-use-bsfilter-headers)
     (spam-bsfilter-score recheck))
+   (spam-use-crm114
+    (spam-crm114-score))
    (t (spam-bogofilter-score recheck))))
 
 ;;; Summary entry and exit processing.
@@ -1150,7 +1216,8 @@ When either list is nil, the other is returned."
     (spam-use-bogofilter-headers       .       spam-check-bogofilter-headers)
     (spam-use-bogofilter               .       spam-check-bogofilter)
     (spam-use-bsfilter-headers         .       spam-check-bsfilter-headers)
-    (spam-use-bsfilter                 .       spam-check-bsfilter))
+    (spam-use-bsfilter                 .       spam-check-bsfilter)
+    (spam-use-crm114                   .       spam-check-crm114))
   "The spam-list-of-checks list contains pairs associating a
 parameter variable with a spam checking function.  If the
 parameter variable is true, then the checking function is called,
@@ -1173,7 +1240,8 @@ definitely a spam.")
     spam-use-bsfilter
     spam-use-blackholes
     spam-use-spamassassin
-    spam-use-spamoracle)
+    spam-use-spamoracle
+    spam-use-crm114)
   "The spam-list-of-statistical-checks list contains all the mail
 splitters that need to have the full message body available.
 Note that you should fetch extra headers if you don't like this,
@@ -1362,7 +1430,12 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
     (spam-use-bsfilter  spam-bsfilter-register-ham-routine
                         spam-bsfilter-register-spam-routine
                         spam-bsfilter-unregister-ham-routine
-                        spam-bsfilter-unregister-spam-routine))
+                        spam-bsfilter-unregister-spam-routine)
+    (spam-use-crm114 spam-crm114-register-ham-routine
+                    spam-crm114-register-spam-routine
+                    ;; does CRM114 Mailfilter support unregistration?
+                    nil
+                    nil))
   "The spam-registration-functions list contains pairs
 associating a parameter variable with the ham and spam
 registration functions, and the ham and spam unregistration
@@ -2407,6 +2480,89 @@ REMOVE not nil, remove the ADDRESSES."
 (defun spam-bsfilter-unregister-ham-routine (articles)
   (spam-bsfilter-register-ham-routine articles t))
 
+\f
+;;;; CRM114 Mailfilter
+(defun spam-check-crm114-headers (&optional score)
+  (let ((header (message-fetch-field spam-crm114-header))
+       (spam-split-group (if spam-split-symbolic-return
+                             'spam
+                           spam-split-group)))
+    (when header                       ; return nil when no header
+      (if score                                ; scoring mode
+         (if (string-match "( pR: \\([0-9.-]+\\)" header)
+             (match-string 1 header)
+           "0")
+       ;; spam detection mode
+       (when (string-match spam-crm114-positive-spam-header
+                           header)
+         spam-split-group)))))
+
+;; return something sensible if the score can't be determined
+(defun spam-crm114-score ()
+  "Get the CRM114 Mailfilter pR"
+  (interactive)
+  (save-window-excursion
+    (gnus-summary-show-article t)
+    (set-buffer gnus-article-buffer)
+    (let ((score (or (spam-check-crm114-headers t)
+                    (spam-check-crm114 t))))
+      (gnus-summary-show-article)
+      (message "pR: %s" score)
+      (or score "0"))))
+
+(defun spam-check-crm114 (&optional score)
+  "Check the CRM114 Mailfilter backend for the classification of this message"
+  (let ((article-buffer-name (buffer-name))
+       (db spam-crm114-database-directory)
+       return)
+    (with-temp-buffer
+      (let ((temp-buffer-name (buffer-name)))
+       (save-excursion
+         (set-buffer article-buffer-name)
+         (apply 'call-process-region
+                (point-min) (point-max)
+                spam-crm114-program
+                nil temp-buffer-name nil
+                 (when db (list (concat "--fileprefix=" db)))))
+       (setq return (spam-check-crm114-headers score))))
+    return))
+
+(defun spam-crm114-register-with-crm114 (articles
+                                        spam
+                                        &optional unregister)
+  "Register an article, given as a string, as spam or non-spam."
+  (dolist (article articles)
+    (let ((article-string (spam-get-article-as-string article))
+         (db spam-crm114-database-directory)
+         (switch (if unregister
+                     (if spam
+                         spam-crm114-spam-strong-switch
+                       spam-crm114-ham-strong-switch)
+                   (if spam
+                       spam-crm114-spam-switch
+                     spam-crm114-ham-switch))))
+      (when (stringp article-string)
+       (with-temp-buffer
+         (insert article-string)
+
+         (apply 'call-process-region
+                (point-min) (point-max)
+                spam-crm114-program
+                nil nil nil
+                 (when db (list switch (concat "--fileprefix=" db)))))))))
+
+(defun spam-crm114-register-spam-routine (articles &optional unregister)
+  (spam-crm114-register-with-crm114 articles t unregister))
+
+(defun spam-crm114-unregister-spam-routine (articles)
+  (spam-crm114-register-spam-routine articles t))
+
+(defun spam-crm114-register-ham-routine (articles &optional unregister)
+  (spam-crm114-register-with-crm114 articles nil unregister))
+
+(defun spam-crm114-unregister-ham-routine (articles)
+  (spam-crm114-register-ham-routine articles t))
+
 \f
 ;;;; Hooks