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:
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:
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
+ "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()
server.serve_forever()
-# vim:set et:
+# vim:set et sw=4 sts=4 sws=4:
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;
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");
}
<span class='smaller'>détermine la politique de l'antispam sur cette liste.</span>
</td>
<td>
- <em><a name='antispam' id='antispam'></a>que faire des mails marqués « [spam probable] » ?</em><br />
- <input type='radio' name='bogo_level' value='0' {if !$bogo_level}checked='checked'{/if} /> les laisser passer ;<br />
- <input type='radio' name='bogo_level' value='1' {if $bogo_level eq 1}checked='checked'{/if} /> les envoyer aux modérateurs pour approbation...<br />
- <input type='radio' name='bogo_level' value='2' {if $bogo_level eq 2}checked='checked'{/if} /> ... après suppression des
+ <div id="spamlevel">
+ <em><a name='antispam' id='antispam'></a>que faire des mails marqués « [spam probable] » ?</em><br />
+ <input type='radio' name='bogo_level' value='0' {if !$bogo_level}checked='checked'{/if} /> les laisser passer ;<br />
+ <input type='radio' name='bogo_level' value='1' {if $bogo_level eq 1}checked='checked'{/if} /> les envoyer aux modérateurs pour approbation...<br />
+ <input type='radio' name='bogo_level' value='2' {if $bogo_level eq 2}checked='checked'{/if} /> ... après suppression des
spams les plus probables* ;<br />
- <input type='radio' name='bogo_level' value='3' {if $bogo_level eq 3}checked='checked'{/if} /> tous les supprimer.
+ <input type='radio' name='bogo_level' value='3' {if $bogo_level eq 3}checked='checked'{/if} /> tous les supprimer.
+ </div>
+ <div id="unsurelevel">
+ <em>que faire des mails dont le classement est indéterminé** ?</em><br />
+ <input type='radio' name='unsure_level' value='0' {if !$unsure_level}checked='checked'{/if} /> les laisser
+ passer ;<br />
+ <input type='radio' name='unsure_level' value='1' {if $unsure_level eq 1}checked='checked'{/if} /> les modérer.
+ </div>
+ <script type="text/javascript">//<![CDATA[
+ {literal}
+ function hideUnsure() {
+ if ($(":radio[@name=bogo_level]:checked").val() == 0) {
+ $("#unsurelevel").hide();
+ } else {
+ $("#unsurelevel").show();
+ }
+ }
+
+ $(document).ready(
+ function() {
+ hideUnsure();
+ $(":radio[@name=bogo_level]").change(function() { hideUnsure(); });
+ }
+ );
+ {/literal}
+ // ]]></script>
</td>
</tr>
<tr>
<td colspan="2" class="smaller">
*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.<br />
+ **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.
</td>
</tr>
</table>