From 2f065bb32b1b6f96557e320ed7cb730bd9eaab59 Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Fri, 27 Mar 2009 18:57:12 +0000 Subject: [PATCH] Match type selection for filters --- filter/CHANGELOG | 1 + filter/edit.cgi | 28 ++++++++++++++++++++++++---- filter/filter-lib.pl | 20 +++++++++++++++++--- filter/lang/ca | 1 - filter/lang/cz | 1 - filter/lang/de | 1 - filter/lang/el | 1 - filter/lang/en | 9 +++++++-- filter/lang/fi | 1 - filter/lang/nl | 1 - filter/save.cgi | 10 +++++++++- 11 files changed, 58 insertions(+), 16 deletions(-) diff --git a/filter/CHANGELOG b/filter/CHANGELOG index 0fbd0da4f..614cfa928 100644 --- a/filter/CHANGELOG +++ b/filter/CHANGELOG @@ -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. diff --git a/filter/edit.cgi b/filter/edit.cgi index 504ed72d1..07cadb49b 100755 --- a/filter/edit.cgi +++ b/filter/edit.cgi @@ -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 diff --git a/filter/filter-lib.pl b/filter/filter-lib.pl index 8f36889fe..66ea734b4 100644 --- a/filter/filter-lib.pl +++ b/filter/filter-lib.pl @@ -482,9 +482,23 @@ elsif ($f->{'condlevel'}) { $cond = &text('index_clevel', $f->{'condlevel'}); } elsif ($f->{'condheader'}) { - $cond = &text('index_cheader', - "".&html_escape($f->{'condheader'})."", - "".&html_escape($f->{'condvalue'}).""); + if ($f->{'condvalue'} =~ /^\.\*(.*)\$$/) { + $cond = &text('index_cheader2', + "".&html_escape($f->{'condheader'})."", + "".&html_escape($1).""); + } + elsif ($f->{'condvalue'} =~ /^\.\*(.*)\.\*$/ || + $f->{'condvalue'} =~ /^\.\*(.*)$/) { + $cond = &text('index_cheader1', + "".&html_escape($f->{'condheader'})."", + "".&html_escape($1).""); + } + elsif ($f->{'condvalue'} =~ /^(.*)\.\*$/ || + $f->{'condvalue'} =~ /^(.*)$/) { + $cond = &text('index_cheader0', + "".&html_escape($f->{'condheader'})."", + "".&html_escape($1).""); + } } elsif ($f->{'condtype'} eq '<' || $f->{'condtype'} eq '>') { $cond = &text('index_csize'.$f->{'condtype'}, diff --git a/filter/lang/ca b/filter/lang/ca index a6d1a90b1..0a18b123c 100755 --- a/filter/lang/ca +++ b/filter/lang/ca @@ -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 diff --git a/filter/lang/cz b/filter/lang/cz index c37ad6f6d..cae633905 100644 --- a/filter/lang/cz +++ b/filter/lang/cz @@ -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¾ diff --git a/filter/lang/de b/filter/lang/de index 1dea7d316..4fe91c198 100644 --- a/filter/lang/de +++ b/filter/lang/de @@ -24,7 +24,6 @@ edit_amode5=Fü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 übereinstimmen edit_cmode0=Alle E-Mail edit_cmode1=Basierend auf regulärem Ausdruck edit_cmode2=E-Mail grösser als diff --git a/filter/lang/el b/filter/lang/el index 31037454d..687230078 100755 --- a/filter/lang/el +++ b/filter/lang/el @@ -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 diff --git a/filter/lang/en b/filter/lang/en index 3b8db7542..7541be932 100644 --- a/filter/lang/en +++ b/filter/lang/en @@ -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 diff --git a/filter/lang/fi b/filter/lang/fi index 6c1f157db..ee2fe3f6b 100644 --- a/filter/lang/fi +++ b/filter/lang/fi @@ -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 diff --git a/filter/lang/nl b/filter/lang/nl index b92f69c72..54741fd59 100644 --- a/filter/lang/nl +++ b/filter/lang/nl @@ -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 diff --git a/filter/save.cgi b/filter/save.cgi index a81a7e932..0d5f5012e 100755 --- a/filter/save.cgi +++ b/filter/save.cgi @@ -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