Match type selection for filters
authorJamie Cameron <jcameron@webmin.com>
Fri, 27 Mar 2009 18:57:12 +0000 (18:57 +0000)
committerJamie Cameron <jcameron@webmin.com>
Fri, 27 Mar 2009 18:57:12 +0000 (18:57 +0000)
filter/CHANGELOG
filter/edit.cgi
filter/filter-lib.pl
filter/lang/ca
filter/lang/cz
filter/lang/de
filter/lang/el
filter/lang/en
filter/lang/fi
filter/lang/nl
filter/save.cgi

index 0fbd0da..614cfa9 100644 (file)
@@ -21,3 +21,4 @@ If spam deletion above some level level is configured globally or for the user's
 Autoreply messages containing non-ASCII characters are now properly quoted-printable encoded.
 ---- Changes since 1.400 ----
 Filters that deliver to mbox-format folders now have locking enabled.
+Creation of filters that match headers is now less error-prone, due to a new menu for selecting if it should match the start, end or any part of the header.
index 504ed72..07cadb4 100755 (executable)
@@ -51,11 +51,28 @@ print &ui_table_row(
        &ui_textbox("condlevel", $filter->{'condlevel'}, 4), undef, \@tds);
 
 # Check some header
-@headers = ( "From", "To", "Subject", "Cc", "Reply-To" );
+@headers = ( "From", "To", "Subject", "Cc", "Reply-To", "List-Id" );
 $common = &indexoflc($filter->{'condheader'}, @headers) >= 0;
+if ($filter->{'condvalue'} =~ /^\.\*(.*)\$$/) {
+       # Ends with
+       $condvalue = $1;
+       $condmode = 2;
+       }
+elsif ($filter->{'condvalue'} =~ /^\.\*(.*)\.\*$/ ||
+       $filter->{'condvalue'} =~ /^\.\*(.*)$/) {
+       # Contains
+       $condvalue = $1;
+       $condmode = 1;
+       }
+elsif ($filter->{'condvalue'} =~ /^(.*)\.\*$/ ||
+       $filter->{'condvalue'} =~ /^(.*)$/) {
+       # Starts with
+       $condvalue = $1;
+       $condmode = 0;
+       }
 print &ui_table_row(
        &ui_oneradio("cmode", 4, $text{'edit_cmode4'}, $cmode == 4),
-       &text('edit_cheader',
+       &text('edit_cheader2',
              &ui_select("condmenu", $cmode != 4 ? "From" :
                                     $common ? $filter->{'condheader'} : "",
                         [ (map { [ $_ ] } @headers),
@@ -65,8 +82,11 @@ print &ui_table_row(
              &ui_textbox("condheader",
                          $common ? "" : $filter->{'condheader'}, 20,
                          $cmode != 4 || $common),
-             &ui_textbox("condvalue",
-                         $filter->{'condvalue'}, 40)),
+             &ui_select("condmode", $condmode,
+                        [ [ 0, $text{'edit_modestart'} ],
+                          [ 1, $text{'edit_modecont'} ],
+                          [ 2, $text{'edit_modeend'} ] ]),
+             &ui_textbox("condvalue", $condvalue, 40)),
        undef, \@tds);
 
 # Smaller
index 8f36889..66ea734 100644 (file)
@@ -482,9 +482,23 @@ elsif ($f->{'condlevel'}) {
        $cond = &text('index_clevel', $f->{'condlevel'});
        }
 elsif ($f->{'condheader'}) {
-       $cond = &text('index_cheader',
-               "<tt>".&html_escape($f->{'condheader'})."</tt>",
-               "<tt>".&html_escape($f->{'condvalue'})."</tt>");
+       if ($f->{'condvalue'} =~ /^\.\*(.*)\$$/) {
+               $cond = &text('index_cheader2',
+                       "<tt>".&html_escape($f->{'condheader'})."</tt>",
+                       "<tt>".&html_escape($1)."</tt>");
+               }
+       elsif ($f->{'condvalue'} =~ /^\.\*(.*)\.\*$/ ||
+              $f->{'condvalue'} =~ /^\.\*(.*)$/) {
+               $cond = &text('index_cheader1',
+                       "<tt>".&html_escape($f->{'condheader'})."</tt>",
+                       "<tt>".&html_escape($1)."</tt>");
+               }
+       elsif ($f->{'condvalue'} =~ /^(.*)\.\*$/ ||
+              $f->{'condvalue'} =~ /^(.*)$/) {
+               $cond = &text('index_cheader0',
+                       "<tt>".&html_escape($f->{'condheader'})."</tt>",
+                       "<tt>".&html_escape($1)."</tt>");
+               }
        }
 elsif ($f->{'condtype'} eq '<' || $f->{'condtype'} eq '>') {
        $cond = &text('index_csize'.$f->{'condtype'},
index a6d1a90..0a18b12 100755 (executable)
@@ -41,7 +41,6 @@ edit_title2=Edici
 edit_header1=Condició del filtre
 edit_cmode0=Tot el correu
 edit_cmode4=Basat en la capçalera
-edit_cheader=La capçalera $1$2 ha de coincidir $3
 edit_cmode3=El correu és més petit de
 edit_cmode2=El correu és més gran de
 edit_cmode5=Correu classificat com a spam
index c37ad6f..cae6339 100644 (file)
@@ -24,7 +24,6 @@ edit_amode5=Vykonat klasifikaci na nevy
 edit_amode6=Odeslat automatickou odpovìï
 edit_amode7=Ulo¾it nové jméno adresáøe
 edit_cbody=Aplikovat na tìlo zprávy
-edit_cheader=Hlavièka $1$2 se musí shodnout s $3
 edit_cmode0=V¹echny emaily
 edit_cmode1=Na základì regulérního výrazu
 edit_cmode2=Email vìt¹í ne¾
index 1dea7d3..4fe91c1 100644 (file)
@@ -24,7 +24,6 @@ edit_amode5=F&#252;hre Spam Klassifizierung durch
 edit_amode6=Sende automatische Antwort
 edit_amode7=Speichere in neuem Ordner mit dem Namen
 edit_cbody=Anwenden auf Nachrichten Body
-edit_cheader=Header $1$2 muss mit $3 &#252;bereinstimmen
 edit_cmode0=Alle E-Mail
 edit_cmode1=Basierend auf regul&#228;rem Ausdruck
 edit_cmode2=E-Mail gr&#246;sser als
index 3103745..6872300 100755 (executable)
@@ -35,7 +35,6 @@ edit_title2=
 edit_header1=ÓõíèÞêç ãéá ößëôñï
 edit_cmode0=¼ëá ôá email
 edit_cmode4=ÂÜóç ôçò åðéêåöáëßäáò
-edit_cheader=Ç åðéêåöáëßäá $1$2 èá ðñÝðåé íá ôáéñéÜæåé ìå $3
 edit_cmode3=Ôï ìÝãåèïò ôïõ email åßíáé ìéêñüôåñï áðü
 edit_cmode2=Ôï ìÝãåèïò ôïõ email åßíáé ìåãáëýôåñï áðü
 edit_cmode5=ÊáôÜôáîç email ùò spam
index 3b8db75..7541be9 100644 (file)
@@ -9,7 +9,12 @@ index_addauto=Quick automatic reply setup.
 index_addfwd=Quick forwarding setup.
 index_cspam=Email is spam
 index_clevel=Spam score is at least $1
-index_cheader=Header $1 matches $2
+index_cheader0=Header $1 must start with $2
+index_cheader1=Header $1 must contain $2
+index_cheader2=Header $1 must end with $2
+edit_modestart=starts with
+edit_modecont=contains
+edit_modeend=ends with
 index_cre=Headers match $1
 index_cre2=Body matches $1
 index_calways=Always
@@ -41,7 +46,7 @@ edit_title2=Edit Filter
 edit_header1=Condition for filter
 edit_cmode0=All email
 edit_cmode4=Based on header
-edit_cheader=Header $1$2 must match $3
+edit_cheader2=Header $1$2 $3 $4
 edit_cmode3=Email smaller than
 edit_cmode2=Email larger than
 edit_cmode5=Email classified as spam
index 6c1f157..ee2fe3f 100644 (file)
@@ -35,7 +35,6 @@ edit_title2=Muokkaa suodatinta
 edit_header1=Suodattimen ehto
 edit_cmode0=Kaikki sähköpostit
 edit_cmode4=Täsmäävä otsake
-edit_cheader=Otsakkeen $1$2 täytyy täsmätä $3
 edit_cmode3=Sähköposti pienempi kuin
 edit_cmode2=Sähköposti suurempi kuin
 edit_cmode5=Sähköposti luokiteltu roskapostiksi
index b92f69c..54741fd 100644 (file)
@@ -24,7 +24,6 @@ edit_amode5=Maak een spam classificatie
 edit_amode6=Stuur automatisch antwoord
 edit_amode7=Opslaan naar nieuw folder genaamd
 edit_cbody=Toevoegen aan berichten body
-edit_cheader=Header $1$2 moet overeenkomen met $3
 edit_cmode0=Alle email
 edit_cmode1=Gebaseerd op regulaire expressies
 edit_cmode2=Email groter dan
index a81a7e9..0d5f501 100755 (executable)
@@ -49,7 +49,15 @@ else {
                $filter->{'condheader'} = $in{'condmenu'} || $in{'condheader'};
                $filter->{'condheader'} =~ /^[a-zA-Z0-9\-]+$/ ||
                        &error($text{'save_econdheader'});
-               $filter->{'condvalue'} = $in{'condvalue'};
+               if ($in{'condmode'} == 0) {
+                       $filter->{'condvalue'} = $in{'condvalue'};
+                       }
+               elsif ($in{'condmode'} == 1) {
+                       $filter->{'condvalue'} = ".*".$in{'condvalue'}.".*";
+                       }
+               else {
+                       $filter->{'condvalue'} = ".*".$in{'condvalue'}."\$";
+                       }
                }
        elsif ($in{'cmode'} == 3) {
                # Smaller than some size