new emails layout
authorx2000habouzit <x2000habouzit>
Sat, 4 Sep 2004 14:40:02 +0000 (14:40 +0000)
committerx2000habouzit <x2000habouzit>
Sat, 4 Sep 2004 14:40:02 +0000 (14:40 +0000)
htdocs/admin/utilisateurs.php
htdocs/antispam.php
htdocs/emails.php
htdocs/pattecassee.php
htdocs/routage-mail.php
include/email.classes.inc.php
scripts/migration.sql
templates/routage-mail.tpl

index 3c4dc4a..dc4cf00 100644 (file)
@@ -18,7 +18,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: utilisateurs.php,v 1.19 2004-09-02 23:57:43 x2000bedo Exp $
+        $Id: utilisateurs.php,v 1.20 2004-09-04 14:40:02 x2000habouzit Exp $
  ***************************************************************************/
 
 require("auto.prepend.inc.php");
@@ -64,8 +64,8 @@ foreach($_POST as $key => $val) {
                 $errors[] = "invalid email $email";
                 break;
             }
-            $globals->db->query("INSERT INTO emails (uid,num,email,flags) 
-                                VALUES ({$_REQUEST['user_id']},{$_REQUEST['num']},'$email','active')");
+            $globals->db->query("INSERT INTO emails (uid,email,flags) 
+                                VALUES ({$_REQUEST['user_id']},'$email','active')");
             $errors[] = "Ajout de $email effectué";
             break;
 
@@ -180,9 +180,9 @@ if(isset($mr)) {
     $page->assign('lastlogin', $lastlogin);
     $page->assign('host', $host);
 
-    $sql = "SELECT email, num, flags, panne
-           FROM emails
-           WHERE num != 0 AND uid = {$mr['user_id']} order by num";
+    $sql = "SELECT email, flags, panne
+              FROM emails
+            WHERE NOT FIND_IN_SET('filter',flags) AND uid = {$mr['user_id']}";
     $result=$globals->db->query($sql);
     $xorgmails = Array();
     $email_panne = Array();
@@ -190,7 +190,6 @@ if(isset($mr)) {
        $xorgmails[] = $l;
        if($l['panne']!="0000-00-00")
            $email_panne[] = "Adresse {$l['email']} signalée comme HS le {$l['panne']}";
-       $next_num = $l['num']+1;
     }
     mysql_free_result($result);
 
@@ -200,7 +199,6 @@ if(isset($mr)) {
                       ORDER BY  type!= 'a_vie'", 'aliases');
     $page->assign_by_ref('xorgmails', $xorgmails);
     $page->assign_by_ref('email_panne', $email_panne);
-    $page->assign('next_num', $next_num);
 }
 
 $page->assign('errors',$errors);
index d71b10f..62357b7 100644 (file)
@@ -18,7 +18,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: antispam.php,v 1.7 2004-08-31 22:01:30 x2000habouzit Exp $
+        $Id: antispam.php,v 1.8 2004-09-04 14:40:02 x2000habouzit Exp $
  ***************************************************************************/
 
 require("auto.prepend.inc.php");
@@ -27,43 +27,43 @@ new_skinned_page('antispam.tpl', AUTH_MDP);
 require("mtic.inc.php");
 
 if (isset($_REQUEST['filtre']) and isset($_REQUEST['statut_filtre'])) {
-    // mise à jour du filtre
-    $result = $globals->db->query("select find_in_set('drop', flags) from emails where uid = {$_SESSION['uid']} and num = 0 and find_in_set('active', flags)");
-    list($filtre) = mysql_fetch_row($result);
-    mysql_free_result($result);
-    $new_filtre = (integer)$_REQUEST['statut_filtre'];
-    if ($new_filtre == 0 and isset($filtre)) {
-        // désactive le filtre
-        // échange les flags active et filtre d'un seul coup (de manière atomique)
-        $globals->db->query("UPDATE emails SET flags=IF(num=0, REPLACE(flags,'active','filtre'), REPLACE(flags,'filtre','active'))
-                     WHERE uid={$_SESSION['uid']} AND (find_in_set('active',flags) OR FIND_IN_SET('filtre',flags))");
-        // supprime la ligne num=0
-        $globals->db->query("delete from emails where uid={$_SESSION['uid']} and num = 0");
-    } elseif ($new_filtre != 0) {
-        // active le filtre
-        // ajoute la ligne num=0 avec le bon pipe et un flag filtre et pas de flag active
-        //  si le filtre n'est pas déjà actif et directement en actif si le filtre est déjà actif.
-        $globals->db->query("replace into emails set uid = {$_SESSION['uid']}, num = 0,
-                     email = '\"|maildrop /var/mail/.maildrop_filters/"
-                    .($new_filtre == 2 ? 'drop_spams':'tag_spams')." {$_SESSION['uid']}\"',
-                     flags = '".(isset($filtre) ? 'active' : 'filtre')
-                    .($new_filtre == 2 ? ',drop' : '')."'");
-        // échange les flags active et filtre d'un seul coup (de manière atomique) si le filtre n'est pas déjà actif
-        if (!isset($filtre))
-            $globals->db->query("UPDATE emails
-                         SET flags=IF(FIND_IN_SET('active',flags), REPLACE(flags,'active','filtre'), REPLACE(flags,'filtre','active'))
-                         WHERE uid={$_SESSION['uid']} AND (FIND_IN_SET('active',flags) OR FIND_IN_SET('filtre',flags))");
+    
+    $new_filter = intval($_REQUEST['statut_filtre']);
+    
+    $res = $globals->db->query("SELECT COUNT(*) FROM emails WHERE uid={$_SESSION['uid']} AND find_in_set('filter', flags)");
+    list($was_filter) = mysql_fetch_row($res);
+    mysql_free_result($res);
+
+    if ($new_filter == 0 && $was_filter) {
+       $globals->db->query("DELETE FROM emails WHERE uid = {$_SESSION['uid']} AND find_in_set('filter', flags)");
+    }
+
+    if ($new_filter != 0) {
+       $pipe = $new_filter == 2 ? 'drop_spams' : 'tag_spams';
+       if($was_filter) {
+           $globals->db->query("UPDATE  emails
+                                   SET  email = '\"|maildrop /var/mail/.maildrop_filters/$pipe {$_SESSION['uid']}\"'
+                                 WHERE  uid = {$_SESSION['uid']} AND flags = 'filter'");
+       } else {
+           $globals->db->query("INSERT INTO emails
+                                        SET uid = {$_SESSION['uid']},
+                                            email = '\"|maildrop /var/mail/.maildrop_filters/$pipe {$_SESSION['uid']}\"',
+                                            flags = 'filter'");
+       }
     }
 }
 
-$result = $globals->db->query("SELECT FIND_IN_SET('drop', flags)!=0
+$result = $globals->db->query("SELECT email LIKE '%drop_spams%'
                                 FROM emails
-                                WHERE uid = {$_SESSION['uid']} AND num = 0 AND find_in_set('active', flags)");
-list($filtre) = mysql_fetch_row($result);
-$filtre += mysql_num_rows($result);
+                               WHERE uid = {$_SESSION['uid']} AND find_in_set('filter', flags)");
+if(mysql_num_rows($result)) {
+    list($n) = mysql_fetch_row($result);
+    $page->assign('filtre',intval($n)+1);
+} else {
+    $page->assign('filtre',0);
+}
 mysql_free_result($result);
 
-$page->assign('filtre',$filtre);
 
 $page->run();
 ?>
index 38b2f6a..c479a6b 100644 (file)
@@ -18,7 +18,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: emails.php,v 1.5 2004-09-02 22:27:05 x2000habouzit Exp $
+        $Id: emails.php,v 1.6 2004-09-04 14:40:02 x2000habouzit Exp $
  ***************************************************************************/
 
 require("auto.prepend.inc.php");
@@ -33,7 +33,7 @@ $page->mysql_assign($sql, 'aliases');
 
 $sql = "SELECT email
         FROM emails
-        WHERE uid = {$_SESSION["uid"]} AND num != 0 AND (FIND_IN_SET('active', flags) OR FIND_IN_SET('filtre', flags))";
+        WHERE uid = {$_SESSION["uid"]} AND FIND_IN_SET('active', flags)";
 $page->mysql_assign($sql, 'mails', 'nb_mails');
 
 
index a24bd7e..d65d61a 100644 (file)
@@ -18,7 +18,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: pattecassee.php,v 1.7 2004-09-02 22:27:05 x2000habouzit Exp $
+        $Id: pattecassee.php,v 1.8 2004-09-04 14:40:02 x2000habouzit Exp $
  ***************************************************************************/
 
 require("auto.prepend.inc.php");
@@ -78,7 +78,7 @@ L'
     $page->assign('email',$email);
     $sel = $globals->db->query("SELECT e1.uid, e1.panne != 0 AS panne, count(e2.uid) AS nb_mails, u.nom, u.prenom, u.promo
                         FROM emails as e1
-                        LEFT JOIN emails as e2 ON(e1.uid = e2.uid AND FIND_IN_SET('active', e2.flags) AND e1.num != e2.num)
+                        LEFT JOIN emails as e2 ON(e1.uid = e2.uid AND FIND_IN_SET('active', e2.flags) AND e1.email != e2.email)
                         INNER JOIN auth_user_md5 as u ON(e1.uid = u.user_id)
                         WHERE e1.email ='$email'
                         GROUP BY e1.uid");
index 9f161b8..f55ba07 100644 (file)
@@ -18,7 +18,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: routage-mail.php,v 1.5 2004-09-02 22:27:05 x2000habouzit Exp $
+        $Id: routage-mail.php,v 1.6 2004-09-04 14:40:02 x2000habouzit Exp $
  ***************************************************************************/
 
 require("auto.prepend.inc.php");
@@ -28,8 +28,8 @@ require("email.classes.inc.php");
 $redirect = new Redirect($_SESSION['uid']);
 
 if (isset($_REQUEST['emailop'])) {
-    if ($_REQUEST['emailop']=="retirer" && isset($_REQUEST['num'])) {
-        $page->assign('retour', $redirect->delete_email($_REQUEST['num']));
+    if ($_REQUEST['emailop']=="retirer" && isset($_REQUEST['email'])) {
+        $page->assign('retour', $redirect->delete_email($_REQUEST['email']));
     }
     elseif ($_REQUEST['emailop']=="ajouter" && isset($_REQUEST['email'])) {
         $page->assign('retour', $redirect->add_email(trim($_REQUEST['email'])));
index 451b308..d8dad85 100644 (file)
@@ -18,7 +18,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: email.classes.inc.php,v 1.3 2004-09-02 22:27:06 x2000habouzit Exp $
+        $Id: email.classes.inc.php,v 1.4 2004-09-04 14:40:03 x2000habouzit Exp $
  ***************************************************************************/
 
 require("xorg.misc.inc.php");
@@ -27,50 +27,47 @@ define("SUCCESS", 1);
 define("ERROR_INACTIVE_REDIRECTION", 2);
 define("ERROR_INVALID_EMAIL", 3);
 define("ERROR_LOOP_EMAIL", 4);
-define("ERROR_DUPLICATE_EMAIL", 5);
 
 class Email {
-    var $flag_active = 'active';
-    var $flag_rewrite = 'rewrite';
-    var $flag_m4x = 'm4x';
-    var $num;
     var $email;
     var $active;
     var $rewrite;
-    var $m4x;
     var $mtic;
 
     function Email($row) {
-        list($this->num,$this->email,$this->active,$this->filtre,$this->rewrite,$this->m4x,$this->mtic)
+        list($this->email,$this->active,$this->rewrite,$this->mtic)
         = $row;
     }
 
-    function set_filtre_antispam() {
-        $this->flag_active = 'filtre';
-        $this->active = $this->filtre;
+    function activate($uid) {
+        global $globals;
+        if (!$this->active) {
+            $globals->db->query("UPDATE emails
+                                   SET flags = CONCAT_WS(',',flags,'active')
+                                 WHERE uid=$uid AND email='{$this->email}'");
+           $_SESSION['log']->log("email_on",$this->email);
+            $this->active = true;
+        }
     }
 
-    function set($flag,$uid) {
+    function deactivate($uid) {
         global $globals;
-        if (!$this->{$flag}) {
-            $globals->db->query("update emails set flags = CONCAT_WS(',',flags,'".$this->{'flag_'.$flag}.
-            "') where uid=$uid and num=".$this->num);
-            if ($flag=='active')
-                $_SESSION['log']->log("email_on",$this->email);
-            $this->{$flag} = true;
+        if ($this->active) {
+           $flags = $this->mtic ? 'mtic' : '';
+            $globals->db->query("UPDATE emails
+                                   SET flags ='$flags'
+                                 WHERE uid=$uid AND email='{$this->email}'");
+           $_SESSION['log']->log("email_off",$this->email);
+            $this->active = false;
         }
     }
 
-    function deset($flag,$uid) {
+    function rewrite($rew,$uid) {
         global $globals;
-        if ($this->{$flag}) {
-            $globals->db->query("update emails set flags = flags & 
-            ~(1 << (FIND_IN_SET('".$this->{'flag_'.$flag}."',flags)-1)) 
-            where uid=$uid and num=".$this->num);
-            if ($flag=='active')
-                $_SESSION['log']->log("email_off",$this->email);
-            $this->{$flag} = false;
-        }
+       if($this->rewrite == $rew) return;
+       $globals->db->query("UPDATE emails SET rewrite='$rew' WHERE uid=$uid AND email='{$this->email}'");
+       $this->rewrite = $rew;
+       return;
     }
 }
 
@@ -82,67 +79,42 @@ class Redirect {
     function Redirect($_uid) {
         global $globals;
        $this->uid=$_uid;
-        $result = $globals->db->query("select num, email,
-        FIND_IN_SET('active',flags),FIND_IN_SET('filtre',flags),
-        FIND_IN_SET('rewrite',flags), FIND_IN_SET('m4x',flags), FIND_IN_SET('mtic',flags) 
-        from emails where uid = $_uid");
+        $result = $globals->db->query("
+           SELECT email, FIND_IN_SET('active',flags), rewrite, FIND_IN_SET('mtic',flags) 
+             FROM emails WHERE uid = $_uid AND NOT FIND_IN_SET('filter',flags)");
         while ($row = mysql_fetch_row($result)) {
-            $num = $row[0];
-            if ($num!=0)
-                $this->emails[$num] = new Email($row);
-            else
-                $this->flag_active = 'filtre';
+           $this->emails[] = new Email($row);
         }
-        if ($this->flag_active == 'filtre')
-            foreach($this->emails as $num=>$mail)
-                $this->emails[$num]->set_filtre_antispam();
     }
 
-    function other_active($num) {
-        foreach($this->emails as $i=>$mail)
-            if ($i!=$num && $this->emails[$i]->active)
+    function other_active($email) {
+        foreach($this->emails as $mail)
+            if ($mail->email!=$email && $mail->active)
                 return true;
         return false;
     }
 
-    function duplicate($email) {
-        foreach($this->emails as $num=>$mail)
-            if ($this->emails[$num]->email==$email)
-                return true;
-        return false;
-    }
-
-    function freenum() {
-        $anc = 0;
-        foreach ($this->emails as $num=>$mail) {
-            if ($anc<$num-1)
-                return $anc+1;
-            $anc = $num;
-        }
-        return $anc+1;
-    }
-
-    function delete_email($num) {
+    function delete_email($email) {
         global $globals;
-        if (!$this->other_active($num))
+        if (!$this->other_active($email))
             return ERROR_INACTIVE_REDIRECTION;
-        $globals->db->query("delete from emails where uid={$this->uid} and num='$num'");
-        $_SESSION['log']->log("email_del",$this->emails[$num]->email);
-        unset($this->emails[$num]);
+        $globals->db->query("DELETE FROM emails WHERE uid={$this->uid} AND email='$email'");
+        $_SESSION['log']->log("email_del",$email);
+       foreach($this->emails as $i=>$mail) {
+           if($email==$mail->email) unset($this->emails[$i]);
+       }
         return SUCCESS;
     }
 
     function add_email($email) {
         global $globals;
-        $email_stripped = stripslashes($email);
+        $email_stripped = strtolower(stripslashes($email));
         if (!isvalid_email($email_stripped))
             return ERROR_INVALID_EMAIL;
         if (!isvalid_email_redirection($email_stripped))
             return ERROR_LOOP_EMAIL;
-        if ($this->duplicate($email))
-            return ERROR_DUPLICATE_EMAIL;
         //construction des flags
-        $flags = $this->flag_active.',rewrite';
+        $flags = 'active';
         // on verifie si le domaine de email ou email est un domaine interdisant
         // les adresses internes depuis l'exterieur
         $mtic = 0;
@@ -152,28 +124,24 @@ class Redirect {
             $page->assign('mtic',1);
             $mtic = 1;
         }
-        $newnum = $this->freenum();
-        $globals->db->query("insert into emails (uid,num,email,flags) VALUES({$this->uid},'$newnum','$email','$flags')");
+        $globals->db->query("REPLACE INTO emails (uid,email,flags) VALUES({$this->uid},'$email','$flags')");
         $_SESSION['log']->log("email_add",$email);
-        $this->emails[$newnum] = new Email(array($newnum,$email,1,1,1,0,$mtic));
+       foreach($this->emails as $mail) {
+           if($mail->email == $email_stripped) return SUCCESS;
+       }
+        $this->emails[] = new Email(array($email,1,'',$mtic));
         return SUCCESS;
     }
 
     function modify_email($emails_actifs,$emails_rewrite) {
         global $globals;
-        foreach($this->emails as $num=>$mail) {
-            if ($emails_rewrite[$num] != 'no')
-                $this->emails[$num]->set('rewrite',$this->uid);
-            else
-                $this->emails[$num]->deset('rewrite');
-            if ($emails_rewrite[$num] == 'm4x')
-                $this->emails[$num]->set('m4x',$this->uid);
-            else
-                $this->emails[$num]->deset('m4x');
-            if(in_array($num,$emails_actifs))
-                $this->emails[$num]->set('active',$this->uid);
-            else
-                $this->emails[$num]->deset('active');
+       foreach($this->emails as $i=>$mail) {
+            if(in_array($mail->email,$emails_actifs)) {
+                $this->emails[$i]->activate($this->uid);
+           } else {
+                $this->emails[$i]->deactivate($this->uid);
+           }
+           $this->emails[$i]->rewrite($emails_rewrite[$mail->email], $this->uid);
         }
     }
 }
index af351b1..b33ac91 100644 (file)
@@ -1,6 +1,7 @@
 -- passage à diogenes
 ALTER TABLE `logger.sessions` ADD `auth` ENUM( 'native' ) DEFAULT 'native' NOT NULL AFTER `id`;
 ALTER TABLE `logger.sessions` ADD `sauth` ENUM( 'native' ) DEFAULT 'native' NOT NULL AFTER `host`;
+INSERT INTO logger.actions SET text="connexion_auth_ext",description="connection via l'auth des groupes X";
 
 -- gestion des skins
 ALTER TABLE `x4dat.skins` ADD COLUMN `skin_tpl` VARCHAR(32) AFTER `id`;
@@ -29,7 +30,6 @@ ALTER TABLE x4dat.auth_user_md5 DROP COLUMN host;
 ALTER TABLE x4dat.auth_user_md5 DROP COLUMN nom_soundex;
 ALTER TABLE x4dat.auth_user_md5 DROP COLUMN prenom_soundex;
 ALTER TABLE x4dat.auth_user_md5 DROP COLUMN epouse_soundex;
-INSERT INTO logger.actions SET text="connexion_auth_ext",description="connection via l'auth des groupes X";
 -- drop des anciens alias --> aliases
 ALTER TABLE x4dat.auth_user_md5 DROP COLUMN loginbis;
 ALTER TABLE x4dat.auth_user_md5 DROP COLUMN username;
index e5cc690..f6b143a 100644 (file)
@@ -17,7 +17,7 @@
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************
-        $Id: routage-mail.tpl,v 1.6 2004-09-02 22:27:06 x2000habouzit Exp $
+        $Id: routage-mail.tpl,v 1.7 2004-09-04 14:40:03 x2000habouzit Exp $
  ***************************************************************************}
 
 {dynamic}
   ni son équivalent en m4x.org, ni vers son équivalent polytechnique.edu.
   </p>
 {/if}
-{if $retour == $smarty.const.ERROR_DUPLICATE_EMAIL}
-  <p class="erreur">
-  L'adresse {$smarty.request.email} fait déjà partie de tes adresses de redirection,
-  il est impossible de la mettre en double.
-  </p>
-{/if}
 {if $mtic == 1}
   <p>
   Ton adresse de redirection {$smarty.request.email} fait partie d'un domaine refusant
       <tr class="{cycle values="pair,impair"}">
         <td><strong>{$e->email}</strong></td>
         <td>
-          <input type="checkbox" name="emails_actifs[]" value="{$e->num}" {if $e->active}checked="checked"{/if} /></td>
+          <input type="checkbox" name="emails_actifs[]" value="{$e->email}" {if $e->active}checked="checked"{/if} /></td>
         <td>
-          <select name="emails_rewrite[{$e->num}]">
-            <option value="poly" {if $e->rewrite == 1 and $e->m4x == 0}selected="selected"{/if}>
-              polytechnique.org</option>
-           <option value="m4x" {if $e->rewrite == 1 and $e->m4x == 1}selected="selected"{/if}>
-              m4x.org</option>
-           <option value="no" {if $e->rewrite == 0}selected="selected"{/if}>
-              aucune</option>
+          <select name="emails_rewrite[{$e->email}]">
+            <option value=''>--- aucune ---</option>
+            {foreach from=$alias item=a}
+            <option {if $e->rewrite eq "`$a.alias`@polytechnique.org"}selected='selected'{/if}
+              value='{$a.alias}@polytechnique.org'>{$a.alias}@polytechnique.org</option>
+            <option {if $e->rewrite eq "`$a.alias`@m4x.org"}selected='selected'{/if}
+              value='{$a.alias}@m4x.org'>{$a.alias}@m4x.org</option>
+            {/foreach}
           </select>
         </td>
-        <td><a href="{$smarty.server.PHP_SELF}?emailop=retirer&amp;num={$e->num}">retirer</a></td>
+        <td><a href="{$smarty.server.PHP_SELF}?emailop=retirer&amp;email={$e->email}">retirer</a></td>
       </tr>
       {/foreach}
     </table>
     <br />
     <input type="submit" value="Mettre à jour les emails actifs" name="emailop" />
   </div>
+</form>
   <p>
     Tu peux ajouter à cette liste une adresse email en la tapant ici et en cliquant sur Ajouter.
   </p>
+<form action="{$smarty.server.PHP_SELF}" method="post">
   <div>
     <input type="text" size="35" maxlength="60" name="email" value="" />
     &nbsp;&nbsp;