Can disable moderation of Unsures.
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 15 Jun 2008 14:26:50 +0000 (16:26 +0200)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Sun, 15 Jun 2008 14:26:50 +0000 (16:26 +0200)
Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
bin/lists.rpc.py
modules/lists.php
templates/lists/options.tpl

index 67abde0..2346d4b 100755 (executable)
@@ -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:
index de95560..bc6078b 100644 (file)
@@ -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");
         }
index 0dc2feb..d71d2b8 100644 (file)
@@ -130,18 +130,48 @@ Tu n'es pas administrateur de la liste, mais du site.
         <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&nbsp;;<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&nbsp;;<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*&nbsp;;<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&nbsp;;<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>