Merge commit 'origin/master' into hruid.
[platal.git] / include / user.func.inc.php
index 1f8a698..6e4edae 100644 (file)
@@ -32,9 +32,9 @@ function user_clear_all_subs($user_id, $really_del=true)
     // + delete maillists
 
     global $globals;
-    $uid   = intval($user_id);
-    $res   = XDB::query("SELECT alias FROM aliases WHERE type='a_vie' AND id={?}", $uid);
-    $alias = $res->fetchOneCell();
+    $uid = intval($user_id);
+    $user = User::getSilent($uid);
+    list($alias) = explode('@', $user->forlifeEmail());
 
     $tables_to_clear = array('uid' => array('competences_ins', 'entreprises', 'langues_ins', 'mentor_pays',
                                             'mentor_secteurs', 'mentor', 'perte_pass', 'watch_sub'),
@@ -75,7 +75,7 @@ function user_clear_all_subs($user_id, $really_del=true)
     if ($globals->mailstorage->googleapps_domain) {
         require_once 'googleapps.inc.php';
         if (GoogleAppsAccount::account_status($uid)) {
-            $account = new GoogleAppsAccount($uid, $alias);
+            $account = new GoogleAppsAccount($user);
             $account->suspend();
         }
     }
@@ -96,113 +96,158 @@ function _silent_user_callback($login)
     return;
 }
 
+// Returns an unique identifier corresponding to the @p data. This piece of data
+// can be a numerical id, an hruid, an email alias (any), or a redirection
+// email address. If @p get_forlife is set to true, the user's forlife is
+// returned, otherwise the user's hruid is returned.
+// When no user is found, calls @p callback, and eventually returns false.
 function get_user_login($data, $get_forlife = false, $callback = '_default_user_callback')
 {
     global $globals;
 
+    // In order to reduce the code size & complexity, we define once for all the
+    // field to be returned. By convention if will be "u.hruid" for the hruid
+    // (thus implying the auth_user_md5 will be aliased on u), and "a.alias" for
+    // the forlife (thus implying the forlife aliases table will be aliased on a).
+    $field = ($get_forlife ? "CONCAT(a.alias, '@" . $globals->mail->domain . "')" : "u.hruid");
+
+    // If $data is an integer, fetches directly the result.
     if (is_numeric($data)) {
-        $res = XDB::query("SELECT alias FROM aliases WHERE type='a_vie' AND id={?}", $data);
+        $res = XDB::query("SELECT  $field
+                             FROM  auth_user_md5 AS u
+                        LEFT JOIN  aliases AS a ON (a.id = u.user_id AND type = 'a_vie')
+                            WHERE  u.user_id = {?}", $data);
         if ($res->numRows()) {
             return $res->fetchOneCell();
-        } else {
-            call_user_func($callback, $data);
-            return false;
         }
+
+        call_user_func($callback, $data);
+        return false;
     }
 
-    $data = trim(strtolower($data));
+    // Checks whether $data is a valid hruid or not.
+    $res = XDB::query("SELECT  $field
+                         FROM  auth_user_md5 AS u
+                    LEFT JOIN  aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
+                        WHERE  u.hruid = {?}", $data);
+    if ($res->numRows()) {
+        return $res->fetchOneCell();
+    }
 
+    // From now, $data can only by an email alias, or an email redirection.
+    // If it doesn't look like a valid address, appends the plat/al's main domain.
+    $data = trim(strtolower($data));
     if (strstr($data, '@')===false) {
-        $data = $data.'@'.$globals->mail->domain;
+        $data = $data . '@' . $globals->mail->domain;
     }
 
+    // Checks if $data is a valid alias on the main domains.
     list($mbox, $fqdn) = explode('@', $data);
     if ($fqdn == $globals->mail->domain || $fqdn == $globals->mail->domain2) {
-
-        $res = XDB::query("SELECT  a.alias
-                             FROM  aliases AS a
-                       INNER JOIN  aliases AS b ON (a.id = b.id AND b.type IN ('alias', 'a_vie') AND b.alias={?})
-                            WHERE  a.type = 'a_vie'", $mbox);
+        $res = XDB::query("SELECT  $field
+                             FROM  auth_user_md5 AS u
+                       INNER JOIN  aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
+                       INNER JOIN  aliases AS b ON (b.id = u.user_id AND b.type IN ('alias', 'a_vie'))
+                            WHERE  b.alias = {?}", $mbox);
         if ($res->numRows()) {
-            return $get_forlife ? $res->fetchOneCell() : $mbox;
+            return $res->fetchOneCell();
         }
 
         if (preg_match('/^(.*)\.([0-9]{4})$/u', $mbox, $matches)) {
             $res = XDB::query("SELECT  a.alias
-                                 FROM  aliases AS a
-                           INNER JOIN  aliases AS b ON (a.id = b.id AND b.type IN ('alias', 'a_vie') AND b.alias={?})
-                           INNER JOIN  auth_user_md5 AS u ON (a.id = u.user_id AND promo = {?})
-                                WHERE  a.type = 'a_vie'", $matches[1], $matches[2]);
+                                 FROM  auth_user_md5 AS u
+                           INNER JOIN  aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
+                           INNER JOIN  aliases AS b ON (b.id = u.user_id AND b.type IN ('alias', 'a_vie'))
+                                WHERE  b.alias = {?} AND u.promo = {?}", $matches[1], $matches[2]);
             if ($res->numRows() == 1) {
                 return $res->fetchOneCell();
             }
         }
+
         call_user_func($callback, $data);
         return false;
 
+    // Looks for $data as an email alias from the dedicated alias domain.
     } elseif ($fqdn == $globals->mail->alias_dom || $fqdn == $globals->mail->alias_dom2) {
-
         $res = XDB::query("SELECT  redirect
                              FROM  virtual_redirect
                        INNER JOIN  virtual USING(vid)
-                            WHERE  alias={?}", $mbox.'@'.$globals->mail->alias_dom);
+                            WHERE  alias = {?}", $mbox . '@' . $globals->mail->alias_dom);
         if ($redir = $res->fetchOneCell()) {
-            list($alias) = explode('@', $redir);
-        } else {
-            call_user_func($callback, $data);
-            $alias = false;
-        }
-        return $alias;
-    } else {
-
-        $res = XDB::query("SELECT  alias
-                                       FROM  aliases AS a
-                                 INNER JOIN  emails  AS e ON e.uid=a.id
-                                      WHERE  e.email={?} AND a.type='a_vie'", $data);
-        switch ($i = $res->numRows()) {
-            case 0:
-                call_user_func($callback, $data);
-                return false;
+            list($alias, $alias_fqdn) = explode('@', $redir);
+            if ($get_forlife) {
+                // It might happen that the "secondary" forlife alias (the one
+                // based on the secondary domaine name) is used as a target; we
+                // then need to canonicalize it to the main domain.
+                if ($alias_fqdn == $globals->mail->domain2) {
+                    return $alias . "@" . $globals->mail->domain;
+                }
+                return $redir;
+            }
 
-            case 1:
+            // We now have a valid alias, which has to be translated to an hruid.
+            $res = XDB::query("SELECT  u.hruid
+                                 FROM  auth_user_md5 AS u
+                            LEFT JOIN  aliases AS a ON (a.id = u.user_id AND a.type IN ('alias', 'a_vie'))
+                                WHERE  a.alias = {?}", $alias);
+            if ($res->numRows()) {
                 return $res->fetchOneCell();
+            }
+        }
 
-            default:
-                if (S::has_perms()) {
-                    $aliases = $res->fetchColumn();
-                    Platal::page()->trigError("Il y a $i utilisateurs avec cette adresse mail : ".join(', ', $aliases));
-                } else {
-                    $res->free();
-                }
+        call_user_func($callback, $data);
+        return false;
+
+    // Otherwise, we do suppose $data is an email redirection.
+    } else {
+        $res = XDB::query("SELECT  $field
+                             FROM  auth_user_md5 AS u
+                        LEFT JOIN  aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
+                        LEFT JOIN  emails AS e ON (e.uid = u.user_id)
+                            WHERE  e.email = {?}", $data);
+        if ($res->numRows() == 1) {
+            return $res->fetchOneCell();
+        } else if ($res->numRows() > 0) {
+            if (S::has_perms()) {
+                Platal::page()->trigError("Il y a $user_count utilisateurs avec cette adresse mail : " . join(', ', $res->fetchColumn()));
+            } else {
+                $res->free();
+            }
+        } else {
+            call_user_func($callback, $data);
         }
+
+        return false;
     }
 
     return false;
 }
 
 // }}}
-// {{{ function get_user_forlife()
-
-function get_user_forlife($data, $callback = '_default_user_callback')
+// {{{ function get_users_login_list()
+
+// Returns an array of valid forlife/hruid based on the @p members list. The
+// list can be an array (in this case the ouput will retain the keys), or a
+// space separated list.
+// The @p strict indicates if the input alias should be retain in output when
+// no valid forlife is found (incompatible with $get_forlife = false).
+function get_users_login_list($members, $strict = false, $get_forlife = false, $callback = '_default_user_callback')
 {
-    return get_user_login($data, true, $callback);
-}
-
-// }}}
-// {{{ function get_users_forlife_list()
+    if (!$get_forlife) {
+        $strict = true;
+    }
 
-function get_users_forlife_list($members, $strict = false, $callback = '_default_user_callback')
-{
     if (!is_array($members)) {
         if (strlen(trim($members)) == 0) {
             return null;
         }
         $members = explode(' ', $members);
     }
+
     if ($members) {
         $list = array();
         foreach ($members as $i => $alias) {
-            if (($login = get_user_forlife($alias, $callback)) !== false) {
+            if (($login = get_user_login($alias, $get_forlife, $callback)) !== false) {
                 $list[$i] = $login;
             } else if(!$strict) {
                 $list[$i] = $alias;
@@ -214,6 +259,38 @@ function get_users_forlife_list($members, $strict = false, $callback = '_default
 }
 
 // }}}
+// {{{ function get_user_forlife()
+
+function get_user_forlife($data, $callback = '_default_user_callback')
+{
+    return get_user_login($data, true, $callback);
+}
+
+// }}}
+// {{{ function get_users_forlife_list()
+
+function get_users_forlife_list($members, $strict = false, $callback = '_default_user_callback')
+{
+    return get_users_login_list($members, $strict, true, $callback);
+}
+
+// }}}
+// {{{ function get_user_hruid()
+
+function get_user_hruid($data, $callback = '_default_user_callback')
+{
+    return get_user_login($data, false, $callback);
+}
+
+// }}}
+// {{{ function get_users_hruid_list()
+
+function get_users_hruid_list($members, $strict = false, $callback = '_default_user_callback')
+{
+    return get_users_login_list($members, true, false, $callback);
+}
+
+// }}}
 // {{{ function has_user_right()
 function has_user_right($pub, $view = 'private') {
     if ($pub == $view) return true;