Gnus development mailing list
 help / color / mirror / Atom feed
From: asjo@koldfront.dk (Adam Sjøgren)
Subject: Re: CRM114 Mailfilter and spam.el
Date: Sun, 04 Apr 2004 01:59:13 +0200	[thread overview]
Message-ID: <877jwwfwa6.fsf@virgil.koldfront.dk> (raw)
In-Reply-To: <87isgjpggh.fsf@virgil.koldfront.dk>

[-- Attachment #1: Type: text/plain, Size: 1048 bytes --]

On Thu, 01 Apr 2004 22:54:06 +0200, Adam wrote:

> So, I've begun to take a stab at switcing from spam-stat.el to
> CRM114 Mailfilter and spam.el.

Attached is a patch for spam.el that adds support for CRM114
Mailfilter (until the general external statistical processor interface
is designed/implemented).

It is basically the bogofilter stuff copied, search/replaced and
modified slightly.

(Included is also the two small changes in the patch in
 <87oeq8g1up.fsf@virgil.koldfront.dk>).

To use it, I set this in my .gnus:

 spam-use-crm114 t
 spam-crm114-path "/usr/share/crm114/mailfilter.crm"
 spam-crm114-database-directory "--fileprefix=/home/asjo/.crm114/"

As you can see from the comments, I couldn't figure out how to
automatically add '--fileprefix=' to the database directory when set,
so I took the easy, ugly way out.


  Best regards,

    Adam

-- 
 "Mr. Cotton's... parrot. Same question."                     Adam Sjøgren
                                                         asjo@koldfront.dk

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: crm114-mailfilter.patch --]
[-- Type: text/x-patch, Size: 14514 bytes --]

*** spam.el	2 Apr 2004 19:09:16 -0000	7.27
--- spam.el	3 Apr 2004 23:55:02 -0000
***************
*** 263,268 ****
--- 263,273 ----
    :type 'boolean
    :group 'spam)
  
+ (defcustom spam-use-crm114 nil
+   "Whether CRM114 Mailfilter should be used by `spam-split'."
+   :type 'boolean
+   :group 'spam)
+ 
  (defcustom spam-install-hooks (or
  			       spam-use-dig
  			       spam-use-gmane-xref
***************
*** 281,287 ****
  			       spam-use-BBDB-exclusive
  			       spam-use-ifile
  			       spam-use-stat
! 			       spam-use-spamoracle)
    "Whether the spam hooks should be installed.
  Default to t if one of the spam-use-* variables is set."
    :group 'spam
--- 286,293 ----
  			       spam-use-BBDB-exclusive
  			       spam-use-ifile
  			       spam-use-stat
! 			       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
***************
*** 515,520 ****
--- 521,573 ----
    :type 'string
    :group 'spam-spamassassin)
  
+ (defgroup spam-crm114 nil
+   "Spam CRM114 Mailfilter configuration."
+   :group 'spam)
+ 
+ (defcustom spam-crm114-path (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
***************
*** 605,610 ****
--- 658,664 ----
      (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-spamassassin spam spam-use-spamassassin)
+     (gnus-group-spam-exit-processor-crm114       spam spam-use-crm114)
      (gnus-group-ham-exit-processor-ifile         ham spam-use-ifile)
      (gnus-group-ham-exit-processor-bogofilter    ham spam-use-bogofilter)
      (gnus-group-ham-exit-processor-stat          ham spam-use-stat)
***************
*** 612,618 ****
      (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))
    "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.")
--- 666,673 ----
      (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-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.")
***************
*** 657,662 ****
--- 712,720 ----
  (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))
  
***************
*** 678,683 ****
--- 736,744 ----
  (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.
  Respects the process/prefix convention."
***************
*** 686,691 ****
--- 747,753 ----
      (gnus-summary-remove-process-mark article)
      (spam-report-gmane article)))
  
+ ; asjo: Perhaps add spam-crm114-score here? How?
  (defun spam-generic-score ()
    (interactive)
    "Invoke whatever scoring method we can."
***************
*** 718,724 ****
  	     (new-articles (spam-list-articles
  			    gnus-newsgroup-articles
  			    classification))
! 	     (changed-articles (spam-set-difference new-articles old-articles)))
  	;; now that we have the changed articles, we go through the processors
  	(dolist (processor-param spam-list-of-processors)
  	  (let ((processor (nth 0 processor-param))
--- 780,786 ----
  	     (new-articles (spam-list-articles
  			    gnus-newsgroup-articles
  			    classification))
! 	     (changed-articles (gnus-set-difference new-articles old-articles)))
  	;; now that we have the changed articles, we go through the processors
  	(dolist (processor-param spam-list-of-processors)
  	  (let ((processor (nth 0 processor-param))
***************
*** 776,783 ****
        (spam-ham-copy-routine
         (gnus-parameter-ham-process-destination gnus-newsgroup-name)))
  
!     ;; now move all ham articles out of spam groups
!     (when (spam-group-spam-contents-p gnus-newsgroup-name)
        (gnus-message 5 "Moving ham messages from spam group")
        (spam-ham-move-routine
         (gnus-parameter-ham-process-destination gnus-newsgroup-name))))
--- 838,845 ----
        (spam-ham-copy-routine
         (gnus-parameter-ham-process-destination gnus-newsgroup-name)))
  
!     ;; now move all ham articles out of non-ham groups
!     (when (not (spam-group-ham-contents-p gnus-newsgroup-name))
        (gnus-message 5 "Moving ham messages from spam group")
        (spam-ham-move-routine
         (gnus-parameter-ham-process-destination gnus-newsgroup-name))))
***************
*** 785,804 ****
    (setq spam-old-ham-articles nil)
    (setq spam-old-spam-articles nil))
  
- (defun spam-set-difference (list1 list2)
-   "Return a set difference of LIST1 and LIST2.  
- When either list is nil, the other is returned."
-   (if (and list1 list2)
-       ;; we have two non-nil lists
-       (progn
- 	(dolist (item (append list1 list2))
- 	  (when (and (memq item list1) (memq item list2))
- 	    (setq list1 (delq item list1))
- 	    (setq list2 (delq item list2))))
- 	(append list1 list2))
-     ;; if either of the lists was nil, return the other one
-     (if list1 list1 list2)))
- 
  (defun spam-mark-junk-as-spam-routine ()
    ;; check the global list of group names spam-junk-mailgroups and the
    ;; group parameters
--- 847,852 ----
***************
*** 859,865 ****
  	 (gnus-check-backend-function
  	  'request-move-article gnus-newsgroup-name))
  	(respool-method (gnus-find-method-for-group gnus-newsgroup-name))
! 	article mark todo deletep respool)
  
      (when (member 'respool groups)
        (setq respool t)			; boolean for later
--- 907,913 ----
  	 (gnus-check-backend-function
  	  'request-move-article gnus-newsgroup-name))
  	(respool-method (gnus-find-method-for-group gnus-newsgroup-name))
! 	article mark deletep respool)
  
      (when (member 'respool groups)
        (setq respool t)			; boolean for later
***************
*** 1006,1012 ****
      (spam-use-spamassassin-headers 	. 	spam-check-spamassassin-headers)
      (spam-use-spamassassin 		. 	spam-check-spamassassin)
      (spam-use-bogofilter-headers 	. 	spam-check-bogofilter-headers)
!     (spam-use-bogofilter 	 	. 	spam-check-bogofilter))
    "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,
--- 1054,1061 ----
      (spam-use-spamassassin-headers 	. 	spam-check-spamassassin-headers)
      (spam-use-spamassassin 		. 	spam-check-spamassassin)
      (spam-use-bogofilter-headers 	. 	spam-check-bogofilter-headers)
!     (spam-use-bogofilter 	 	. 	spam-check-bogofilter)
!     (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,
***************
*** 1028,1034 ****
      spam-use-bogofilter
      spam-use-blackholes
      spam-use-spamassassin
!     spam-use-spamoracle)
    "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,
--- 1077,1084 ----
      spam-use-bogofilter
      spam-use-blackholes
      spam-use-spamassassin
!     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,
***************
*** 1209,1215 ****
      (spam-use-bogofilter spam-bogofilter-register-ham-routine
  			 spam-bogofilter-register-spam-routine
  			 spam-bogofilter-unregister-ham-routine
! 			 spam-bogofilter-unregister-spam-routine))
    "The spam-registration-functions list contains pairs
  associating a parameter variable with the ham and spam
  registration functions, and the ham and spam unregistration
--- 1259,1270 ----
      (spam-use-bogofilter spam-bogofilter-register-ham-routine
  			 spam-bogofilter-register-spam-routine
  			 spam-bogofilter-unregister-ham-routine
! 			 spam-bogofilter-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
***************
*** 2162,2167 ****
--- 2217,2307 ----
  
  (defun spam-spamassassin-unregister-ham-routine (articles)
    (spam-spamassassin-register-with-sa-learn articles nil 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-path
+ 		 nil temp-buffer-name nil
+ 		 (if db `("", db) `("")))) ; asjo: I don't know how to do this right.
+                                            ;       I'd like to add --fileprefix=db if
+                                            ;       db is set.
+ 	(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-path
+ 		 nil nil nil switch
+ 		 (if db `("", db) `("")))))))) ; asjo: See above.
+ 
+ (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
  

  parent reply	other threads:[~2004-04-03 23:59 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-04-01 20:54 Adam Sjøgren
2004-04-02  6:22 ` Kai Grossjohann
2004-04-02 16:04   ` Adam Sjøgren
2004-04-03 13:28     ` Kai Grossjohann
2004-04-03 14:01       ` Adam Sjøgren
2004-04-05 13:21         ` Ted Zlatanov
2004-04-02 16:06   ` Adam Sjøgren
2004-04-02 17:14     ` Ted Zlatanov
2004-04-03 21:10       ` Adam Sjøgren
2004-04-03 21:19         ` Adam Sjøgren
2004-04-03 21:48           ` Adam Sjøgren
2004-04-03 21:58             ` Adam Sjøgren
2004-04-03 13:29     ` Kai Grossjohann
2004-04-03 13:49       ` Adam Sjøgren
2004-04-06  8:12         ` Kai Grossjohann
2004-04-06 21:40           ` Adam Sjøgren
2004-04-02 16:10   ` Jody Klymak
2004-04-02 17:07   ` Ted Zlatanov
2004-04-02 17:06 ` Ted Zlatanov
2004-04-02 17:26   ` Adam Sjøgren
2004-04-02 17:44     ` Ted Zlatanov
2004-04-03 14:22       ` Adam Sjøgren
2004-04-03 14:24         ` Adam Sjøgren
2004-04-03 23:59 ` Adam Sjøgren [this message]
2004-04-04  1:59   ` Jesper Harder
2004-04-04 13:07     ` Adam Sjøgren
2004-04-05 13:24       ` Ted Zlatanov
2004-04-05 15:50         ` Jesper Harder
2004-04-06 21:36       ` Adam Sjøgren
2004-05-20 18:39         ` Ted Zlatanov
2004-05-20 19:19           ` Adam Sjøgren
2004-05-22 23:44             ` Lars Magne Ingebrigtsen
2004-05-23 13:44               ` Adam Sjøgren
2004-05-26 16:23             ` Ted Zlatanov
2004-05-26 20:30               ` Adam Sjøgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877jwwfwa6.fsf@virgil.koldfront.dk \
    --to=asjo@koldfront.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).