--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 Polytechnique.org *
+ * http://opensource.polytechnique.org/ *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+ ***************************************************************************/
+
+// PlUserNotFound is raised when a given id cannot be linked to an existing user.
+// The @p results give the list hruids (useful when several users are found).
+class UserNotFoundException extends Exception
+{
+ public function __construct($results = array())
+ {
+ $this->results = $results;
+ parent::__construct();
+ }
+}
+
+// Represents an user of the system, with a special focus on its identification
+// (hruid, forlife, and bestalias).
+// Note: each implementation of platal-core MUST create a subclass 'User' of
+// this abstract PlUser class.
+abstract class PlUser
+{
+ // User's data storage. By convention, null means the information hasn't
+ // been fetched yet, and false means the information is not available.
+
+ // Main (unique) identifiers.
+ protected $user_id = null;
+ protected $hruid = null;
+
+ // User's emails (bestalias should be preferred when sending emails).
+ 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);
+ }
+
+
+ // Properties accessors.
+ 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.
+ 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.
+ protected function fillFromArray(array $values)
+ {
+ foreach ($values as $key => $value) {
+ if (property_exists($this, $key) && !isset($this->$key)) {
+ $this->$key = $value;
+ }
+ }
+ }
+
+
+ // Returns a valid User object built from the @p id and optionnal @p values,
+ // or returns false and calls the callback if the @p id is not valid.
+ public static function get($login, $callback = false)
+ {
+ return User::getWithValues($login, array(), $callback);
+ }
+
+ public static function getWithValues($login, $values, $callback = false)
+ {
+ if (!$callback) {
+ $callback = array(__CLASS__, '_default_user_callback');
+ }
+
+ try {
+ return new User($login, $values);
+ } catch (UserNotFoundException $e) {
+ return call_user_func($callback, $login, $e->results);
+ }
+ }
+
+ // Alias on get() with the silent callback.
+ public static function getSilent($login)
+ {
+ return User::getWithValues($login, array(), array(__CLASS__, '_silent_user_callback'));
+ }
+
+ // Returns the forlife emails for @p members. If @p strict mode is enabled,
+ // it returns the list of validated forlife emails. If strict mode is not,
+ // it also returns unvalidated values (but still call the callback for them).
+ public static function getBulkForlifeEmails($logins, $strict = true, $callback = false)
+ {
+ if (!is_array($logins)) {
+ if (strlen(trim($logins)) == 0) {
+ return null;
+ }
+ $logins = explode(' ', $logins);
+ }
+
+ if ($logins) {
+ $list = array();
+ foreach ($logins as $i => $login) {
+ if (($user = User::get($login, $callback))) {
+ $list[$i] = $user->forlifeEmail();
+ } else if(!$strict) {
+ $list[$i] = $login;
+ }
+ }
+ return $list;
+ }
+ return null;
+ }
+
+ // Silent callback for the user lookup -- does nothing.
+ public static function _silent_user_callback($login, $results)
+ {
+ return;
+ }
+
+ // Default callback for user lookup -- displays an error message w.r.t. the
+ // number of matching users found.
+ abstract public static function _default_user_callback($login, $results);
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 Polytechnique.org *
+ * http://opensource.polytechnique.org/ *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+ ***************************************************************************/
+
+class User extends PlUser
+{
+ // Implementation of properties accessors.
+ 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;
+ }
+
+ // Implementation of the login to array(user_id, hruid) function.
+ protected 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));
+ }
+
+ // Implementation of the default user callback.
+ 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));
+ }
+ }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
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, $page;
+ // 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();
- $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()) {
+ $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;
}
// }}}
+// {{{ 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;
$res = XDB::query("
SELECT u.user_id AS uid, prenom, nom, perms, promo, password, FIND_IN_SET('femme', u.flags) AS femme,
- a.alias AS forlife, a2.alias AS bestalias, q.core_mail_fmt AS mail_fmt, q.core_rss_hash
+ u.hruid, a.alias AS forlife, a2.alias AS bestalias, q.core_mail_fmt AS mail_fmt, q.core_rss_hash
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))
+ 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))
WHERE u.user_id = {?} AND u.perms IN('admin','user')
LIMIT 1", Get::i('uid'));
$_SESSION = array_merge($_SESSION, $res->fetchOneAssoc());
// ou passwordpromptscreenlogged.tpl
if (S::has('suid')) {
$suid = S::v('suid');
- $login = $uname = $suid['forlife'];
+ $login = $uname = $suid['hruid'];
$redirect = false;
} else {
$uname = Env::v('username');
$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,
+ u.hruid, 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
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))
+ 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))
WHERE u.user_id = {?} AND u.perms IN('admin','user')", $uid);
$sess = $res->fetchOneAssoc();
$res = XDB::query("SELECT UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
if ($suid) {
$logger = new CoreLogger($uid, $suid['uid']);
- $logger->log("suid_start", S::v('forlife')." by {$suid['uid']}");
+ $logger->log("suid_start", S::v('hruid') . " by {$suid['uid']}");
$sess['suid'] = $suid;
} else {
$logger = S::v('log', new CoreLogger($uid));
case 'ajouter':
require_once('user.func.inc.php');
- if (($login = get_user_login($user)) !== false) {
+ if (($login = get_user_forlife($user)) !== false) {
if (XDB::execute(
'REPLACE INTO contacts (uid, contact)
SELECT {?}, id
--- /dev/null
+# Creates a new column for the hruid field, and adds an index on it.
+ALTER TABLE auth_user_md5
+ ADD COLUMN hruid VARCHAR(255) DEFAULT NULL AFTER user_id,
+ ADD UNIQUE INDEX hruid(hruid);
+
+
+# Pre-fills the hruid field with the current forlife.
+ UPDATE auth_user_md5 AS u
+LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
+ SET u.hruid = a.alias
+ WHERE a.alias IS NOT NULL AND u.hruid IS NULL;
+
+# vim:set syntax=mysql:
--- /dev/null
+<?php
+/***************************************************************************
+ * Copyright (C) 2003-2008 Polytechnique.org *
+ * http://opensource.polytechnique.org/ *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the Free Software *
+ * Foundation, Inc., *
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
+ ***************************************************************************/
+
+ini_set('include_path', dirname(__FILE__).'/../../include:' . dirname(__FILE__).'/../../classes:/usr/share/php');
+
+require_once 'xorg.inc.php';
+require_once 'xdb.php';
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
--- /dev/null
+#!/usr/bin/php5
+<?php
+
+require_once 'connect.db.inc.php';
+require_once 'xorg.misc.inc.php';
+
+// Fetches the list of unregistered users.
+$users = XDB::iterRow(
+ "SELECT user_id, prenom, nom, promo
+ FROM auth_user_md5
+ WHERE hruid IS NULL");
+
+// Creates missing human readable uids.
+while (list($user_id, $prenom, $nom, $promo) = $users->next()) {
+ $forlife = make_forlife($prenom, $nom, $promo);
+ if (!XDB::execute("UPDATE auth_user_md5 SET hruid = {?} WHERE user_id = {?}", $forlife, $user_id)) {
+ echo "WARNING: Duplicate forlife for user $user_id and forlife '$forlife'. Please check manually the entry.\n";
+ }
+}
+?>
done
###########################################################
+echo "Creating forlife ids for unregistered user (takes a while)."
+
+./hruid.update.php
+
+###########################################################