Merge remote branch 'origin/platal-0.10.2'
[platal.git] / include / user.func.inc.php
index 0030770..232f833 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -41,8 +41,8 @@ function user_clear_all_subs($user_id, $really_del=true)
                              'user_id' => array('requests', 'user_changes'));
 
     if ($really_del) {
-        array_push($tables_to_clear['uid'], 'emails', 'groupex.membres', 'contacts', 'adresses', 'tels',
-                                            'photo', 'perte_pass', 'langues_ins', 'forums.abos', 'forums.profils');
+        array_push($tables_to_clear['uid'], 'emails', '#groupex#.membres', 'contacts', 'adresses', 'tels',
+                                            'photo', 'perte_pass', 'langues_ins', '#forums#.abos', '#forums#.profils');
         array_push($tables_to_clear['user_id'], 'newsletter_ins', 'auth_user_quick', 'binets_ins');
         $tables_to_clear['id'] = array('aliases');
         $tables_to_clear['contact'] = array('contacts');
@@ -82,227 +82,6 @@ function user_clear_all_subs($user_id, $really_del=true)
 }
 
 // }}}
-// {{{ function get_user_login()
-
-// Defaut callback to call when a login is not found
-function _default_user_callback($login)
-{
-    Platal::page()->trigError("Il n'y a pas d'utilisateur avec l'identifiant : $login");
-    return;
-}
-
-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  $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();
-        }
-
-        call_user_func($callback, $data);
-        return false;
-    }
-
-    // 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;
-    }
-
-    // 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  $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 $res->fetchOneCell();
-        }
-
-        if (preg_match('/^(.*)\.([0-9]{4})$/u', $mbox, $matches)) {
-            $res = XDB::query("SELECT  a.alias
-                                 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);
-        if ($redir = $res->fetchOneCell()) {
-            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;
-            }
-
-            // 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();
-            }
-        }
-
-        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_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')
-{
-    if (!$get_forlife) {
-        $strict = true;
-    }
-
-    if (!is_array($members)) {
-        if (strlen(trim($members)) == 0) {
-            return null;
-        }
-        $members = split("[; ,\r\n\|]+", $members);
-    }
-
-    if ($members) {
-        $list = array();
-        foreach ($members as $i => $alias) {
-            $alias = trim($alias);
-            if (empty($alias)) {
-                continue;
-            }
-            if (($login = get_user_login($alias, $get_forlife, $callback)) !== false) {
-                $list[$i] = $login;
-            } else if (!$strict) {
-                $list[$i] = $alias;
-            } else {
-                global $globals;
-                if (strpos($alias, '@') !== false) {
-                    list($user, $dom) = explode('@', $alias);
-                    if ($dom != $globals->mail->domain && $dom != $globals->mail->domain2) {
-                        $list[$i] = $alias;
-                    }
-                }
-            }
-        }
-        return $list;
-    }
-    return null;
-}
-
-// }}}
-// {{{ 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;
@@ -324,8 +103,10 @@ function get_not_registered_user($login, $iterator = false)
         return null;
     }
     @list($prenom, $nom, $promo) = explode('.', $login);
-    $where = 'REPLACE(REPLACE(REPLACE(nom, " ", ""), "-", ""), "\'", "") LIKE CONCAT("%", {?}, "%")
-          AND  REPLACE(REPLACE(REPLACE(prenom, " ", ""), "-", ""), "\'", "") LIKE CONCAT("%", {?}, "%")';
+    $where = 'REPLACE(REPLACE(REPLACE(nom, " ", ""), "-", ""), "\'", "")
+              LIKE CONCAT("%", REPLACE(REPLACE(REPLACE({?}, " ", ""), "-", ""), "\'", ""), "%")
+              AND  REPLACE(REPLACE(REPLACE(prenom, " ", ""), "-", ""), "\'", "")
+              LIKE CONCAT("%", REPLACE(REPLACE(REPLACE({?}, " ", ""), "-", ""), "\'", ""), "%")';
     if ($promo) {
         if (preg_match('/^[0-9]{2}$/', $promo)) {
             $where .= 'AND MOD(promo, 100) = {?}';
@@ -435,6 +216,7 @@ function get_user_details_adr($uid, $view = 'private') {
                      gp.pays AS countrytxt,a.region, a.regiontxt,
                      FIND_IN_SET('active', a.statut) AS active, a.adrid,
                      FIND_IN_SET('res-secondaire', a.statut) AS secondaire,
+                     FIND_IN_SET('courrier', a.statut) AS courier,
                      a.pub, gp.display
                FROM  adresses AS a
           LEFT JOIN  geoloc_pays AS gp ON (gp.a2=a.country)
@@ -545,8 +327,8 @@ function &get_user_details($login, $from_uid = '', $view = 'private')
         $user['binets_join'] = join(', ', $user['binets']);
 
         $res  = XDB::iterRow("SELECT  a.diminutif, a.nom, a.site
-                                FROM  groupex.asso    AS a
-                           LEFT JOIN  groupex.membres AS m ON (m.asso_id = a.id)
+                                FROM  #groupex#.asso    AS a
+                           LEFT JOIN  #groupex#.membres AS m ON (m.asso_id = a.id)
                                WHERE  m.uid = {?} AND (a.cat = 'GroupesX' OR a.cat = 'Institutions')
                                       AND pub = 'public'", $uid);
         $user['gpxs'] = Array();
@@ -646,9 +428,11 @@ function remove_user_address($uid, $adrid) {
 // }}}
 // {{{ function add_user_tel()
 function add_user_tel($uid, $adrid, $telid, $tel) {
-    XDB::execute(
-        "INSERT INTO tels SET uid = {?}, adrid = {?}, telid = {?}, tel = {?}, tel_type = {?}, tel_pub = {?}",
-        $uid, $adrid, $telid, $tel['tel'], $tel['tel_type'], $tel['tel_pub']);
+    $tel['tel_type'] = ($tel['tel_type'] ? $tel['tel_type'] : '');
+    XDB::execute('INSERT INTO  tels
+                          SET  uid = {?}, adrid = {?}, telid = {?}, tel = {?},
+                               tel_type = {?}, tel_pub = {?}',
+                 $uid, $adrid, $telid, $tel['tel'], $tel['tel_type'], $tel['tel_pub']);
 }
 // }}}
 // {{{ function update_user_tel()
@@ -748,18 +532,17 @@ function remove_user_pro($uid, $entrid) {
 // }}}
 // {{{ function set_user_details()
 function set_user_details_addresses($uid, $adrs) {
-    $res = XDB::query("SELECT adrid FROM adresses WHERE uid = {?} AND adrid >= 1 ORDER BY adrid", $uid);
-    $adrids = $res->fetchColumn();
+    $req = XDB::query('SELECT MAX(adrid) + 1
+                         FROM adresses
+                        WHERE uid = {?}', $uid);
+    $adrid = $req->fetchOneCell();
+    if (is_null($adrid)) {
+        $adrid = 0;
+    }
     foreach ($adrs as $adr) {
-        if (isset($adr['adrid']) && isset($adr['remove']) && $adr['remove']) {
-            remove_user_address($uid, $adr['adrid']);
-            if (isset($adrids[$adr['adrid']])) unset($adrids[$adr['adrid']]);
-        } else if (isset($adr['adrid'])) {
-            update_user_address($uid, $adr['adrid'], $adr);
-        } else {
-            for ($adrid = 1; isset($adrids[$adrid-1]) && ($adrids[$adrid-1] == $adrid); $adrid++);
+        if (!@$adr['remove']) {
             add_user_address($uid, $adrid, $adr);
-            $adrids[$adrid-1] = $adrid;
+            ++$adrid;
         }
     }
     require_once 'geoloc.inc.php';
@@ -770,17 +553,17 @@ function set_user_details_addresses($uid, $adrs) {
 
 function set_user_details_pro($uid, $pros)
 {
-    $res = XDB::query("SELECT entrid FROM entreprises WHERE uid = {?} ORDER BY entrid", $uid);
-    $entrids = $res->fetchColumn();
+    $req = XDB::query('SELECT MAX(entrid) + 1
+                         FROM entreprises
+                        WHERE uid = {?}', $uid);
+    $entrid = $req->fetchOneCell();
+    if (is_null($entrid)) {
+        $entrid = 0;
+    }
     foreach ($pros as $pro) {
-        if (isset($pro['entrid']) && isset($pro['remove']) && $pro['remove']) {
-            remove_user_pro($uid, $pro['entrid']);
-            if (isset($entrids[$pro['entrid']])) unset($entrids[$pro['entrid']]);
-        } else if (isset($pro['entrid'])) {
-            update_user_pro($uid, $pro['entrid'], $pro);
-        } else {
-            for ($entrid = 0; isset($entrids[$entrid]) && ($entrids[$entrid] == $entrid); $entrid++);
+        if (!@$pro['remove']) {
             add_user_pro($uid, $entrid, $pro);
+            ++$entrid;
         }
     }
 }
@@ -789,7 +572,7 @@ function set_user_details_pro($uid, $pros)
 // {{{ function set_user_details()
 function set_user_details($uid, $details) {
     if (isset($details['nom_usage'])) {
-        XDB::execute("UPDATE auth_user_md5 SET nom_usage = {?} WHERE user_id = {?}", strtoupper($details['nom_usage']), $uid);
+        XDB::execute("UPDATE auth_user_md5 SET nom_usage = {?} WHERE user_id = {?}", mb_strtoupper($details['nom_usage']), $uid);
     }
     if (isset($details['mobile'])) {
         XDB::execute("UPDATE auth_user_quick SET profile_mobile = {?} WHERE user_id = {?}", $details['mobile'], $uid);