From c638d8c81038b2007b8bebcdbe6a062073c2b99e Mon Sep 17 00:00:00 2001 From: Florent Bruneau Date: Sun, 15 Jun 2008 16:26:50 +0200 Subject: [PATCH] Can disable moderation of Unsures. Signed-off-by: Florent Bruneau --- bin/lists.rpc.py | 57 ++++++++++++++++++++++++++++++++++----------- modules/lists.php | 15 ++++++++++-- templates/lists/options.tpl | 42 ++++++++++++++++++++++++++++----- 3 files changed, 93 insertions(+), 21 deletions(-) diff --git a/bin/lists.rpc.py b/bin/lists.rpc.py index 67abde0..2346d4b 100755 --- a/bin/lists.rpc.py +++ b/bin/lists.rpc.py @@ -684,6 +684,7 @@ def del_from_wl(userdesc, perms, vhost, listname, addr): return 0 def get_bogo_level(userdesc, perms, vhost, listname): + """ Compute bogo level from the filtering rules set up on the list. """ try: mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: @@ -691,21 +692,37 @@ def get_bogo_level(userdesc, perms, vhost, listname): try: if not is_admin_on(userdesc, perms, mlist): return 0 - if mlist.header_filter_rules == []: + if len(mlist.header_filter_rules) == 0: return 0 + + unsurelevel = 0 + filterlevel = 0 + filterbase = 0 + + # The first rule filters Unsure mails + if mlist.header_filter_rules[0][0] == 'X-Spam-Flag: Unsure, tests=bogofilter': + unsurelevel = 1 + filterbase = 1 + + # Check the other rules: + # - we have 2 rules: this is level 2 (drop > 0.999999, moderate Yes) + # - we have only one rule with HOLD directive : this is level 1 (moderate spams) + # - we have only one rule with DISCARD directive : this is level 3 (drop spams) try: - action = mlist.header_filter_rules[2][1] - return 2 + action = mlist.header_filter_rules[filterbase + 1][1] + filterlevel = 2 except: - action = mlist.header_filter_rules[1][1] + action = mlist.header_filter_rules[filterbase][1] if action == mm_cfg.HOLD: - return 1 - if action == mm_cfg.DISCARD: - return 3 + filterlevel = 1 + elif action == mm_cfg.DISCARD: + filterlevel = 3 + return (filterlevel << 1) + unsurelevel except: return 0 def set_bogo_level(userdesc, perms, vhost, listname, level): + """ set filter to the specify level. """ try: mlist = MailList.MailList(vhost+VHOST_SEP+listname.lower(), lock=0) except: @@ -714,16 +731,29 @@ def set_bogo_level(userdesc, perms, vhost, listname, level): if not is_admin_on(userdesc, perms, mlist): return 0 hfr = [] - if int(level) is 1: + + # The level is a combination of a spam filtering level and unsure filtering level + # - the unsure filtering level is only 1 bit (1 = HOLD unsures, 0 = Accept unsures) + # - the spam filtering level is a number growing with filtering strength + # (0 = no filtering, 1 = moderate spam, 2 = drop 0.999999 and moderate others, 3 = drop spams) + bogolevel = int(level) + filterlevel = bogolevel >> 1 + unsurelevel = bogolevel & 1 + + # Set up unusre filtering + if unsurelevel == 1: hfr.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False)) + + # Set up spam filtering + if filterlevel is 1: hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False)) - elif int(level) is 2: - hfr.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False)) + elif filterlevel is 2: hfr.append(('X-Spam-Flag: Yes, tests=bogofilter, spamicity=(0\.999999|1\.000000)', mm_cfg.DISCARD, False)) hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False)) - elif int(level) is 3: - hfr.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False)) + elif filterlevel is 3: hfr.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.DISCARD, False)) + + # save configuration if mlist.header_filter_rules != hfr: mlist.Lock() mlist.header_filter_rules = hfr @@ -884,6 +914,7 @@ def create_list(userdesc, perms, vhost, listname, desc, advertise, modlevel, ins + "http://listes.polytechnique.org/members/" + inverted_listname mlist.header_filter_rules = [] + mlist.header_filter_rules.append(('X-Spam-Flag: Unsure, tests=bogofilter', mm_cfg.HOLD, False)) mlist.header_filter_rules.append(('X-Spam-Flag: Yes, tests=bogofilter', mm_cfg.HOLD, False)) mlist.Save() @@ -1041,4 +1072,4 @@ server.register_function(kill) server.serve_forever() -# vim:set et: +# vim:set et sw=4 sts=4 sws=4: diff --git a/modules/lists.php b/modules/lists.php index de95560..bc6078b 100644 --- a/modules/lists.php +++ b/modules/lists.php @@ -631,7 +631,16 @@ class ListsModule extends PLModule if (Post::has('submit')) { $values = $_POST; $values = array_map('utf8_decode', $values); - $this->client->set_bogo_level($liste, intval($values['bogo_level'])); + $spamlevel = intval($values['bogo_level']); + $unsurelevel = intval($values['unsure_level']); + if ($spamlevel == 0) { + $unsurelevel = 0; + } + if ($spamlevel > 3 || $spamlevel < 0 || $unsurelevel < 0 || $unsurelevel > 1) { + $page->trigError("Réglage de l'antispam non valide"); + } else { + $this->client->set_bogo_level($liste, ($spamlevel << 1) + $unsurelevel); + } switch($values['moderate']) { case '0': $values['generic_nonmember_action'] = 0; @@ -664,7 +673,9 @@ class ListsModule extends PLModule if (list($details,$options) = $this->client->get_owner_options($liste)) { $page->assign_by_ref('details', $details); $page->assign_by_ref('options', $options); - $page->assign('bogo_level', $this->client->get_bogo_level($liste)); + $bogo_level = intval($this->client->get_bogo_level($liste)); + $page->assign('unsure_level', $bogo_level & 1); + $page->assign('bogo_level', $bogo_level >> 1); } else { $page->kill("La liste n'existe pas ou tu n'as pas le droit de l'administrer"); } diff --git a/templates/lists/options.tpl b/templates/lists/options.tpl index 0dc2feb..d71d2b8 100644 --- a/templates/lists/options.tpl +++ b/templates/lists/options.tpl @@ -130,18 +130,48 @@ Tu n'es pas administrateur de la liste, mais du site. détermine la politique de l'antispam sur cette liste. - que faire des mails marqués « [spam probable] » ?
- les laisser passer ;
- les envoyer aux modérateurs pour approbation...
- ... après suppression des +
+ que faire des mails marqués « [spam probable] » ?
+ les laisser passer ;
+ les envoyer aux modérateurs pour approbation...
+ ... après suppression des spams les plus probables* ;
- tous les supprimer. + tous les supprimer. +
+
+ que faire des mails dont le classement est indéterminé** ?
+ les laisser + passer ;
+ les modérer. +
+ *La troisième option permet de supprimer automatiquement les spams sûrs à plus de 99,9999%, qui sont donc peu susceptibles - d'être des faux-positifs. + d'être des faux-positifs.
+ **Certains mails ne sont pas classables par l'antispam qui le signale en indiquant que le mail est "Unsure". Ces + mails contiennent statistiquement autant de spams que de non-spams, mais ceci peut varier d'une adresse à l'autre. + Cette option the permet de choisir si tu préfères que les mails 'Unsures' soient modérés ou envoyés diretement + à la liste. -- 2.1.4