Fix ids_from_emails (errors when invalid @x.org emails were given).
[platal.git] / include / emails.inc.php
index e53edfa..9b1f5a4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -31,7 +31,7 @@ function fix_bestalias(User &$user)
 {
     $res = XDB::query("SELECT  COUNT(*)
                          FROM  aliases
-                        WHERE  id = {?} AND FIND_IN_SET('bestalias', flags) AND type != 'homonyme'",
+                        WHERE  uid = {?} AND FIND_IN_SET('bestalias', flags) AND type != 'homonyme'",
                       $user->id());
     if ($res->fetchOneCell()) {
         return;
@@ -39,7 +39,7 @@ function fix_bestalias(User &$user)
 
     XDB::execute("UPDATE  aliases
                      SET  flags=CONCAT(flags,',','bestalias')
-                   WHERE  id={?} AND type!='homonyme'
+                   WHERE  uid={?} AND type!='homonyme'
                 ORDER BY  !FIND_IN_SET('usage',flags),alias LIKE '%.%', LENGTH(alias)
                    LIMIT  1", $user->id());
 }
@@ -113,7 +113,7 @@ function ids_from_mails(array $emails)
     // Look up user ids for addresses in domain
     $alias_uids = array();
     if (count($domain_mails)) {
-        $res = XDB::query("SELECT   alias, id
+        $res = XDB::query("SELECT   alias, uid
                              FROM   aliases
                             WHERE   alias IN {?}", array_unique($domain_mails));
         foreach ($res->fetchAllRow() as $row) {
@@ -123,13 +123,16 @@ function ids_from_mails(array $emails)
     }
     // Connect emails with uids
     foreach ($domain_mails as $email => $user) {
-        $uids[$email] = $domain_uids[$user];
+        // Some 'domain' emails might be invalid.
+        if (array_key_exists($user, $domain_uids)) {
+            $uids[$email] = $domain_uids[$user];
+        }
     }
 
     // Look up user ids for addresses in our alias domain
     $alias_uids = array();
     if (count($alias_mails)) {
-        $res = XDB::query("SELECT   v.alias, a.id
+        $res = XDB::query("SELECT   v.alias, a.uid
                              FROM   virtual             AS v
                        INNER JOIN   virtual_redirect    AS r USING(vid)
                        INNER JOIN   aliases             AS a ON (a.type = 'a_vie'
@@ -142,17 +145,23 @@ function ids_from_mails(array $emails)
     }
     // Connect emails with uids
     foreach ($alias_mails as $email => $user) {
-        $uids[$email] = $alias_uids[$user];
+        if (array_key_exists($user, $alias_uids)) {
+            $uids[$email] = $alias_uids[$user];
+        }
     }
 
     // Look up user ids for other addresses in the email redirection list
     if (count($other_mails)) {
+        $lowerupper = array();
+        foreach ($other_mails as $mail) {
+            $lowerupper[strtolower($mail)] = $mail;
+        }
         $res = XDB::query("SELECT   email, uid
                              FROM   emails
                             WHERE   email IN {?}", $other_mails);
         foreach ($res->fetchAllRow() as $row) {
             list ($email, $uid) = $row;
-            $uids[$email] = $uid;
+            $uids[$lowerupper[strtolower($email)]] = $uid;
         }
     }
 
@@ -384,18 +393,18 @@ class EmailStorage extends Email
     // Retrieves the current list of actives storages.
     private function get_storages()
     {
-        $res = XDB::query("SELECT  mail_storage
-                             FROM  auth_user_md5
-                            WHERE  user_id = {?}", $this->user->id());
-        return new PlFlagSet($res->fetchOneCell());
+        return new PlFlagSet(XDB::fetchOneCell('SELECT  storage
+                                                  FROM  email_options
+                                                 WHERE  uid = {?}',
+                                                $this->user->id()));
     }
 
     // Updates the list of active storages.
     private function set_storages($storages)
     {
-        XDB::execute("UPDATE  auth_user_md5
-                         SET  mail_storage = {?}
-                       WHERE  user_id = {?}", $storages, $this->user->id());
+        XDB::execute("UPDATE  email_options
+                         SET  storage = {?}
+                       WHERE  uid = {?}", $storages, $this->user->id());
     }
 
     // Returns the list of allowed storages for the @p user.