'all' match added. Better header parsing. Behavior of test mode change.
authorFrederic Jolliton <frederic@jolliton.com>
Thu, 11 Nov 2004 14:33:01 +0000 (14:33 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Thu, 11 Nov 2004 14:33:01 +0000 (14:33 +0000)
* Added 'all' match. It's always matching any mail.
  It allow catchall rule.
* Better header parsing. Headers were not normalized for blank
  when using a partial match (.domain/.address/.name). Part
  name '.raw' added ('from.raw' is equivalent to 'from'.)
* Test mode behavior changed. Now, it list summary of matching
  rules.
* Fixed a bug on the output when checking a configuration (with -c).
git-archimport-id: frederic@jolliton.com--2004-private/mail-filter--main--0.1.1--patch-3

confparser.py
mailfilter.py

index 3c6b872..bfe0841 100644 (file)
@@ -153,7 +153,7 @@ class Folder( Validator , MixinNonEmpty ) :
 
 def ruleValidator( item ) :
 
-       if item in [ 'broken' , 'infected' , 'spam' ] :
+       if item in [ 'broken' , 'infected' , 'spam' , 'all' ] :
                return Keyword( item )
        elif item in [ 'or' , 'and' , 'not' ] :
                return Logical( item )
index 15653f7..6738ca0 100644 (file)
@@ -624,23 +624,27 @@ def testRule( rule ) :
                        return False
                args = rule[ 1 ]
                headerName , matchType , text = args
+               text = normalizeBlank( text )
+               if headerName.find( '.' ) != -1 :
+                       headerName , partName = headerName.split( '.' , 1 )
+                       partName = partName.lower()
+               else :
+                       partName = 'raw'
                headers = g_mail.get_all( headerName ) or []
                headers = map( decodeHeader , headers )
-               if headerName.find( '.' ) != -1 :
+
+               if partName != 'raw' :
                        #
                        # Support for .name, .address and .domain part.
                        #
                        # Example:
                        #
-                       # 'From: Frederic Jolliton <frederic@jolliton.com>, a@b.c (Foo)'
+                       # with 'From: Frederic Jolliton <frederic@jolliton.com>, a@b.c (Foo)'
                        #
-                       # 'From'         -> [ 'Frederic Jolliton <frederic@jolliton.com>' , 'a@b.c (Foo)' ]
                        # 'From.name'    -> [ 'Frederic Jolliton' , 'Foo' ]
                        # 'From.address' -> [ 'frederic@jolliton.com' , 'a@b.c' ]
                        # 'From.domain'  -> [ 'jolliton.com' , 'b.c' ]
                        #
-                       headerName , partName = headerName.split( '.' , 1 )
-                       partName = partName.lower()
                        if partName not in [ 'name' , 'address' , 'domain' ] :
                                logMessage( 'Unknown header part %r' % partName )
                                return False
@@ -651,8 +655,7 @@ def testRule( rule ) :
                                headers = [ adr[ 1 ] for adr in adrs ]
                        elif partName == 'domain' :
                                headers = [ adr[ 1 ].split( '@' )[ -1 ] for adr in adrs ]
-               else :
-                       headers = map( normalizeBlank , headers )
+
                return some( headers , lambda header : ruleMatch( header , matchType , text ) )
 
        #
@@ -674,6 +677,12 @@ def testRule( rule ) :
                return g_mail != None and not spamScan()
 
        #
+       # Catchall
+       #
+       if cmd == 'all' :
+               return True
+
+       #
        # Unknown rule
        #
        logMessage( 'Unknown rule name `%s\'.' % ( cmd , ) )
@@ -707,6 +716,9 @@ def checkUserRules( user ) :
                        actionName , args , subs = item[ : 3 ]
 
                        if some( subs , testRule ) :
+                               if g_testMode :
+                                       logMessage( 'MATCH: %s %s { ... }' % ( actionName , ' '.join( args ) ) )
+                                       continue
                                if actionName == 'folder' :
                                        action = FileToFolderAction( args[ 0 ] )
                                elif actionName == 'reject' :
@@ -792,6 +804,8 @@ def parseMail() :
 def dispatchMail() :
 
        action = checkUserRules( g_user )
+       if g_testMode :
+               return 0
 
        #
        # If custom error code is returned, stop processing
@@ -880,7 +894,7 @@ def checkConfiguration( filename ) :
        except Exception , e :
                print e
        else :
-               print filename , ok
+               print filename , 'ok'
 
 #-----------------------------------------------------------------------------