X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fpluser.php;h=4beee0a3a183e17a914fe18818980f90673eabbe;hb=e3a55098b1cfd274d8965fc307a316d9f0c447a1;hp=d80cb428b2856a0e16d8820d8c0fd713a012b7ff;hpb=2d96cf7b8e6a4362efbfc35bb129c39f8ca4cdaa;p=platal.git diff --git a/classes/pluser.php b/classes/pluser.php index d80cb42..4beee0a 100644 --- a/classes/pluser.php +++ b/classes/pluser.php @@ -40,150 +40,47 @@ abstract class PlUser // been fetched yet, and false means the information is not available. // Main (unique) identifiers. - private $user_id = null; - private $hruid = null; + protected $user_id = null; + protected $hruid = null; // User's emails (bestalias should be preferred when sending emails). - private $forlife = null; - private $bestalias = null; + protected $forlife = null; + protected $bestalias = null; // Constructs the object from an identifier (hruid/uid/email alias/email // redirection) and an optionnal array of known user properties. public function __construct($login, $values = array()) { - list($this->user_id, $this->hruid) = $this->getLogin($login); $this->fillFromArray($values); + if (!isset($this->user_id) || !isset($this->hruid)) { + list($this->user_id, $this->hruid) = $this->getLogin($login); + } } // Properties accessors. - public function id() - { - return $this->user_id; - } - - public function login() - { - return $this->hruid; - } - - public function bestEmail() - { - if (!isset($this->bestalias)) { - global $globals; - $res = XDB::query("SELECT CONCAT(alias, '@{$globals->mail->domain}') - FROM aliases - WHERE FIND_IN_SET('bestalias', flags) - AND id = {?}", $this->user_id); - $this->bestalias = $res->numRows() ? $res->fetchOneCell() : false; - } - return $this->bestalias; - } - - public function forlifeEmail() - { - if (!isset($this->forlife)) { - global $globals; - $res = XDB::query("SELECT CONCAT(alias, '@{$globals->mail->domain}') - FROM aliases - WHERE type = 'a_vie' AND id = {?}", $this->user_id); - $this->forlife = $res->numRows() ? $res->fetchOneCell() : false; - } - return $this->forlife; - } + public function id() { return $this->user_id; } + public function login() { return $this->hruid; } + abstract public function bestEmail(); + abstract public function forlifeEmail(); // Determines if the @p id is a valid identifier; if so, returns the user_id // and the hruid. Otherwise raises UserNotFoundException. - private function getLogin($login) - { - global $globals; - - // If $data is an integer, fetches directly the result. - if (is_numeric($login)) { - $res = XDB::query("SELECT user_id, hruid FROM auth_user_md5 WHERE user_id = {?}", $login); - if ($res->numRows()) { - return $res->fetchOneRow(); - } - - throw new UserNotFoundException(); - } - - // Checks whether $login is a valid hruid or not. - $res = XDB::query("SELECT user_id, hruid FROM auth_user_md5 WHERE hruid = {?}", $login); - if ($res->numRows()) { - return $res->fetchOneRow(); - } - - // From now, $login 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. - $login = trim(strtolower($login)); - if (strstr($login, '@') === false) { - $login = $login . '@' . $globals->mail->domain; - } - - // Checks if $login is a valid alias on the main domains. - list($mbox, $fqdn) = explode('@', $login); - if ($fqdn == $globals->mail->domain || $fqdn == $globals->mail->domain2) { - $res = XDB::query("SELECT u.user_id, u.hruid - FROM auth_user_md5 AS u - INNER JOIN aliases AS a ON (a.id = u.user_id AND a.type IN ('alias', 'a_vie')) - WHERE a.alias = {?}", $mbox); - if ($res->numRows()) { - return $res->fetchOneRow(); - } - - if (preg_match('/^(.*)\.([0-9]{4})$/u', $mbox, $matches)) { - $res = XDB::query("SELECT u.user_id, u.hruid - FROM auth_user_md5 AS u - INNER JOIN aliases AS a ON (a.id = u.user_id AND a.type IN ('alias', 'a_vie')) - WHERE a.alias = {?} AND u.promo = {?}", $matches[1], $matches[2]); - if ($res->numRows() == 1) { - return $res->fetchOneRow(); - } - } - - throw new UserNotFoundException(); - } - - // Looks for $login as an email alias from the dedicated alias domain. - if ($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()) { - // We now have a valid alias, which has to be translated to an hruid. - list($alias, $alias_fqdn) = explode('@', $redir); - $res = XDB::query("SELECT u.user_id, 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->fetchOneRow(); - } - } - - throw new UserNotFoundException(); - } - - // Otherwise, we do suppose $login is an email redirection. - $res = XDB::query("SELECT u.user_id, u.hruid - FROM auth_user_md5 AS u - LEFT JOIN emails AS e ON (e.uid = u.user_id) - WHERE e.email = {?}", $login); - if ($res->numRows() == 1) { - return $res->fetchOneRow(); - } - - throw new UserNotFoundException($res->fetchColumn(1)); - } + abstract protected function getLogin($login); // Fills the object from associative arrays containing our data. // The use case is for arrays got directly from anoter SQL request. - private function fillFromArray(array $values) + protected function fillFromArray(array $values) { + // It might happen that the 'user_id' field is called uid in some places + // (eg. in sessions), so we hard link uid to user_id to prevent useless + // SQL requests. + if (!isset($values['user_id']) && isset($values['uid'])) { + $values['user_id'] = $values['uid']; + } + foreach ($values as $key => $value) { if (property_exists($this, $key) && !isset($this->$key)) { $this->$key = $value; @@ -252,17 +149,7 @@ abstract class PlUser // Default callback for user lookup -- displays an error message w.r.t. the // number of matching users found. - public static function _default_user_callback($login, $results) - { - global $page; - - $result_count = count($results); - if ($result_count == 0 || !S::has_perms()) { - $page->trigError("Il n'y a pas d'utilisateur avec l'identifiant : $login"); - } else { - $page->trigError("Il y a $result_count utilisateurs avec cet identifiant : " . join(', ', $results)); - } - } + abstract public static function _default_user_callback($login, $results); } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: