public function __construct()
{
parent::__construct();
- S::bootstrap('perms_backup', new PlFlagSet());
}
public function startAvailableAuth()
{
- if (!(S::v('perms') instanceof PlFlagSet)) {
- S::set('perms', S::v('perms_backup'));
- }
if (!S::logged()) {
$cookie = $this->tryCookie();
if ($cookie == 0) {
return $this->start(AUTH_COOKIE);
- } else if ($cookie == 1 || $cooke == -2) {
+ } else if ($cookie == 1 || $cookie == -2) {
return false;
}
}
if ((check_ip('dangerous') && S::has('uid')) || check_account()) {
- $_SESSION['log']->log("view_page", $_SERVER['REQUEST_URI']);
+ S::logger()->log("view_page", $_SERVER['REQUEST_URI']);
}
return true;
}
return -1;
}
- $res = XDB::query('SELECT user_id, password
- FROM auth_user_md5
- WHERE user_id = {?} AND perms IN(\'admin\', \'user\')',
+ $res = XDB::query('SELECT uid, password
+ FROM accounts
+ WHERE uid = {?} AND state = \'active\'',
Cookie::i('ORGuid'));
if ($res->numRows() != 0) {
list($uid, $password) = $res->fetchOneRow();
- require_once 'secure_hash.inc.php';
- $expected_value = hash_encrypt($password);
+ $expected_value = sha1($password);
if ($expected_value == Cookie::v('ORGaccess')) {
S::set('auth_by_cookie', $uid);
return 0;
private function checkPassword($uname, $login, $response, $login_type)
{
- $res = XDB::query('SELECT u.user_id, u.password
- FROM auth_user_md5 AS u
- INNER JOIN aliases AS a ON (a.id = u.user_id AND type != \'homonyme\')
- WHERE a.' . $login_type . ' = {?} AND u.perms IN(\'admin\', \'user\')',
+ $res = XDB::query('SELECT a.uid, a.password
+ FROM accounts AS a
+ INNER JOIN aliases AS l ON (l.id = a.uid AND l.type != \'homonyme\')
+ WHERE l.' . $login_type . ' = {?} AND a.state = \'active\'',
$login);
if (list($uid, $password) = $res->fetchOneRow()) {
- require_once 'secure_hash.inc.php';
- $expected_response = hash_encrypt("$uname:$password:" . S::v('challenge'));
- if ($response != $expected_response) {
- $new_password = hash_xor(Env::v('xorpass'), $password);
- $expected_response = hash_encrypt("$uname:$new_password:" . S::v('challenge'));
- if ($response == $expected_response) {
- XDB::execute('UPDATE auth_user_md5
- SET password = {?}
- WHERE user_id = {?}',
- $new_password, $uid);
- }
- }
+ $expected_response = sha1("$uname:$password:" . S::v('challenge'));
+ /* XXX: Deprecates len(password) > 10 conversion */
if ($response != $expected_response) {
S::logger($uid)->log('auth_fail', 'bad password');
return null;
*/
if (S::has('suid')) {
$suid = S::v('suid');
- $login = $uname = $suid['forlife'];
+ $login = $uname = $suid['uid'];
$redirect = false;
} else {
$uname = Env::v('username');
-
if (Env::v('domain') == "alias") {
$res = XDB::query('SELECT redirect
FROM virtual
}
}
- $uid = $this->checkPassword($uname, $login, Post::v('response'), (!$redirect && preg_match('/^\d*$/', $uname)) ? 'id' : 'alias');
+ $uid = $this->checkPassword($uname, $login, Post::v('response'), (!$redirect && is_numeric($uname)) ? 'id' : 'alias');
+ if (!is_null($uid) && S::has('suid')) {
+ $suid = S::v('suid');
+ if ($suid['uid'] == $uid) {
+ $uid = S::i('uid');
+ } else {
+ $uid = null;
+ }
+ }
if (!is_null($uid)) {
S::set('auth', AUTH_MDP);
- if (Post::has('domain')) {
- if (($domain = Post::v('domain', 'login')) == 'alias') {
- setcookie('ORGdomain', "alias", (time() + 25920000), '/', '', 0);
- } else {
- setcookie('ORGdomain', '', (time() - 3600), '/', '', 0);
+ if (!S::has('suid')) {
+ if (Post::has('domain')) {
+ if (($domain = Post::v('domain', 'login')) == 'alias') {
+ setcookie('ORGdomain', "alias", (time() + 25920000), '/', '', 0);
+ } else {
+ setcookie('ORGdomain', '', (time() - 3600), '/', '', 0);
+ }
+ // pour que la modification soit effective dans le reste de la page
+ $_COOKIE['ORGdomain'] = $domain;
}
- // pour que la modification soit effective dans le reste de la page
- $_COOKIE['ORGdomain'] = $domain;
}
S::kill('challenge');
S::logger($uid)->log('auth_ok');
} else if (S::has('uid')) {
return true;
}
- if ($level == -1) {
- S::set('auth', AUTH_COOKIE);
+ if ($level == AUTH_SUID) {
+ S::set('auth', AUTH_MDP);
+ unset($_SESSION['log']);
}
- unset($_SESSION['log']);
- $res = XDB::query('SELECT u.user_id AS uid, prenom, prenom_ini, nom, nom_ini, nom_usage, perms, promo, promo_sortie,
- matricule, password, FIND_IN_SET(\'femme\', u.flags) AS femme,
- a.alias AS forlife, a2.alias AS bestalias,
- q.core_mail_fmt AS mail_fmt, UNIX_TIMESTAMP(q.banana_last) AS banana_last, q.watch_last, q.core_rss_hash,
- FIND_IN_SET(\'watch\', u.flags) AS watch_account, q.last_version, g.g_account_name IS NOT NULL AS googleapps
- FROM auth_user_md5 AS u
- INNER JOIN auth_user_quick AS q USING(user_id)
- INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type = \'a_vie\')
- INNER JOIN aliases AS a2 ON (u.user_id = a2.id AND FIND_IN_SET(\'bestalias\', a2.flags))
- LEFT JOIN gapps_accounts AS g ON (u.user_id = g.l_userid AND g.g_status = \'active\')
- WHERE u.user_id = {?} AND u.perms IN(\'admin\', \'user\')', $uid);
+
+ // Retrieves main user properties.
+ /** TODO: Move needed informations to account tables */
+ /** TODO: Currently suppressed data are matricule, promo */
+ /** TODO: Data to move are: banana_last, watch_last, last_version */
+ /** TODO: Switch to new permission system */
+ $res = XDB::query("SELECT a.uid, a.hruid, a.display_name, a.full_name, a.password,
+ a.sex = 'female' AS femme, a.mail_format as mail_fmt,
+ a.token, FIND_IN_SET('watch', a.flags) AS watch_account,
+ UNIX_TIMESTAMP(q.banana_last) AS banana_last, q.watch_last,
+ q.last_version, g.g_account_name IS NOT NULL AS googleapps,
+ UNIX_TIMESTAMP(s.start) AS lastlogin, s.host,
+ IF(a.is_admin, 'admin', 'user') AS perms
+ FROM accounts AS a
+ INNER JOIN auth_user_quick AS q ON(a.uid = q.user_id)
+ LEFT JOIN gapps_accounts AS g ON(a.uid = g.l_userid AND g.g_status = 'active')
+ LEFT JOIN logger.last_sessions AS ls ON (ls.uid = a.uid)
+ LEFT JOIN logger.sessions AS s ON(s.id = ls.id)
+ WHERE a.uid = {?} AND a.state = 'active'", $uid);
$sess = $res->fetchOneAssoc();
$perms = $sess['perms'];
unset($sess['perms']);
- $res = XDB::query('SELECT UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
- FROM logger.sessions AS s
- WHERE s.uid = {?} AND s.suid = 0
- ORDER BY s.start DESC
- LIMIT 1', $uid);
- if ($res->numRows()) {
- $sess = array_merge($sess, $res->fetchOneAssoc());
- }
- $suid = S::v('suid');
- if ($suid) {
- $logger = S::logger();
- $logger->log("suid_start", S::v('forlife')." by {$suid['uid']}");
- $sess['suid'] = $suid;
+ // Loads the data into the real session.
+ $_SESSION = array_merge($_SESSION, $sess);
+
+ // Starts the session's logger, and sets up the permanent cookie.
+ if (S::has('suid')) {
+ $suid = S::v('suid');
+ $logger = S::logger($uid);
+ $logger->log("suid_start", S::v('hruid') . " by " . $suid['hruid']);
} else {
- $logger = S::logger();
- //$logger->log("connexion", Env::v('n'));
+ $logger = S::logger($uid);
+ $logger->saveLastSession();
setcookie('ORGuid', $uid, (time() + 25920000), '/', '', 0);
- if (Post::v('remember', 'false') == 'true') {
- $cookie = hash_encrypt($sess['password']);
+
+ if (S::i('auth_by_cookie') == $uid || Post::v('remember', 'false') == 'true') {
+ $cookie = sha1($sess['password']);
setcookie('ORGaccess', $cookie, (time() + 25920000), '/', '', 0);
- if ($logger) {
+ if (S::i('auth_by_cookie') != $uid) {
$logger->log("cookie_on");
}
} else {
setcookie('ORGaccess', '', time() - 3600, '/', '', 0);
- if ($logger) {
- $logger->log("cookie_off");
- }
+ $logger->log("cookie_off");
}
}
- $_SESSION = array_merge($_SESSION, $sess);
- $this->makePerms($perms);
+ // Finalizes the session setup.
+ S::set('perms', User::makePerms($perms));
$this->securityChecks();
$this->setSkin();
$this->updateNbNotifs();
check_redirect();
+
+ // We should not have to use this private data anymore
+ S::kill('auth_by_cookie');
return true;
}
}
}
+ public function tokenAuth($login, $token)
+ {
+ $res = XDB::query('SELECT a.hruid
+ FROM aliases AS l
+ INNER JOIN accounts AS a ON (l.id = a.uid AND a.state = \'active\')
+ WHERE a.token = {?} AND l.alias = {?} AND l.type != \'homonyme\'',
+ $token, $login);
+ if ($res->numRows() == 1) {
+ $data = $res->fetchOneAssoc();
+ return new User($data['hruid'], $data);
+ }
+ return null;
+ }
+
public function makePerms($perm)
{
$flags = new PlFlagSet();
if ($perm == 'disabled' || $perm == 'ext') {
S::set('perms', $flags);
- S::set('perms_backup', $flags);
return;
}
$flags->addFlag(PERMS_USER);
$flags->addFlag(PERMS_ADMIN);
}
S::set('perms', $flags);
- S::set('perms_backup', $flags);
}
public function setSkin()
{
- global $globals;
if (S::logged() && (!S::has('skin') || S::has('suid'))) {
$uid = S::v('uid');
- $res = XDB::query("SELECT skin_tpl
- FROM auth_user_quick AS a
- INNER JOIN skins AS s ON a.skin = s.id
- WHERE user_id = {?} AND skin_tpl != ''", $uid);
+ $res = XDB::query('SELECT skin_tpl
+ FROM accounts AS a
+ INNER JOIN skins AS s on (a.skin = s.id)
+ WHERE a.uid = {?} AND skin_tpl != \'\'', S::i('uid'));
S::set('skin', $res->fetchOneCell());
}
}
+ public function loggedLevel()
+ {
+ return AUTH_COOKIE;
+ }
+
public function sureLevel()
{
return AUTH_MDP;