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