X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=include%2Fuser.func.inc.php;h=1cbd1f9e5c74d17974d8749cdc0acf443fb4408a;hb=ced003168bf3b75a29313c727fe28d65cb03057c;hp=c3db0f75f24b4f795399a66a67f7615d9a3c4cb1;hpb=a1cec8694f46c786d38564105711d78abc39c187;p=platal.git diff --git a/include/user.func.inc.php b/include/user.func.inc.php index c3db0f7..1cbd1f9 100644 --- a/include/user.func.inc.php +++ b/include/user.func.inc.php @@ -1,6 +1,6 @@ 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_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; @@ -316,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) = {?}'; @@ -427,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) @@ -740,18 +530,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'; @@ -762,17 +551,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; } } }