Merge commit 'origin/master' into hruid
authorVincent Zanotti <vincent.zanotti@polytechnique.org>
Sun, 21 Sep 2008 20:24:50 +0000 (22:24 +0200)
committerVincent Zanotti <vincent.zanotti@polytechnique.org>
Sun, 21 Sep 2008 20:24:50 +0000 (22:24 +0200)
Conflicts:
include/emails.inc.php

Signed-off-by: Vincent Zanotti <vincent.zanotti@polytechnique.org>
103 files changed:
bin/cron/checkdb.php
bin/cron/emails.check.php
bin/cron/homonymes.php
bin/cron/rapports_inscription.php
bin/lists.create_promo.php
classes/user.php [new file with mode: 0644]
classes/xnetsession.php
classes/xorgsession.php
include/banana/forum.inc.php
include/banana/hooks.inc.php
include/banana/ml.inc.php
include/banana/moderate.inc.php
include/emails.inc.php
include/googleapps.inc.php
include/marketing.inc.php
include/massmailer.inc.php
include/rss.inc.php
include/security.inc.php
include/user.func.inc.php
include/userset.inc.php
include/validations.inc.php
include/validations/aliases.inc.php
include/validations/broken.inc.php
include/validations/evts.inc.php
include/validations/googleapps.inc.php
include/validations/homonymes.inc.php
include/validations/listes.inc.php
include/validations/marketing.inc.php
include/validations/medals.inc.php
include/validations/nl.inc.php
include/validations/nomusage.inc.php
include/validations/orange.inc.php
include/validations/paiements.inc.php
include/validations/photos.inc.php
include/validations/surveys.inc.php
include/vcard.inc.php
include/wiki/farmconfig.php
modules/admin.php
modules/axletter.php
modules/axletter/axletter.inc.php
modules/carnet.php
modules/email.php
modules/events.php
modules/forums.php
modules/googleapps.php
modules/lists.php
modules/marketing.php
modules/newsletter.php
modules/platal.php
modules/profile.php
modules/profile/decos.inc.php
modules/register.php
modules/register/register.inc.php
modules/search.php
modules/survey/survey.inc.php
modules/xnetevents.php
modules/xnetevents/xnetevents.inc.php
modules/xnetgrp.php
modules/xnetlists.php
plugins/function.test_email.php
templates/admin/utilisateurs.tpl
templates/admin/valider.tpl
templates/emails/broken.tpl
templates/emails/lost.tpl
templates/emails/redirect.tpl
templates/emails/rewrite-in.mail.tpl
templates/emails/send.tpl
templates/emails/test.mail.tpl
templates/include/form.valid.broken.tpl
templates/include/form.valid.homonymes.tpl
templates/include/form.valid.mark.tpl
templates/include/form.valid.orange.tpl
templates/include/form.valid.paiements.tpl
templates/include/form.valid.photos.tpl
templates/include/minifiche.tpl
templates/marketing/broken.tpl
templates/marketing/marketing.mail.tpl
templates/marketing/private.tpl
templates/marketing/public.tpl
templates/profile/admin_trombino.tpl
templates/profile/profile.tpl
templates/skin/default.tpl
templates/skin/espace.tpl
templates/skin/humlinux.tpl
templates/skin/keynote.tpl
templates/skin/linux.tpl
templates/skin/liteskin.tpl
templates/skin/nbviolet.tpl
templates/skin/newxorg.tpl
templates/skin/oldtimes.tpl
templates/skin/openweb.tpl
templates/skin/register.tpl
templates/skin/sharky.tpl
templates/skin/spectral.tpl
templates/skin/trapped.tpl
templates/xnetgrp/asso.tpl
templates/xnetgrp/form.announce.tpl
templates/xnetgrp/inscrire.tpl
templates/xnetgrp/subscribe-valid.tpl
upgrade/hruid/03_hruid.sql [new file with mode: 0644]
upgrade/hruid/connect.db.inc.php [moved from plugins/function.make_forlife.php with 86% similarity]
upgrade/hruid/hruid.update.php [new file with mode: 0755]
upgrade/hruid/update.sh [new file with mode: 0755]

index b891fec..f70e566 100755 (executable)
@@ -85,6 +85,10 @@ check("SELECT  u.user_id, nom, prenom, promo,
 check("select uid from adresses where pub != 'private' and pub !='ax' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour une adresse");
 check("select uid from tels where tel_pub != 'private' and tel_pub !='ax' and tel_pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour un numero de telephone");
 
+/* validite des hruid */
+check("SELECT user_id, nom, prenom, promo FROM auth_user_md5 WHERE hruid IS NULL OR hruid = ''",
+      "Utilisateur n'ayant pas de hruid.");
+
 /* validite de aliases */
 check("SELECT a.*
         FROM aliases       AS a
index c9690c9..1ed5a4d 100755 (executable)
@@ -68,18 +68,18 @@ if (count($conflits) > 0) {
  * Check dead emails
  */
 if ($panne_level > 0) {
-    $sql = "SELECT  e.email, a.alias AS forlife
+    $sql = "SELECT  e.email, u.hruid
               FROM  emails  AS e
-        INNER JOIN  aliases AS a ON a.id = e.uid AND a.type = 'a_vie'
+        INNER JOIN  auth_user_md5 AS u ON u.user_id = e.uid
              WHERE  e.panne_level = $panne_level AND e.flags = 'active'
-          ORDER BY  a.alias";
+          ORDER BY  u.hruid";
     $res = Xdb::query($sql);
 
     if ($res->numRows()) {
         $result = $res->fetchAllAssoc();
         echo "Nouvelles adresses en panne detectees :\n";
         foreach ($result as $assoc) {
-            echo '* ' . $assoc['email'] . ' pour ' . $assoc['forlife'] . "\n";
+            echo '* ' . $assoc['email'] . ' pour ' . $assoc['hruid'] . "\n";
         }
         echo "\n\n";
 
index 9cfc622..608e3ba 100755 (executable)
  *  Foundation, Inc.,                                                      *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
-/* vim: set sw=4 ts=4 sts=4 tw=100:
+/**
  * crée des demandes de validation pour les kill d'alias
  * une demande 10 jours avant pour un warning, puis une autre pour le robot
-*/
+ */
 
-$W_PERIOD = "INTERVAL 7 DAY"; // temps d'envoi du warning avant la deadline
+require('connect.db.inc.php');
+require_once('validations/homonymes.inc.php');
 
-require('./connect.db.inc.php');
+$resRobot = XDB::iterator(
+        "SELECT  id, alias, expire
+           FROM  aliases
+          WHERE  (expire = NOW() + INTERVAL 7 DAY OR expire <= NOW())
+                 AND type = 'alias'");
+while ($old = $resRobot->next()) {
+    $res = XDB::query(
+            "SELECT  u.hruid
+               FROM  homonymes AS h
+         INNER JOIN  auth_user_md5 AS u USING (user_id)
+              WHERE  homonyme_id = {?}",
+            $old['id']);
+    $hruids = $res->fetchColumn();
 
-$resRobot = XDB::iterator("SELECT id, alias, expire FROM aliases WHERE (expire = NOW() + $W_PERIOD OR expire <= NOW()) AND type = 'alias'");
-
-if ($resRobot->total()) {
-    require_once('validations/homonymes.inc.php');
-    while ($old = $resRobot->next()) {
-       $res = XDB::query("SELECT alias AS forlife FROM homonymes INNER JOIN aliases ON(user_id = id) WHERE homonyme_id = {?} AND type='a_vie'", $old['id']);
-       $forlifes = $res->fetchColumn();
-       $req = new HomonymeReq($old['id'], $old['alias'], $forlifes, $old['expire'] > date("Y-m-d"));
-       $req->submit();
-    }
+    $homonyme = User::getSilent($old['id']);
+    $req = new HomonymeReq($homonyme, $old['alias'], $hruids, $old['expire'] > date("Y-m-d"));
+    $req->submit();
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index d25f1fd..b7e9167 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/php5 -q
 <?php
-require('./connect.db.inc.php');
+require('connect.db.inc.php');
 $MESSAGE = '';
 
 // ---------------------------------------
@@ -23,10 +23,11 @@ if ($a = $res->total()) {
 // ---------------------------------------
 
 $res = XDB::iterRow(
-        "SELECT  forlife, email, date
-           FROM  register_pending
-          WHERE  hash != 'INSCRIT'
-       ORDER BY  date");
+        "SELECT  u.hruid, r.email, r.date
+           FROM  register_pending AS r
+      LEFT JOIN  auth_user_md5 AS u ON (u.user_id = r.uid)
+          WHERE  r.hash != 'INSCRIT'
+       ORDER BY  r.date");
 if ($b = $res->total()) {
     $MESSAGE.="\n$b INSCRIPTIONS NON CONFIRMEES:\n";
     while (list($usern, $mail, $quand) = $res->next()) {       
@@ -38,14 +39,13 @@ if ($b = $res->total()) {
 
 $res = XDB::query('SELECT COUNT(DISTINCT uid), COUNT(*) FROM register_marketing');
 list($a, $b) = $res->fetchOneRow();
-$MESSAGE .= "\n$c INSCRIPTIONS SOLICITÉES :\n";
+$MESSAGE .= "\nINSCRIPTIONS SOLICITÉES :\n";
 $MESSAGE .= "    $a utilisateurs\n    $b adresses email\n";
 
 // ---------------------------------------
 
 $MESSAGE .= "\n\n";
 
-require_once('../../classes/plmailer.php');
 $mailer = new PlMailer();
 $mailer->setSubject("$a confirmées, $b en attente et $c sollicitées");
 $mailer->setFrom($globals->register->notif);
index 34eb213..35a1200 100755 (executable)
@@ -17,10 +17,18 @@ EOF;
     exit;
 }
 
+// Retrieves list parameters.
 $promo = intval($opt['p']);
 $owner = $opt['o'];
 
-$req = new ListeReq(0, false, "promo$promo", $globals->mail->domain, "Liste de la promotion $promo",
+$owner_user = User::getSilent($owner);
+if (!$owner_user) {
+    echo "Supplied owner is not valid, aborting.\n";
+    exit 1;
+}
+
+// Creates the list.
+$req = new ListeReq($owner_user, false, "promo$promo", $globals->mail->domain, "Liste de la promotion $promo",
                     1 /*private*/, 2 /*moderate*/, 0 /*free subscription*/,
                     array($owner), array());
 $req->submit();
diff --git a/classes/user.php b/classes/user.php
new file mode 100644 (file)
index 0000000..eb112ca
--- /dev/null
@@ -0,0 +1,231 @@
+<?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 the login to uid method.
+    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 FROM auth_user_md5 WHERE user_id = {?}", $login);
+            if ($res->numRows()) {
+                return $res->fetchOneCell();
+            }
+
+            throw new UserNotFoundException();
+        }
+
+        // Checks whether $login is a valid hruid or not.
+        $res = XDB::query("SELECT user_id FROM auth_user_md5 WHERE hruid = {?}", $login);
+        if ($res->numRows()) {
+            return $res->fetchOneCell();
+        }
+
+        // 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
+                                 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->fetchOneCell();
+            }
+
+            if (preg_match('/^(.*)\.([0-9]{4})$/u', $mbox, $matches)) {
+                $res = XDB::query("SELECT  u.user_id
+                                     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->fetchOneCell();
+                }
+            }
+
+            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
+                                     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();
+                }
+            }
+
+            throw new UserNotFoundException();
+        }
+
+        // Otherwise, we do suppose $login is an email redirection.
+        $res = XDB::query("SELECT  u.user_id
+                             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->fetchOneCell();
+        }
+
+        throw new UserNotFoundException($res->fetchColumn(1));
+    }
+
+    // Implementation of the data loader.
+    protected function loadMainFields()
+    {
+        if ($this->hruid !== null && $this->forlife !== null
+            && $this->bestalias !== null && $this->display_name !== null
+            && $this->full_name !== null && $this->promo !== null && $this->perms !== null
+            && $this->gender !== null && $this->email_format !== null) {
+            return;
+        }
+
+        global $globals;
+        $res = XDB::query("SELECT  u.hruid, u.promo,
+                                   CONCAT(af.alias, '@{$globals->mail->domain}') AS forlife,
+                                   CONCAT(ab.alias, '@{$globals->mail->domain}') AS bestalias,
+                                   CONCAT(u.prenom, ' ', IF(u.nom_usage <> '', u.nom_usage, u.nom)) AS full_name,
+                                   IF(u.prenom != '', u.prenom, u.nom) AS display_name,
+                                   FIND_IN_SET('femme', u.flags) AS gender,
+                                   q.core_mail_fmt AS email_format,
+                                   u.perms
+                             FROM  auth_user_md5 AS u
+                        LEFT JOIN  auth_user_quick AS q ON (q.user_id = u.user_id)
+                        LEFT JOIN  aliases AS af ON (af.id = u.user_id AND af.type = 'a_vie')
+                        LEFT JOIN  aliases AS ab ON (ab.id = u.user_id AND FIND_IN_SET('bestalias', ab.flags))
+                            WHERE  u.user_id = {?}", $this->user_id);
+        $this->fillFromArray($res->fetchOneAssoc());
+    }
+
+    // Specialization of the fillFromArray method, to implement hacks to enable
+    // lazy loading of user's main properties from the session.
+    // TODO(vzanotti): remove the conversion hacks once the old codebase will
+    // stop being used actively.
+    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'];
+        }
+
+        // Also, if display_name and full_name are not known, but the user's
+        // surname and last name are, we can construct the former two.
+        if (isset($values['prenom']) && isset($values['nom'])) {
+            if (!isset($values['display_name'])) {
+                $values['display_name'] = ($values['prenom'] ? $values['prenom'] : $values['nom']);
+            }
+            if (!isset($values['full_name'])) {
+                $values['full_name'] = $values['prenom'] . ' ' . $values['nom'];
+            }
+        }
+
+        // We also need to convert the gender (usually named "femme"), and the
+        // email format parameter (valued "texte" instead of "text").
+        if (isset($values['femme'])) {
+            $values['gender'] = (bool) $values['femme'];
+        }
+        if (isset($values['mail_fmt'])) {
+            $values['email_format'] = $values['mail_fmt'];
+        }
+        if (isset($values['email_format'])) {
+            $values['email_format'] = ($values['email_format'] ? self::FORMAT_HTML : self::FORMAT_TEXT);
+        }
+
+        parent::fillFromArray($values);
+    }
+
+    // Specialization of the buildPerms method
+    // This function build 'generic' permissions for the user. It does not take
+    // into account page specific permissions (e.g X.net group permissions)
+    protected function buildPerms()
+    {
+        if (!is_null($this->perm_flags)) {
+            return;
+        }
+        if ($this->perms === null) {
+             $this->loadMainFields();
+        }
+        $this->perm_flags = self::makePerms($this->perms);
+    }
+
+    // Return permission flags for a given permission level.
+    public static function makePerms($perms)
+    {
+        $flags = new PlFlagSet();
+        if (is_null($flags) || $perms == 'disabled' || $perms == 'ext') {
+            return $flags;
+        }
+        $flags->addFlag(PERMS_USER);
+        if ($perms == 'admin') {
+            $flags->addFlag(PERMS_ADMIN);
+        }
+        return $flags;
+    }
+
+    // Implementation of the default user callback.
+    public static function _default_user_callback($login, $results)
+    {
+        $result_count = count($results);
+        if ($result_count == 0 || !S::has_perms()) {
+            Platal::page()->trigError("Il n'y a pas d'utilisateur avec l'identifiant : $login");
+        } else {
+            Platal::page()->trigError("Il y a $result_count utilisateurs avec cet identifiant : " . join(', ', $results));
+        }
+    }
+
+    // Implementation of the static email locality checker.
+    public static function isForeignEmailAddress($email)
+    {
+        global $globals;
+        if (strpos($email, '@') === false) {
+            return false;
+        }
+
+        list($user, $dom) = explode('@', $email);
+        return $dom != $globals->mail->domain &&
+               $dom != $globals->mail->domain2 &&
+               $dom != $globals->mail->alias_dom &&
+               $dom != $globals->mail->alias_dom2;
+    }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
index a1a6cf8..837e469 100644 (file)
@@ -97,19 +97,21 @@ class XnetSession extends XorgSession
         if ($level == -1) {
             S::set('auth', AUTH_MDP);
         }
-        $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
+        $res  = XDB::query("SELECT  u.user_id AS uid, u.hruid, prenom, nom, perms, promo, password, FIND_IN_SET('femme', u.flags) AS femme,
+                                    CONCAT(a.alias, '@{$globals->mail->domain}') AS forlife,
+                                    CONCAT(a2.alias, '@{$globals->mail->domain}') 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))
-                             WHERE  u.user_id = {?} AND u.perms IN(\'admin\', \'user\')
-                             LIMIT  1', $user);
+                        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", $user);
         $sess = $res->fetchOneAssoc();
         $perms = $sess['perms'];
         unset($sess['perms']);
         $_SESSION = array_merge($_SESSION, $sess);
-        $this->makePerms($perms);
+        S::set('perms', User::makePerms($perms));
         S::kill('challenge');
         S::kill('loginX');
         S::kill('may_update');
@@ -129,7 +131,7 @@ class XnetSession extends XorgSession
         if (!$this->startSUID(S::i('uid'))) {
             return false;
         }
-        $this->makePerms('user');
+        S::set('perms', User::makePerms('user'));
         return true;
     }
 
index 025af61..e0f89ee 100644 (file)
@@ -128,7 +128,7 @@ class XorgSession extends PlSession
          */
         if (S::has('suid')) {
             $suid  = S::v('suid');
-            $login = $uname = $suid['forlife'];
+            $login = $uname = $suid['hruid'];
             $redirect = false;
         } else {
             $uname = Env::v('username');
@@ -182,17 +182,19 @@ class XorgSession extends PlSession
         unset($_SESSION['log']);
 
         // Retrieves main user properties.
-        $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,
+        global $globals;
+        $res  = XDB::query("SELECT  u.user_id AS uid, u.hruid, prenom, prenom_ini, nom, nom_ini, nom_usage, perms, promo, promo_sortie,
+                                    matricule, password, FIND_IN_SET('femme', u.flags) AS femme,
+                                    CONCAT(a.alias, '@{$globals->mail->domain}') AS forlife,
+                                    CONCAT(a2.alias, '@{$globals->mail->domain}') 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
+                                    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);
+                        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);
         $sess = $res->fetchOneAssoc();
         $perms = $sess['perms'];
         unset($sess['perms']);
@@ -214,7 +216,7 @@ class XorgSession extends PlSession
         if (S::has('suid')) {
             $suid = S::v('suid');
             $logger = S::logger($uid);
-            $logger->log("suid_start", S::v('forlife') . " by " . $suid['uid']);
+            $logger->log("suid_start", S::v('hruid') . " by " . $suid['hruid']);
         } else {
             $logger = S::logger($uid);
             setcookie('ORGuid', $uid, (time() + 25920000), '/', '', 0);
@@ -234,7 +236,7 @@ class XorgSession extends PlSession
         }
 
         // Finalizes the session setup.
-        $this->makePerms($perms);
+        S::set('perms', User::makePerms($perms));
         $this->securityChecks();
         $this->setSkin();
         $this->updateNbNotifs();
@@ -269,26 +271,14 @@ class XorgSession extends PlSession
 
     public function tokenAuth($login, $token)
     {
-        // FIXME: we broke the session here because some RSS feeds (mainly wiki feeds) require
-        // a valid nome and checks the permissions. When the PlUser object will be ready, we'll
-        // be able to return a simple 'PlUser' object here without trying to alterate the
-        // session.
-        $res = XDB::query('SELECT  u.user_id AS uid, u.perms, u.nom, u.nom_usage, u.prenom, u.promo, FIND_IN_SET(\'femme\', u.flags) AS sexe
+        $res = XDB::query('SELECT  u.hruid
                              FROM  aliases         AS a
                        INNER JOIN  auth_user_md5   AS u ON (a.id = u.user_id AND u.perms IN ("admin", "user"))
                        INNER JOIN  auth_user_quick AS q ON (a.id = q.user_id AND q.core_rss_hash = {?})
                             WHERE  a.alias = {?} AND a.type != "homonyme"', $token, $login);
         if ($res->numRows() == 1) {
-            $sess = $res->fetchOneAssoc();
-            if (!S::has('uid')) {
-                $_SESSION = $sess;
-                $this->makePerms($sess['perms']);
-                return S::i('uid');
-            } else if (S::i('uid') == $sess['uid']) {
-                return S::i('uid');
-            } else {
-                Platal::page()->kill('Invalid state. To be fixed when hruid is ready');
-            }
+            $data = $res->fetchOneAssoc();
+            return new User($data['hruid'], $data);
         }
         return null;
     }
index 53d01c6..e9dff7e 100644 (file)
@@ -24,22 +24,22 @@ require_once 'banana/hooks.inc.php';
 
 function hook_checkcancel($_headers)
 {
-    return ($_headers['x-org-id'] == S::v('forlife') or S::has_perms());
+    return ($_headers['x-org-id'] == S::v('hruid') or S::has_perms());
 }
 
 class ForumsBanana extends Banana
 {
-    private $forlife;
+    private $user;
 
-    public function __construct($forlife, $params = null)
+    public function __construct(User &$user, $params = null)
     {
-        $this->forlife = $forlife;
+        $this->user = &$user;
 
         global $globals;
         Banana::$msgedit_canattach = false;
         Banana::$spool_root = $globals->banana->spool_root;
         array_push(Banana::$msgparse_headers, 'x-org-id', 'x-org-mail');
-        Banana::$nntp_host = 'news://web_'.$forlife
+        Banana::$nntp_host = 'news://web_' . $user->login()
                            . ":{$globals->banana->password}@{$globals->banana->server}:{$globals->banana->port}/";
         if (S::has_perms()) {
             Banana::$msgshow_mimeparts[] = 'source';
@@ -74,7 +74,7 @@ class ForumsBanana extends Banana
                             WHERE  uid={?}", S::i('uid'));
         if (!(list($nom, $mail, $sig, $disp, $maj, $unread, $read) = $req->fetchOneRow())) {
             $nom  = S::v('prenom')." ".S::v('nom');
-            $mail = S::v('forlife')."@" . $globals->mail->domain;
+            $mail = $this->user->forlifeEmail();
             $sig  = $nom." (".S::v('promo').")";
             $disp = 0;
             $maj  = 1;
@@ -136,13 +136,11 @@ class ForumsBanana extends Banana
     public function post($dest, $reply, $subject, $body)
     {
         global $globals;
-        $res = XDB::query('SELECT  nom, prenom, promo, b.alias AS bestalias
+        $res = XDB::query('SELECT  nom, prenom, promo
                              FROM  auth_user_md5 AS u
-                       INNER JOIN  aliases       AS a ON (a.id = u.user_id)
-                       INNER JOIN  aliases       AS b ON (b.id = a.id AND FIND_IN_SET(\'bestalias\', b.flags))
-                            WHERE  a.alias = {?}', $this->forlife);
-        list($nom, $prenom, $promo, $bestalias) = $res->fetchOneRow();
-        Banana::$profile['headers']['From']         = "$prenom $nom ($promo) <$bestalias@{$globals->mail->domain}>";
+                            WHERE  u.user_id = {?}', $this->user->id());
+        list($nom, $prenom, $promo) = $res->fetchOneRow();
+        Banana::$profile['headers']['From']         = "$prenom $nom ($promo) <{$this->user->bestEmail()}>";
         Banana::$profile['headers']['Organization'] = make_Organization();
         return parent::post($dest, $reply, $subject, $body);
     }
@@ -227,7 +225,7 @@ class ForumsBanana extends Banana
              WHERE  uid = {?}", S::v('uid'));
         if (!(list($nom, $mail, $sig, $disp, $maj, $xface, $unread, $read) = $req->fetchOneRow())) {
             $nom   = S::v('prenom').' '.S::v('nom');
-            $mail  = S::v('forlife').'@'.$globals->mail->domain;
+            $mail  = S::user()->forlifeEmail();
             $sig   = $nom.' ('.S::v('promo').')';
             $disp  = 0;
             $maj   = 0;
index 71e4aff..69c5c37 100644 (file)
@@ -76,7 +76,7 @@ function hook_platalRSS($group)
     } else {
         $group = '';
     }
-    return '/rss/' . $group . S::v('forlife') . '/' . S::v('core_rss_hash') . '/rss.xml';
+    return '/rss/' . $group . S::v('hruid') . '/' . S::v('core_rss_hash') . '/rss.xml';
 }
 
 function hook_platalMessageLink($params)
@@ -322,7 +322,7 @@ class BananaHandler
 
 function run_banana(&$page, $class, array $args)
 {
-    $banana = new $class(S::v('forlife'), $args);
+    $banana = new $class(S::user(), $args);
     $page->assign('banana', $banana->run());
     $page->addCssInline($banana->css());
     $page->addCssLink('banana.css');
index c2eea5c..9a3174f 100644 (file)
@@ -45,10 +45,13 @@ class MLBanana extends Banana
 {
     static public $listname;
     static public $domain;
+    private $user;
 
-    function __construct($forlife, $params = null)
+    function __construct(User &$user, $params = null)
     {
         global $globals;
+        $this->user = &$user;
+
         Banana::$spool_root = $globals->banana->spool_root;
         Banana::$spool_boxlist = false;
         Banana::$msgedit_canattach = true;
@@ -75,9 +78,9 @@ class MLBanana extends Banana
         global $platal, $globals;
 
         $nom  = S::v('prenom') . ' ' . S::v('nom');
-        $mail = S::v('bestalias') . '@' . $globals->mail->domain;
+        $mail = $this->user->bestEmail();
         $sig  = $nom . ' (' . S::v('promo') . ')';
-        Banana::$msgedit_headers['X-Org-Mail'] = S::v('forlife') . '@' . $globals->mail->domain;
+        Banana::$msgedit_headers['X-Org-Mail'] = $this->user->forlifeEmail();
 
         // Tree color
         $req = XDB::query("SELECT  tree_unread, tree_read
index 9e5588a..a6439b0 100644 (file)
@@ -25,7 +25,7 @@ require_once 'banana/hooks.inc.php';
 
 function hook_checkcancel($_headers)
 {
-    return ($_headers['x-org-id'] == S::v('forlife') or S::has_perms());
+    return ($_headers['x-org-id'] == S::v('hruid') or S::has_perms());
 }
 
 function hook_makeLink($params)
@@ -57,7 +57,7 @@ class ModerationBanana extends Banana
     static public $domain;
     static public $client;
 
-    function __construct($forlife, $params = null)
+    function __construct(User &$user, $params = null)
     {
         ini_set('memory_limit', '128M'); 
 
index 0984c38..db87791 100644 (file)
@@ -27,12 +27,12 @@ define("ERROR_LOOP_EMAIL", 4);
 // function fix_bestalias() {{{1
 // Checks for an existing 'bestalias' among the the current user's aliases, and
 // eventually selects a new bestalias when required.
-function fix_bestalias($uid)
+function fix_bestalias(User &$user)
 {
     $res = XDB::query("SELECT  COUNT(*)
                          FROM  aliases
                         WHERE  id = {?} AND FIND_IN_SET('bestalias', flags) AND type != 'homonyme'",
-                      $uid);
+                      $user->id());
     if ($res->fetchOneCell()) {
         return;
     }
@@ -41,7 +41,7 @@ function fix_bestalias($uid)
                      SET  flags=CONCAT(flags,',','bestalias')
                    WHERE  id={?} AND type!='homonyme'
                 ORDER BY  !FIND_IN_SET('usage',flags),alias LIKE '%.%', LENGTH(alias)
-                   LIMIT  1", $uid);
+                   LIMIT  1", $user->id());
 }
 
 // function valide_email() {{{1
@@ -80,26 +80,28 @@ class Bogo
 {
     // properties {{{2
 
-    private $uid;
+    private $user;
     private $state;
     private $_states = Array('let_spams', 'tag_spams', 'tag_and_drop_spams', 'drop_spams');
 
     // constructor {{{2
 
-    public function __construct($uid)
+    public function __construct(User &$user)
     {
-        if (!$uid) {
+        if (!$user) {
             return;
         }
 
-        $this->uid = $uid;
-        $res = XDB::query('SELECT email FROM emails WHERE uid={?} AND flags="filter"', $uid);
+        $this->user = &$user;
+        $res = XDB::query('SELECT email FROM emails WHERE uid = {?} AND flags = "filter"', $user->id());
         if ($res->numRows()) {
             $this->state = $res->fetchOneCell();
         } else {
             $this->state = 'tag_and_drop_spams';
-            $res = XDB::query("INSERT INTO emails (uid,email,rewrite,panne,flags)
-                                    VALUES ({?},'tag_and_drop_spams','','0000-00-00','filter')", $uid);
+            $res = XDB::query(
+                    "INSERT INTO  emails (uid, email, rewrite, panne, flags)
+                          VALUES  ({?}, 'tag_and_drop_spams', '', '0000-00-00', 'filter')",
+                    $user->id());
         }
     }
 
@@ -108,8 +110,8 @@ class Bogo
     public function change($state)
     {
         $this->state = is_int($state) ? $this->_states[$state] : $state;
-        XDB::execute('UPDATE emails SET email={?} WHERE uid={?} AND flags = "filter"',
-                     $this->state, $this->uid);
+        XDB::execute('UPDATE emails SET email = {?} WHERE uid = {?} AND flags = "filter"',
+                     $this->state, $this->user->id());
     }
 
     // pubic function level() {{{2
@@ -126,7 +128,7 @@ class Bogo
 // Storage emails (Polytechnique.org).
 abstract class Email
 {
-    protected $uid;
+    protected $user;
 
     // Basic email properties; $sufficient indicates if the email can be used as
     // an unique redirection; $email contains the delivery email address.
@@ -176,9 +178,9 @@ class EmailRedirection extends Email
 {
     // constructor {{{2
 
-    public function __construct($uid, $row)
+    public function __construct(User &$user, $row)
     {
-        $this->uid = $uid;
+        $this->user = &$user;
         $this->sufficient = true;
 
         list($this->email, $flags, $this->rewrite, $this->allow_rewrite, $this->hash, $this->panne, $this->last, $this->panne_level) = $row;
@@ -196,8 +198,8 @@ class EmailRedirection extends Email
             XDB::execute("UPDATE  emails
                              SET  panne_level = IF(flags = 'panne', panne_level - 1, panne_level),
                                   flags = 'active'
-                           WHERE  uid={?} AND email={?}", $this->uid, $this->email);
-            S::logger()->log("email_on", $this->email.($this->uid!=S::v('uid') ? "(admin on {$this->uid})" : ""));
+                           WHERE  uid = {?} AND email = {?}", $this->user->id(), $this->email);
+            S::logger()->log("email_on", $this->email . ($this->user->id() != S::v('uid') ? "(admin on {$this->user->login()})" : ""));
             $this->active = true;
             $this->broken = false;
         }
@@ -209,8 +211,8 @@ class EmailRedirection extends Email
     {
         if ($this->active) {
             XDB::execute("UPDATE  emails SET flags =''
-                           WHERE  uid={?} AND email={?}", $this->uid, $this->email);
-            S::logger()->log("email_off",$this->email.($this->uid != S::v('uid') ? "(admin on {$this->uid})" : "") );
+                           WHERE  uid = {?} AND email = {?}", $this->user->id(), $this->email);
+            S::logger()->log("email_off", $this->email . ($this->user->id() != S::v('uid') ? "(admin on {$this->user->login()})" : "") );
             $this->active = false;
         }
     }
@@ -225,7 +227,7 @@ class EmailRedirection extends Email
         if (!$rewrite || !isvalid_email($rewrite)) {
             $rewrite = '';
         }
-        XDB::execute('UPDATE emails SET rewrite={?} WHERE uid={?} AND email={?}', $rewrite, $this->uid, $this->email);
+        XDB::execute('UPDATE emails SET rewrite = {?} WHERE uid = {?} AND email = {?}', $rewrite, $this->user->id(), $this->email);
         $this->rewrite = $rewrite;
         if (!$this->allow_rewrite) {
             global $globals;
@@ -233,26 +235,15 @@ class EmailRedirection extends Email
                 $this->hash = rand_url_id();
                 XDB::execute("UPDATE emails
                                  SET hash = {?}
-                               WHERE uid = {?} AND email = {?}", $this->hash, $this->uid, $this->email);
+                               WHERE uid = {?} AND email = {?}", $this->hash, $this->user->id(), $this->email);
             }
-            $res = XDB::query("SELECT  IF(u.nom_usage = '', u.nom, u.nom_usage) AS nom, u.prenom, FIND_IN_SET('femme', u.flags) AS sex,
-                                       q.core_mail_fmt, a.alias AS forlife, a2.alias AS bestalias
-                                 FROM  auth_user_md5 AS u
-                           INNER JOIN  auth_user_quick AS q ON (u.user_id = q.user_id)
-                           INNER JOIN  aliases         AS a ON (a.id = u.user_id AND a.type = 'a_vie')
-                           INNER JOIN  aliases         AS a2 ON (a2.id = u.user_id AND FIND_IN_SET('bestalias', a2.flags))
-                                WHERE  u.user_id = {?}", $this->uid);
-            list($nom, $prenom, $sexe, $fmt, $forlife, $bestalias) = $res->fetchOneRow();
             $mail = new PlMailer('emails/rewrite-in.mail.tpl');
             $mail->assign('mail', $this);
-            $mail->assign('nom', $nom);
-            $mail->assign('prenom', $prenom);
-            $mail->assign('sexe', $sexe);
-            $mail->assign('forlife', $forlife);
+            $mail->assign('user', $this->user);
             $mail->assign('baseurl', $globals->baseurl);
             $mail->assign('sitename', $globals->core->sitename);
             $mail->assign('to', $this->email);
-            $mail->send($fmt == 'html');
+            $mail->send($this->user->isEmailFormatHtml());
         }
         return;
     }
@@ -270,7 +261,7 @@ class EmailRedirection extends Email
         return XDB::execute("UPDATE  emails
                                 SET  panne_level = 0, panne = 0, last = 0
                               WHERE  uid = {?} AND email = {?}",
-                            $this->uid, $this->email);
+                            $this->user->id(), $this->email);
     }
 
     // public function has_rewrite() {{{2
@@ -310,7 +301,7 @@ class EmailStorage extends Email
     {
         $res = XDB::query("SELECT  mail_storage
                              FROM  auth_user_md5
-                            WHERE  user_id = {?}", $this->uid);
+                            WHERE  user_id = {?}", $this->user->id());
         return new PlFlagSet($res->fetchOneCell());
     }
 
@@ -319,11 +310,11 @@ class EmailStorage extends Email
     {
         XDB::execute("UPDATE  auth_user_md5
                          SET  mail_storage = {?}
-                       WHERE  user_id = {?}", $storages, $this->uid);
+                       WHERE  user_id = {?}", $storages, $this->user->id());
     }
 
     // Returns the list of allowed storages for the @p user.
-    static public function get_allowed_storages($uid)
+    static public function get_allowed_storages(User &$user)
     {
         global $globals;
         $storages = array();
@@ -331,7 +322,7 @@ class EmailStorage extends Email
         // Google Apps storage is available for users with valid Google Apps account.
         require_once 'googleapps.inc.php';
         if ($globals->mailstorage->googleapps_domain &&
-            GoogleAppsAccount::account_status($uid) == 'active') {
+            GoogleAppsAccount::account_status($user->id()) == 'active') {
             $storages[] = 'googleapps';
         }
 
@@ -345,9 +336,9 @@ class EmailStorage extends Email
     }
 
 
-    public function __construct($uid, $name)
+    public function __construct(User &$user, $name)
     {
-        $this->uid = $uid;
+        $this->user = &$user;
         $this->email = $name;
         $this->display_email = (isset($this->display_names[$name]) ? $this->display_names[$name] : $name);
 
@@ -402,30 +393,30 @@ class Redirect
     // properties {{{2
 
     private $flag_active = 'active';
-    private $uid;
+    private $user;
 
     public $emails;
     public $bogo;
 
     // constructor {{{2
 
-    public function __construct($_uid)
+    public function __construct(User &$user)
     {
-        $this->uid = $_uid;
-        $this->bogo = new Bogo($_uid);
+        $this->user = &$user;
+        $this->bogo = new Bogo($user);
 
         // Adds third-party email redirections.
         $res = XDB::iterRow("SELECT  email, flags, rewrite, allow_rewrite, hash, panne, last, panne_level
                                FROM  emails
-                              WHERE  uid = {?} AND flags != 'filter'", $_uid);
+                              WHERE  uid = {?} AND flags != 'filter'", $user->id());
         $this->emails = Array();
         while ($row = $res->next()) {
-            $this->emails[] = new EmailRedirection($_uid, $row);
+            $this->emails[] = new EmailRedirection($user, $row);
         }
 
         // Adds local email storage backends.
-        foreach (EmailStorage::get_allowed_storages($_uid) as $storage) {
-            $this->emails[] = new EmailStorage($_uid, $storage);
+        foreach (EmailStorage::get_allowed_storages($user) as $storage) {
+            $this->emails[] = new EmailStorage($user, $storage);
         }
     }
 
@@ -448,8 +439,8 @@ class Redirect
         if (!$this->other_active($email)) {
             return ERROR_INACTIVE_REDIRECTION;
         }
-        XDB::execute('DELETE FROM emails WHERE uid={?} AND email={?}', $this->uid, $email);
-        S::logger()->log('email_del',$email.($this->uid!=S::v('uid') ? " (admin on {$this->uid})" : ""));
+        XDB::execute('DELETE FROM emails WHERE uid = {?} AND email = {?}', $this->user->id(), $email);
+        S::logger()->log('email_del', $email . ($this->user->id() != S::v('uid') ? " (admin on {$this->user->login()})" : ""));
         foreach ($this->emails as $i => $mail) {
             if ($email == $mail->email) {
                 unset($this->emails[$i]);
@@ -470,19 +461,19 @@ class Redirect
         if (!isvalid_email_redirection($email_stripped)) {
             return ERROR_LOOP_EMAIL;
         }
-        XDB::execute('REPLACE INTO emails (uid,email,flags) VALUES({?},{?},"active")', $this->uid, $email);
+        XDB::execute('REPLACE INTO emails (uid,email,flags) VALUES({?},{?},"active")', $this->user->id(), $email);
         if ($logger = S::v('log', null)) { // may be absent --> step4.php
-            S::logger()->log('email_add',$email.($this->uid!=S::v('uid') ? " (admin on {$this->uid})" : ""));
+            S::logger()->log('email_add', $email . ($this->user->id() != S::v('uid') ? " (admin on {$this->user->login()})" : ""));
         }
         foreach ($this->emails as $mail) {
             if ($mail->email == $email_stripped) {
                 return SUCCESS;
             }
         }
-        $this->emails[] = new EmailRedirection($this->uid, array($email, 'active', '', 0, null, '0000-00-00', '0000-00-00', 0));
+        $this->emails[] = new EmailRedirection($this->user, array($email, 'active', '', 0, null, '0000-00-00', '0000-00-00', 0));
 
         // security stuff
-        check_email($email, "Ajout d'une adresse surveillée aux redirections de " . $this->uid);
+        check_email($email, "Ajout d'une adresse surveillée aux redirections de " . $this->user->login());
         check_redirect($this);
         return SUCCESS;
     }
@@ -562,7 +553,7 @@ class Redirect
     {
         XDB::execute("UPDATE  emails
                          SET  flags = 'disable'
-                       WHERE  flags = 'active' AND uid = {?}", $this->uid);
+                       WHERE  flags = 'active' AND uid = {?}", $this->user->id);
         foreach ($this->emails as &$mail) {
             if ($mail->active && $mail->has_disable()) {
                 $mail->disabled = true;
@@ -578,7 +569,7 @@ class Redirect
     {
         XDB::execute("UPDATE  emails
                          SET  flags = 'active'
-                       WHERE  flags = 'disable' AND uid = {?}", $this->uid);
+                       WHERE  flags = 'disable' AND uid = {?}", $this->user->id);
         foreach ($this->emails as &$mail) {
             if ($mail->disabled) {
                 $mail->active   = true;
@@ -642,7 +633,7 @@ class Redirect
 
     public function get_uid()
     {
-        return $this->uid;
+        return $this->user->id();
     }
 }
 
index 28d9459..fb9d52c 100644 (file)
 function post_queue_u_create($job) {
     global $globals;
 
-    // Retrieves the user parameters (userid and forlife).
+    // Retrieves the user parameters (GoogleApps username and user_id).
     $parameters = json_decode($job['j_parameters'], true);
-    $forlife = isset($parameters['username']) ? $parameters['username'] : null;
-    $userid = $job['q_recipient_id'];
-    if (!$forlife || !$userid) {
+    $username = isset($parameters['username']) ? $parameters['username'] : null;
+    if (!($user = User::getSilent($username))) {
         return;
     }
 
     // Adds a redirection to the Google Apps delivery address, if requested by
     // the user at creation time.
-    $account = new GoogleAppsAccount($userid, $forlife);
+    $account = new GoogleAppsAccount($user);
     if ($account->activate_mail_redirection) {
         require_once('emails.inc.php');
-        $storage = new EmailStorage($userid, 'googleapps');
+        $storage = new EmailStorage($user, 'googleapps');
         $storage->activate();
     }
 
@@ -44,14 +43,12 @@ function post_queue_u_create($job) {
     $res = XDB::query(
         "SELECT  FIND_IN_SET('femme', u.flags), prenom
            FROM  auth_user_md5 AS u
-     INNER JOIN  aliases AS a ON (a.id = u.user_id)
-          WHERE  a.alias = {?}",
-        $forlife);
+          WHERE  u.user_id = {?}", $user->id());
     list($sexe, $prenom) = $res->fetchOneRow();
 
     $mailer = new PlMailer('googleapps/create.mail.tpl');
     $mailer->assign('account', $account);
-    $mailer->assign('email', $forlife . '@' . $globals->mail->domain);
+    $mailer->assign('email', $user->bestEmail());
     $mailer->assign('googleapps_domain', $globals->mailstorage->googleapps_domain);
     $mailer->assign('prenom', $prenom);
     $mailer->assign('sexe', $sexe);
@@ -66,19 +63,18 @@ function post_queue_u_update($job) {
     // to the Google Apps delivery address, provided the account is active (it might
     // have been deleted between the unsuspension and the post-queue processing).
     $parameters = json_decode($job['j_parameters'], true);
-    $forlife = isset($parameters['username']) ? $parameters['username'] : null;
-    $userid = $job['q_recipient_id'];
-    if (!$forlife || !$userid) {
+    $username = isset($parameters['username']) ? $parameters['username'] : null;
+    if (!($user = User::getSilent($username))) {
         return;
     }
 
     if (isset($parameters['suspended']) && $parameters['suspended'] == false) {
         require_once('emails.inc.php');
-        $account = new GoogleAppsAccount($userid, $forlife);
+        $account = new GoogleAppsAccount($user);
         if ($account->active()) {
             // Re-adds the email redirection (if the user did request it).
             if ($account->activate_mail_redirection) {
-                $storage = new EmailStorage($userid, 'googleapps');
+                $storage = new EmailStorage($user, 'googleapps');
                 $storage->activate();
             }
 
@@ -86,14 +82,12 @@ function post_queue_u_update($job) {
             $res = XDB::query(
                 "SELECT  FIND_IN_SET('femme', u.flags), prenom
                    FROM  auth_user_md5 AS u
-             INNER JOIN  aliases AS a ON (a.id = u.user_id)
-                  WHERE  a.alias = {?}",
-                $forlife);
+                  WHERE  u.user_id = {?}", $user->id());
             list($sexe, $prenom) = $res->fetchOneRow();
 
             $mailer = new PlMailer('googleapps/unsuspend.mail.tpl');
             $mailer->assign('account', $account);
-            $mailer->assign('email', $forlife . '@' . $globals->mail->domain);
+            $mailer->assign('email', $user->bestEmail());
             $mailer->assign('prenom', $prenom);
             $mailer->assign('sexe', $sexe);
             $mailer->send();
@@ -108,7 +102,7 @@ function post_queue_u_update($job) {
 class GoogleAppsAccount
 {
     // User identification: user id, and forlife.
-    private $uid;
+    private $user;
     public $g_account_name;
 
     // Local account parameters.
@@ -139,19 +133,17 @@ class GoogleAppsAccount
 
     // Constructs the account object, by retrieving all informations from the
     // GApps account table, from GApps job queue, and from plat/al validation queue.
-    public function __construct($uid, $account_name = NULL)
+    public function __construct(User &$user)
     {
-        if ($account_name == NULL) {
-            require_once 'user.func.inc.php';
-            $account_name = get_user_forlife($uid, '_silent_user_callback');
+        $this->user = &$user;
+        if (!$this->user || !$this->user->login()) {
+            return;
         }
 
-        $this->uid = $uid;
-        $this->g_account_name = $account_name;
+        // TODO: switch to multi-domain Google Apps, and use $this->user->forlifeEmail()
+        // as Google Apps idenfiant (requires changes in gappsd).
+        $this->g_account_name = $this->user->login();
         $this->g_status = NULL;
-        if (!$this->g_account_name) {
-            return;
-        }
 
         $res = XDB::query(
             "SELECT  l_sync_password, l_activate_mail_redirection,
@@ -160,8 +152,7 @@ class GoogleAppsAccount
                      UNIX_TIMESTAMP(r_last_login) as r_last_login,
                      UNIX_TIMESTAMP(r_last_webmail) as r_last_webmail
                FROM  gapps_accounts
-              WHERE  g_account_name = {?}",
-            $account_name);
+              WHERE  g_account_name = {?}", $this->g_account_name);
         if ($account = $res->fetchOneAssoc()) {
             $this->sync_password = $account['l_sync_password'];
             $this->activate_mail_redirection = $account['l_activate_mail_redirection'];
@@ -195,8 +186,7 @@ class GoogleAppsAccount
                FROM  gapps_queue
               WHERE  q_recipient_id = {?} AND
                      p_status IN ('idle', 'active', 'softfail')
-           GROUP BY  j_type",
-            $this->uid);
+           GROUP BY  j_type", $this->user->id());
         $pending = $res->fetchOneAssoc();
         $this->pending_create = $pending['pending_create'];
         $this->pending_update = $pending['pending_update'];
@@ -214,7 +204,7 @@ class GoogleAppsAccount
     {
         require_once('validations.inc.php');
         $this->pending_validation_unsuspend =
-            Validate::get_typed_requests_count($this->uid, 'gapps-unsuspend');
+            Validate::get_typed_requests_count($this->user->id(), 'gapps-unsuspend');
     }
 
     // Retrieves all the pending update job in the gappsd queue for the current
@@ -227,8 +217,7 @@ class GoogleAppsAccount
                FROM  gapps_queue
               WHERE  q_recipient_id = {?} AND
                      p_status IN ('idle', 'active', 'softfail') AND
-                     j_type = 'u_update'",
-            $this->uid);
+                     j_type = 'u_update'", $this->user->id());
         while ($update = $res->next()) {
             $update_data = json_decode($update["j_parameters"], true);
 
@@ -258,7 +247,7 @@ class GoogleAppsAccount
                      p_priority = 'immediate',
                      j_type = {?}, j_parameters = {?}",
             S::v('uid'),
-            $this->uid,
+            $this->user->id(),
             $type,
             json_encode($parameters));
     }
@@ -347,7 +336,7 @@ class GoogleAppsAccount
 
         if (!$this->pending_update_suspension && !$this->pending_validation_unsuspend) {
             require_once('validations.inc.php');
-            $unsuspend = new GoogleAppsUnsuspendReq($this->uid);
+            $unsuspend = new GoogleAppsUnsuspendReq($this->user);
             $unsuspend->submit();
             $this->pending_validation_unsuspend = true;
         }
@@ -365,8 +354,7 @@ class GoogleAppsAccount
                 $res = XDB::query(
                     "SELECT  password
                        FROM  auth_user_md5
-                      WHERE  user_id = {?}",
-                    $this->uid);
+                      WHERE  user_id = {?}", $this->user->id());
                 $password = ($res->numRows() > 0 ? $res->fetchOneCell() : false);
             } else {
                 $password = false;
@@ -394,8 +382,7 @@ class GoogleAppsAccount
             $res = XDB::query(
                 "SELECT  nom, nom_usage, prenom
                    FROM  auth_user_md5
-                  WHERE  user_id = {?}",
-                $this->uid);
+                  WHERE  user_id = {?}", $this->user->id());
             list($nom, $nom_usage, $prenom) = $res->fetchOneRow();
 
             // Adds an 'unprovisioned' entry in the gapps_accounts table.
@@ -408,7 +395,7 @@ class GoogleAppsAccount
                          g_first_name = {?},
                          g_last_name = {?},
                          g_status = 'unprovisioned'",
-                $this->uid,
+                $this->user->id(),
                 $password_sync,
                 $redirect_mails,
                 $this->g_account_name,
@@ -426,7 +413,7 @@ class GoogleAppsAccount
                 ));
 
             // Updates the GoogleAppsAccount status.
-            $this->__construct($this->uid, $this->g_account_name);
+            $this->__construct($this->user);
         }
     }
 
index f397ad0..d488843 100644 (file)
@@ -53,37 +53,31 @@ class Marketing
 
     private function getUser($uid, $email)
     {
-        $res = XDB::query("SELECT  FIND_IN_SET('femme', flags) AS sexe, nom, prenom, promo
-                             FROM  auth_user_md5
-                            WHERE  user_id = {?}", $uid);
-        if ($res->numRows() == 0) {
+        $user = User::getSilent($uid);
+        if (!$user) {
             return null;
         }
-        $user            = $res->fetchOneAssoc();
-        $user['id']      = $uid;
-        $user['forlife'] = make_forlife($user['prenom'], $user['nom'], $user['promo']);
-        $user['mail']    = $email;
-        $user['to']      = '"' . $user['prenom'] . ' ' . $user['nom'] . '" <' . $email . '>';
-        return $user;
+
+        global $globals;
+        return array(
+            'user'           => $user,
+            'id'             => $user->id(),
+            'sexe'           => $user->isFemale(),
+            'mail'           => $email,
+            'to'             => '"' . $user->fullName() . '" <' . $email . '>',
+            'forlife_email'  => $user->login() . '@' . $globals->mail->domain,
+            'forlife_email2' => $user->login() . '@' . $globals->mail->domain2,
+        );
     }
 
     private function getFrom($from, $sender)
     {
         global $globals;
 
-        if ($from == 'staff') {
+        if ($from == 'staff' || !($user = User::getSilent($sender))) {
             return '"L\'équipe de Polytechnique.org" <register@' . $globals->mail->domain . '>';
-        } else {
-            $res = XDB::query("SELECT  u.nom, u.prenom, a.alias
-                                 FROM  auth_user_md5 AS u
-                           INNER JOIN  aliases       AS a ON (a.id = u.user_id AND FIND_IN_SET('bestalias', a.flags))
-                                WHERE  u.user_id = {?}", $sender);
-            if (!$res->numRows()) {
-                return '"L\'équipe de Polytechnique.org" <register@' . $globals->mail->domain . '>';
-            }
-            $sender = $res->fetchOneAssoc();
-            return '"' . $sender['prenom'] . ' ' . $sender['nom'] . '" <' . $sender['alias'] . '@' . $globals->mail->domain . '>';
         }
+        return '"' . $user->fullName() . '" <' . $user->bestEmail() . '>';
     }
 
     private function &getEngine($type, $data, $from)
@@ -141,7 +135,7 @@ class Marketing
         $this->engine->process($this->user);
         if ($valid) {
             require_once 'validations.inc.php';
-            $valid = new MarkReq($this->sender, $this->user['id'], $this->user['mail'],
+            $valid = new MarkReq(User::getSilent($this->sender), $this->user['user'], $this->user['mail'],
                                  $this->from == 'user', $this->type, $this->data);
             $valid->submit();
         }
@@ -304,12 +298,8 @@ class ListMarketing extends AnnuaireMarketing
     public function __construct($data, $from)
     {
         list($this->name, $this->domain) = explode('@', $data);
-        $res = XDB::query("SELECT  prenom, IF (nom_usage != '', nom_usage, nom)
-            FROM  auth_user_md5
-            WHERE  user_id = {?} AND user_id != 0", $from ? $from : 0);
-        if ($res->numRows()) {
-            list($prenom, $nom) = $res->fetchOneRow();
-            $from = "$prenom $nom";
+        if ($from && ($user = User::getSilent($from))) {
+            $from = $user->fullName();
         } else {
             $from = "Je";
         }
@@ -339,12 +329,8 @@ class GroupMarketing extends AnnuaireMarketing
     public function __construct($data, $from)
     {
         $this->group = $data;
-        $res = XDB::query("SELECT  prenom, IF (nom_usage != '', nom_usage, nom)
-            FROM  auth_user_md5
-            WHERE  user_id = {?} AND user_id != 0", $from ? $from : 0);
-        if ($res->numRows()) {
-            list($prenom, $nom) = $res->fetchOneRow();
-            $from = "$prenom $nom vient";
+        if ($from && ($user = User::getSilent($from))) {
+            $from = $user->fullName() . " vient";
         } else {
             $from = "Je viens";
         }
index a1d49f3..261fb8b 100644 (file)
@@ -157,26 +157,25 @@ abstract class MassMailer
         return $hash;
     }
 
-    public function sendTo($prenom, $nom, $login, $sexe, $html, $hash = 0)
+    public function sendTo($hruid, $email, $prenom, $nom, $sexe, $html, $hash = 0)
     {
-        global $globals;
-        $alias = $login;
-        if (strpos($login, '@') === false) {
-            $login = "$login@{$globals->mail->domain}";
-        }
-        require_once('user.func.inc.php');
-        $forlife = get_user_forlife($login, '_silent_user_callback');
-        if ($forlife) {
-            $alias = $forlife;
+        // If $email is not a real email address, tries to compute it up from
+        // the hruid. Otherwise, we suppose that caller will have used a valid
+        // and canonical email address.
+        if (strpos($email, '@') === false) {
+            if (!($user = User::getSilent($email))) {
+                Platal::page()->trigError("'$email' is neither a valid email address nor a valid login; did not send the email.");
+            }
+            $email = $user->bestEmail();
         }
-        if (strpos($alias, '@') === false && (is_null($hash) || $hash == 0)) {
 
-            $hash = $this->createHash(array($prenom, $nom, $login, $sexe, $html, rand(), "X.org rulez"));
+        if ($hruid && (is_null($hash) || $hash == 0)) {
+            $hash = $this->createHash(array($email, $prenom, $nom, $sexe, $html, rand(), "X.org rulez"));
             XDB::query("UPDATE  {$this->_subscriptionTable} as ni
-                    INNER JOIN  aliases AS a ON (ni.user_id = a.id)
+                    INNER JOIN  auth_user_md5 AS u USING (user_id)
                            SET  ni.hash = {?}
-                         WHERE  ni.user_id != 0 AND a.alias = {?}",
-                       $hash, $alias);
+                         WHERE  ni.user_id != 0 AND u.hruid = {?}",
+                       $hash, $hruid);
         }
 
         $mailer = new PlMailer($this->_tpl);
@@ -187,16 +186,16 @@ abstract class MassMailer
         $mailer->assign('sexe',    $sexe);
         $mailer->assign('prefix',  null);
         $mailer->assign('hash',    $hash);
-        $mailer->assign('email',   $login);
-        $mailer->assign('alias',   $alias);
-        $mailer->addTo("\"$prenom $nom\" <$login>");
+        $mailer->assign('email',   $email);
+        $mailer->assign('alias',   $hruid);
+        $mailer->addTo("\"$prenom $nom\" <$email>");
         $mailer->send($html);
     }
 
     protected function getAllRecipients()
     {
         global $globals;
-        return  "SELECT  u.user_id, CONCAT(a.alias, '@{$globals->mail->domain}'),
+        return  "SELECT  u.user_id, u.hruid, CONCAT(a.alias, '@{$globals->mail->domain}'),
                          u.prenom, IF(u.nom_usage='', u.nom, u.nom_usage),
                          FIND_IN_SET('femme', u.flags),
                          q.core_mail_fmt AS pref, ni.hash AS hash
@@ -220,9 +219,9 @@ abstract class MassMailer
                 return;
             }
             $sent = array();
-            while (list($uid, $bestalias, $prenom, $nom, $sexe, $fmt, $hash) = $res->next()) {
-                $sent[] = "(user_id='$uid'" . (!$uid ? " AND email='$bestalias')": ')');
-                $this->sendTo($prenom, $nom, $bestalias, $sexe, $fmt=='html', $hash);
+            while (list($uid, $hruid, $email, $prenom, $nom, $sexe, $fmt, $hash) = $res->next()) {
+                $sent[] = "(user_id='$uid'" . (!$uid ? " AND email='$email')": ')');
+                $this->sendTo($hruid, $email, $prenom, $nom, $sexe, $fmt=='html', $hash);
             }
             XDB::execute("UPDATE  {$this->_subscriptionTable}
                              SET  last = {?}
index 9d38d31..e45a822 100644 (file)
@@ -23,12 +23,12 @@ function init_rss($template, $alias, $hash, $require_uid = true)
 {
     $page =& Platal::page();
     $page->changeTpl($template, NO_SKIN);
-    $uid = Platal::session()->tokenAuth($alias, $hash);
-    if (empty($uid)) {
+    $user = Platal::session()->tokenAuth($alias, $hash);
+    if (is_null($user)) {
         if ($require_uid) {
             exit;
         } else {
-            $uid = null;
+            $user = null;
         }
     }
 
@@ -36,7 +36,7 @@ function init_rss($template, $alias, $hash, $require_uid = true)
         $page->assign('rss_hash', $hash);
         header('Content-Type: application/rss+xml; charset=utf8');
     }
-    return $uid;
+    return is_null($user) ? null : $user->id();
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index e0b1d14..683dd10 100644 (file)
@@ -80,7 +80,7 @@ function check_redirect($red = null)
 {
     require_once 'emails.inc.php';
     if (is_null($red)) {
-        $red = new Redirect(S::v('uid'));
+        $red = new Redirect(S::user());
     }
     if ($red->get_uid() == S::v('uid')) {
         $_SESSION['no_redirect'] = !$red->other_active('');
index d9232a3..7da7ada 100644 (file)
@@ -32,9 +32,9 @@ function user_clear_all_subs($user_id, $really_del=true)
     // + delete maillists
 
     global $globals;
-    $uid   = intval($user_id);
-    $res   = XDB::query("SELECT alias FROM aliases WHERE type='a_vie' AND id={?}", $uid);
-    $alias = $res->fetchOneCell();
+    $uid = intval($user_id);
+    $user = User::getSilent($uid);
+    list($alias) = explode('@', $user->forlifeEmail());
 
     $tables_to_clear = array('uid' => array('competences_ins', 'entreprises', 'langues_ins', 'mentor_pays',
                                             'mentor_secteurs', 'mentor', 'perte_pass', 'watch_sub'),
@@ -75,157 +75,13 @@ function user_clear_all_subs($user_id, $really_del=true)
     if ($globals->mailstorage->googleapps_domain) {
         require_once 'googleapps.inc.php';
         if (GoogleAppsAccount::account_status($uid)) {
-            $account = new GoogleAppsAccount($uid, $alias);
+            $account = new GoogleAppsAccount($user);
             $account->suspend();
         }
     }
 }
 
 // }}}
-// {{{ 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;
-}
-
-function get_user_login($data, $get_forlife = false, $callback = '_default_user_callback')
-{
-    global $globals;
-
-    if (is_numeric($data)) {
-        $res = XDB::query("SELECT alias FROM aliases WHERE type='a_vie' AND id={?}", $data);
-        if ($res->numRows()) {
-            return $res->fetchOneCell();
-        } else {
-            call_user_func($callback, $data);
-            return false;
-        }
-    }
-
-    $data = trim(strtolower($data));
-
-    if (strstr($data, '@')===false) {
-        $data = $data.'@'.$globals->mail->domain;
-    }
-
-    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);
-        if ($res->numRows()) {
-            return $get_forlife ? $res->fetchOneCell() : $mbox;
-        }
-
-        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]);
-            if ($res->numRows() == 1) {
-                return $res->fetchOneCell();
-            }
-        }
-        call_user_func($callback, $data);
-        return false;
-
-    } 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) = 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;
-
-            case 1:
-                return $res->fetchOneCell();
-
-            default:
-                if (S::has_perms()) {
-                    $aliases = $res->fetchColumn();
-                    Platal::page()->trigError("Il y a $i utilisateurs avec cette adresse mail : ".join(', ', $aliases));
-                } else {
-                    $res->free();
-                }
-        }
-    }
-
-    return false;
-}
-
-// }}}
-// {{{ 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')
-{
-    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_forlife($alias, $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 has_user_right()
 function has_user_right($pub, $view = 'private') {
     if ($pub == $view) return true;
index c05f5ac..e61507b 100644 (file)
@@ -137,7 +137,7 @@ class ArraySet extends UserSet
     {
         $where = $this->getUids($users);
         if ($where) {
-            $where = "a.alias IN ($where)";
+            $where = "u.hruid IN ($where)";
         } else {
             $where = " 0 ";
         }
@@ -146,7 +146,7 @@ class ArraySet extends UserSet
 
     private function getUids(array $users)
     {
-        $users = get_users_forlife_list($users, true, '_silent_user_callback');
+        $users = User::getBulkHruid($users, array('User', '_silent_user_callback'));
         if (is_null($users)) {
             return '';
         }
index d5cd9e0..734a407 100644 (file)
@@ -59,13 +59,7 @@ abstract class Validate
 {
     // {{{ properties
 
-    public $uid;
-    public $prenom;
-    public $nom;
-    public $promo;
-    public $sexe;
-    public $bestalias;
-    public $forlife;
+    public $user;
 
     public $stamp;
     public $unique;
@@ -81,23 +75,16 @@ abstract class Validate
     // {{{ constructor
 
     /** constructeur
-     * @param       $_uid       user id
+     * @param       $_user      user object
      * @param       $_unique    requête pouvant être multiple ou non
      * @param       $_type      type de la donnée comme dans le champ type de x4dat.requests
      */
-    public function __construct($_uid, $_unique, $_type)
+    public function __construct(User &$_user, $_unique, $_type)
     {
-        $this->uid    = $_uid;
+        $this->user   = &$_user;
         $this->stamp  = date('YmdHis');
         $this->unique = $_unique;
         $this->type   = $_type;
-        $res = XDB::query(
-                "SELECT  u.prenom, u.nom, u.promo, FIND_IN_SET('femme', u.flags) AS sexe, a.alias, b.alias
-                   FROM  auth_user_md5 AS u
-             INNER JOIN  aliases       AS a ON ( u.user_id=a.id AND a.type='a_vie' )
-             INNER JOIN  aliases       AS b ON ( u.user_id=b.id AND b.type!='homonyme' AND FIND_IN_SET('bestalias', b.flags) )
-                  WHERE  u.user_id={?}", $_uid);
-        list($this->prenom, $this->nom, $this->promo, $this->sexe, $this->forlife, $this->bestalias) = $res->fetchOneRow();
     }
 
     // }}}
@@ -109,12 +96,12 @@ abstract class Validate
     public function submit()
     {
         if ($this->unique) {
-            XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}', $this->uid, $this->type);
+            XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}', $this->user->id(), $this->type);
         }
 
         $this->stamp = date('YmdHis');
         XDB::execute('INSERT INTO requests (user_id, type, data, stamp) VALUES ({?}, {?}, {?}, {?})',
-                $this->uid, $this->type, $this, $this->stamp);
+                $this->user->id(), $this->type, $this, $this->stamp);
 
         global $globals;
         $globals->updateNbValid();
@@ -128,7 +115,7 @@ abstract class Validate
     {
         XDB::execute('UPDATE requests SET data={?}, stamp=stamp
                        WHERE user_id={?} AND type={?} AND stamp={?}',
-                     $this, $this->uid, $this->type, $this->stamp);
+                     $this, $this->user->id(), $this->type, $this->stamp);
         return true;
     }
 
@@ -144,10 +131,10 @@ abstract class Validate
 
         if ($this->unique) {
             $success = XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}',
-                                    $this->uid, $this->type);
+                                    $this->user->id(), $this->type);
         } else {
             $success =  XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?} AND stamp={?}',
-                                      $this->uid, $this->type, $this->stamp);
+                                      $this->user->id(), $this->type, $this->stamp);
         }
         $globals->updateNbValid();
         return $success;
@@ -187,7 +174,7 @@ abstract class Validate
             if (!strlen(trim(Env::v('comm')))) {
                 return true;
             }
-            $this->comments[] = Array(S::v('bestalias'), Env::v('comm'), $formid);
+            $this->comments[] = Array(S::user()->login(), Env::v('comm'), $formid);
 
             // envoi d'un mail à hotliners
             global $globals;
@@ -196,10 +183,10 @@ abstract class Validate
             $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}");
             $mailer->addTo($globals->core->admin_email);
 
-            $body = "Validation {$this->type} pour {$this->prenom} {$this->nom}\n\n"
-              . S::v('bestalias')." a ajouté le commentaire :\n\n"
-              . Env::v('comm')."\n\n"
-              . "cf la discussion sur : ".$globals->baseurl."/admin/validate";
+            $body = "Validation {$this->type} pour {$this->user->id()}\n\n"
+              . S::user()->login() . " a ajouté le commentaire :\n\n"
+              . Env::v('comm') . "\n\n"
+              . "cf la discussion sur : " . $globals->baseurl . "/admin/validate";
 
             $mailer->setTxtBody(wordwrap($body));
             $mailer->send();
@@ -244,10 +231,10 @@ abstract class Validate
         $mailer = new PlMailer();
         $mailer->setSubject($this->_mail_subj());
         $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}");
-        $mailer->addTo("\"{$this->prenom} {$this->nom}\" <{$this->bestalias}@{$globals->mail->domain}>");
+        $mailer->addTo("\"{$this->user->fullName()}\" <{$this->user->bestEmail()}>");
         $mailer->addCc("validation+{$this->type}@{$globals->mail->domain}");
 
-        $body = ($this->sexe ? "Chère camarade,\n\n" : "Cher camarade,\n\n")
+        $body = ($this->user->isFemale() ? "Chère camarade,\n\n" : "Cher camarade,\n\n")
               . $this->_mail_body($isok)
               . (Env::has('comm') ? "\n\n".Env::v('comm') : '')
               . "\n\nCordialement,\n\n-- \nL'équipe de Polytechnique.org\n";
@@ -386,7 +373,7 @@ abstract class Validate
 
     public function id()
     {
-        return $this->uid . '_' . $this->type . '_' . $this->stamp;
+        return $this->user->id() . '_' . $this->type . '_' . $this->stamp;
     }
 
     // }}}
index 44f5af7..c5f555c 100644 (file)
@@ -39,10 +39,10 @@ class AliasReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_alias, $_raison, $_public, $_stamp=0)
+    public function __construct(User &$_user, $_alias, $_raison, $_public, $_stamp=0)
     {
         global $globals;
-        parent::__construct($_uid, true, 'alias', $_stamp);
+        parent::__construct($_user, true, 'alias', $_stamp);
         $this->alias  = $_alias.'@'.$globals->mail->alias_dom;
         $this->raison = $_raison;
         $this->public = $_public;
@@ -51,10 +51,15 @@ class AliasReq extends Validate
                 SELECT  v.alias
                   FROM  virtual_redirect AS vr
             INNER JOIN  virtual          AS v  ON (v.vid=vr.vid AND v.alias LIKE '%@{$globals->mail->alias_dom}')
-                 WHERE  vr.redirect={?} OR vr.redirect={?}",
-                 "{$this->forlife}@{$globals->mail->domain}", "{$this->forlife}@{$globals->mail->domain2}");
+                 WHERE  vr.redirect = {?} OR vr.redirect = {?}",
+                $this->user->forlifeEmail(),
+                // TODO: remove this über-ugly hack. The issue is that you need
+                // to remove all @m4x.org addresses in virtual_redirect first.
+                $this->user->login() . '@' . $globals->mail->domain2);
         $this->old = $res->fetchOneCell();
-        if (empty($this->old)) { unset($this->old); }
+        if (empty($this->old)) {
+            unset($this->old);
+        }
     }
 
     // }}}
@@ -62,7 +67,7 @@ class AliasReq extends Validate
 
     static public function get_request($uid)
     {
-        return parent::get_typed_request($uid,'alias');
+        return parent::get_typed_request($uid, 'alias');
     }
 
     // }}}
@@ -115,17 +120,16 @@ class AliasReq extends Validate
     public function commit ()
     {
         XDB::execute("UPDATE auth_user_quick SET emails_alias_pub = {?} WHERE user_id = {?}",
-                     $this->public, $this->uid);
+                     $this->public, $this->user->id());
 
         if ($this->old) {
-            return XDB::execute('UPDATE virtual SET alias={?} WHERE alias={?}',
+            return XDB::execute("UPDATE virtual SET alias = {?} WHERE alias = {?}",
                                 $this->alias, $this->old);
         } else {
-            XDB::execute('INSERT INTO virtual SET alias={?},type="user"', $this->alias);
+            XDB::execute("INSERT INTO virtual SET alias = {?},type='user'", $this->alias);
             $vid = XDB::insertId();
-            $dom = $this->shorter_domain();
-            return XDB::query('INSERT INTO virtual_redirect (vid,redirect) VALUES ({?}, {?})',
-                              $vid, $this->forlife.'@'.$dom);
+            return XDB::query("INSERT INTO virtual_redirect (vid,redirect) VALUES ({?}, {?})",
+                              $vid, $this->user->forlifeEmail());
         }
     }
 
index cd64eb5..da22479 100644 (file)
@@ -24,15 +24,9 @@ class BrokenReq extends Validate
 {
     // {{{ properties
 
-    public $m_forlife;
-    public $m_bestalias;
-    public $m_prenom;
-    public $m_nom;
-    public $m_promo;
-    public $m_sexe;
-    public $m_email;
-    public $old_email;
+    public $m_user;
     public $m_comment;
+    public $m_email;
 
     private $m_reactive = false;
 
@@ -43,18 +37,12 @@ class BrokenReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($sender, $user, $email, $comment = null)
+    public function __construct(User &$sender, User &$user, $email, $comment = null)
     {
         parent::__construct($sender, false, 'broken');
-        $this->m_email     = $email;
+        $this->m_user      = &$user;
         $this->m_comment   = trim($comment);
-        $this->m_forlife   = $user['forlife'];
-        $this->m_bestalias = $user['bestalias'];
-        $this->m_prenom    = $user['prenom'];
-        $this->m_nom       = $user['nom'];
-        $this->m_promo     = $user['promo'];
-        $this->m_sexe      = $user['sexe'];
-        $this->old_email   = $user['email'];
+        $this->m_email     = $email;
     }
 
     // }}}
@@ -70,7 +58,7 @@ class BrokenReq extends Validate
 
     protected function _mail_subj()
     {
-        return "[Polytechnique.org] Récupération de {$this->m_prenom} {$this->m_nom} ({$this->m_promo})";
+        return "[Polytechnique.org] Récupération de {$this->m_user->fullName()} ({$this->m_user->promo()})";
     }
 
     // }}}
@@ -79,16 +67,16 @@ class BrokenReq extends Validate
     protected function _mail_body($isok)
     {
         if ($isok && !$this->m_reactive) {
-            return "  Un email de contact vient d'être envoyé"
-                ." à {$this->m_prenom} {$this->m_nom} ({$this->m_promo}) pour confirmer sa volonté de"
-                ." mettre à jour sa redirection Polytechnique.org !\n\n"
-                ."Merci de ta participation !\n";
+            return "  Un email de contact vient d'être envoyé à {$this->m_user->fullName()}"
+                . " ({$this->m_user->promo()})  pour confirmer sa volonté de"
+                . " mettre à jour sa redirection Polytechnique.org !\n\n"
+                . "Merci de ta participation !\n";
         } elseif ($isok) {
-            return "  L'adresse de redirection {$this->m_email} de {$this->m_prenom} {$this->m_nom} ({$this->m_promo}) "
+            return "  L'adresse de redirection {$this->m_email} de {$this->m_user->fullName()} ({$this->m_user->promo()}) "
                 ."vient d'être réactivée. Un email lui a été envoyé pour l'en informer.\n\n"
                 ."Merci de ta participation !\n";
         } else {
-            return "  Nous n'utiliserons pas cette adresse pour contacter {$this->m_prenom} {$this->m_nom} ({$this->m_promo}).";
+            return "  Nous n'utiliserons pas cette adresse pour contacter {$this->m_user->fullName()} ({$this->m_user->promo()}).";
         }
     }
 
@@ -98,39 +86,34 @@ class BrokenReq extends Validate
     public function commit()
     {
         global $globals;
-        $email =  $this->m_bestalias . '@' . $globals->mail->domain;
+        $email =  $this->m_user->bestEmail();
 
-        XDB::execute("UPDATE  emails AS e
-                  INNER JOIN  aliases AS a ON (a.id = e.uid)
-                         SET  e.flags = 'active', panne_level = 2
-                       WHERE  a.alias = {?} AND e.email = {?}", $this->m_forlife, $this->m_email);
+        XDB::execute("UPDATE  emails
+                         SET  flags = 'active', panne_level = 2
+                       WHERE  uid = {?} AND email = {?}", $this->m_user->id(), $this->m_email);
         if (XDB::affectedRows() > 0) {
             $this->m_reactive = true;
             $mailer = new PlMailer();
             $mailer->setFrom('"Association Polytechnique.org" <register@' . $globals->mail->domain . '>');
             $mailer->addTo($email);
-            $mailer->setSubject("Mise à jour de ton adresse $email");
+            $mailer->setSubject("Mise à jour de ton adresse {$email}");
             $mailer->setTxtBody(wordwrap("Cher Camarade,\n\n"
-                             . "Ton adresse $email étant en panne et ayant été informés que ta redirection {$this->m_email}, jusqu'à présent inactive, "
-                             . "est fonctionnelle, nous venons de réactiver cette adresse.\n\n"
-                             . "N'hésite pas à aller gérer toi-même tes redirections en te rendant à la page :\n"
-                             . "https://www.polytechnique.org/emails/redirect\n"
-                             . "Si tu as perdu ton mot de passe d'accès au site, tu peux également effectuer la procédure de récupération à l'adresse :\n"
-                             . "https://www.polytechnique.org/recovery\n\n"
-                             . "-- \nTrès Cordialement,\nL'Équipe de Polytechnique.org\n"));
+                    . "Ton adresse {$email} étant en panne et ayant été informés que ta redirection {$this->m_email}, jusqu'à présent inactive, "
+                    . "est fonctionnelle, nous venons de réactiver cette adresse.\n\n"
+                    . "N'hésite pas à aller gérer toi-même tes redirections en te rendant à la page :\n"
+                    . "https://www.polytechnique.org/emails/redirect\n"
+                    . "Si tu as perdu ton mot de passe d'accès au site, tu peux également effectuer la procédure de récupération à l'adresse :\n"
+                    . "https://www.polytechnique.org/recovery\n\n"
+                    . "-- \nTrès Cordialement,\nL'Équipe de Polytechnique.org\n"));
             $mailer->send();
             return true;
         }
 
-        $email =  $this->m_bestalias . '@' . $globals->mail->domain;
-        if ($this->old_email) {
+        if ($this->m_user->email) {
             $subject = "Ton adresse $email semble ne plus fonctionner";
             $reason  = "Nous avons été informés que ton adresse $email ne fonctionne plus correctement par un camarade";
         } else {
-            $res = XDB::iterRow("SELECT  email
-                                   FROM  emails AS e
-                             INNER JOIN  aliases AS a ON (a.id = e.uid)
-                                  WHERE  a.alias = {?} AND e.flags = 'panne'", $this->m_forlife);
+            $res = XDB::iterRow("SELECT email FROM emails WHERE uid = {?} AND flags = 'panne'", $this->m_user->id());
             $redirect = array();
             while (list($red) = $res->next()) {
                 list(, $redirect[]) = explode('@', $red);
@@ -146,7 +129,7 @@ class BrokenReq extends Validate
                         . ' sont hors-services depuis plusieurs mois.';
             }
         }
-        $body = ($this->m_sexe ? 'Chère ' : 'Cher ') . $this->m_prenom . ",\n\n"
+        $body = ($this->m_user->isFemale() ? 'Chère ' : 'Cher ') . $this->m_user->displayName() . ",\n\n"
               . $reason . "\n\n"
               . "L'adresse {$this->m_email} nous a été communiquée, veux-tu que cette adresse devienne ta nouvelle "
               . "adresse de redirection ? Si oui, envoie nous des informations qui "
index c33ce5e..73ec0ca 100644 (file)
@@ -41,9 +41,9 @@ class EvtReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_titre, $_texte, $_pmin, $_pmax, $_peremption, $_comment, $_uid, PlUpload &$upload = null)
+    public function __construct($_titre, $_texte, $_pmin, $_pmax, $_peremption, $_comment, User &$_user, PlUpload &$upload = null)
     {
-        parent::__construct($_uid, false, 'evts');
+        parent::__construct($_user, false, 'evts');
         $this->titre      = $_titre;
         $this->texte      = $_texte;
         $this->pmin       = $_pmin;
@@ -94,7 +94,7 @@ class EvtReq extends Validate
         $this->pmax       = Env::i('promo_max');
         $this->peremption = Env::v('peremption');
         if (@$_FILES['image']['tmp_name']) {
-            $upload = PlUpload::get($_FILES['image'], S::v('forlife'), 'event');
+            $upload = PlUpload::get($_FILES['image'], S::user()->login(), 'event');
             if (!$upload) {
                 $this->trigError("Impossible de télécharger le fichier");
             } elseif (!$upload->isType('image')) {
@@ -137,7 +137,7 @@ class EvtReq extends Validate
         if (XDB::execute("INSERT INTO  evenements
                          SET  user_id = {?}, creation_date=NOW(), titre={?}, texte={?},
                               peremption={?}, promo_min={?}, promo_max={?}, flags=CONCAT(flags,',valide,wiki')",
-                $this->uid, $this->titre, $this->texte,
+                $this->user->id(), $this->titre, $this->texte,
                 $this->peremption, $this->pmin, $this->pmax)) {
             $eid = XDB::insertId();
             if ($this->img) {
@@ -147,10 +147,8 @@ class EvtReq extends Validate
             }
             global $globals;
             if ($globals->banana->event_forum) {
-                require_once 'user.func.inc.php';
-                $forlife = get_user_forlife($this->uid);
                 require_once 'banana/forum.inc.php';
-                $banana = new ForumsBanana($forlife);
+                $banana = new ForumsBanana($this->user);
                 $post = $banana->post($globals->banana->event_forum,
                                       $globals->banana->event_reply,
                                       $this->titre, MiniWiki::wikiToText($this->texte, false, 0, 80));
index 7413d73..5932e14 100644 (file)
@@ -26,9 +26,9 @@ class GoogleAppsUnsuspendReq extends Validate
                   alors la raison s'affichera (mais seulement 24-48h après la suspension).
                   Si l'utilisateur a désactivé lui-même son compte, la raison sera toujours vierge.";
 
-    public function __construct($_uid)
+    public function __construct(User &$_user)
     {
-        parent::__construct($_uid, true, 'gapps-unsuspend');
+        parent::__construct($_user, true, 'gapps-unsuspend');
     }
 
     public function sendmail($isok)
@@ -61,7 +61,7 @@ class GoogleAppsUnsuspendReq extends Validate
     public function commit()
     {
         require_once dirname(__FILE__) . '/../googleapps.inc.php';
-        $account = new GoogleAppsAccount($this->uid, $this->forlife);
+        $account = new GoogleAppsAccount($this->user);
         return $account->do_unsuspend();
     }
 
@@ -71,7 +71,7 @@ class GoogleAppsUnsuspendReq extends Validate
             "SELECT  g_suspension
                FROM  gapps_accounts
               WHERE  g_account_name = {?}",
-            $this->forlife);
+            $this->user->login());
         return $res->fetchOneCell();
     }
 }
index 88ddcf7..44f0234 100644 (file)
@@ -30,22 +30,22 @@ class HomonymeReq extends Validate
 
     public $warning = true;
 
-    public $homonymes_forlife;
+    public $homonymes_hruid;
 
     public $rules = "Accepter, sauf cas particulier d'utilisateur dont l'homonymie est traité plus ... manuellement";
 
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_loginbis, $_homonymes_forlife, $warning=true)
+    public function __construct(User &$_user, $_loginbis, $_homonymes_hruid, $warning=true)
     {
         $this->warning = $warning;
 
-        parent::__construct($_uid, true, $this->title());
+        parent::__construct($_user, true, $this->title());
 
         $this->refuse = false;
         $this->loginbis = $_loginbis;
-        $this->homonymes_forlife = $_homonymes_forlife;
+        $this->homonymes_hruid = $_homonymes_hruid;
     }
 
     // }}}
@@ -53,7 +53,7 @@ class HomonymeReq extends Validate
 
     private function title()
     {
-        return $this->warning?'alerte alias':'robot répondeur';
+        return ($this->warning ? 'alerte alias' : 'robot répondeur');
     }
 
     // }}}
@@ -70,7 +70,9 @@ class HomonymeReq extends Validate
     protected function _mail_subj()
     {
         global $globals;
-        return "[Polytechnique.org/Support] ".($this->warning?"Dans une semaine : suppression de l'alias":"Mise en place du robot")." $loginbis@" . $globals->mail->domain;
+        return "[Polytechnique.org/Support] "
+            . ($this->warning ? "Dans une semaine : suppression de l'alias " : "Mise en place du robot")
+            . " $loginbis@" . $globals->mail->domain;
     }
 
     // }}}
@@ -84,7 +86,7 @@ class HomonymeReq extends Validate
 Comme nous t'en avons informé par email il y a quelques temps,
 pour respecter nos engagements en terme d'adresses email devinables,
 tu te verras bientôt retirer l'alias ".$this->loginbis."@".$globals->mail->domain." pour
-ne garder que ".$this->forlife."@".$globals->mail->domain.".
+ne garder que " . $this->user->forlifeEmail() . ".
 
 Toute personne qui écrira à ".$this->loginbis."@".$globals->mail->domain." recevra la
 réponse d'un robot qui l'informera que ".$this->loginbis."@".$globals->mail->domain."
@@ -99,14 +101,14 @@ est ambigu pour des raisons d'homonymie et signalera ton email exact.";
         if (!$isok) return false;
         global $globals;
         $mailer = new PlMailer;
-        $cc = "support+homonyme@".$globals->mail->domain;
-        $FROM = "\"Support Polytechnique.org\" <$cc>";
+        $cc = "support+homonyme@" . $globals->mail->domain;
+        $from = "\"Support Polytechnique.org\" <$cc>";
         $mailer->setSubject($this->_mail_subj());
-        $mailer->setFrom($FROM);
-        $mailer->addTo("\"{$this->prenom} {$this->nom}\" <{$this->bestalias}@{$globals->mail->domain}>");
+        $mailer->setFrom($from);
+        $mailer->addTo("\"{$this->user->fullName()}\" <{$this->user->bestEmail()}>");
         $mailer->addCc($cc);
 
-        $body = $this->prenom.",\n\n"
+        $body = $this->user->displayName() . ",\n\n"
               . $this->_mail_body($isok)
               . (Env::has('comm') ? "\n\n".Env::v('comm') : '')
               . "\n\nCordialement,\n\n-- \nL'équipe de Polytechnique.org\n";
@@ -121,10 +123,10 @@ est ambigu pour des raisons d'homonymie et signalera ton email exact.";
     {
         require_once('homonymes.inc.php');
 
-        switch_bestalias($this->uid, $this->loginbis);
+        switch_bestalias($this->user->id(), $this->loginbis);
         if (!$this->warning) {
-            XDB::execute("UPDATE aliases SET type='homonyme',expire=NOW() WHERE alias={?}", $this->loginbis);
-            XDB::execute("REPLACE INTO homonymes (homonyme_id,user_id) VALUES({?},{?})", $this->uid, $this->uid);
+            XDB::execute("UPDATE aliases SET type = 'homonyme', expire = NOW() WHERE alias = {?}", $this->loginbis);
+            XDB::execute("REPLACE INTO homonymes (homonyme_id, user_id) VALUES({?}, {?})", $this->user->id(), $this->user->id());
         }
 
         return true;
index 31a3515..bc29451 100644 (file)
@@ -42,10 +42,10 @@ class ListeReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_asso, $_liste, $_domain, $_desc, $_advertise,
+    public function __construct(User &$_user, $_asso, $_liste, $_domain, $_desc, $_advertise,
                                 $_modlevel, $_inslevel, $_owners, $_members, $_stamp=0)
     {
-        parent::__construct($_uid, false, 'liste', $_stamp);
+        parent::__construct($_user, false, 'liste', $_stamp);
 
         $this->asso      = $_asso;
         $this->liste     = $_liste;
@@ -143,7 +143,7 @@ class ListeReq extends Validate
             return 1;
         }
 
-        $list = new MMList(S::v('uid'), S::v('password'), $this->domain);
+        $list = new MMList(S::user()->id(), S::v('password'), $this->domain);
         $ret = $list->create_list($this->liste, utf8_decode($this->desc), $this->advertise,
                                   $this->modlevel, $this->inslevel,
                                   $this->owners, $this->members);
index 2f62845..a81d0a2 100644 (file)
@@ -26,11 +26,8 @@ class MarkReq extends Validate
 
     public $perso;
 
-    public $m_id;
+    public $m_user;
     public $m_email;
-    public $m_nom;
-    public $m_prenom;
-    public $m_promo;
     public $m_relance;
     public $m_type;
     public $m_data;
@@ -42,20 +39,14 @@ class MarkReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($sender, $mark_id, $email, $perso, $type, $data)
+    public function __construct(User &$sender, User &$mark, $email, $perso, $type, $data)
     {
         parent::__construct($sender, false, 'marketing');
-        $this->m_id    = $mark_id;
+        $this->m_user  = &$mark;
         $this->m_email = $email;
         $this->perso   = $perso;
         $this->m_type  = $type;
         $this->m_data  = $data;
-
-        $res = XDB::query('SELECT  u.nom, u.prenom, u.promo
-                             FROM  auth_user_md5      AS u
-                            WHERE  user_id = {?}
-                         GROUP BY  u.user_id', $mark_id);
-        list ($this->m_nom, $this->m_prenom, $this->m_promo) = $res->fetchOneRow();
     }
 
     // }}}
@@ -68,7 +59,7 @@ class MarkReq extends Validate
                         LEFT JOIN  register_pending   AS p ON p.uid = u.user_id
                         LEFT JOIN  register_marketing AS m ON m.uid = u.user_id
                             WHERE  user_id = {?}',
-                            $this->m_id);
+                          $this->m_user->id());
         $this->m_relance = $res->fetchOneCell();
         return 'include/form.valid.mark.tpl';
     }
@@ -78,7 +69,7 @@ class MarkReq extends Validate
 
     protected function _mail_subj()
     {
-        return "[Polytechnique.org] Marketing de {$this->m_prenom} {$this->m_nom} ({$this->m_promo})";
+        return "[Polytechnique.org] Marketing de {$this->m_user->fullName()} ({$this->m_user->promo()})";
     }
 
     // }}}
@@ -88,11 +79,13 @@ class MarkReq extends Validate
     {
         if ($isok) {
             return "  Un email de marketing vient d'être envoyé "
-                .($this->perso ? 'en ton nom' : 'en notre nom')
-                ." à {$this->m_prenom} {$this->m_nom} ({$this->m_promo}) pour l'encourager à s'inscrire !\n\n"
-                ."Merci de ta participation !\n";
+                . ($this->perso ? 'en ton nom' : 'en notre nom')
+                . " à {$this->m_user->fullName()} ({$this->m_user->promo()}) "
+                . "pour l'encourager à s'inscrire !\n\n"
+                . "Merci de ta participation !\n";
         } else {
-            return "  Nous n'avons pas jugé bon d'envoyer d'email de marketing à {$this->m_prenom} {$this->m_nom} ({$this->m_promo}).";
+            return "  Nous n'avons pas jugé bon d'envoyer d'email de marketing à "
+                . "{$this->m_user->fullName()} ({$this->m_user->promo()}).";
         }
     }
 
@@ -101,7 +94,7 @@ class MarkReq extends Validate
 
     public function commit()
     {
-        $market = Marketing::get($this->m_id, $this->m_email);
+        $market = Marketing::get($this->m_user->id(), $this->m_email);
         if ($market == null) {
             return false;
         }
index 599ba21..a2a5dc1 100644 (file)
@@ -31,10 +31,10 @@ class MedalReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_idmedal, $_subidmedal, $_stamp=0)
+    public function __construct(User &$_user, $_idmedal, $_subidmedal, $_stamp=0)
     {
-        parent::__construct($_uid, false, 'medal', $_stamp);
-        $this->mid  = $_idmedal;
+        parent::__construct($_user, false, 'medal', $_stamp);
+        $this->mid = $_idmedal;
         $this->gid = $_subidmedal;
     }
 
@@ -101,10 +101,10 @@ class MedalReq extends Validate
     public function commit ()
     {
         require_once 'notifs.inc.php';
-        register_watch_op($this->uid, WATCH_FICHE, '', 'medals');
+        register_watch_op($this->user->id(), WATCH_FICHE, '', 'medals');
         return XDB::execute('REPLACE INTO  profile_medals_sub
                                    VALUES  ({?}, {?}, {?})',
-                            $this->uid, $this->mid, $this->gid);
+                            $this->user->id(), $this->mid, $this->gid);
     }
 
     // }}}
index 74ff546..3008be3 100644 (file)
@@ -33,10 +33,10 @@ class NLReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($uid, $title, $body, $append)
+    public function __construct(User &$_user, $_title, $_body, $_append)
     {
-        parent::__construct($uid, false, 'nl');
-        $this->art = new NLArticle($title, $body, $append);
+        parent::__construct($_user, false, 'nl');
+        $this->art = new NLArticle($_title, $_body, $_append);
     }
 
     // }}}
index 15f3e8e..0bc76cd 100644 (file)
@@ -44,20 +44,24 @@ class UsageReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_usage, $_reason)
+    public function __construct(User &$_user, $_usage, $_reason)
     {
-        parent::__construct($_uid, true, 'usage');
-        $this->nom_usage  = $_usage;
+        parent::__construct($_user, true, 'usage');
+        $this->nom_usage = $_usage;
         $this->reason = $_reason;
-        $this->alias   = make_username($this->prenom, $this->nom_usage);
-        if (!$this->nom_usage) $this->alias = "";
+
+        $res = XDB::query("SELECT prenom FROM auth_user_md5 WHERE user_id = {?}", $this->user->id());
+        $this->alias = make_username($res->fetchOneCell(), $this->nom_usage);
+        if (!$this->nom_usage) {
+            $this->alias = "";
+        }
 
         $res = XDB::query("
                 SELECT  e.alias, u.nom_usage, a.id
                   FROM  auth_user_md5 as u
              LEFT JOIN  aliases       as e ON(e.type='alias' AND FIND_IN_SET('usage',e.flags) AND e.id = u.user_id)
              LEFT JOIN  aliases       as a ON(a.alias = {?} AND a.id != u.user_id)
-                 WHERE  u.user_id = {?}", $this->alias, $this->uid);
+                 WHERE  u.user_id = {?}", $this->alias, $this->user->id());
         list($this->oldalias, $this->oldusage, $this->homonyme) = $res->fetchOneRow();
     }
 
@@ -93,7 +97,7 @@ class UsageReq extends Validate
             }
             if ($globals->mailstorage->googleapps_domain) {
                 require_once 'googleapps.inc.php';
-                $account = new GoogleAppsAccount($this->uid, $this->forlife);
+                $account = new GoogleAppsAccount($this->user);
                 if ($account->active()) {
                     $res .= "\n\n  Si tu utilises Google Apps, tu peux changer ton nom d'usage sur https://mail.google.com/a/polytechnique.org/#settings/accounts";
                 }
@@ -110,9 +114,9 @@ class UsageReq extends Validate
     public function commit()
     {
         require_once 'notifs.inc.php';
-        register_watch_op($this->uid, WATCH_FICHE, '', 'nom');
+        register_watch_op($this->user->id(), WATCH_FICHE, '', 'nom');
         require_once('user.func.inc.php');
-        $this->bestalias = set_new_usage($this->uid, $this->nom_usage, $this->alias);
+        set_new_usage($this->user->id(), $this->nom_usage, $this->alias);
         return true;
     }
 
index 1cf625c..2cd3918 100644 (file)
@@ -27,7 +27,6 @@ class OrangeReq extends Validate
 
     public $unique = true;
 
-    public $promo;
     public $promo_sortie;
 
     public $rules = "A priori accepter (la validation sert à repousser les
@@ -37,12 +36,11 @@ class OrangeReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_sortie)
+    public function __construct(User &$_user, $_sortie)
     {
-        parent::__construct($_uid, true, 'orange');
+        parent::__construct($_user, true, 'orange');
         $this->promo_sortie  = $_sortie;
-        $res = XDB::query("SELECT promo FROM auth_user_md5 WHERE user_id = {?}", $_uid);
-        $this->promo = $res->fetchOneCell();
+        $res = XDB::query("SELECT promo FROM auth_user_md5 WHERE user_id = {?}", $_user->id());
     }
 
     // }}}
@@ -79,7 +77,7 @@ class OrangeReq extends Validate
 
     public function commit()
     {
-        XDB::execute("UPDATE auth_user_md5 set promo_sortie={?} WHERE user_id={?}",$this->promo_sortie ,$this->uid);
+        XDB::execute("UPDATE auth_user_md5 set promo_sortie = {?} WHERE user_id = {?}",$this->promo_sortie, $this->user->id());
         return true;
     }
 
index e0eca22..62e264a 100644 (file)
@@ -44,11 +44,11 @@ Si le télépaiement n'est pas lié à un groupe ou supérieur à 51 euros, lais
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, $_intitule, $_site, $_montant, $_msg,
+    public function __construct(User &$_user, $_intitule, $_site, $_montant, $_msg,
                                 $_montantmin=0, $_montantmax=999, $_asso_id = 0,
                                 $_evt = 0, $_stamp=0)
     {
-        parent::__construct($_uid, false, 'paiements', $_stamp);
+        parent::__construct($_user, false, 'paiements', $_stamp);
 
         $this->titre        = $_intitule;
         $this->site         = $_site;
@@ -165,7 +165,6 @@ Si le télépaiement n'est pas lié à un groupe ou supérieur à 51 euros, lais
 
     public function commit()
     {
-        global $globals;
         $res = XDB::query("SELECT MAX(id) FROM paiement.paiements");
         $id = $res->fetchOneCell()+1;
         $ret = XDB::execute("INSERT INTO paiement.paiements VALUES
@@ -175,7 +174,7 @@ Si le télépaiement n'est pas lié à un groupe ou supérieur à 51 euros, lais
             ",
             $id, $this->titre, $this->site,
             $this->montant, $this->montant_min, $this->montant_max,
-            $this->bestalias."@".$globals->mail->domain, $this->msg_reponse, $this->asso_id);
+            $this->user->bestEmail(), $this->msg_reponse, $this->asso_id);
         if ($this->asso_id && $this->evt) {
             XDB::execute("UPDATE  groupex.evenements
                              SET  paiement_id = {?}
index 0f2d109..7194e04 100644 (file)
@@ -43,9 +43,9 @@ class PhotoReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_uid, PlUpload &$upload, $_stamp=0)
+    public function __construct(User &$_user, PlUpload &$upload, $_stamp=0)
     {
-        parent::__construct($_uid, true, 'photo', $_stamp);
+        parent::__construct($_user, true, 'photo', $_stamp);
         $this->read($upload);
     }
 
@@ -76,7 +76,7 @@ class PhotoReq extends Validate
 
     static public function get_request($uid)
     {
-        return parent::get_typed_request($uid,'photo');
+        return parent::get_typed_request($uid, 'photo');
     }
 
     // }}}
@@ -101,7 +101,7 @@ class PhotoReq extends Validate
     protected function handle_editor()
     {
         if (isset($_FILES['userfile'])) {
-            $upload =& PlUpload::get($_FILES['userfile'], S::v('forlife'), 'photo');
+            $upload =& PlUpload::get($_FILES['userfile'], S::user()->login(), 'photo');
             if (!$upload) {
                 $this->trigError('Une erreur est survenue lors du téléchargement du fichier');
                 return false;
@@ -140,8 +140,8 @@ class PhotoReq extends Validate
         require_once 'notifs.inc.php';
         XDB::execute('REPLACE INTO  photo (uid, attachmime, attach, x, y)
                             VALUES  ({?},{?},{?},{?},{?})',
-                     $this->uid, $this->mimetype, $this->data, $this->x, $this->y);
-        register_watch_op($this->uid, WATCH_FICHE, '', 'photo');
+                     $this->user->id(), $this->mimetype, $this->data, $this->x, $this->y);
+        register_watch_op($this->user->id(), WATCH_FICHE, '', 'photo');
         return true;
     }
 
index 5a519b4..2d1ef52 100644 (file)
@@ -33,9 +33,9 @@ class SurveyReq extends Validate
     // }}}
     // {{{ constructor
 
-    public function __construct($_title, $_description, $_end, $_mode, $_promos, $_questions, $_uid)
+    public function __construct($_title, $_description, $_end, $_mode, $_promos, $_questions, User &$_user)
     {
-        parent::__construct($_uid, false, 'surveys');
+        parent::__construct($_user, false, 'surveys');
         $this->title       = $_title;
         $this->description = $_description;
         $this->end         = $_end;
@@ -99,7 +99,7 @@ class SurveyReq extends Validate
                             end={?},
                             mode={?},
                             promos={?}';
-        return XDB::execute($sql, serialize($this->questions), $this->title, $this->description, $this->uid, $this->end, $this->mode, $this->promos);
+        return XDB::execute($sql, serialize($this->questions), $this->title, $this->description, $this->user->id(), $this->end, $this->mode, $this->promos);
     }
 
     // }}}
index 2be89de..d16dae6 100644 (file)
@@ -37,9 +37,9 @@ class VCard extends PlVCard
 
     public function addUser($user)
     {
-        $forlife = get_user_forlife($user, '_silent_user_callback');
-        if ($forlife) {
-            $this->user_list[] = get_user_forlife($user);
+        $user = User::getSilent($user);
+        if ($user) {
+            $this->user_list[] = $user;
             $this->count++;
         }
     }
@@ -59,7 +59,7 @@ class VCard extends PlVCard
     {
         global $globals;
         $login = $entry['value'];
-        $user  = get_user_details($login);
+        $user  = get_user_details($login->login());
 
         if (empty($user['nom_usage'])) {
             $entry = new PlVCardEntry($user['prenom'], $user['nom'], null, null, @$user['nickname']);
@@ -160,10 +160,9 @@ class VCard extends PlVCard
         // Photo
         if ($this->photos) {
             $res = XDB::query(
-                    "SELECT attach, attachmime
-                       FROM photo   AS p
-                 INNER JOIN aliases AS a ON (a.id = p.uid AND a.type = 'a_vie')
-                      WHERE a.alias = {?}", $login);
+                    "SELECT  attach, attachmime
+                       FROM  photo AS p
+                      WHERE  u.user_id = {?}", $login->id());
             if ($res->numRows()) {
                 list($data, $type) = $res->fetchOneRow();
                 $entry->setPhoto($data, strtoupper($type));
index b867000..b15491a 100644 (file)
@@ -53,7 +53,7 @@ $GUIButtons['table'] = array(600,
                  '$GUIButtonDirUrlFmt/table.gif"$[Table]"');
 
 // set default author
-$Author = $_SESSION['forlife'].'|'.$_SESSION['prenom'].' '.$_SESSION['nom'];
+$Author = $_SESSION['hruid'].'|'.$_SESSION['prenom'].' '.$_SESSION['nom'];
 
 $InputTags['e_form'] = array(
   ':html' => "<form action='{\$PageUrl}?action=edit' method='post'><div><input
index 84af751..59173b9 100644 (file)
@@ -356,330 +356,342 @@ class AdminModule extends PLModule
         $page->changeTpl('admin/utilisateurs.tpl');
         $page->setTitle('Administration - Edit/Su/Log');
         require_once("emails.inc.php");
-        require_once("user.func.inc.php");
 
         if (S::has('suid')) {
             $page->kill("Déjà en SUID !!!");
         }
 
-        if (Env::has('user_id')) {
-            $login = get_user_forlife(Env::i('user_id'));
-            if (empty($login)) {
-                $login = Env::i('user_id');
-            }
-        } elseif (Env::has('login')) {
-            $login = get_user_forlife(Env::v('login'));
+        // Loads the user identity using the environment.
+        if ($login) {
+            $user = User::get($login);
+        } else if (Env::has('user_id')) {
+            $user = User::get(Env::i('user_id'));
+        } else if (Env::has('login')) {
+            $user = User::get(Env::v('login'));
         }
 
-        if(Env::has('logs_button') && $login) {
-            pl_redirect("admin/logger?loguser=$login&year=".date('Y')."&month=".date('m'));
+        if ($user) {
+            $login = $user->login();
+            $registered = ($user->forlifeEmail() != null);
+        } else {
+            return;
         }
 
-        if (Env::has('ax_button') && $login) {
-            pl_redirect("admin/synchro_ax/$login");
+        // Handles specific requests (AX sync, su, ...).
+        if(Env::has('logs_button') && $registered) {
+            pl_redirect("admin/logger?loguser=$login&year=".date('Y')."&month=".date('m'));
         }
 
-        if(Env::has('suid_button') && $login) {
-            S::logger()->log("suid_start", "login by ".S::v('forlife'));
-            $r = XDB::query("SELECT  id
-                               FROM  aliases
-                              WHERE  alias={?}", $login);
-            if($uid = $r->fetchOneCell()) {
-                if (!Platal::session()->startSUID($uid)) {
-                    $page->trigError('Impossible d\'effectuer un SUID sur ' . $uid);
-                } else {
-                    $page->kill("coucou");
-                    pl_redirect("");
-                }
-            }
+        if (Env::has('ax_button') && $registered) {
+            pl_redirect("admin/synchro_ax/" . $user->login());
         }
 
-        if ($login) {
-            if (is_numeric($login)) {
-                $r = XDB::query("SELECT *, a.alias AS forlife,
-                                        FIND_IN_SET('watch', u.flags) AS watch, FIND_IN_SET('femme', u.flags) AS sexe,
-                                        (year(naissance) > promo - 15 or year(naissance) < promo - 25) AS naiss_err
-                                   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 = {?}", $login);
+        if(Env::has('suid_button') && $registered) {
+            S::logger()->log("suid_start", "login on " . $user->login());
+            if (!Platal::session()->startSUID($user->id())) {
+                $page->trigError('Impossible d\'effectuer un SUID sur ' . $user->id());
             } else {
-                $r  = XDB::query("SELECT  *, a.alias AS forlife,
-                                          FIND_IN_SET('watch', u.flags) AS watch, FIND_IN_SET('femme', u.flags) AS sexe,
-                                          (year(naissance) > promo - 15 or year(naissance) < promo - 25) AS naiss_err
-                                    FROM  auth_user_md5 AS u
-                              INNER JOIN  aliases       AS a ON ( a.id = u.user_id AND a.alias={?} AND type!='homonyme' )", $login);
+                pl_redirect("");
             }
-            $mr = $r->fetchOneAssoc();
+        }
 
-            // Checks the user has a forlife, as non-registered user can't have redirections.
-            if ($mr['forlife']) {
-                $redirect = new Redirect($mr['user_id']);
-            }
+        // Fetches user data.
+        $userinfo_query = "SELECT  *, FIND_IN_SET('watch', flags) AS watch, FIND_IN_SET('femme', flags) AS sexe,
+                                   (year(naissance) > promo - 15 or year(naissance) < promo - 25) AS naiss_err
+                             FROM  auth_user_md5
+                            WHERE  user_id = {?}";
+        $mr = XDB::query($userinfo_query, $user->id())->fetchOneAssoc();
+        $redirect = ($registered ? new Redirect($user) : null);
 
-            // Check if there was a submission
-            foreach($_POST as $key => $val) {
-                S::assert_xsrf_token();
+        // Processes admin requests, if any.
+        foreach($_POST as $key => $val) {
+            S::assert_xsrf_token();
 
-                switch ($key) {
-                    case "add_fwd":
-                        $email = trim(Env::v('email'));
-                        if (!isvalid_email_redirection($email)) {
-                            $page->trigError("Email non valide: $email");
-                        } else {
-                            $redirect->add_email($email);
-                            $page->trigSuccess("Ajout de $email effectué");
-                        }
-                        break;
+            switch ($key) {
+                // Email redirection actions.
+                case "add_fwd":
+                    $email = trim(Env::v('email'));
+                    if (!isvalid_email_redirection($email)) {
+                        $page->trigError("Email non valide: $email");
+                    } else {
+                        $redirect->add_email($email);
+                        $page->trigSuccess("Ajout de $email effectué");
+                    }
+                    break;
 
-                    case "del_fwd":
-                        if (!empty($val)) {
-                            $redirect->delete_email($val);
-                        }
-                        break;
+                case "del_fwd":
+                    if (!empty($val)) {
+                        $redirect->delete_email($val);
+                    }
+                    break;
 
-                    case "del_alias":
-                        if (!empty($val)) {
-                            XDB::execute("DELETE FROM aliases
-                                                WHERE id={?} AND alias={?}
-                                                      AND type!='a_vie' AND type!='homonyme'", $mr['user_id'], $val);
-                            XDB::execute("UPDATE emails
-                                             SET rewrite = ''
-                                           WHERE uid = {?} AND rewrite LIKE CONCAT({?}, '@%')",
-                                         $mr['user_id'], $val);
-                            fix_bestalias($mr['user_id']);
-                            $page->trigSuccess($val." a été supprimé");
-                        }
-                        break;
-                    case "activate_fwd":
-                        if (!empty($val)) {
-                            $redirect->modify_one_email($val, true);
-                        }
-                        break;
-                    case "deactivate_fwd":
-                        if (!empty($val)) {
-                            $redirect->modify_one_email($val, false);
-                        }
-                        break;
-                    case "disable_fwd":
-                        $redirect->disable();
-                        break;
-                    case "enable_fwd":
-                        $redirect->enable();
-                        break;
-                    case "clean_fwd":
-                        if (!empty($val)) {
-                            $redirect->clean_errors($val);
-                        }
-                        break;
-                    case "add_alias":
-                        global $globals;
-                        $alias = trim(Env::v('email'));
-                        if (strpos($alias, '@') !== false) {
-                            list($alias, $domain) = explode('@', $alias);
+                case "activate_fwd":
+                    if (!empty($val)) {
+                        $redirect->modify_one_email($val, true);
+                    }
+                    break;
+                case "deactivate_fwd":
+                    if (!empty($val)) {
+                        $redirect->modify_one_email($val, false);
+                    }
+                    break;
+                case "disable_fwd":
+                    $redirect->disable();
+                    break;
+                case "enable_fwd":
+                    $redirect->enable();
+                    break;
+                case "clean_fwd":
+                    if (!empty($val)) {
+                        $redirect->clean_errors($val);
+                    }
+                    break;
+
+                // Alias actions.
+                case "add_alias":
+                    global $globals;
+
+                    // Splits new alias in user and fqdn.
+                    $alias = trim(Env::v('email'));
+                    if (strpos($alias, '@') !== false) {
+                        list($alias, $domain) = explode('@', $alias);
+                    } else {
+                        $domain = $globals->mail->domain;
+                    }
+
+                    // Checks for alias' user validity.
+                    if (!preg_match('/[-a-z0-9\.]+/s', $alias)) {
+                        $page->trigError("'$alias' n'est pas un alias valide");
+                    }
+
+                    // Eventually adds the alias to the right domain.
+                    if ($domain == $globals->mail->alias_dom || $domain == $globals->mail->alias_dom2) {
+                        $req = new AliasReq($user, $alias, 'Admin request', false);
+                        if ($req->commit()) {
+                            $page->trigSuccess("Nouvel alias '$alias@$domain' attribué");
                         } else {
-                            $domain = $globals->mail->domain;
-                        }
-                        if (!preg_match('/[-a-z0-9\.]+/s', $alias)) {
-                            $page->trigError("'$alias' n'est pas un alias valide");
+                            $page->trigError("Impossible d'ajouter l'alias '$alias@$domain', il est probablement déjà attribué");
                         }
-                        if ($domain == $globals->mail->alias_dom || $domain == $globals->mail->alias_dom2) {
-                            $req = new AliasReq($mr['user_id'], $alias, 'Admin request', false);
-                            if ($req->commit()) {
-                                $page->trigSuccess("Nouvel alias '$alias@$domain' attribué");
-                            } else {
-                                $page->trigError("Impossible d'ajouter l'alias '$alias@$domain', il est probablement déjà attribué");
-                            }
-                        } elseif ($domain == $globals->mail->domain || $domain == $globals->mail->domain2) {
-                            if (XDB::execute("INSERT INTO  aliases (id,alias,type) VALUES  ({?}, {?}, 'alias')",
-                                    $mr['user_id'], $alias)) {
-                                $page->trigSuccess("Nouvel alias '$alias' ajouté");
-                            } else {
-                                $page->trigError("Impossible d'ajouter l'alias '$alias', il est probablement déjà attribué");
-                            }
+                    } elseif ($domain == $globals->mail->domain || $domain == $globals->mail->domain2) {
+                        $res = XDB::execute("INSERT INTO aliases (id,alias,type) VALUES ({?}, {?}, 'alias')",
+                                            $user->id(), $alias);
+                        if ($res) {
+                            $page->trigSuccess("Nouvel alias '$alias' ajouté");
                         } else {
-                            $page->trigError("Le domaine '$domain' n'est pas valide");
+                            $page->trigError("Impossible d'ajouter l'alias '$alias', il est probablement déjà attribué");
                         }
-                        break;
+                    } else {
+                        $page->trigError("Le domaine '$domain' n'est pas valide");
+                    }
+                    break;
 
-                    case "best":
-                        // 'bestalias' is the first bit of the set : 1
-                        // 255 is the max for flags (8 sets max)
-                        XDB::execute("UPDATE  aliases SET flags= flags & (255 - 1) WHERE id={?}", $mr['user_id']);
-                        XDB::execute("UPDATE  aliases
-                                                   SET  flags= flags | 1
-                                                WHERE  id={?} AND alias={?}", $mr['user_id'], $val);
-                        break;
+                case "del_alias":
+                    if (!empty($val)) {
+                        XDB::execute("DELETE FROM  aliases
+                                            WHERE  id = {?} AND alias = {?} AND
+                                                   type NOT IN ('a_vie', 'homonyme')",
+                                     $user->id(), $val);
+                        XDB::execute("UPDATE  emails
+                                         SET  rewrite = ''
+                                       WHERE  uid = {?} AND rewrite LIKE CONCAT({?}, '@%')",
+                                     $user->id(), $val);
+                        fix_bestalias($user);
+                        $page->trigSuccess("L'alias '$val' a été supprimé");
+                    }
+                    break;
 
+                case "best":
+                    XDB::execute("UPDATE  aliases
+                                     SET  flags = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', flags, ','), ',bestalias,', ','))
+                                   WHERE  id = {?}", $user->id());
+                    XDB::execute("UPDATE  aliases
+                                     SET  flags = CONCAT_WS(',', IF(flags = '', NULL, flags), 'bestalias')
+                                   WHERE  id = {?} AND alias = {?}", $user->id(), $val);
+
+                    // As having a non-null bestalias value is critical in
+                    // plat/al's code, we do an a posteriori check on the
+                    // validity of the bestalias.
+                    fix_bestalias($user);
+                    break;
 
-                    // Editer un profil
-                    case "u_edit":
-                        require_once('secure_hash.inc.php');
-                        $pass_encrypted = Env::v('newpass_clair') != "********" ? hash_encrypt(Env::v('newpass_clair')) : Env::v('passw');
-                        $naiss    = Env::v('naissanceN');
-                        $deces    = Env::v('decesN');
-                        $perms    = Env::v('permsN');
-                        $prenm    = Env::v('prenomN');
-                        $nom      = Env::v('nomN');
-                        $nomusage = Env::v('nomusageN');
-                        $promo    = Env::i('promoN');
-                        $sexe     = Env::v('sexeN');
-                        $comm     = trim(Env::v('commentN'));
-                        $watch    = Env::v('watchN');
-                        $flags    = '';
-                        if ($sexe) {
-                            $flags = 'femme';
-                        }
-                        if ($watch) {
-                            if ($flags) {
-                                $flags .= ',';
-                            }
-                            $flags .= 'watch';
-                        }
+                // Profile edition.
+                case "u_edit":
+                    // Loads new values from environment.
+                    require_once('secure_hash.inc.php');
+                    $pass_encrypted = Env::v('newpass_clair') != "********" ? hash_encrypt(Env::v('newpass_clair')) : Env::v('passw');
+                    $naiss    = Env::v('naissanceN');
+                    $deces    = Env::v('decesN');
+                    $perms    = Env::v('permsN');
+                    $prenom    = Env::v('prenomN');
+                    $nom      = Env::v('nomN');
+                    $nomusage = Env::v('nomusageN');
+                    $promo    = Env::i('promoN');
+                    $sexe     = Env::v('sexeN');
+                    $comm     = trim(Env::v('commentN'));
+                    $watch    = Env::v('watchN');
+
+                    $flags    = ($sexe ? 'femme' : '');
+                    if ($watch) {
+                        $flags .= ($flags ? ',watch' : 'watch');
+                    }
+                    if ($watch && !$comm) {
+                        $page->trigError("Il est nécessaire de mettre un commentaire pour surveiller un compte");
+                        break;
+                    }
 
-                        if ($watch && !$comm) {
-                            $page->trigError("Il est nécessaire de mettre un commentaire pour surveiller un compte");
-                            break;
-                        }
+                    // Fetches fields to watch for changes.
+                    $watch_query = "SELECT  naissance, deces, password, perms, nom_usage,
+                                           prenom, nom, flags, promo, comment
+                                      FROM  auth_user_md5
+                                     WHERE user_id = {?}";
+                    $old_fields = XDB::query($watch_query, $user->id())->fetchOneAssoc();
+
+                    // If user was newly banned, we need to ensure her php session
+                    // is killed. This hack is ugly (and largely overkill); it should
+                    // however suits our needs.
+                    if ($perms == 'disabled' && $old_fields['perms'] != 'disabled') {
+                        kill_sessions();
+                    }
 
-                        $watch = 'SELECT naissance, deces, password, perms, nom_usage,
-                                         prenom, nom, flags, promo, comment
-                                    FROM auth_user_md5
-                                   WHERE user_id = ' . $mr['user_id'];
-                        $res = XDB::query($watch);
-                        $old_fields = $res->fetchOneAssoc();
-                        $query = "UPDATE auth_user_md5 SET
-                                         naissance = '$naiss',
-                                         deces     = '$deces',
-                                         password  = '$pass_encrypted',
-                                         perms     = '$perms',
-                                         prenom    = '".addslashes($prenm)."',
-                                         nom       = '".addslashes($nom)."',
-                                         nom_usage = '".addslashes($nomusage)."',
-                                         flags     = '$flags',
-                                         promo     = $promo,
-                                         comment   = '".addslashes($comm)."'
-                                   WHERE user_id = '{$mr['user_id']}'";
-                        if ($perms == 'disabled' && $old_fields['perms'] != 'disabled') {
-                            // A user has been banned ==> ensure his php session has been killed
-                            // This solution is ugly and overkill, but, it should be efficient.
-                            kill_sessions();
-                        }
-                        if (XDB::execute($query)) {
-                            user_reindex($mr['user_id']);
+                    // Updates the user profile with the new values.
+                    $res = XDB::execute("UPDATE  auth_user_md5
+                                            SET  naissance = {?}, deces = {?}, password = {?},
+                                                 perms = {?}, prenom = {?}, nom = {?}, nom_usage = {?},
+                                                 flags = {?}, promo = {?}, comment = {?}
+                                          WHERE  user_id = {?}",
+                                        $naiss, $deces, $pass_encrypted,
+                                        $perms, $prenom, $nom, $nomusage,
+                                        $flags, $promo, $comm, $user->id());
+                    if ($res) {
+                        require_once("user.func.inc.php");
+                        user_reindex($user->id());
+                        $new_fields = XDB::query($watch_query, $user->id())->fetchOneAssoc();
 
-                            $res = XDB::query($watch);
-                            $new_fields = $res->fetchOneAssoc();
+                        $mailer = new PlMailer("admin/useredit.mail.tpl");
+                        $mailer->assign("admin", S::user()->login());
+                        $mailer->assign("user", $user->login());
+                        $mailer->assign('old', $old_fields);
+                        $mailer->assign('new', $new_fields);
+                        $mailer->send();
 
-                            $mailer = new PlMailer("admin/useredit.mail.tpl");
-                            $mailer->assign("admin", S::v('forlife'));
-                            $mailer->assign("user", $mr['forlife']);
-                            $mailer->assign('old', $old_fields);
-                            $mailer->assign('new', $new_fields);
-                            $mailer->send();
+                        $globals->updateNbIns();
+                        $page->trigSuccess("Update was successful.");
+                    } else {
+                        $page->trigError("Update failed, please double check your values.");
+                    }
 
-                            // update number of subscribers (perms or deceased may have changed)
-                            $globals->updateNbIns();
+                    // Checks for changes, and updates other tables of plat/al.
+                    if (Env::v('nomusageN') != $mr['nom_usage']) {
+                        set_new_usage($user->id(), Env::v('nomusageN'), make_username(Env::v('prenomN'), Env::v('nomusageN')));
+                    }
+                    if (Env::v('decesN') != $mr['deces']) {
+                        require_once 'notifs.inc.php';
+                        register_watch_op($user->id(), WATCH_DEATH, $mr['deces']);
+                        user_clear_all_subs($user->id(), false);
+                    }
 
-                            $page->trigSuccess("updaté correctement.");
-                        }
-                        if (Env::v('nomusageN') != $mr['nom_usage']) {
-                            set_new_usage($mr['user_id'], Env::v('nomusageN'), make_username(Env::v('prenomN'), Env::v('nomusageN')));
-                        }
-                        if (Env::v('decesN') != $mr['deces']) {
-                            require_once 'notifs.inc.php';
-                            register_watch_op($mr['user_id'], WATCH_DEATH, $mr['deces']);
-                            user_clear_all_subs($mr['user_id'], false);
-                        }
-                        $r = XDB::query("SELECT *, a.alias AS forlife,
-                                                FIND_IN_SET('watch', u.flags) AS watch, FIND_IN_SET('femme', u.flags) AS sexe
-                                           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 = {?}", $mr['user_id']);
-                        $mr = $r->fetchOneAssoc();
-
-                        // If GoogleApps is enabled, the user did choose to use synchronized passwords,
-                        // and the password was changed, updates the Google Apps password as well.
-                        if ($globals->mailstorage->googleapps_domain && Env::v('newpass_clair') != "********") {
+                    // Eventually updates the Google Apps account.
+                    if ($globals->mailstorage->googleapps_domain) {
+                        // If the user did choose to use synchronized passwords,
+                        // and the password was changed, updates the Google Apps
+                        // password as well.
+                        if (Env::v('newpass_clair') != "********") {
                             require_once 'googleapps.inc.php';
-                            $account = new GoogleAppsAccount($mr['user_id'], $mr['forlife']);
+                            $account = new GoogleAppsAccount($user);
                             if ($account->active() && $account->sync_password) {
                                 $account->set_password($pass_encrypted);
                             }
                         }
 
-                        // If GoogleApps is enabled, and the user is now disabled, disables the Google Apps account as well.
-                        if ($globals->mailstorage->googleapps_domain &&
-                            $new_fields['perms'] == 'disabled' &&
-                            $new_fields['perms'] != $old_fields['perms']) {
+                        // If the update did disable the user account, disables
+                        // the Google Apps account as well.
+                        if ($new_fields['perms'] == 'disabled' && $new_fields['perms'] != $old_fields['perms']) {
                             require_once 'googleapps.inc.php';
-                            $account = new GoogleAppsAccount($mr['user_id'], $mr['forlife']);
+                            $account = new GoogleAppsAccount($user);
                             $account->suspend();
                         }
-                        break;
+                    }
 
-                    // DELETE FROM auth_user_md5
-                    case "u_kill":
-                        user_clear_all_subs($mr['user_id']);
-                        // update number of subscribers (perms or deceased may have changed)
-                        $globals->updateNbIns();
-                        $page->trigSuccess("'{$mr['user_id']}' a été désinscrit !");
-                        $mailer = new PlMailer("admin/useredit.mail.tpl");
-                        $mailer->assign("admin", S::v('forlife'));
-                        $mailer->assign("user", $mr['forlife']);
-                        $mailer->assign("deletion", true);
-                        $mailer->send();
-                        break;
 
-                    case "b_edit":
-                        XDB::execute("DELETE FROM forums.innd WHERE uid = {?}", $mr['user_id']);
-                        if (Env::v('write_perm') != "" || Env::v('read_perm') != ""  || Env::v('commentaire') != "" ) {
-                          XDB::execute("INSERT INTO forums.innd
-                                                SET ipmin = '0',
-                                                    ipmax = '4294967295',
-                                                    write_perm = {?},
-                                                    read_perm = {?},
-                                                    comment = {?},
-                                                    priority = '200',
-                                                    uid = {?}",
-                                       Env::v('write_perm'), Env::v('read_perm'), Env::v('comment'), $mr['user_id']);
-                        }
-                        break;
-                }
-            }
+                    // Reloads the user profile, to ensure the latest version will
+                    // be served to the administrator.
+                    $mr = XDB::query($userinfo_query, $user->id())->fetchOneAssoc();
+
+                    break;
 
-            $res = XDB::query("SELECT  start, host
-                                 FROM  logger.sessions
-                                WHERE  uid={?} AND suid=0
-                             ORDER BY  start DESC
-                                LIMIT  1", $mr['user_id']);
-            list($lastlogin,$host) = $res->fetchOneRow();
-            $page->assign('lastlogin', $lastlogin);
-            $page->assign('host', $host);
-
-            $res = XDB::iterator("SELECT  alias
-                                    FROM  virtual
-                              INNER JOIN  virtual_redirect USING(vid)
-                                   WHERE  type = 'user' AND redirect LIKE '" . $mr['forlife'] . "@%'");
-            $page->assign('virtuals', $res);
-
-            $page->assign('aliases', XDB::iterator(
-                        "SELECT  alias, type='a_vie' AS for_life,FIND_IN_SET('bestalias',flags) AS best,expire
-                           FROM  aliases
-                          WHERE  id = {?} AND type!='homonyme'
-                       ORDER BY  type!= 'a_vie'", $mr["user_id"]));
-            if ($mr['perms'] != 'pending' && isset($redirect)) {
-                $page->assign('emails', $redirect->emails);
+                // User re-registration.
+                case "u_kill":
+                    user_clear_all_subs($user->id());
+                    $globals->updateNbIns();
+                    $page->trigSuccess("'" . $user->id() . "' a été désinscrit !");
+
+                    $mailer = new PlMailer("admin/useredit.mail.tpl");
+                    $mailer->assign("admin", S::user()->login());
+                    $mailer->assign("user", $user->login());
+                    $mailer->assign("deletion", true);
+                    $mailer->send();
+                    break;
+
+                // Forum ban update.
+                case "b_edit":
+                    XDB::execute("DELETE FROM forums.innd WHERE uid = {?}", $user->id());
+                    if (Env::v('write_perm') != "" || Env::v('read_perm') != ""  || Env::v('commentaire') != "" ) {
+                        XDB::execute("INSERT INTO  forums.innd
+                                              SET  ipmin = '0', ipmax = '4294967295',
+                                                   write_perm = {?}, read_perm = {?},
+                                                   comment = {?}, priority = '200', uid = {?}",
+                                     Env::v('write_perm'), Env::v('read_perm'), Env::v('comment'), $user->id());
+                    }
+                    break;
             }
+        }
+
+        // Displays last login and last host information.
+        $res = XDB::query("SELECT  start, host
+                             FROM  logger.sessions
+                            WHERE  uid = {?} AND suid = 0
+                         ORDER BY  start DESC
+                            LIMIT  1", $user->id());
+        list($lastlogin,$host) = $res->fetchOneRow();
+        $page->assign('lastlogin', $lastlogin);
+        $page->assign('host', $host);
+
+        // Display active aliases.
+        $page->assign('virtuals', XDB::iterator(
+                "SELECT  alias
+                   FROM  virtual
+             INNER JOIN  virtual_redirect USING (vid)
+                  WHERE  type = 'user' AND redirect LIKE CONCAT({?}, '@%')", $user->id()));
+
+        $page->assign('aliases', XDB::iterator(
+                "SELECT  alias, type='a_vie' AS for_life,FIND_IN_SET('bestalias',flags) AS best,expire
+                   FROM  aliases
+                  WHERE  id = {?} AND type != 'homonyme'
+               ORDER BY  type != 'a_vie'", $user->id()));
+
+        // Displays email redirection and the general profile.
+        if ($registered && $redirect) {
+            $page->assign('emails', $redirect->emails);
+        }
 
-            $page->assign('mr',$mr);
+        $page->assign('mr', $mr);
+        $page->assign('user', $user);
 
-            // Bans forums
-            $res = XDB::query("SELECT  write_perm, read_perm, comment
-                                 FROM  forums.innd
-                                WHERE  uid = {?}", $mr['user_id']);
-            $bans = $res->fetchOneAssoc();
-            $page->assign('bans', $bans);
+        // Displays forum bans.
+        $res = XDB::query("SELECT  write_perm, read_perm, comment
+                             FROM  forums.innd
+                            WHERE  uid = {?}", $user->id());
+        $bans = $res->fetchOneAssoc();
+        $page->assign('bans', $bans);
+    }
+
+    function getHruid($line, $key)
+    {
+        var_dump($line);
+        if (!isset($line['nom']) || !isset($line['prenom']) || !isset($line['promo'])) {
+            return null;
         }
+        return make_forlife($line['prenom'], $line['nom'], $line['promo']);
     }
 
     function getMatricule($line, $key)
@@ -714,12 +726,13 @@ class AdminModule extends PLModule
         }
 
         $importer = new CSVImporter('auth_user_md5', 'matricule');
-        $importer->registerFunction('matricule', 'matricle Ecole vers X.org', array($this, 'getMatricule'));
+        $importer->registerFunction('matricule', 'matricule Ecole vers X.org', array($this, 'getMatricule'));
         switch ($action) {
           case 'add':
-            $fields = array('nom', 'nom_ini', 'prenom', 'naissance_ini',
+            $fields = array('hruid', 'nom', 'nom_ini', 'prenom', 'naissance_ini',
                             'prenom_ini', 'promo', 'promo_sortie', 'flags',
                             'matricule', 'matricule_ax', 'perms');
+            $importer->forceValue('hruid', array($this, 'getHruid'));
             $importer->forceValue('promo', $promo);
             $importer->forceValue('promo_sortie', $promo + 3);
             break;
@@ -730,7 +743,8 @@ class AdminModule extends PLModule
         $importer->apply($page, "admin/promo/$action/$promo", $fields);
     }
 
-    function handler_homonyms(&$page, $op = 'list', $target = null) {
+    function handler_homonyms(&$page, $op = 'list', $target = null)
+    {
         $page->changeTpl('admin/homonymes.tpl');
         $page->setTitle('Administration - Homonymes');
         require_once("homonymes.inc.php");
@@ -876,51 +890,41 @@ class AdminModule extends PLModule
         $page->assign('dead', $res);
     }
 
-    function handler_synchro_ax(&$page, $user = null, $action = null) {
+    function handler_synchro_ax(&$page, $login = null, $action = null) {
         $page->changeTpl('admin/synchro_ax.tpl');
         $page->setTitle('Administration - Synchro AX');
 
+        // Checks for synchronization requirements.
         require_once('synchro_ax.inc.php');
-
         if (is_ax_key_missing()) {
             $page->assign('no_private_key', true);
             $page->run();
         }
 
-        require_once('user.func.inc.php');
-
-        if ($user)
-            $login = get_user_forlife($user);
-
-        if (Env::has('user')) {
-            $login = get_user_forlife(Env::v('user'));
-            if ($login === false) {
-                return;
-            }
+        // Determines user identity using environment.
+        if ($login) {
+            $user = User::get($login);
+        } else if (Env::has('user')) {
+            $user = User::get(Env::v('user'));
+        } else if (Env::has('mat')) {
+            $res = XDB::query("SELECT user_id FROM auth_user_md5 WHERE matricule = {?}", Env::i('mat'));
+            $user = User::get($res->fetchOneCell());
+        } else {
+            return;
         }
 
-        if (Env::has('mat')) {
-            $res = XDB::query(
-                    "SELECT  alias
-                       FROM  aliases       AS a
-                 INNER JOIN  auth_user_md5 AS u ON (a.id=u.user_id AND a.type='a_vie')
-                      WHERE  matricule={?}", Env::i('mat'));
-            $login = $res->fetchOneCell();
+        // Finally synchronizes the AX and plat/al information.
+        if ($action == 'import') {
+            ax_synchronize($user->login(), S::v('uid'));
         }
 
-        if ($login) {
-            if ($action == 'import') {
-                ax_synchronize($login, S::v('uid'));
-            }
-            // get details from user, but looking only info that can be seen by ax
-            $user  = get_user_details($login, S::v('uid'), 'ax');
-            $userax= get_user_ax($user['matricule_ax']);
-            require_once 'profil.func.inc.php';
-            $diff = diff_user_details($userax, $user, 'ax');
-
-            $page->assign('x', $user);
-            $page->assign('diff', $diff);
-        }
+        require_once 'profil.func.inc.php';
+        $userxorg = get_user_details($user->login(), S::v('uid'), 'ax');
+        $userax = get_user_ax($userxorg['matricule_ax']);
+        $diff = diff_user_details($userax, $userxorg, 'ax');
+
+        $page->assign('x', $userxorg);
+        $page->assign('diff', $diff);
     }
 
     function handler_validate(&$page, $action = 'list', $id = null)
index 0839734..8bd7b2d 100644 (file)
@@ -275,9 +275,9 @@ class AXLetterModule extends PLModule
             $nl->toHtml($page, S::v('prenom'), S::v('nom'), S::v('femme'));
         }
         if (Post::has('send')) {
-            $nl->sendTo(S::v('prenom'), S::v('nom'),
-                        S::v('bestalias'), S::v('femme'),
-                        S::v('mail_fmt') != 'texte');
+            $nl->sendTo(S::user()->login(), S::user()->bestEmail(),
+                        S::v('prenom'), S::v('nom'),
+                        S::v('femme'), S::v('mail_fmt') != 'texte');
         }
     }
 
index f8c7ca1..eed37b6 100644 (file)
@@ -99,7 +99,9 @@ class AXLetter extends MassMailer
 
     protected function getAllRecipients()
     {
-        return "SELECT  ni.user_id, IF(ni.user_id = 0, ni.email, a.alias) AS alias,
+        global $globals;
+        return "SELECT  ni.user_id, IF(ni.user_id = 0, NULL, u.hruid) AS hruid,
+                        IF(ni.user_id = 0, ni.email, CONCAT(a.alias, '@{$globals->mail->domain}')) AS alias,
                         IF(ni.user_id = 0, ni.prenom, u.prenom) AS prenom,
                         IF(ni.user_id = 0, ni.nom, IF(u.nom_usage='', u.nom, u.nom_usage)) AS nom,
                         FIND_IN_SET('femme', IF(ni.user_id = 0, ni.flag, u.flags)) AS sexe,
index ce4b16c..2bd196c 100644 (file)
@@ -208,39 +208,24 @@ class CarnetModule extends PLModule
         }
         switch (Env::v('action')) {
             case 'retirer':
-                if (is_numeric($user)) {
-                    if (XDB::execute('DELETE FROM contacts
-                                       WHERE uid = {?} AND contact = {?}',
-                                     $uid, $user))
-                    {
-                        $page->trigSuccess("Contact retiré !");
-                    }
-                } else {
-                    if (XDB::execute(
-                                'DELETE FROM  c
-                                       USING  contacts AS c
-                                  INNER JOIN  aliases  AS a ON (c.contact=a.id and a.type!="homonyme")
-                                       WHERE  c.uid = {?} AND a.alias={?}', $uid, $user))
-                    {
+                if (($user = User::get(Env::v('user')))) {
+                    if (XDB::execute("DELETE FROM  contacts
+                                            WHERE  uid = {?} AND contact = {?}", $uid, $user->id())) {
                         $page->trigSuccess("Contact retiré !");
                     }
                 }
                 break;
 
             case 'ajouter':
-                require_once('user.func.inc.php');
-                if (($login = get_user_login($user)) !== false) {
-                    if (XDB::execute(
-                                'REPLACE INTO  contacts (uid, contact)
-                                       SELECT  {?}, id
-                                         FROM  aliases
-                                        WHERE  alias = {?}', $uid, $login))
-                    {
+                if (($user = User::get(Env::v('user')))) {
+                    if (XDB::execute("REPLACE INTO  contacts (uid, contact)
+                                            VALUES  ({?}, {?})", $uid, $user->id())) {
                         $page->trigSuccess('Contact ajouté !');
                     } else {
                         $page->trigWarning('Contact déjà dans la liste !');
                     }
                 }
+                break;
         }
 
         $search = false;
index 3776043..38672f3 100644 (file)
@@ -52,45 +52,59 @@ class EmailModule extends PLModule
         $page->changeTpl('emails/index.tpl');
         $page->setTitle('Mes emails');
 
-        $uid = S::v('uid');
+        $user = S::user();
 
+        // Apply the bestalias change request.
         if ($action == 'best' && $email) {
             if (!S::has_xsrf_token()) {
                 return PL_FORBIDDEN;
             }
 
-            // bestalias is the first bit : 1
-            // there will be maximum 8 bits in flags : 255
-            XDB::execute("UPDATE  aliases SET flags=flags & (255 - 1) WHERE id={?}", $uid);
-            XDB::execute("UPDATE  aliases SET flags=flags | 1 WHERE id={?} AND alias={?}",
-                                   $uid, $email);
+            XDB::execute("UPDATE  aliases
+                             SET  flags = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', flags, ','), ',bestalias,', ','))
+                           WHERE  id = {?}", $user->id());
+            XDB::execute("UPDATE  aliases
+                             SET  flags = CONCAT_WS(',', IF(flags = '', NULL, flags), 'bestalias')
+                           WHERE  id = {?} AND alias = {?}", $user->id(), $email);
+
+            // As having a non-null bestalias value is critical in
+            // plat/al's code, we do an a posteriori check on the
+            // validity of the bestalias.
+            fix_bestalias($user);
         }
 
-        // on regarde si on a affaire à un homonyme
+        // Fetch and display aliases.
         $sql = "SELECT  alias, (type='a_vie') AS a_vie,
                         (alias REGEXP '\\\\.[0-9]{2}$') AS cent_ans,
                         FIND_IN_SET('bestalias',flags) AS best, expire
                   FROM  aliases
                  WHERE  id = {?} AND type!='homonyme'
               ORDER BY  LENGTH(alias)";
-        $page->assign('aliases', XDB::iterator($sql, $uid));
+        $page->assign('aliases', XDB::iterator($sql, $user->id()));
 
-        $homonyme = XDB::query("SELECT alias FROM aliases INNER JOIN homonymes ON (id = homonyme_id) WHERE user_id = {?} AND type = 'homonyme'", $uid);
+        // Check for homonyms.
+        $homonyme = XDB::query(
+                "SELECT  alias
+                   FROM  aliases
+             INNER JOIN  homonymes ON (id = homonyme_id)
+                  WHERE  user_id = {?} AND type = 'homonyme'", $user->id());
         $page->assign('homonyme', $homonyme->fetchOneCell());
 
-        // Affichage des redirections de l'utilisateur.
-        $redirect = new Redirect($uid);
+        // Display active redirections.
+        $redirect = new Redirect($user);
         $page->assign('mails', $redirect->active_emails());
 
-        // on regarde si l'utilisateur a un alias et si oui on l'affiche !
-        $forlife = S::v('forlife');
+        // Display, when available, the @alias_dom email alias.
         $res = XDB::query(
                 "SELECT  alias
                    FROM  virtual          AS v
              INNER JOIN  virtual_redirect AS vr USING(vid)
                   WHERE  (redirect={?} OR redirect={?})
                          AND alias LIKE '%@{$globals->mail->alias_dom}'",
-                $forlife.'@'.$globals->mail->domain, $forlife.'@'.$globals->mail->domain2);
+                $user->forlifeEmail(),
+                // TODO: remove this über-ugly hack. The issue is that you need
+                // to remove all @m4x.org addresses in virtual_redirect first.
+                $user->login() . '@' . $globals->mail->domain2);
         $page->assign('melix', $res->fetchOneCell());
     }
 
@@ -103,32 +117,35 @@ class EmailModule extends PLModule
         $page->changeTpl('emails/alias.tpl');
         $page->setTitle('Alias melix.net');
 
-        $uid     = S::v('uid');
-        $forlife = S::v('forlife');
-
-        $page->assign('demande', AliasReq::get_request($uid));
+        $user = S::user();
+        $page->assign('demande', AliasReq::get_request($user->id()));
 
+        // Remove the email alias.
         if ($action == 'delete' && $value) {
             S::assert_xsrf_token();
 
-            //Suppression d'un alias
             XDB::execute(
-                'DELETE virtual, virtual_redirect
-                   FROM virtual
-             INNER JOIN virtual_redirect USING (vid)
-                  WHERE alias = {?} AND (redirect = {?} OR redirect = {?})', $value,
-                $forlife.'@'.$globals->mail->domain, $forlife.'@'.$globals->mail->domain2);
+                    "DELETE  virtual, virtual_redirect
+                       FROM  virtual
+                 INNER JOIN  virtual_redirect USING (vid)
+                      WHERE  alias = {?} AND (redirect = {?} OR redirect = {?})",
+                    $value, $user->forlifeEmail(),
+                    // TODO: remove this über-ugly hack. The issue is that you need
+                    // to remove all @m4x.org addresses in virtual_redirect first.
+                    $user->login() . '@' . $globals->mail->domain2);
         }
 
-        //Récupération des alias éventuellement existants
+        // Fetch existing @alias_dom aliases.
         $res = XDB::query(
                 "SELECT  alias, emails_alias_pub
                    FROM  auth_user_quick, virtual
              INNER JOIN  virtual_redirect USING(vid)
-                   WHERE ( redirect={?} OR redirect= {?} )
+                  WHERE  (redirect = {?} OR redirect = {?})
                          AND alias LIKE '%@{$globals->mail->alias_dom}' AND user_id = {?}",
-                $forlife.'@'.$globals->mail->domain,
-                $forlife.'@'.$globals->mail->domain2, S::v('uid'));
+                $user->forlifeEmail(),
+                // TODO: remove this über-ugly hack. The issue is that you need
+                // to remove all @m4x.org addresses in virtual_redirect first.
+                $user->login() . '@' . $globals->mail->domain2, $user->id());
         list($alias, $visibility) = $res->fetchOneRow();
         $page->assign('actuel', $alias);
 
@@ -174,7 +191,7 @@ class EmailModule extends PLModule
                 }
 
                 //Insertion de la demande dans la base, écrase les requêtes précédente
-                $myalias = new AliasReq($uid, $alias, $raison, $public);
+                $myalias = new AliasReq($user, $alias, $raison, $public);
                 $myalias->submit();
                 $page->assign('success',$alias);
                 return;
@@ -186,10 +203,10 @@ class EmailModule extends PLModule
 
             if ($value == 'public') {
                 XDB::execute("UPDATE auth_user_quick SET emails_alias_pub = 'public'
-                                         WHERE user_id = {?}", S::v('uid'));
+                                         WHERE user_id = {?}", $user->id());
             } else {
                 XDB::execute("UPDATE auth_user_quick SET emails_alias_pub = 'private'
-                                         WHERE user_id = {?}", S::v('uid'));
+                                         WHERE user_id = {?}", $user->id());
             }
 
             $visibility = $value;
@@ -206,18 +223,18 @@ class EmailModule extends PLModule
 
         $page->changeTpl('emails/redirect.tpl');
 
-        $uid     = S::v('uid');
-        $forlife = S::v('forlife');
-
-        $page->assign('eleve', S::i('promo') >= date("Y") - 5);
+        $user = S::user();
+        $page->assign_by_ref('user', $user);
+        $page->assign('eleve', $user->promo() >= date("Y") - 5);
 
-        $redirect = new Redirect(S::v('uid'));
+        $redirect = new Redirect($user);
 
         // FS#703 : $_GET is urldecoded twice, hence
         // + (the data) => %2B (in the url) => + (first decoding) => ' ' (second decoding)
         // Since there can be no spaces in emails, we can fix this with :
         $email = str_replace(' ', '+', $email);
 
+        // Apply email redirection change requests.
         if ($action == 'remove' && $email) {
             $retour = $redirect->delete_email($email);
             $page->assign('retour', $retour);
@@ -251,30 +268,35 @@ class EmailModule extends PLModule
             }
         }
 
+        // Fetch the @alias_dom email alias, if any.
         $res = XDB::query(
                 "SELECT  alias
                    FROM  virtual
              INNER JOIN  virtual_redirect USING(vid)
                   WHERE  (redirect={?} OR redirect={?})
                          AND alias LIKE '%@{$globals->mail->alias_dom}'",
-                $forlife.'@'.$globals->mail->domain, $forlife.'@'.$globals->mail->domain2);
+                $user->forlifeEmail(),
+                // TODO: remove this über-ugly hack. The issue is that you need
+                // to remove all @m4x.org addresses in virtual_redirect first.
+                $user->login() . '@' . $globals->mail->domain2);
         $melix = $res->fetchOneCell();
         if ($melix) {
             list($melix) = explode('@', $melix);
             $page->assign('melix',$melix);
         }
 
+        // Fetch existing email aliases.
         $res = XDB::query(
                 "SELECT  alias,expire
                    FROM  aliases
                   WHERE  id={?} AND (type='a_vie' OR type='alias')
-               ORDER BY  !FIND_IN_SET('usage',flags), LENGTH(alias)", $uid);
-
+               ORDER BY  !FIND_IN_SET('usage',flags), LENGTH(alias)", $user->id());
         $page->assign('alias', $res->fetchAllAssoc());
-        $page->assign('emails',$redirect->emails);
+        $page->assign('emails', $redirect->emails);
 
+        // Display GoogleApps acount information.
         require_once 'googleapps.inc.php';
-        $page->assign('googleapps', GoogleAppsAccount::account_status($uid));
+        $page->assign('googleapps', GoogleAppsAccount::account_status($user->id()));
     }
 
     function handler_antispam(&$page, $statut_filtre = null)
@@ -285,11 +307,11 @@ class EmailModule extends PLModule
 
         $page->changeTpl('emails/antispam.tpl');
 
-        $bogo = new Bogo(S::v('uid'));
+        $bogo = new Bogo(S::user());
         if (isset($statut_filtre)) {
             $bogo->change($statut_filtre + 0);
         }
-        $page->assign('filtre',$bogo->level());
+        $page->assign('filtre', $bogo->level());
     }
 
     function handler_submit(&$page)
@@ -301,7 +323,7 @@ class EmailModule extends PLModule
         if (Post::has('send_email')) {
             S::assert_xsrf_token();
 
-            $upload = PlUpload::get($_FILES['mail'], S::v('forlife'), 'spam.submit', true);
+            $upload = PlUpload::get($_FILES['mail'], S::user()->login(), 'spam.submit', true);
             if (!$upload) {
                 $page->trigError('Une erreur a été rencontrée lors du transfert du fichier');
                 return;
@@ -312,13 +334,15 @@ class EmailModule extends PLModule
                 $page->trigError('Le fichier ne contient pas un email complet');
                 return;
             }
+            $type = (Post::v('type') == 'spam' ? 'spam' : 'nonspam');
+
             global $globals;
-            $box    = Post::v('type') . '@' . $globals->mail->domain;
+            $box    = $type . '@' . $globals->mail->domain;
             $mailer = new PlMailer();
             $mailer->addTo($box);
-            $mailer->setFrom('"' . S::v('prenom') . ' ' . S::v('nom') . '" <web@' . $globals->mail->domain . '>');
-            $mailer->setTxtBody(Post::v('type') . ' soumis par ' . S::v('forlife') . ' via le web');
-            $mailer->addUploadAttachment($upload, Post::v('type') . '.mail');
+            $mailer->setFrom('"' . S::user()->fullName() . '" <web@' . $globals->mail->domain . '>');
+            $mailer->setTxtBody($type . ' soumis par ' . S::user()->login() . ' via le web');
+            $mailer->addUploadAttachment($upload, $type . '.mail');
             $mailer->send();
             $page->trigSuccess('Le message a été transmis à ' . $box);
             $upload->clear();
@@ -327,7 +351,6 @@ class EmailModule extends PLModule
 
     function handler_send(&$page)
     {
-        global $globals;
         $page->changeTpl('emails/send.tpl');
         $page->addJsLink('ajax.js');
 
@@ -366,7 +389,7 @@ class EmailModule extends PLModule
 
             $error = false;
             foreach ($_FILES as &$file) {
-                if ($file['name'] && !PlUpload::get($file, S::v('forlife'), 'emails.send', false)) {
+                if ($file['name'] && !PlUpload::get($file, S::user()->login(), 'emails.send', false)) {
                     $page->trigError(PlUpload::$lastError);
                     $error = true;
                     break;
@@ -388,7 +411,7 @@ class EmailModule extends PLModule
 
                 if (empty($to) && empty($cc) && empty($to2) && empty($bcc) && empty($cc2)) {
                     $page->trigError("Indique au moins un destinataire.");
-                    $page->assign('uploaded_f', PlUpload::listFilenames(S::v('forlife'), 'emails.send'));
+                    $page->assign('uploaded_f', PlUpload::listFilenames(S::user()->login(), 'emails.send'));
                 } else {
                     $mymail = new PlMailer();
                     $mymail->setFrom($from);
@@ -398,7 +421,7 @@ class EmailModule extends PLModule
                     if (!empty($bcc)) { $mymail->addBcc($bcc); }
                     if (!empty($to2)) { $mymail->addTo($to2); }
                     if (!empty($cc2)) { $mymail->addCc($cc2); }
-                    $files =& PlUpload::listFiles(S::v('forlife'), 'emails.send');
+                    $files =& PlUpload::listFiles(S::user()->login(), 'emails.send');
                     foreach ($files as $name=>&$upload) {
                         $mymail->addUploadAttachment($upload, $name);
                     }
@@ -409,11 +432,11 @@ class EmailModule extends PLModule
                     }
                     if ($mymail->send()) {
                         $page->trigSuccess("Ton email a bien été envoyé.");
-                        $_REQUEST = array('bcc' => S::v('bestalias').'@'.$globals->mail->domain);
-                        PlUpload::clear(S::v('forlife'), 'emails.send');
+                        $_REQUEST = array('bcc' => S::user()->bestEmail());
+                        PlUpload::clear(S::user()->login(), 'emails.send');
                     } else {
                         $page->trigError("Erreur lors de l'envoi du courriel, réessaye.");
-                        $page->assign('uploaded_f', PlUpload::listFilenames(S::v('forlife'), 'emails.send'));
+                        $page->assign('uploaded_f', PlUpload::listFilenames(S::user()->login(), 'emails.send'));
                     }
                 }
             }
@@ -422,8 +445,8 @@ class EmailModule extends PLModule
                                  FROM  email_send_save
                                 WHERE  uid = {?}", S::i('uid'));
             if ($res->numRows() == 0) {
-                PlUpload::clear(S::v('forlife'), 'emails.send');
-                $_REQUEST['bcc'] = S::v('bestalias').'@'.$globals->mail->domain;
+                PlUpload::clear(S::user()->login(), 'emails.send');
+                $_REQUEST['bcc'] = S::user()->bestEmail();
             } else {
                 $data = unserialize($res->fetchOneCell());
                 $_REQUEST = array_merge($_REQUEST, $data);
@@ -439,33 +462,36 @@ class EmailModule extends PLModule
                  ORDER BY u.nom, u.prenom", S::v('uid'));
         $page->assign('contacts', $res->fetchAllAssoc());
         $page->assign('maxsize', ini_get('upload_max_filesize') . 'o');
+        $page->assign('user', S::user());
     }
 
-    function handler_test(&$page, $forlife = null)
+    function handler_test(&$page, $hruid = null)
     {
-        global $globals;
         require_once 'emails.inc.php';
 
         if (!S::has_xsrf_token()) {
             return PL_FORBIDDEN;
         }
-        if (!S::has_perms() || !$forlife) {
-            $forlife = S::v('bestalias');
+
+        // Retrieves the User object for the test email recipient.
+        if (S::has_perms() && $hruid) {
+            $user = User::getSilent($hruid);
+        } else {
+            $user = S::user();
+        }
+        if (!$user) {
+            return PL_NOT_FOUND;
         }
 
-        $res = XDB::query("SELECT  FIND_IN_SET('femme', u.flags), prenom, user_id
-                             FROM  auth_user_md5 AS u
-                       INNER JOIN  aliases AS a ON (a.id = u.user_id)
-                            WHERE  a.alias = {?}", $forlife);
-        list($sexe, $prenom, $uid) = $res->fetchOneRow();
-        $redirect = new Redirect($uid);
+        // Sends the test email.
+        $redirect = new Redirect($user);
 
         $mailer = new PlMailer('emails/test.mail.tpl');
-        $mailer->assign('email', $forlife . '@' . $globals->mail->domain);
+        $mailer->assign('email', $user->bestEmail());
         $mailer->assign('redirects', $redirect->active_emails());
-        $mailer->assign('sexe', $sexe);
-        $mailer->assign('prenom', $prenom);
-        $mailer->send();
+        $mailer->assign('display_name', $user->displayName());
+        $mailer->assign('sexe', $user->isFemale());
+        $mailer->send($user->isEmailFormatHtml());
         exit;
     }
 
@@ -541,30 +567,31 @@ class EmailModule extends PLModule
     function handler_imap_in(&$page, $hash = null, $login = null)
     {
         $page->changeTpl('emails/imap_register.tpl');
-        $id = null;
+        $user = null;
         if (!empty($hash) || !empty($login)) {
-            $req = XDB::query("SELECT  u.prenom, FIND_IN_SET('femme', u.flags) AS sexe, a.id
-                                 FROM  aliases AS a
-                           INNER JOIN  newsletter_ins AS ni ON (a.id = ni.user_id)
-                           INNER JOIN  auth_user_md5 AS u ON (u.user_id = a.id)
-                                WHERE  a.alias = {?} AND ni.hash = {?}", $login, $hash);
-            list($prenom, $sexe, $id) = $req->fetchOneRow();
+            $user = User::getSilent($login);
+            if ($user) {
+                $req = XDB::query("SELECT 1 FROM newsletter_ins WHERE user_id = {?} AND hash = {?}", $user->id(), $hash);
+                if ($req->numRows() == 0) {
+                    $user = null;
+                }
+            }
         }
 
         require_once('emails.inc.php');
         $page->assign('ok', false);
-        if (S::logged() && (is_null($id) || $id == S::i('uid'))) {
-            $storage = new EmailStorage(S::i('uid'), 'imap');
+        if (S::logged() && (is_null($user) || $user->id() == S::i('uid'))) {
+            $storage = new EmailStorage(S::user(), 'imap');
             $storage->activate();
             $page->assign('ok', true);
             $page->assign('prenom', S::v('prenom'));
             $page->assign('sexe', S::v('femme'));
-        } else if (!S::logged() && $id) {
-            $storage = new EmailStorage($id, 'imap');
+        } else if (!S::logged() && $user) {
+            $storage = new EmailStorage($user, 'imap');
             $storage->activate();
             $page->assign('ok', true);
-            $page->assign('prenom', $prenom);
-            $page->assign('sexe', $sexe);
+            $page->assign('prenom', $user->displayName());
+            $page->assign('sexe', $user->isFemale());
         }
     }
 
@@ -583,19 +610,15 @@ class EmailModule extends PLModule
 
             $email = valide_email($email);
             // vérifications d'usage
-            $sel = XDB::query(
-                    "SELECT  e.uid, a.alias
-                       FROM  emails        AS e
-                 INNER JOIN  aliases       AS a ON (e.uid = a.id AND type!='homonyme'
-                                                    AND FIND_IN_SET('bestalias',a.flags))
-                      WHERE  e.email={?}", $email);
-
-            if (list($uid, $dest) = $sel->fetchOneRow()) {
+            $sel = XDB::query("SELECT uid FROM emails WHERE email = {?}", $email);
+            if (($uid = $sel->fetchOneCell())) {
+                $dest = User::getSilent($uid);
+
                 // envoi du mail
                 $message = "Bonjour !
 
 Cet email a été généré automatiquement par le service de patte cassée de
-Polytechnique.org car un autre utilisateur, ".S::v('prenom').' '.S::v('nom').",
+Polytechnique.org car un autre utilisateur, " . S::user()->fullName() . ",
 nous a signalé qu'en t'envoyant un email, il avait reçu un message d'erreur
 indiquant que ton adresse de redirection $email
 ne fonctionnait plus !
@@ -613,7 +636,7 @@ L'équipe d'administration <support@" . $globals->mail->domain . '>';
 
                 $mail = new PlMailer();
                 $mail->setFrom('"Polytechnique.org" <support@' . $globals->mail->domain . '>');
-                $mail->addTo("$dest@" . $globals->mail->domain);
+                $mail->addTo($dest->bestEmail());
                 $mail->setSubject("Une de tes adresse de redirection Polytechnique.org ne marche plus !!");
                 $mail->setTxtBody($message);
                 $mail->send();
@@ -633,13 +656,12 @@ L'équipe d'administration <support@" . $globals->mail->domain . '>';
                 $sel = XDB::query(
                         "SELECT  e1.uid, e1.panne != 0 AS panne,
                                  (count(e2.uid) + IF(FIND_IN_SET('googleapps', u.mail_storage), 1, 0)) AS nb_mails,
-                                 u.nom, u.prenom, u.promo, a.alias AS forlife
+                                 u.nom, u.prenom, u.promo, u.hruid
                            FROM  emails as e1
                       LEFT JOIN  emails as e2 ON(e1.uid = e2.uid
                                                  AND FIND_IN_SET('active', e2.flags)
                                                  AND e1.email != e2.email)
                      INNER JOIN  auth_user_md5 as u ON(e1.uid = u.user_id)
-                     INNER JOIN  aliases AS a ON (a.id = e1.uid AND a.type = 'a_vie')
                           WHERE  e1.email = {?}
                        GROUP BY  e1.uid", $email);
                 if ($x = $sel->fetchOneAssoc()) {
@@ -758,15 +780,13 @@ L'équipe d'administration <support@" . $globals->mail->domain . '>';
     {
         $page->changeTpl('emails/lost.tpl');
 
-        $page->assign('lost_emails', XDB::iterator('
-            SELECT  u.user_id, a.alias
+        $page->assign('lost_emails', XDB::iterator("
+            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 = "a_vie")
-         LEFT JOIN  emails  AS e ON (u.user_id=e.uid AND FIND_IN_SET("active",e.flags))
-             WHERE  e.uid IS NULL AND
-                    FIND_IN_SET("googleapps", u.mail_storage) = 0 AND
-                    u.deces = 0
-          ORDER BY  u.promo DESC, u.nom, u.prenom'));
+         LEFT JOIN  emails        AS e ON (u.user_id = e.uid AND FIND_IN_SET('active', e.flags))
+             WHERE  e.uid IS NULL AND FIND_IN_SET('googleapps', u.mail_storage) = 0 AND
+                    u.deces = 0 AND u.perms IN ('user', 'admin', 'disabled')
+          ORDER BY  u.promo DESC, u.nom, u.prenom"));
     }
 }
 
index 36c501e..24b0a4b 100644 (file)
@@ -218,7 +218,7 @@ class EventsModule extends PLModule
                 exit;
             }
         } else {
-            $upload = new PlUpload(S::v('forlife'), 'event');
+            $upload = new PlUpload(S::user()->login(), 'event');
             if ($upload->exists() && $upload->isType('image')) {
                 header('Content-Type: ' . $upload->contentType());
                 echo $upload->getContents();
@@ -269,7 +269,7 @@ class EventsModule extends PLModule
         $peremption = Post::i('peremption');
         $valid_mesg = Post::v('valid_mesg');
         $action     = Post::v('action');
-        $upload     = new PlUpload(S::v('forlife'), 'event');
+        $upload     = new PlUpload(S::user()->login(), 'event');
         $this->upload_image($page, $upload);
 
         if (($promo_min > $promo_max && $promo_max != 0)||
@@ -299,7 +299,7 @@ class EventsModule extends PLModule
 
             require_once 'validations.inc.php';
             $evtreq = new EvtReq($titre, $texte, $promo_min, $promo_max,
-                                 $peremption, $valid_mesg, S::v('uid'), $upload);
+                                 $peremption, $valid_mesg, S::user(), $upload);
             $evtreq->submit();
             $page->assign('ok', true);
         } elseif (!Env::v('preview')) {
@@ -343,7 +343,7 @@ class EventsModule extends PLModule
         $arch = $action == 'archives';
         $page->assign('action', $action);
 
-        $upload = new PlUpload(S::v('forlife'), 'event');
+        $upload = new PlUpload(S::user()->login(), 'event');
         if ((Env::has('preview') || Post::v('action') == "Proposer") && $eid) {
             $action = 'edit';
             $this->upload_image($page, $upload);
index e67966d..9c8ac06 100644 (file)
@@ -64,7 +64,7 @@ class ForumsModule extends PLModule
         $_SESSION = array_merge($row, $_SESSION);
 
         require_once 'banana/forum.inc.php';
-        $banana = new ForumsBanana(S::v('forlife'), array('group' => $group, 'action' => 'rss2'));
+        $banana = new ForumsBanana(S::user(), array('group' => $group, 'action' => 'rss2'));
         $banana->run();
         exit;
     }
index 553aeaf..0a22f86 100644 (file)
@@ -44,14 +44,14 @@ class GoogleAppsModule extends PLModule
         $page->addJsLink('motdepasse.js');
         $page->setTitle('Compte Google Apps');
 
-        $account = new GoogleAppsAccount(S::v('uid'), S::v('forlife'));
+        $account = new GoogleAppsAccount(S::user());
 
         // Fills up the 'is Google Apps redirection active' variable.
         $page->assign('redirect_active', false);
         $page->assign('redirect_unique', true);
 
         if ($account->active()) {
-            $redirect = new Redirect(S::v('uid'));
+            $redirect = new Redirect(S::user());
             $page->assign('redirect_unique', !$redirect->other_active('googleapps'));
 
             $storage = new EmailStorage(S::v('uid'), 'googleapps');
@@ -189,34 +189,31 @@ class GoogleAppsModule extends PLModule
         if (!$user && Post::has('login')) {
             $user = Post::v('login');
         }
-        if ($user && !is_numeric($user)) {
-            $res = XDB::query("SELECT id FROM aliases WHERE alias = {?} AND type != 'homonyme'", $user);
-            $user = $res->fetchOneCell();
-        }
+        $user = User::get($user);
 
         if ($user) {
             $account = new GoogleAppsAccount($user);
-            $storage = new EmailStorage($user, 'googleapps');
+            $storage = new EmailStorage($user->id(), 'googleapps');
 
             // Force synchronization of plat/al and Google Apps passwords.
             if ($action == 'forcesync' && $account->sync_password) {
-                $res = XDB::query("SELECT password FROM auth_user_md5 WHERE user_id = {?}", $user);
+                $res = XDB::query("SELECT password FROM auth_user_md5 WHERE user_id = {?}", $user->id());
                 $account->set_password($res->fetchOneCell());
                 $page->trigSuccess('Le mot de passe a été synchronisé.');
             }
 
             // Displays basic account information.
             $page->assign('account', $account);
-            $page->assign('admin_account', GoogleAppsAccount::is_administrator($user));
+            $page->assign('admin_account', GoogleAppsAccount::is_administrator($user->id()));
             $page->assign('googleapps_storage', $storage->active);
-            $page->assign('user', $user);
+            $page->assign('user', $user->id());
 
             // Retrieves user's pending requests.
             $res = XDB::iterator(
                 "SELECT  q_id, q_recipient_id, p_status, j_type, UNIX_TIMESTAMP(p_entry_date) AS p_entry_date
                    FROM  gapps_queue
                   WHERE  q_recipient_id = {?}
-               ORDER BY  p_entry_date DESC", $user);
+               ORDER BY  p_entry_date DESC", $user->id());
             $page->assign('requests', $res);
         }
     }
index 36b247b..93151c2 100644 (file)
@@ -182,11 +182,10 @@ class ListsModule extends PLModule
 
         // click on validate button 'add_owner_sub' or type <enter>
         if (Post::has('add_owner_sub') && Post::has('add_owner')) {
-            require_once('user.func.inc.php');
             // if we want to add an owner and then type <enter>, then both
             // add_owner_sub and add_owner are filled.
-            $oforlifes = get_users_forlife_list(Post::v('add_owner'), true);
-            $mforlifes = get_users_forlife_list(Post::v('add_member'), true);
+            $oforlifes = User::getBulkForlifeEmails(Post::v('add_owner'), true);
+            $mforlifes = User::getBulkForlifeEmails(Post::v('add_member'), true);
             if (!is_null($oforlifes)) {
                 $owners = array_merge($owners, $oforlifes);
             }
@@ -198,19 +197,18 @@ class ListsModule extends PLModule
         }
 
         // click on validate button 'add_member_sub'
-        require_once('user.func.inc.php');
         if (Post::has('add_member_sub') && Post::has('add_member')) {
-            $forlifes = get_users_forlife_list(Post::v('add_member'), true);
+            $forlifes = User::getBulkForlifeEmails(Post::v('add_member'), true);
             if (!is_null($forlifes)) {
                 $members = array_merge($members, $forlifes);
             }
         }
         if (Post::has('add_member_sub') && isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
-            $upload =& PlUpload::get($_FILES['add_member_file'], S::v('forlife'), 'list.addmember', true);
+            $upload =& PlUpload::get($_FILES['add_member_file'], S::user()->login(), 'list.addmember', true);
             if (!$upload) {
                 $page->trigError('Une erreur s\'est produite lors du téléchargement du fichier');
             } else {
-                $forlifes = get_users_forlife_list($upload->getContents(), true);
+                $forlifes = User::getBulkForlifeEmails($upload->getContents(), true);
                 if (!is_null($forlifes)) {
                     $members = array_merge($members, $forlifes);
                 }
@@ -292,7 +290,7 @@ class ListsModule extends PLModule
         if (!$page->nb_errs()) {
             $page->assign('created', true);
             require_once 'validations.inc.php';
-            $req = new ListeReq(S::v('uid'), $asso, $liste, $domain,
+            $req = new ListeReq(S::user(), $asso, $liste, $domain,
                                 Post::v('desc'), Post::i('advertise'),
                                 Post::i('modlevel'), Post::i('inslevel'),
                                 $owners, $members);
@@ -438,7 +436,7 @@ class ListsModule extends PLModule
                 exit;
             }
             require_once('banana/ml.inc.php');
-            $banana = new MLBanana(S::v('forlife'), Array('listname' => $liste, 'domain' => $domain, 'action' => 'rss2'));
+            $banana = new MLBanana(S::user(), Array('listname' => $liste, 'domain' => $domain, 'action' => 'rss2'));
             $banana->run();
         }
         exit;
@@ -574,7 +572,7 @@ class ListsModule extends PLModule
         } else {
             list($name, $dom) = @explode('@', $login);
             if ($dom == $globals->mail->domain || $dom == $globals->mail->domain2) {
-                _default_user_callback($login);
+                User::_default_user_callback($login);
             }
         }
     }
@@ -626,10 +624,9 @@ class ListsModule extends PLModule
         if (Env::has('add_member')) {
             S::assert_xsrf_token();
 
-            require_once('user.func.inc.php');
-            $members = get_users_forlife_list(Env::v('add_member'),
-                                              false,
-                                              array('ListsModule', 'no_login_callback'));
+            $members = User::getBulkForlifeEmails(Env::v('add_member'),
+                                                  false,
+                                                  array('ListsModule', 'no_login_callback'));
             $arr = $this->client->mass_subscribe($liste, $members);
             if (is_array($arr)) {
                 foreach($arr as $addr) {
@@ -641,13 +638,13 @@ class ListsModule extends PLModule
         if (isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
             S::assert_xsrf_token();
 
-            $upload =& PlUpload::get($_FILES['add_member_file'], S::v('forlife'), 'list.addmember', true);
+            $upload =& PlUpload::get($_FILES['add_member_file'], S::user()->login(), 'list.addmember', true);
             if (!$upload) {
                 $page->trigError('Une erreur s\'est produite lors du téléchargement du fichier');
             } else {
-                $members = get_users_forlife_list($upload->getContents(),
-                                                  false,
-                                                  array('ListsModule', 'no_login_callback'));
+                $members = User::getBulkForlifeEmails($upload->getContents(),
+                                                      false,
+                                                      array('ListsModule', 'no_login_callback'));
                 $arr = $this->client->mass_subscribe($liste, $members);
                 if (is_array($arr)) {
                     foreach($arr as $addr) {
@@ -672,12 +669,11 @@ class ListsModule extends PLModule
         if (Env::has('add_owner')) {
             S::assert_xsrf_token();
 
-            require_once('user.func.inc.php');
-            $owners = get_users_forlife_list(Env::v('add_owner'), false, array('ListsModule', 'no_login_callback'));
+            $owners = User::getBulkForlifeEmails(Env::v('add_owner'), false, array('ListsModule', 'no_login_callback'));
             if ($owners) {
                 foreach ($owners as $login) {
                     if ($this->client->add_owner($liste, $login)) {
-                        $page->trigSuccess($alias." ajouté aux modérateurs.");
+                        $page->trigSuccess($login ." ajouté aux modérateurs.");
                     }
                 }
             }
index 9507cf5..9e62667 100644 (file)
@@ -76,41 +76,43 @@ class MarketingModule extends PLModule
         $page->assign('nbInsMarkOK', $res->fetchOneCell());
     }
 
-    function handler_private(&$page, $uid = null,
+    function handler_private(&$page, $hruid = null,
                              $action = null, $value = null)
     {
         global $globals;
         $page->changeTpl('marketing/private.tpl');
 
-        if (is_null($uid)) {
+        $user = User::getSilent($hruid);
+        if (!$user) {
             return PL_NOT_FOUND;
         }
 
-        $page->assign('path', 'marketing/private/'.$uid);
-
-        $res = XDB::query("SELECT  nom, prenom, promo, matricule
-                             FROM  auth_user_md5
-                            WHERE  user_id={?} AND perms='pending'", $uid);
-
-        if (list($nom, $prenom, $promo, $matricule) = $res->fetchOneRow()) {
-            require_once('user.func.inc.php');
-            $matricule_X = get_X_mat($matricule);
-            $page->assign('nom', $nom);
-            $page->assign('prenom', $prenom);
-            $page->assign('promo', $promo);
-            $page->assign('matricule', $matricule);
-            $page->assign('matricule_X',$matricule_X);
-        } else {
-            $page->kill('uid invalide');
+        // Retrieves marketed user details.
+        $res = XDB::query(
+            "SELECT  matricule
+               FROM  auth_user_md5
+              WHERE  user_id = {?} AND perms = 'pending'", $user->id());
+        if (!($matricule = $res->fetchOneCell())) {
+            $page->kill("Cet utilisateur est déjà inscrit au site.");
         }
 
+        require_once('user.func.inc.php');
+        $matricule = $res->fetchOneCell();
+        $matricule_X = get_X_mat($matricule);
+
+        $page->assign('full_name', $user->fullName());
+        $page->assign('promo', $user->promo());
+        $page->assign('matricule', $matricule);
+        $page->assign('matricule_X',$matricule_X);
+
+        // Applies in-parameter action to the user.
         if ($action == 'del') {
             S::assert_xsrf_token();
-            Marketing::clear($uid, $value);
+            Marketing::clear($user->id(), $value);
         }
 
         if ($action == 'rel') {
-            $market = Marketing::get($uid, $value);
+            $market = Marketing::get($user->id(), $value);
             if ($market == null) {
                 $page->trigWarning("Aucun marketing n'a été effectué vers $value");
             } else {
@@ -131,9 +133,9 @@ class MarketingModule extends PLModule
         if ($action == 'relforce') {
             S::assert_xsrf_token();
 
-            $market = Marketing::get($uid, Post::v('to'));
+            $market = Marketing::get($user->id(), Post::v('to'));
             if (is_null($market)) {
-                $market = new Marketing($uid, Post::v('to'), 'default', null, 'staff');
+                $market = new Marketing($user->id(), Post::v('to'), 'default', null, 'staff');
             }
             $market->send(Post::v('title'), Post::v('message'));
             $page->trigSuccess("Email envoyé");
@@ -141,60 +143,61 @@ class MarketingModule extends PLModule
 
         if ($action == 'insrel') {
             S::assert_xsrf_token();
-            if (Marketing::relance($uid)) {
+            if (Marketing::relance($user->id())) {
                 $page->trigSuccess('relance faite');
             }
         }
 
         if ($action == 'add' && Post::has('email') && Post::has('type')) {
-            $market = new Marketing($uid, Post::v('email'), 'default', null, Post::v('type'), S::v('uid'));
+            $market = new Marketing($user->id(), Post::v('email'), 'default', null, Post::v('type'), S::v('uid'));
             $market->add(false);
         }
 
+        // Retrieves and display the existing marketing attempts.
         $res = XDB::iterator(
                 "SELECT  r.*, a.alias
                    FROM  register_marketing AS r
              INNER JOIN  aliases            AS a ON (r.sender=a.id AND a.type = 'a_vie')
                   WHERE  uid={?}
-               ORDER BY  date", $uid);
+               ORDER BY  date", $user->id());
         $page->assign('addr', $res);
 
         $res = XDB::query("SELECT date, relance FROM register_pending
-                            WHERE uid = {?}", $uid);
+                            WHERE uid = {?}", $user->id());
         if (list($pending, $relance) = $res->fetchOneRow()) {
             $page->assign('pending', $pending);
             $page->assign('relance', $relance);
         }
+
+        $page->assign('path', 'marketing/private/' . $user->login());
     }
 
     function handler_broken(&$page, $uid = null)
     {
-        require_once('user.func.inc.php');
         $page->changeTpl('marketing/broken.tpl');
 
         if (is_null($uid)) {
             return PL_NOT_FOUND;
         }
-        $forlife = get_user_forlife($uid);
-        if (!$forlife) {
+
+        $user = User::get($uid);
+        if (!$user) {
             return PL_NOT_FOUND;
-        } elseif ($forlife == S::v('forlife')) {
+        } elseif ($user->login() == S::user()->login()) {
             pl_redirect('emails/redirect');
         }
 
-        $res = Xdb::query("SELECT  u.nom, u.prenom, u.promo, FIND_IN_SET('femme', u.flags) AS sexe,
-                                   u.deces = '0000-00-00' AS alive, a.alias AS forlife, b.alias AS bestalias,
-                                   IF(e.email IS NOT NULL, e.email, IF(FIND_IN_SET('googleapps', u.mail_storage), 'googleapps', NULL)) AS email, e.last
-                             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 FIND_IN_SET('bestalias', b.flags))
-                        LEFT JOIN  emails        AS e ON (e.flags = 'active' AND e.uid = u.user_id)
-                            WHERE  a.alias = {?}
-                         ORDER BY  e.panne_level, e.last", $forlife);
+        $res = XDB::query(
+                "SELECT  u.deces = '0000-00-00' AS alive, e.last,
+                         IF(e.email IS NOT NULL, e.email, IF(FIND_IN_SET('googleapps', u.mail_storage), 'googleapps', NULL)) AS email
+                   FROM  auth_user_md5 AS u
+              LEFT JOIN  emails        AS e ON (e.flags = 'active' AND e.uid = u.user_id)
+                  WHERE  u.user_id = {?}
+               ORDER BY  e.panne_level, e.last", $user->id());
         if (!$res->numRows()) {
             return PL_NOT_FOUND;
         }
-        $user = $res->fetchOneAssoc();
+        $user->addProperties($res->fetchOneAssoc());
         $page->assign('user', $user);
 
         $email = null;
@@ -206,22 +209,21 @@ class MarketingModule extends PLModule
             S::assert_xsrf_token();
 
             // security stuff
-            check_email($email, "Proposition d'une adresse surveillee pour " . $user['forlife'] . " par " . S::v('forlife'));
-            $res = XDB::query("SELECT  e.flags
-                                 FROM  emails   AS e
-                           INNER JOIN  aliases  AS a ON (a.id = e.uid)
-                                WHERE  e.email = {?} AND a.alias = {?}", $email, $user['forlife']);
+            check_email($email, "Proposition d'une adresse surveillee pour " . $user->login() . " par " . S::user()->login());
+            $res = XDB::query("SELECT  flags
+                                 FROM  emails
+                                WHERE  email = {?} AND uid = {?}", $email, $user->id());
             $state = $res->numRows() ? $res->fetchOneCell() : null;
             if ($state == 'panne') {
-                $page->trigWarning("L'adresse que tu as fournie est l'adresse actuelle de {$user['prenom']} et est en panne.");
+                $page->trigWarning("L'adresse que tu as fournie est l'adresse actuelle de {$user->fullName()} et est en panne.");
             } elseif ($state == 'active') {
-                $page->trigWarning("L'adresse que tu as fournie est l'adresse actuelle de {$user['prenom']}");
-            } elseif ($user['email'] && !trim(Post::v('comment'))) {
+                $page->trigWarning("L'adresse que tu as fournie est l'adresse actuelle de {$user->fullName()}");
+            } elseif ($user->email && !trim(Post::v('comment'))) {
                 $page->trigError("Il faut que tu ajoutes un commentaire à ta proposition pour justifier le "
-                           ."besoin de changer la redirection de " . $user['prenom']);
+                               . "besoin de changer la redirection de {$user->fullName()}.");
             } else {
                 require_once 'validations.inc.php';
-                $valid = new BrokenReq(S::i('uid'), $user, $email, trim(Post::v('comment')));
+                $valid = new BrokenReq(S::user(), $user, $email, trim(Post::v('comment')));
                 $valid->submit();
                 $page->assign('sent', true);
             }
@@ -250,41 +252,46 @@ class MarketingModule extends PLModule
         $page->assign('nonins', XDB::iterator($sql, $promo));
     }
 
-    function handler_public(&$page, $uid = null)
+    function handler_public(&$page, $hruid = null)
     {
         $page->changeTpl('marketing/public.tpl');
 
-        if (is_null($uid)) {
+        // Retrieves the user info, and checks the user is not yet registered.
+        $user = User::getSilent($hruid);
+        if (!$user) {
             return PL_NOT_FOUND;
         }
 
-        $res = XDB::query("SELECT nom, prenom, promo FROM auth_user_md5
-                                      WHERE user_id={?} AND perms='pending'", $uid);
+        $res = XDB::query(
+            "SELECT  COUNT(*)
+               FROM  auth_user_md5
+              WHERE  user_id = {?} AND perms = 'pending'", $user->id());
+        if (!$res->fetchOneCell()) {
+            $page->kill("Cet utilisateur est déjà inscrit au site.");
+        }
 
-        if (list($nom, $prenom, $promo) = $res->fetchOneRow()) {
-            $page->assign('prenom', $prenom);
-            $page->assign('nom', $nom);
-            $page->assign('promo', $promo);
+        // Displays the page, and handles the eventual user actions.
+        $page->assign('full_name', $user->fullName());
+        $page->assign('promo', $user->promo());
 
-            if (Post::has('valide')) {
-                S::assert_xsrf_token();
-                $email = trim(Post::v('mail'));
+        if (Post::has('valide')) {
+            S::assert_xsrf_token();
+            $email = trim(Post::v('mail'));
+
+            require_once 'emails.inc.php';
+            if (!isvalid_email_redirection($email)) {
+                $page->trigError("Email invalide !");
+            } else {
+                // On cherche les marketings précédents sur cette adresse
+                // email, en se restreignant au dernier mois
 
-                require_once 'emails.inc.php';
-                if (!isvalid_email_redirection($email)) {
-                    $page->trigError("Email invalide !");
+                if (Marketing::get($user->id(), $email, true)) {
+                    $page->assign('already', true);
                 } else {
-                    // On cherche les marketings précédents sur cette adresse
-                    // email, en se restreignant au dernier mois
-
-                    if (Marketing::get($uid, $email, true)) {
-                        $page->assign('already', true);
-                    } else {
-                        $page->assign('ok', true);
-                        check_email($email, "Une adresse surveillée est proposée au marketing par " . S::v('forlife'));
-                        $market = new Marketing($uid, $email, 'default', null, Post::v('origine'), S::v('uid'));
-                        $market->add();
-                    }
+                    $page->assign('ok', true);
+                    check_email($email, "Une adresse surveillée est proposée au marketing par " . S::user()->login());
+                    $market = new Marketing($user->id(), $email, 'default', null, Post::v('origine'), S::v('uid'));
+                    $market->add();
                 }
             }
         }
index 9dfe318..8390eed 100644 (file)
@@ -64,9 +64,9 @@ class NewsletterModule extends PLModule
         }
         if (Post::has('send')) {
             $res = XDB::query("SELECT hash FROM newsletter_ins WHERE user_id = {?}", S::i('uid'));
-            $nl->sendTo(S::v('prenom'), S::v('nom'),
-                        S::v('bestalias'), S::v('femme'),
-                        S::v('mail_fmt') != 'texte',
+            $nl->sendTo(S::user()->login(), S::user()->bestEmail(),
+                        S::v('prenom'), S::v('nom'),
+                        S::v('femme'), S::v('mail_fmt') != 'texte',
                         $res->fetchOneCell());
         }
     }
@@ -87,7 +87,7 @@ class NewsletterModule extends PLModule
             $page->assign('art', $art);
         } elseif (Post::has('valid')) {
             require_once('validations.inc.php');
-            $art = new NLReq(S::v('uid'), Post::v('title'),
+            $art = new NLReq(S::user(), Post::v('title'),
                              Post::v('body'), Post::v('append'));
             $art->submit();
             $page->assign('submited', true);
index 4ce3c3c..a1699d5 100644 (file)
@@ -202,7 +202,7 @@ class PlatalModule extends PLModule
             // updates the Google Apps password as well.
             if ($globals->mailstorage->googleapps_domain) {
                 require_once 'googleapps.inc.php';
-                $account = new GoogleAppsAccount(S::v('uid'), S::v('forlife'));
+                $account = new GoogleAppsAccount(S::user());
                 if ($account->active() && $account->sync_password) {
                     $account->set_password($password);
                 }
@@ -368,7 +368,7 @@ Adresse de secours : " . Post::v('email') : ""));
             // updates the Google Apps password as well.
             if ($globals->mailstorage->googleapps_domain) {
                 require_once 'googleapps.inc.php';
-                $account = new GoogleAppsAccount($uid);
+                $account = new GoogleAppsAccount(User::getSilent($uid));
                 if ($account->active() && $account->sync_password) {
                     $account->set_password($password);
                 }
@@ -412,12 +412,11 @@ Adresse de secours : " . Post::v('email') : ""));
     function handler_exit(&$page, $level = null)
     {
         if (S::has('suid')) {
-            $a4l  = S::v('forlife');
             $suid = S::v('suid');
             $log  = S::v('log');
-            S::logger()->log("suid_stop", S::v('forlife') . " by " . $suid['forlife']);
+            S::logger()->log("suid_stop", S::user()->login() . " by " . $suid['hruid']);
             Platal::session()->stopSUID();
-            pl_redirect('admin/user/' . $a4l);
+            pl_redirect('admin/user/' . S::user()->login());
         }
 
         if ($level == 'forget' || $level == 'forgetall') {
index 039f71a..07324f4 100644 (file)
@@ -73,35 +73,40 @@ class ProfileModule extends PLModule
 
     function handler_photo(&$page, $x = null, $req = null)
     {
-        if (is_null($x)) {
+        if (!$x || !($user = User::getSilent($x))) {
             return PL_NOT_FOUND;
         }
 
-        $res = XDB::query("SELECT id, pub FROM aliases
-                                  LEFT JOIN photo ON(id = uid)
-                                      WHERE alias = {?}", $x);
-        list($uid, $photo_pub) = $res->fetchOneRow();
+        // Retrieve the photo and its mime type.
+        $photo_data = null;
+        $photo_type = null;
 
         if ($req && S::logged()) {
             include 'validations.inc.php';
-            $myphoto = PhotoReq::get_request($uid);
-            Header('Content-type: image/'.$myphoto->mimetype);
-            echo $myphoto->data;
+            $myphoto = PhotoReq::get_request($user->id());
+            if ($myphoto) {
+                $photo_data = $myphoto->data;
+                $photo_type = $myphoto->mimetype;
+            }
         } else {
             $res = XDB::query(
-                    "SELECT  attachmime, attach
+                    "SELECT  attachmime, attach, pub
                        FROM  photo
-                      WHERE  uid={?}", $uid);
-
-            if ((list($type, $data) = $res->fetchOneRow())
-            &&  ($photo_pub == 'public' || S::logged())) {
-                Header("Content-type: image/$type");
-                echo $data;
-            } else {
-                Header('Content-type: image/png');
-                echo file_get_contents(dirname(__FILE__).'/../htdocs/images/none.png');
+                      WHERE  uid = {?}", $user->id());
+            list($photo_type, $photo_data, $photo_pub) = $res->fetchOneRow();
+            if ($photo_pub != 'public' && !S::logged()) {
+                $photo_type = $photo_data = null;
             }
         }
+
+        // Display the photo, or a default one when not available.
+        if ($photo_type && $photo_data != null) {
+            header('Content-type: image/' . $photo_type);
+            echo $photo_data;
+        } else {
+            header('Content-type: image/png');
+            echo file_get_contents(dirname(__FILE__).'/../htdocs/images/none.png');
+        }
         exit;
     }
 
@@ -130,17 +135,15 @@ class ProfileModule extends PLModule
 
         require_once('validations.inc.php');
 
-        $trombi_x = '/home/web/trombino/photos'.S::v('promo')
-                    .'/'.S::v('forlife').'.jpg';
-
+        $trombi_x = '/home/web/trombino/photos' . S::v('promo') . '/' . S::user()->login() . '.jpg';
         if (Env::has('upload')) {
             S::assert_xsrf_token();
 
-            $upload = new PlUpload(S::v('forlife'), 'photo');
+            $upload = new PlUpload(S::user()->login(), 'photo');
             if (!$upload->upload($_FILES['userfile']) && !$upload->download(Env::v('photo'))) {
                 $page->trigError('Une erreur est survenue lors du téléchargement du fichier');
             } else {
-                $myphoto = new PhotoReq(S::v('uid'), $upload);
+                $myphoto = new PhotoReq(S::user(), $upload);
                 if ($myphoto->isValid()) {
                     $myphoto->submit();
                 }
@@ -148,9 +151,9 @@ class ProfileModule extends PLModule
         } elseif (Env::has('trombi')) {
             S::assert_xsrf_token();
 
-            $upload = new PlUpload(S::v('forlife'), 'photo');
+            $upload = new PlUpload(S::user()->login(), 'photo');
             if ($upload->copyFrom($trombi_x)) {
-                $myphoto = new PhotoReq(S::v('uid'), $upload);
+                $myphoto = new PhotoReq(S::user(), $upload);
                 if ($myphoto->isValid()) {
                     $myphoto->commit();
                     $myphoto->clean();
@@ -185,56 +188,67 @@ class ProfileModule extends PLModule
 
     function handler_profile(&$page, $x = null)
     {
+        // TODO/note for upcoming developers:
+        // We currently maintain both $user and $login; $user is the old way of
+        // obtaining information, and eventually everything will be loaded
+        // through $login. That is the reason why in the template $user is named
+        // $x, and $login $user (sorry for the confusion).
+
+        // Determines which user to display the profile of, and retrieves basic
+        // information on this user.
         if (is_null($x)) {
             return PL_NOT_FOUND;
         }
 
-        global $globals;
-        require_once 'user.func.inc.php';
+        $login = S::logged() ? User::get($x) : User::getSilent($x);
+        if (!$login) {
+            return PL_NOT_FOUND;
+        }
 
+        // Now that we know this is the profile of an existing user, we can
+        // switch to the appropriate template.
         $page->changeTpl('profile/profile.tpl', SIMPLE);
+        require_once 'user.func.inc.php';
 
-        $view = 'private';
-        if (!S::logged() || Env::v('view') == 'public') $view = 'public';
-        if (S::logged() && Env::v('view') == 'ax')      $view = 'ax';
-
-        if (is_numeric($x)) {
-            $res = XDB::query(
-                    "SELECT  alias
-                       FROM  aliases       AS a
-                 INNER JOIN  auth_user_md5 AS u ON (a.id=u.user_id AND a.type='a_vie')
-                      WHERE  matricule={?}", $x);
-            $login = $res->fetchOneCell();
+        // Determines the access level at which the profile will be displayed.
+        if (!S::logged() || Env::v('view') == 'public') {
+            $view = 'public';
+        } else if (S::logged() && Env::v('view') == 'ax') {
+            $view = 'ax';
         } else {
-            $login = get_user_forlife($x, S::logged() ? '_default_user_callback'
-                                                      : '_silent_user_callback');
+            $view = 'private';
         }
 
-        if (empty($login)) {
-            $user = get_not_registered_user($x, true);
-            if ($user->total() != 1) {
-                return PL_NOT_FOUND;
-            }
-            $user = $user->next();
+        // Determines is the user is registered, and fetches the user infos in
+        // the appropriate way.
+        $res = XDB::query("SELECT  perms IN ('admin','user','disabled')
+                             FROM  auth_user_md5
+                            WHERE  user_id = {?}", $login->id());
+        if ($res->fetchOneCell()) {
+            $new  = Env::v('modif') == 'new';
+            $user = get_user_details($login->login(), S::v('uid'), $view);
+        } else {
+            $new  = false;
+            $user = array();
             if (S::logged()) {
-                pl_redirect('marketing/public/' . $user['user_id']);
+                pl_redirect('marketing/public/' . $login->login());
             }
-            $user['forlife'] = $x;
-        } else {
-            $new   = Env::v('modif') == 'new';
-            $user  = get_user_details($login, S::v('uid'), $view);
         }
 
+        // Profile view are logged.
         if (S::logged()) {
-            S::logger()->log('view_profile', $login);
+            S::logger()->log('view_profile', $login->login());
         }
 
-        $title = $user['prenom'] . ' ' . ( empty($user['nom_usage']) ? $user['nom'] : $user['nom_usage'] );
-        $page->setTitle($title);
+        // Sets the title of the html page.
+        $page->setTitle($login->fullName());
 
-        // photo
-
-        $photo = 'photo/'.$user['forlife'].($new ? '/req' : '');
+        // Prepares the display of the user's mugshot.
+        $photo = 'photo/' . $login->login() . ($new ? '/req' : '');
+        if (!isset($user['photo_pub']) || !has_user_right($user['photo_pub'], $view)) {
+            $photo = "";
+        }
+        $page->assign('photo_url', $photo);
 
         if (!isset($user['y']) and !isset($user['x'])) {
             list($user['x'], $user['y']) = getimagesize("images/none.png");
@@ -254,45 +268,48 @@ class ProfileModule extends PLModule
             $user['x'] = 160;
         }
 
-        $page->assign('logged', has_user_right('private', $view));
-        if (!has_user_right($user['photo_pub'], $view)) {
-            $photo = "";
-        }
-
-        $page->assign_by_ref('x', $user);
-        $page->assign('photo_url', $photo);
-        // alias virtual
+        // Determines and displays the virtual alias.
+        global $globals;
         $res = XDB::query(
-                "SELECT alias
-                   FROM virtual
-             INNER JOIN virtual_redirect USING(vid)
-             INNER JOIN auth_user_quick  ON ( user_id = {?} AND emails_alias_pub = 'public' )
-                  WHERE ( redirect={?} OR redirect={?} )
-                        AND alias LIKE '%@{$globals->mail->alias_dom}'",
-                $user['user_id'],
-                $user['forlife'].'@'.$globals->mail->domain,
-                $user['forlife'].'@'.$globals->mail->domain2);
+                "SELECT  alias
+                   FROM  virtual
+             INNER JOIN  virtual_redirect USING (vid)
+             INNER JOIN  auth_user_quick ON (user_id = {?} AND emails_alias_pub = 'public')
+                  WHERE  (redirect={?} OR redirect={?})
+                         AND alias LIKE '%@{$globals->mail->alias_dom}'",
+                $login->id(),
+                $login->forlifeEmail(),
+                // TODO(vzanotti): get ride of all @m4x.org addresses in the
+                // virtual redirect base, and remove this über-ugly hack.
+                $login->login() . '@' . $globals->mail->domain2);
         $page->assign('virtualalias', $res->fetchOneCell());
+
+        // Adds miscellaneous properties to the display.
+        // Adds the global user property array to the display.
+        $page->assign_by_ref('x', $user);
+        $page->assign_by_ref('user', $login);
+        $page->assign('logged', has_user_right('private', $view));
         $page->assign('view', $view);
 
         $page->addJsLink('close_on_esc.js');
-        header('Last-Modified: ' . date('r', strtotime($user['date'])));
+        if (isset($user['date'])) {
+            header('Last-Modified: ' . date('r', strtotime($user['date'])));
+        }
     }
 
     function handler_ax(&$page, $user = null)
     {
-        require_once 'user.func.inc.php';
-        $user = get_user_forlife($user);
+        $user = User::get($user);
         if (!$user) {
             return PL_NOT_FOUND;
         }
-        $res = XDB::query('SELECT matricule_ax
-                             FROM auth_user_md5 AS u
-                       INNER JOIN aliases       AS a ON (a.type = "a_vie" AND a.id = u.user_id)
-                            WHERE a.alias = {?}', $user);
+
+        $res = XDB::query("SELECT  matricule_ax
+                             FROM  auth_user_md5
+                            WHERE  user_id = {?}", $user->id());
         $mat = $res->fetchOneCell();
         if (!intval($mat)) {
-            $page->kill("Le matricule AX de $user est inconnu");
+            $page->kill("Le matricule AX de {$user->login()} est inconnu");
         }
         http_redirect("http://www.polytechniciens.com/?page=AX_FICHE_ANCIEN&anc_id=$mat");
     }
@@ -494,8 +511,7 @@ class ProfileModule extends PLModule
             $page->assign('promo_sortie', $promo_sortie);
 
             if (Env::has('submit')) {
-                $myorange = new OrangeReq(S::v('uid'),
-                                          $promo_sortie);
+                $myorange = new OrangeReq(S::user(), $promo_sortie);
                 $myorange->submit();
                 $page->assign('myorange', $myorange);
             }
@@ -684,7 +700,7 @@ class ProfileModule extends PLModule
                 if ($reason == 'other') {
                     $reason = Env::v('other_reason');
                 }
-                $myusage = new UsageReq(S::v('uid'), $nom_usage, $reason);
+                $myusage = new UsageReq(S::user(), $nom_usage, $reason);
                 $myusage->submit();
                 $page->assign('myusage', $myusage);
             }
@@ -723,22 +739,20 @@ class ProfileModule extends PLModule
         $vcard->show();
     }
 
-    function handler_admin_trombino(&$page, $uid = null, $action = null) {
+    function handler_admin_trombino(&$page, $login = null, $action = null) {
         $page->changeTpl('profile/admin_trombino.tpl');
         $page->setTitle('Administration - Trombino');
-        $page->assign('uid', $uid);
 
-        $q   = XDB::query(
-                "SELECT  a.alias,promo
-                  FROM  auth_user_md5 AS u
-            INNER JOIN  aliases       AS a ON ( u.user_id = a.id AND type='a_vie' )
-                 WHERE  user_id = {?}", $uid);
-        list($forlife, $promo) = $q->fetchOneRow();
+        if (!$login || !($user = User::get($login))) {
+            return PL_NOT_FOUND;
+        } else {
+            $page->assign_by_ref('user', $user);
+        }
 
         switch ($action) {
             case "original":
                 header("Content-type: image/jpeg");
-               readfile("/home/web/trombino/photos".$promo."/".$forlife.".jpg");
+               readfile("/home/web/trombino/photos" . $user->promo() . "/" . $user->login() . ".jpg");
                 exit;
                break;
 
@@ -751,17 +765,15 @@ class ProfileModule extends PLModule
                unlink($_FILES['userfile']['tmp_name']);
                 XDB::execute(
                         "REPLACE INTO photo SET uid={?}, attachmime = {?}, attach={?}, x={?}, y={?}",
-                        $uid, $mimetype, $data, $x, $y);
+                        $user->id(), $mimetype, $data, $x, $y);
                break;
 
             case "delete":
                 S::assert_xsrf_token();
 
-                XDB::execute('DELETE FROM photo WHERE uid = {?}', $uid);
+                XDB::execute('DELETE FROM photo WHERE uid = {?}', $user->id());
                 break;
         }
-
-        $page->assign('forlife', $forlife);
     }
     function handler_admin_binets(&$page, $action = 'list', $id = null) {
         $page->setTitle('Administration - Binets');
index df97147..85d2a86 100644 (file)
@@ -76,7 +76,7 @@ class ProfileDeco implements ProfileSetting
         // Add new ones
         foreach ($value as $id=>&$val) {
             if (!isset($orig[$id]) || $orig[$id]['grade'] != $val['grade']) {
-                $req = new MedalReq(S::i('uid'), $id, $val['grade']);
+                $req = new MedalReq(S::user(), $id, $val['grade']);
                 $req->submit();
             }
         }
index 8d30088..5b098f0 100644 (file)
@@ -297,7 +297,8 @@ class RegisterModule extends PLModule
         }
 
         require_once('emails.inc.php');
-        $redirect = new Redirect($uid);
+        $user = User::getSilent($uid);
+        $redirect = new Redirect($user);
         $redirect->add_email($email);
 
         // on cree un objet logger et on log l'inscription
@@ -428,11 +429,11 @@ class RegisterModule extends PLModule
                                    S::v('uid'));
 
             // If GoogleApps is enabled, and the user did choose to use synchronized passwords,
-            // and if the (stupid) user has decided to user /register/success another time,
+            // and if the (stupid) user has decided to use /register/success another time,
             // updates the Google Apps password as well.
             if ($globals->mailstorage->googleapps_domain) {
                 require_once 'googleapps.inc.php';
-                $account = new GoogleAppsAccount(S::v('uid'), S::v('forlife'));
+                $account = new GoogleAppsAccount(S::user());
                 if ($account->active() && $account->sync_password) {
                     $account->set_password($password);
                 }
index 4839e36..2de1530 100644 (file)
@@ -149,24 +149,24 @@ function create_aliases (&$sub)
     global $globals;
     extract ($sub);
 
-    $mailorg  = make_username($prenom, $nom);
+    $mailorg = make_username($prenom, $nom);
     $mailorg2 = $mailorg.sprintf(".%02u", ($promo%100));
-    $forlife  = make_forlife($prenom, $nom, $promo);
 
-    $res      = XDB::query('SELECT COUNT(*) FROM aliases WHERE alias={?}', $forlife);
-    if ($res->fetchOneCell() > 0) {
-        return "Tu as un homonyme dans ta promo, il faut traiter ce cas manuellement.<br />".
-            "envoie un mail à <a href=\"mailto:support@{$globals->mail->domain}</a>\">" .
-            "support@{$globals->mail->domain}</a> en expliquant ta situation.";
+    $res = XDB::query("SELECT hruid FROM auth_user_md5 WHERE user_id = {?}", $uid);
+    if ($res->numRows() == 0) {
+        return "Tu n'as pas d'adresse à vie pré-attribuée.<br />"
+            . "Envoie un mail à <a href=\"mailto:support@{$globals->mail->domain}</a>\">" .
+            . "support@{$globals->mail->domain}</a> en expliquant ta situation.";
+    } else {
+        // TODO: at the moment forlife == hruid, however we'll have to change
+        // that behaviour when masters will be on plat/al.
+        $forlife = $res->fetchOneCell();
     }
 
-    $res      = XDB::query('SELECT id, type, expire FROM aliases WHERE alias={?}', $mailorg);
-
-    if ( $res->numRows() ) {
-
+    $res = XDB::query('SELECT id, type, expire FROM aliases WHERE alias={?}', $mailorg);
+    if ($res->numRows()) {
         list($h_id, $h_type, $expire) = $res->fetchOneRow();
-
-        if ( $h_type != 'homonyme' and empty($expire) ) {
+        if ($h_type != 'homonyme' and empty($expire)) {
             XDB::execute('UPDATE aliases SET expire=ADDDATE(NOW(),INTERVAL 1 MONTH) WHERE alias={?}', $mailorg);
             XDB::execute('REPLACE INTO homonymes (homonyme_id,user_id) VALUES ({?},{?})', $h_id, $h_id);
             XDB::execute('REPLACE INTO homonymes (homonyme_id,user_id) VALUES ({?},{?})', $h_id, $uid);
index c9ca317..2ab0e37 100644 (file)
@@ -87,7 +87,7 @@ class SearchModule extends PLModule
                 $list .= '|admin|adm|ax';
             }
             if (preg_match('/^(' . $list . '):([-a-z]+(\.[-a-z]+(\.\d{2,4})?)?)$/', replace_accent($quick), $matches)) {
-                $forlife = $matches[2];
+                $login = $matches[2];
                 switch($matches[1]) {
                   case 'admin': case 'adm':
                     $base = 'admin/user/';
@@ -103,10 +103,9 @@ class SearchModule extends PLModule
                     break;
                 }
 
-                require_once 'user.func.inc.php';
-                $login = get_user_forlife($forlife, '_silent_user_callback');
-                if ($login) {
-                    pl_redirect($base . $login);
+                $user = User::getSilent($login);
+                if ($user) {
+                    pl_redirect($base . $user->login());
                 }
                 $_REQUEST['quick'] = $forlife;
                 $_GET['quick'] = $forlife;
index 89d674b..003bbcf 100644 (file)
@@ -407,7 +407,7 @@ class Survey
     public function proposeSurvey()
     {
         require_once 'validations.inc.php';
-        $surveyreq = new SurveyReq($this->title, $this->description, $this->end, $this->mode, $this->promos, $this->questions, S::v('uid'));
+        $surveyreq = new SurveyReq($this->title, $this->description, $this->end, $this->mode, $this->promos, $this->questions, S::user());
         return $surveyreq->submit();
     }
     // }}}
index a879db9..91aa302 100644 (file)
@@ -452,7 +452,7 @@ class XnetEventsModule extends PLModule
             // request for a new payment
             if (Post::v('paiement_id') == -1 && $money_defaut >= 0) {
                 require_once 'validations.inc.php';
-                $p = new PayReq(S::v('uid'),
+                $p = new PayReq(S::user(),
                                 Post::v('intitule')." - ".$globals->asso('nom'),
                                 Post::v('site'), $money_defaut,
                                 Post::v('confirmation'), 0, 999,
index 9c2f4ff..494d664 100644 (file)
@@ -204,17 +204,15 @@ function get_event_participants(&$evt, $item_id, $tri, $limit = '') {
 //  {{{ function subscribe_lists_event()
 function subscribe_lists_event($participate, $uid, $evt)
 {
-    require_once('user.func.inc.php');
     global $globals;
     $page =& Platal::page();
 
     $participant_list = $evt['participant_list'];
     $absent_list      = $evt['absent_list'];
 
-    $email = get_user_forlife($uid, '_silent_user_callback');
-
-    if ($email) {
-        $email .= '@'.$globals->mail->domain;
+    $user = User::getSilent($uid);
+    if ($user) {
+        $email = $user->forlifeEmail();
     } else {
         $res = XDB::query("SELECT email
                              FROM groupex.membres
index afe992d..1b20356 100644 (file)
@@ -137,11 +137,10 @@ class XnetGrpModule extends PLModule
                             Env::i('unread'), S::i('uid'));
                 pl_redirect("#art" . Env::i('unread'));
             }
-            $arts = XDB::iterator("SELECT a.*, u.nom, u.prenom, u.promo, l.alias AS forlife,
+            $arts = XDB::iterator("SELECT a.*, u.nom, u.prenom, u.promo, u.hruid,
                                           FIND_IN_SET('photo', a.flags) AS photo
                                      FROM groupex.announces AS a
                                INNER JOIN auth_user_md5 AS u USING(user_id)
-                               INNER JOIN aliases AS l ON (u.user_id = l.id AND l.type = 'a_vie')
                                 LEFT JOIN groupex.announces_read AS r ON (r.user_id = {?} AND r.announce_id = a.id)
                                     WHERE asso_id = {?} AND peremption >= CURRENT_DATE()
                                           AND (promo_min = 0 OR promo_min <= {?})
@@ -179,7 +178,7 @@ class XnetGrpModule extends PLModule
                               $platal->ns . "rss/rss.xml");
         } else {
             $page->setRssLink("Polytechnique.net :: {$globals->asso("nom")} :: News",
-                              $platal->ns . 'rss/'.S::v('forlife') .'/'.S::v('core_rss_hash').'/rss.xml');
+                              $platal->ns . 'rss/'.S::v('hruid') .'/'.S::v('core_rss_hash').'/rss.xml');
         }
 
         $page->assign('articles', $arts);
@@ -332,7 +331,7 @@ class XnetGrpModule extends PLModule
             $this->load('mail.inc.php');
             set_time_limit(120);
             $tos = get_all_redirects($mbr,  $mls, $mmlist);
-            $upload = PlUpload::get($_FILES['uploaded'], S::v('forlife'), 'xnet.emails', true);
+            $upload = PlUpload::get($_FILES['uploaded'], S::user()->login(), 'xnet.emails', true);
             send_xnet_mails($from, $sujet, $body, Env::v('wiki'), $tos, Post::v('replyto'), $upload, @$_FILES['uploaded']['name']);
             if ($upload) {
                 $upload->rm();
@@ -529,26 +528,25 @@ class XnetGrpModule extends PLModule
                      $globals->asso('id'), $uid);
     }
 
-    private function validSubscription($nom, $prenom, $sexe, $uid, $forlife)
+    private function validSubscription(User &$user)
     {
         global $globals;
-        $this->removeSubscriptionRequest($uid);
+        $this->removeSubscriptionRequest($user->id());
         XDB::execute("INSERT INTO  groupex.membres (asso_id, uid)
                            VALUES  ({?}, {?})",
-                     $globals->asso('id'), $uid);
+                     $globals->asso('id'), $user->id());
         $mailer = new PlMailer();
-        $mailer->addTo("$forlife@polytechnique.org");
-        $mailer->setFrom('"' . S::v('prenom') . ' ' . S::v('nom')
-                         . '" <' . S::v('forlife') . '@polytechnique.org>');
+        $mailer->addTo($user->forlifeEmail());
+        $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
         $mailer->setSubject('[' . $globals->asso('nom') . '] Demande d\'inscription');
-        $message = ($sexe ? 'Chère' : 'Cher') . " Camarade,\n"
+        $message = ($user->isFemale() ? 'Chère' : 'Cher') . " Camarade,\n"
                  . "\n"
                  . "  Suite à ta demande d'adhésion à " . $globals->asso('nom') . ",\n"
                  . "j'ai le plaisir de t'annoncer que ton inscription a été validée !\n"
                  . "\n"
                  . "Bien cordialement,\n"
                  . "-- \n"
-                 . S::s('prenom') . ' ' . S::s('nom') . '.';
+                 . S::user()->fullName() . '.';
         $mailer->setTxtBody($message);
         $mailer->send();
     }
@@ -564,52 +562,51 @@ class XnetGrpModule extends PLModule
                             ."sur la page de présentation.");
 
         if (!is_null($u) && may_update()) {
-            $page->assign('u', $u);
-            $res = XDB::query("SELECT  u.nom, u.prenom, u.promo, u.user_id, FIND_IN_SET('femme', u.flags), s.reason
-                                 FROM  auth_user_md5 AS u
-                           INNER JOIN  aliases AS al ON (al.id = u.user_id AND al.type != 'liste')
-                            LEFT JOIN  groupex.membres_sub_requests AS s ON (u.user_id = s.uid AND s.asso_id = {?})
-                                WHERE  al.alias = {?}", $globals->asso('id'), $u);
-
-            if (list($nom, $prenom, $promo, $uid, $sexe, $reason) = $res->fetchOneRow()) {
-                $res = XDB::query("SELECT  COUNT(*)
-                                     FROM  groupex.membres AS m
-                               INNER JOIN  aliases  AS a ON (m.uid = a.id AND a.type != 'homonyme')
-                                    WHERE  a.alias = {?} AND m.asso_id = {?}",
-                                  $u, $globals->asso('id'));
-                $n   = $res->fetchOneCell();
-                if ($n) {
-                    $this->removeSubscriptionRequest($uid);
-                    $page->kill("$prenom $nom est déjà membre du groupe !");
-                    return;
-                } elseif (Env::has('accept')) {
-                    S::assert_xsrf_token();
-
-                    $this->validSubscription($nom, $prenom, $sexe, $uid, $u);
-                    pl_redirect("member/$u");
-                } elseif (Env::has('refuse')) {
-                    S::assert_xsrf_token();
-
-                    $this->removeSubscriptionRequest($uid);
-                    $mailer = new PlMailer();
-                    $mailer->addTo("$u@polytechnique.org");
-                    $mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
-                                     .'" <'.S::v('forlife').'@polytechnique.org>');
-                    $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription annulée');
-                    $mailer->setTxtBody(Env::v('motif'));
-                    $mailer->send();
-                    $page->kill("La demande de $prenom $nom a bien été refusée.");
-                } else {
-                    $page->assign('show_form', true);
-                    $page->assign('prenom', $prenom);
-                    $page->assign('nom', $nom);
-                    $page->assign('promo', $promo);
-                    $page->assign('uid', $uid);
-                    $page->assign('reason', $reason);
-                }
-                return;
+            $user = User::get($u);
+            if (!$user) {
+                return PL_NOT_FOUND;
+            } else {
+                $page->assign('user', $user);
             }
-            return PL_NOT_FOUND;
+
+            // Retrieves the subscription status, and the reason.
+            $res = XDB::query("SELECT  reason
+                                 FROM  groupex.membres_sub_requests
+                                WHERE  asso_id = {?} AND uid = {?}",
+                              $globals->asso('id'), $user->id());
+            $reason = ($res->numRows() ? $res->fetchOneCell() : null);
+
+            $res = XDB::query("SELECT  COUNT(*)
+                                 FROM  groupex.membres
+                                WHERE  asso_id = {?} AND uid = {?}",
+                              $globals->asso('id'), $user->id());
+            $already_member = ($res->fetchOneCell() > 0);
+
+            // Handles the membership request.
+            if ($already_member) {
+                $this->removeSubscriptionRequest($user->id());
+                $page->kill($user->fullName() . " est déjà membre du groupe !");
+            } elseif (Env::has('accept')) {
+                S::assert_xsrf_token();
+
+                $this->validSubscription($user);
+                pl_redirect("member/" . $user->login());
+            } elseif (Env::has('refuse')) {
+                S::assert_xsrf_token();
+
+                $this->removeSubscriptionRequest($user->id());
+                $mailer = new PlMailer();
+                $mailer->addTo($user->forlifeEmail());
+                $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
+                $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription annulée');
+                $mailer->setTxtBody(Env::v('motif'));
+                $mailer->send();
+                $page->kill("La demande de {$user->fullName()} a bien été refusée.");
+            } else {
+                $page->assign('show_form', true);
+                $page->assign('reason', $reason);
+            }
+            return;
         }
 
         if (is_member()) {
@@ -646,12 +643,10 @@ class XnetGrpModule extends PLModule
             $append = "\n"
                     . "-- \n"
                     . "Ce message a été envoyé suite à la demande d'inscription de\n"
-                    . S::v('prenom').' '.S::v('nom').' (X'.S::v('promo').")\n"
+                    . S::user()->fullName() . ' (X' . S::v('promo') . ")\n"
                     . "Via le site www.polytechnique.net. Tu peux choisir de valider ou\n"
                     . "de refuser sa demande d'inscription depuis la page :\n"
-                    .
-                    "http://www.polytechnique.net/".$globals->asso("diminutif")."/subscribe/"
-                        .S::v('forlife')."\n"
+                    . "http://www.polytechnique.net/" . $globals->asso("diminutif") . "/subscribe/" . S::user()->login() . "\n"
                     . "\n"
                     . "En cas de problème, contacter l'équipe de Polytechnique.org\n"
                     . "à l'adresse : support@polytechnique.org\n";
@@ -666,8 +661,7 @@ class XnetGrpModule extends PLModule
 
             $mailer = new PlMailer();
             $mailer->addTo($to);
-            $mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
-                             .'" <'.S::v('forlife').'@polytechnique.org>');
+            $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
             $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription');
             $mailer->setTxtBody(Post::v('message').$append);
             $mailer->send();
@@ -683,17 +677,11 @@ class XnetGrpModule extends PLModule
             $subs = Post::v('subs');
             if (is_array($subs)) {
                 $users = array();
-                foreach ($subs as $forlife => $val) {
+                foreach ($subs as $hruid => $val) {
                     if ($val == '1') {
-                        $res = XDB::query("SELECT  IF(u.nom_usage != '', u.nom_usage, u.nom) AS u,
-                                                   u.prenom, FIND_IN_SET('femme', u.flags) AS sexe,
-                                                   u.user_id
-                                             FROM  auth_user_md5 AS u
-                                       INNER JOIN  aliases AS a ON (a.id = u.user_id)
-                                            WHERE  a.alias = {?}", $forlife);
-                        if ($res->numRows() == 1) {
-                            list($nom, $prenom, $sexe, $uid) = $res->fetchOneRow();
-                            $this->validSubscription($nom, $prenom, $sexe, $uid, $forlife);
+                        $user = User::get($hruid);
+                        if ($user) {
+                            $this->validSubscription($user);
                         }
                     }
                 }
@@ -701,10 +689,9 @@ class XnetGrpModule extends PLModule
         }
 
         $it = XDB::iterator("SELECT  IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom,
-                                     u.prenom, u.promo, a.alias AS forlife, s.ts AS date
+                                     u.prenom, u.promo, u.hruid, s.ts AS date
                                FROM  groupex.membres_sub_requests AS s
                          INNER JOIN  auth_user_md5 AS u ON (s.uid = u.user_id)
-                         INNER JOIN  aliases AS a ON (a.id = s.uid AND a.type = 'a_vie')
                               WHERE  asso_id = {?}
                            ORDER BY  nom, prenom",
                            $globals->asso('id'));
@@ -800,26 +787,13 @@ class XnetGrpModule extends PLModule
             S::assert_xsrf_token();
         }
 
-        if (strpos($email, '@') === false) {
-            $x = true;
-        } else {
-            list(,$fqdn) = explode('@', $email, 2);
-            $fqdn = strtolower($fqdn);
-            $x = ($fqdn == 'polytechnique.org' || $fqdn == 'melix.org' ||
-                  $fqdn == 'm4x.org' || $fqdn == 'melix.net');
-        }
-        if ($x) {
-            require_once 'user.func.inc.php';
-            if ($forlife = get_user_forlife($email)) {
-                XDB::execute(
-                    'INSERT INTO  groupex.membres (uid,asso_id,origine)
-                          SELECT  user_id,{?},"X"
-                            FROM  auth_user_md5 AS u
-                      INNER JOIN  aliases       AS a ON (u.user_id = a.id)
-                           WHERE  a.alias={?}', $globals->asso('id'), $forlife);
-                pl_redirect("member/$forlife");
-            } else {
-                $page->trigError($email." n'est pas un alias polytechnique.org valide.");
+        if (!User::isForeignEmailAddress($email)) {
+            $user = User::get($email);
+            if ($user) {
+                XDB::execute("REPLACE INTO  groupex.membres (uid, asso_id, origine)
+                                    VALUES  ({?}, {?}, 'X')",
+                             $user->id(), $globals->asso('id'));
+                pl_redirect("member/" . $user->login());
             }
         } else {
             if (isvalid_email($email)) {
@@ -956,7 +930,7 @@ class XnetGrpModule extends PLModule
     function handler_unsubscribe(&$page)
     {
         $page->changeTpl('xnetgrp/membres-del.tpl');
-        $user = get_infos(S::v('forlife'));
+        $user = get_infos(S::user()->id());
         if (empty($user)) {
             return PL_NOT_FOUND;
         }
@@ -1229,7 +1203,7 @@ class XnetGrpModule extends PLModule
                 exit;
             }
         } else {
-            $upload = new PlUpload(S::v('forlife'), 'xnetannounce');
+            $upload = new PlUpload(S::user()->login(), 'xnetannounce');
             if ($upload->exists() && $upload->isType('image')) {
                 header('Content-Type: ' . $upload->contentType());
                 echo $upload->getContents();
@@ -1264,13 +1238,13 @@ class XnetGrpModule extends PLModule
             $art['nom']        = S::v('nom');
             $art['prenom']     = S::v('prenom');
             $art['promo']      = S::v('promo');
-            $art['forlife']    = S::v('forlife');
+            $art['hruid']      = S::user()->login();
             $art['peremption'] = Post::v('peremption');
             $art['public']     = Post::has('public');
             $art['xorg']       = Post::has('xorg');
             $art['nl']         = Post::has('nl');
             $art['event']      = Post::v('event');
-            $upload     = new PlUpload(S::v('forlife'), 'xnetannounce');
+            $upload     = new PlUpload(S::user()->login(), 'xnetannounce');
             $this->upload_image($page, $upload);
 
             $art['contact_html'] = $art['contacts'];
@@ -1323,7 +1297,7 @@ class XnetGrpModule extends PLModule
                 $post = null;/*
                 if ($globals->asso('forum')) {
                     require_once 'banana/forum.inc.php';
-                    $banana = new ForumsBanana(S::v('forlife'));
+                    $banana = new ForumsBanana(S::user());
                     $post = $banana->post($globals->asso('forum'), null,
                                           $art['titre'], MiniWiki::wikiToText($fulltext, false, 0, 80));
                 }*/
@@ -1343,7 +1317,7 @@ class XnetGrpModule extends PLModule
                 if ($art['xorg']) {
                     require_once('validations.inc.php');
                     $article = new EvtReq("[{$globals->asso('nom')}] " . $art['titre'], $fulltext,
-                                    $art['promo_min'], $art['promo_max'], $art['peremption'], "", S::v('uid'),
+                                    $art['promo_min'], $art['promo_max'], $art['peremption'], "", S::user(),
                                     $upload);
                     $article->submit();
                     $page->trigWarning("L'affichage sur la page d'accueil de Polytechnique.org est en attente de validation.");
@@ -1352,7 +1326,7 @@ class XnetGrpModule extends PLModule
                 }
                 if ($art['nl']) {
                     require_once('validations.inc.php');
-                    $article = new NLReq(S::v('uid'), $globals->asso('nom') . " : " .$art['titre'],
+                    $article = new NLReq(S::user(), $globals->asso('nom') . " : " .$art['titre'],
                                          $art['texte'], $art['contact_html']);
                     $article->submit();
                     $page->trigWarning("La parution dans la Lettre Mensuelle est en attente de validation.");
@@ -1379,12 +1353,11 @@ class XnetGrpModule extends PLModule
         }
 
         if (empty($art) && !is_null($aid)) {
-            $res = XDB::query("SELECT a.*, u.nom, u.prenom, u.promo, l.alias AS forlife,
+            $res = XDB::query("SELECT a.*, u.nom, u.prenom, u.promo, u.hruid,
                                       FIND_IN_SET('public', a.flags) AS public,
                                       FIND_IN_SET('photo', a.flags) AS photo
                                  FROM groupex.announces AS a
                            INNER JOIN auth_user_md5 AS u USING(user_id)
-                           INNER JOIN aliases AS l ON (l.id = u.user_id AND l.type = 'a_vie')
                                 WHERE asso_id = {?} AND a.id = {?}",
                               $globals->asso('id'), $aid);
             if ($res->numRows()) {
index de5392d..35b0f86 100644 (file)
@@ -159,7 +159,7 @@ class XnetListsModule extends ListsModule
         $ret = $this->client->create_list(
                     $liste, utf8_decode(Post::v('desc')), Post::v('advertise'),
                     Post::v('modlevel'), Post::v('inslevel'),
-                    array(S::v('forlife')), array(S::v('forlife')));
+                    array(S::user()->forlifeEmail()), array(S::user()->forlifeEmail()));
 
         $dom = strtolower($globals->asso("mail_domain"));
         $red = $dom.'_'.$liste;
index ebdce6e..932c998 100644 (file)
 
 function smarty_function_test_email($params, &$smarty) {
     $label = isset($params['title']) ? $params['title'] : 'Envoyer un email de test';
-    $token = "'" . S::v('xsrf_token') . (isset($params['forlife']) ? "', " : "'");
-    $forlife = isset($params['forlife']) ? "'" . $params['forlife'] . "'" : '';
+    $token = "'" . S::v('xsrf_token') . (isset($params['hruid']) ? "', " : "'");
+    $hruid = isset($params['hruid']) ? "'" . $params['hruid'] . "'" : '';
     return '<div class="center">'
          . '  <div id="mail_sent" style="position: absolute;"></div><br />'
-         . '  <form action="emails/test" method="get" onsubmit="return sendTestEmail(' . $token . $forlife . ')">'
+         . '  <form action="emails/test" method="get" onsubmit="return sendTestEmail(' . $token . $hruid . ')">'
          . '    <input type="hidden" name="token" value="' . S::v('xsrf_token') . '" />'
          . '    <div><input type="submit" name="send" value="' . $label . '" /></div>'
          . '  </form>'
index ff2e34f..924ed8f 100644 (file)
@@ -45,7 +45,7 @@
         Administrer
       </th>
     </tr>
-    {if !$smarty.request.login && !$mr.forlife}
+    {if !$smarty.request.login && !$mr.hruid}
     <tr class="pair">
       <td class="center">
         Il est possible d'entrer ici n'importe quelle adresse email&nbsp;: redirection, melix, ou alias.
@@ -54,7 +54,7 @@
     {/if}
     <tr>
       <td class="center">
-        <input type="text" name="login" size="40" maxlength="255" value="{$smarty.request.login|default:$mr.forlife}" />
+        <input type="text" name="login" size="40" maxlength="255" value="{$smarty.request.login|default:$mr.hruid}" />
       </td>
     </tr>
     <tr>
@@ -257,7 +257,7 @@ function ban_read()
     {else}
     <tr class="center">
       <td>
-        <a href="profile/{$mr.forlife}" class="popup2">[Voir fiche]</a>
+        <a href="profile/{$mr.hruid}" class="popup2">[Voir fiche]</a>
       </td>
       <td>
         <input onclick="doEditUser(); return true;" type="submit" name="u_edit" value="UPDATE" />
@@ -375,7 +375,7 @@ Pour ceci changer ses permissions en 'disabled'.
 </form>
 
 {javascript name="ajax"}
-{test_email forlife=$mr.forlife}
+{test_email hruid=$user->login()}
 
 <form id="fwds" method="post" action="admin/user#fwds">
   {xsrf_token_field}
@@ -409,7 +409,7 @@ Pour ceci changer ses permissions en 'disabled'.
       </td>
       <td>
         {if $mail->broken}<span style="color: #f00">{/if}
-        {if $mail->email == 'googleapps'}<a href="admin/googleapps/user/{$mr.forlife}">{/if}
+        {if $mail->email == 'googleapps'}<a href="admin/googleapps/user/{$mr.hruid}">{/if}
         {$mail->display_email}
         {if $mail->email == 'googleapps'}</a>{/if}
         {if $mail->broken}<em> (en panne)</em></span>{/if}
index df42a75..e28ffeb 100644 (file)
@@ -46,8 +46,8 @@ function toggleField(name, id, obj) {
   <tr>
     <td class="titre" style="width: 20%">Demandeur&nbsp;:</td>
     <td>
-      <a href="profile/{$valid->bestalias}" class="popup2">
-        {$valid->prenom} {$valid->nom} (X{$valid->promo})
+      <a href="profile/{$valid->user->login()}" class="popup2">
+        {$valid->user->fullName()} (X{$valid->user->promo()})
       </a>
     </td>
   </tr>
@@ -75,7 +75,7 @@ function toggleField(name, id, obj) {
         {xsrf_token_field}
         <div>
           {include file=$valid->editor()}
-          <input type="hidden" name="uid"    value="{$valid->uid}" />
+          <input type="hidden" name="uid"    value="{$valid->user->id()}" />
           <input type="hidden" name="type"   value="{$valid->type}" />
           <input type="hidden" name="stamp"  value="{$valid->stamp}" />
           <br />
@@ -108,7 +108,7 @@ function toggleField(name, id, obj) {
       <form action="admin/validate" method="post">
         {xsrf_token_field}
         <div>
-          <input type="hidden" name="uid"    value="{$valid->uid}" />
+          <input type="hidden" name="uid"    value="{$valid->user->id()}" />
           <input type="hidden" name="type"   value="{$valid->type}" />
           <input type="hidden" name="stamp"  value="{$valid->stamp}" />
           <input type="hidden" name="formid" value="{0|rand:65535}" />
@@ -147,7 +147,7 @@ function toggleField(name, id, obj) {
           Ajouté dans l'email&nbsp;:<br />
           <textarea rows="5" cols="50" name="comm"></textarea><br />
 
-          <input type="hidden" name="uid"    value="{$valid->uid}" />
+          <input type="hidden" name="uid"    value="{$valid->user->id()}" />
           <input type="hidden" name="type"   value="{$valid->type}" />
           <input type="hidden" name="stamp"  value="{$valid->stamp}" />
           <input type="submit" name="accept" value="Accepter" />
index d4ab3d3..c017119 100644 (file)
@@ -57,7 +57,7 @@ correspondant si tu veux que nous puissions te répondre.
   </p>
   <p>
     Si tu connais une autre adresse email où le contacter, nous pouvons l'inviter à mettre à jour sa redirection
-    Polytechnique.org. Pour ceci il suffit que tu remplisses <a href="marketing/broken/{$x.forlife}">ce formulaire</a>.
+    Polytechnique.org. Pour ceci il suffit que tu remplisses <a href="marketing/broken/{$x.hruid}">ce formulaire</a>.
   </p>
 {elseif $email}
 <p class="erreur">
index 1e12c51..1c99a1e 100644 (file)
@@ -31,7 +31,7 @@
   {iterate from=$lost_emails item="looser"}
     <tr class="{cycle values="pair,impair"}">
       <td>
-        <a href="profile/{$looser.alias}" class="popup2">{$looser.alias}</a>
+        <a href="profile/{$looser.hruid}" class="popup2">{$looser.hruid}</a>
       </td>
   {/iterate}
 </table>
index 27f50ed..b950d56 100644 (file)
@@ -23,7 +23,7 @@
 {if $retour == $smarty.const.ERROR_INACTIVE_REDIRECTION}
   <p class="erreur">
   Tu ne peux pas avoir aucune adresse de redirection active, sinon ton adresse
-  {$smarty.session.forlife}@{#globals.mail.domain#} ne fonctionnerait plus.
+  {$user->forlifeEmail()} ne fonctionnerait plus.
   </p>
 {/if}
 {if $retour == $smarty.const.ERROR_INVALID_EMAIL}
@@ -33,8 +33,8 @@
 {/if}
 {if $retour == $smarty.const.ERROR_LOOP_EMAIL}
   <p class="erreur">
-  Erreur&nbsp;: {$smarty.session.forlife}@{#globals.mail.domain#} ne doit pas être renvoyé
-  vers lui-même, ni vers son équivalent en {#globals.mail.domain2#} ni vers polytechnique.edu.
+  Erreur&nbsp;: {$user->forlifeEmail()} ne doit pas être renvoyé vers lui-même,
+  ni vers son équivalent en {#globals.mail.domain2#} ni vers polytechnique.edu.
   </p>
 {/if}
   <h1>
   L'X te fournit aussi une adresse à vie en <strong>«prenom.nom»@polytechnique.edu</strong> qui par défaut est
   une redirection vers «login»@poly.polytechnique.fr. <a href="https://www.mail.polytechnique.edu/">
   Tu peux modifier cette redirection</a> et la faire pointer vers ton adresse
-  {$smarty.session.forlife}@{#globals.mail.domain#} (attention, cela demande de la concentration).
+  {$user->forlifeEmail()} (attention, cela demande de la concentration).
 </p>
 <p>
   Si tu utilises le service POP de poly pour récupérer tes emails dans ton logiciel de courrier,
   l'équipe de Polytechnique.org te conseille de rediriger&nbsp;:
 </p>
 <ul>
-  <li>«prenom.nom»@polytechnique.edu vers {$smarty.session.forlife}@{#globals.mail.domain#}&nbsp;;</li>
-  <li>{$smarty.session.forlife}@{#globals.mail.domain#} vers «login»@poly.polytechnique.fr.</li>
+  <li>«prenom.nom»@polytechnique.edu vers {$user->forlifeEmail()}&nbsp;;</li>
+  <li>{$user->forlifeEmail()} vers «login»@poly.polytechnique.fr.</li>
 </ul>
 <p>
   Attention à ne pas faire une boucle quand tu manipules tes redirections ! Tes emails seraient
index 38dfc0c..c9f0a35 100644 (file)
@@ -26,7 +26,7 @@
 {to addr=$to}
 {subject text="Validation de la demande de réécriture pour l'adresse `$mail->email`"}
 {elseif $mail_part eq 'wiki'}
-{if $sexe}Chère{else}Cher{/if} {$prenom},
+{if $user->isFemale()}Chère{else}Cher{/if} {$user->displayName()},
 
 Tu reçois cet email car une demande de réécriture vient d'être effectuée sur {$sitename} pour que les mails
 l'adresse {$mail->email} soit automatiquement réécrite en {$mail->rewrite}.
index 74c5c71..f9ef4f2 100644 (file)
         <input type='text' name='from' size='60' value='{if $smarty.request.from}
 {$smarty.request.from}
 {else}
-"{$smarty.session.prenom} {$smarty.session.nom_usage|default:$smarty.session.nom}" &lt;{$smarty.session.bestalias}@{#globals.mail.domain#}&gt;
+"{$user->fullName()}" &lt;{$user->bestEmail()}&gt;
 {/if}' />
       </td>
     </tr>
index a2fae6d..5737395 100644 (file)
@@ -26,7 +26,7 @@
 {to addr=$email}
 {subject text="Test de ton adresse `$email`"}
 {elseif $mail_part eq 'wiki'}
-{if $sexe}Chère{else}Cher{/if} {$prenom},
+{if $sexe}Chère{else}Cher{/if} {$display_name},
 
 Tu reçois cet email car tu as demandé la confirmation du bon fonctionnement de ton adresse polytechnicienne {$email}.
 {if count($redirects) gt 1}Si toutes tes redirections fonctionnent correctement tu devrais recevoir une copie de cet email
index b7dbd6b..ca61ffc 100644 (file)
@@ -22,7 +22,7 @@
 
 <tr class="pair">
   <td class="titre">Récupération de</td>
-  <td><a href='admin/user/{$valid->m_forlife}'>{$valid->m_prenom} {$valid->m_nom} ({$valid->m_promo})</a></td>
+  <td><a href='admin/user/{$valid->m_user->login()}'>{$valid->m_user->fullName()} ({$valid->m_user->promo()})</a></td>
 </tr>
 <tr class="pair">
   <td class="titre">Email proposé</td>
index c9ceb0c..7b9a903 100644 (file)
@@ -29,7 +29,7 @@
 <tr class="pair">
   <td class="titre">Homonymes&nbsp;:</td>
   <td>
-    {foreach from=$valid->homonymes_forlife item=o}
+    {foreach from=$valid->homonymes_hruid item=o}
     <a href='profile/{$o}' class='popup2'>{$o}</a>
     {/foreach}
   </td>
index 30090ea..c45d3da 100644 (file)
@@ -28,7 +28,7 @@
 {/if}
 <tr class="pair">
   <td class="titre">Marketing sur</td>
-  <td><a href='marketing/private/{$valid->m_id}'>{$valid->m_prenom} {$valid->m_nom} ({$valid->m_promo})</a></td>
+  <td><a href='marketing/private/{$valid->m_user->login()}'>{$valid->m_user->fullName()} ({$valid->m_user->promo()})</a></td>
 </tr>
 {if $valid->m_type neq 'default'}
 <tr class="pair">
index 1cc4d8f..1a47a2f 100644 (file)
 
 <tr class="impair">
   <td class="titre">Promotion&nbsp;:</td>
-  <td>{$valid->promo}</td>
+  <td>{$valid->user->promo()}</td>
 </tr>
 <tr class="impair">
   <td class="titre">Année de sortie&nbsp;:</td>
-  <td>{$valid->promo_sortie} au lieu de {math equation="a + b" a=$valid->promo b=3}</td>
+  <td>{$valid->promo_sortie} au lieu de {math equation="a + b" a=$valid->user->promo() b=3}</td>
 </tr>
 
 {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index ef3628c..0262ba2 100644 (file)
@@ -40,7 +40,7 @@
 <tr class="pair">
   <td class="titre">Contact&nbsp;:</td>
   <td>
-    {$valid->bestalias}@polytechnique.org
+    {$valid->user->bestEmail()}
   </td>
 </tr>
 <tr class="pair">
index 88f1bbd..762928d 100644 (file)
@@ -23,9 +23,9 @@
 <tr class="pair">
   <td class="titre">Photos</td>
   <td>
-    <img src="photo/{$valid->forlife}" style="width:110px;" alt=" [ PHOTO ] " />
+    <img src="photo/{$valid->user->login()}" style="width:110px;" alt=" [ PHOTO ] " />
     &nbsp;&nbsp;&nbsp;&nbsp;
-    <img src="photo/{$valid->forlife}/req" style="width:110px;" alt=" [ PHOTO ] " />
+    <img src="photo/{$valid->user->login()}/req" style="width:110px;" alt=" [ PHOTO ] " />
   </td>
 </tr>
 
index 50ca5f4..26d428c 100644 (file)
   <div class="identity">
     {if $smarty.session.auth ge AUTH_COOKIE}
     <div class="photo">
-      <img src="photo/{if $c.inscrit}{$c.forlife}{else}{make_forlife nom=$c.nom prenom=$c.prenom promo=$c.promo}{/if}"
+      <img src="photo/{$c.hruid}"
            alt="{$c.prenom} {$c.nom}" />
     </div>
     {/if}
 
     <div class="nom">
       {if $c.sexe}&bull;{/if}
-      {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}<a href="profile/{if $c.inscrit}{$c.forlife}{else}{make_forlife nom=$c.nom prenom=$c.prenom promo=$c.promo}{/if}" class="popup2">{/if}
+      {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}<a href="profile/{$c.hruid}" class="popup2">{/if}
       {if $c.nom_usage}{$c.nom_usage} {$c.prenom}<br />({$c.nom}){else}{$c.nom} {$c.prenom}{/if}
       {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}</a>{/if}
     </div>
     *}{icon name=cross title="Retirer de la liste de mes surveillances"}</a>
         {/if}
       {elseif $c.wasinscrit}
-    <a href="profile/{$c.forlife}" class="popup2">{*
+    <a href="profile/{$c.hruid}" class="popup2">{*
     *}{icon name=user_suit title="Afficher la fiche"}</a>
         {if !$c.dcd}
-    <a href="vcard/{$c.forlife}.vcf">{*
+    <a href="vcard/{$c.hruid}.vcf">{*
     *}{icon name=vcard title="Afficher la carte de visite"}</a>
     <a href="mailto:{$c.forlife}@{#globals.mail.domain#}">{*
     *}{icon name=email title="Envoyer un email"}</a>
           {if $show_action eq ajouter}
-    <a href="carnet/contacts?action={$show_action}&amp;user={$c.forlife}&amp;token={xsrf_token}">{*
+    <a href="carnet/contacts?action={$show_action}&amp;user={$c.hruid}&amp;token={xsrf_token}">{*
     *}{icon name=add title="Ajouter à mes contacts"}</a>
           {else}
-    <a href="carnet/contacts?action={$show_action}&amp;user={$c.forlife}&amp;token={xsrf_token}">{*
+    <a href="carnet/contacts?action={$show_action}&amp;user={$c.hruid}&amp;token={xsrf_token}">{*
     *}{icon name=cross title="Retirer de mes contacts"}</a>
           {/if}
         {/if}
     {if hasPerm('admin')}
     <div>
       [{if !$c.wasinscrit && !$c.dcd}
-      <a href="marketing/private/{$c.user_id}">{*
+      <a href="marketing/private/{$c.hruid}">{*
         *}{icon name=email title="marketter user"}</a>
       {/if}
-      <a href="admin/user/{if $c.wasinscrit}{$c.forlife}{else}{$c.user_id}{/if}">{*
+      <a href="admin/user/{$c.hruid}">{*
       *}{icon name=wrench title="administrer user"}</a>
       <a href="http://www.polytechniciens.com/?page=AX_FICHE_ANCIEN&amp;anc_id={$c.matricule_ax}">{*
       *}{icon name=user_gray title="fiche AX"}</a>]
         <td class="smaller" colspan="2">
           {if !$c.wasinscrit}
           Ce{if $c.sexe}tte{/if} camarade n'est pas inscrit{if $c.sexe}e{/if}.
-          <a href="marketing/public/{$c.user_id}" class='popup'>Si tu connais son adresse email,
+          <a href="marketing/public/{$c.hruid}" class='popup'>Si tu connais son adresse email,
           <strong>n'hésite pas à nous la transmettre !</a>
           {elseif !$c.actif}
           Ce{if $c.sexe}tte{/if} camarade n'a plus d'adresse de redirection valide.
-          <a href="marketing/broken/{$c.forlife}">
+          <a href="marketing/broken/{$c.hruid}">
             Si tu en connais une, <strong>n'hésite pas à nous la transmettre</strong>.
           </a>
           {/if}
index 278030d..54a7f86 100644 (file)
 {*                                                                        *}
 {**************************************************************************}
 
-
 {if $sent}
 
 <p>
   Merci de nous avoir communiqué cette information !
 </p>
 
-{elseif $user && !$user.alive}
+{elseif $user && !$user->alive}
 <p class="erreur">
-  {$user.prenom} {$user.nom} (X{$user.promo}) est malheureusement décédé{if $user.sexe}e{/if}.
+  {$user->fullName()} (X{$user->promo()}) est malheureusement décédé{if $user->isFemale()}e{/if}.
   Nous ne réaliserons maintenance sur son adresse Polytechnique.org qu'à la demande explicite
   de sa famille. Pour tout renseignement, merci de <a href="mailto:contact@polytechnique.org">
   contacter le support</a>.
 
 {elseif $user}
 <h1>
-  Recherche d'adresses pour {$user.nom} {$user.prenom} (X{$user.promo})
+  Recherche d'adresses pour {$user->fullName()} (X{$user->promo()}).
 </h1>
 
-{if !$user.email}
+{if !$user->email}
 <p>
   Avec le temps, toutes les adresses de redirection de notre camarade sont devenues invalides et produisent
   des erreurs lorsqu'on lui envoie un email. Nous sommes donc à la recherche d'adresses valides où nous pourrions
   contacter ce camarade.
 </p>
-{elseif $user.last}
+{elseif $user->last}
 <p>
-  {$user.prenom} a encore des adresses de redirection actives malgré des pannes détectées sur certaines d'entre elles. Si
+  {$user->fullName()} a encore des adresses de redirection actives malgré des pannes détectées sur certaines d'entre elles. Si
   tu es sûr{if $smarty.session.femme}e{/if} que son adresse Polytechnique.org est en panne, tu peux proposer une nouvelle
   adresse email à ajouter à ses redirections. Merci d'ajouter un commentaire pour nous indiquer la raison de cette proposition.
 </p>
 {else}
 <p>
-  Nous n'avons actuellement enregistré aucune panne sur les adresses de redirection de {$user.prenom}. Si tu es 
+  Nous n'avons actuellement enregistré aucune panne sur les adresses de redirection de {$user->fullName()}. Si tu es 
   sûr{if $smarty.session.femme}e{/if} que son adresse de redirection actuelle est en panne, tu peux nous proposer
   une nouvelle adresse, accompagnée d'un commentaire nous expliquant les raisons exactes de cette proposition.
 </p>
 {/if}
 <p>
-  Les adresses email que tu pourras nous donner ne seront pas ajoutées directement aux redirections de {$user.prenom}.
-  Nous allons d'abord prendre contact avec {if $user.sexe}elle{else}lui{/if} pour savoir {if $user.sexe}si elle {else}s'il {/if}
-  accepte la mise à jour de sa redirection.
+  Les adresses email que tu pourras nous donner ne seront pas ajoutées directement aux redirections de {$user->fullName()}.
+  Nous allons d'abord prendre contact avec {if $user->isFemale()}elle{else}lui{/if} pour savoir {if $user->isFemale()}si elle
+  {else}s'il {/if} accepte la mise à jour de sa redirection.
 </p>
 <p>
   Merci de ta participation active à l'amélioration de notre qualité de service.
 <form method="post" action="{$platal->path}">
   {xsrf_token_field}
   <table class="bicol" summary="Fiche camarade">
-    <tr><th colspan="2">Proposition d'adresse pour<br />{$user.nom} {$user.prenom} (X{$user.promo})</th></tr>
+    <tr><th colspan="2">Proposition d'adresse pour<br />{$user->fullName()} (X{$user->promo()})</th></tr>
     <tr class="pair">
       <td>Adresse email&nbsp;:</td>
       <td>
         <input type="text" name="mail" size="30" maxlength="50" value="{$smarty.post.mail}" />
       </td>
     </tr>
-    {if $user.email}
+    {if $user->email}
     <tr class="impair">
       <td>Explication&nbsp;:</td>
       <td><textarea name="comment" cols="50" rows="4">{$smarty.post.comment}</textarea></td>
index af5e9b2..dc202bb 100644 (file)
@@ -27,7 +27,7 @@
 {#globals.baseurl#}/register/%%hash%%
 ==========================================================
 
-Il ne te faut que 5 minutes sur https://www.polytechnique.org/ pour rejoindre la communauté polytechnicienne sur le web grâce aux services de Polytechnique.org dont profitent déjà {$num_users} camarades. Cela te permettra, entre autres, de contacter un X en connaissant seulement son nom et son prénom et de bénéficier à vie d'une adresse prestigieuse {$u.forlife}@polytechnique.org et de son alias discret {$u.forlife}@m4x.org (m4x = mail for X).
+Il ne te faut que 5 minutes sur https://www.polytechnique.org/ pour rejoindre la communauté polytechnicienne sur le web grâce aux services de Polytechnique.org dont profitent déjà {$num_users} camarades. Cela te permettra, entre autres, de contacter un X en connaissant seulement son nom et son prénom et de bénéficier à vie d'une adresse prestigieuse {$u.forlife_email} et de son alias discret {$u.forlife_email2} (m4x = mail for X).
 
 Pas de nouvelle boîte aux lettres à relever, il suffit de la rediriger vers ton adresse personnelle et/ou professionnelle que tu indiques et que tu peux changer à ta guise, sans que tes correspondants n'aient à actualiser leur carnet d'adresses.
 
index aee32ff..0ca3bba 100644 (file)
@@ -20,7 +20,7 @@
 {*                                                                        *}
 {**************************************************************************}
 
-<h1>Marketing de {$prenom} {$nom}</h1>
+<h1>Marketing de {$full_name}</h1>
 
 <h2>Matricules</h2>
 
index a9a3e98..88e38b6 100644 (file)
@@ -27,7 +27,7 @@
 Merci de nous avoir communiqué cette information !
 </p>
 <p>
-Nous avions déjà connaissance de cette adresse, nous espérons donc comme toi que {$prenom} va s'inscrire au plus vite.
+Nous avions déjà connaissance de cette adresse, nous espérons donc comme toi que {$full_name} va s'inscrire au plus vite.
 </p>
 <p>
 Si tu le connais personnellement, un petit email pour lui expliquer les atouts de Polytechnique.org
@@ -38,21 +38,21 @@ peut sans aucun doute l'aider à se décider !
 
 <p>
   Merci de nous avoir communiqué cette information !  Un administrateur de Polytechnique.org va
-  envoyer un email de proposition d'inscription à Polytechnique.org à {$prenom} {$nom} dans les
+  envoyer un email de proposition d'inscription à Polytechnique.org à {$full_name} dans les
   toutes prochaines heures (ceci est fait à la main pour vérifier qu'aucun utilisateur malveillant
   ne fasse mauvais usage de cette fonctionnalité...).
 </p>
 <p>
   <strong>Merci de ton aide à la reconnaissance de notre site !</strong> Tu seras informé par email de
-  l'inscription de {$prenom} {$nom} si notre camarade accepte de rejoindre la communauté des X sur
+  l'inscription de {$full_name} si notre camarade accepte de rejoindre la communauté des X sur
   le web !
 </p>
 
 {else}
 
-{if $prenom}
+{if $full_name}
 <h1>
-  Et si nous proposions à {$prenom} {$nom} de s'inscrire à Polytechnique.org ?
+  Et si nous proposions à {$full_name} de s'inscrire à Polytechnique.org ?
 </h1>
 
 <p>
@@ -61,7 +61,7 @@ peut sans aucun doute l'aider à se décider !
   proposition d'inscription.
 </p>
 <p>
-  Si tu es d'accord, merci d'indiquer ci-dessous l'adresse email de {$prenom} {$nom} si tu la
+  Si tu es d'accord, merci d'indiquer ci-dessous l'adresse email de {$full_name} si tu la
   connais.  Nous nous permettons d'attirer ton attention sur le fait que nous avons besoin d'être
   sûrs que cette adresse est bien la sienne, afin que la partie privée du site reste uniquement
   accessible aux seuls polytechniciens. Merci donc de ne nous donner ce renseignement uniquement si
@@ -69,15 +69,14 @@ peut sans aucun doute l'aider à se décider !
 </p>
 <p>
   Nous pouvons au choix lui écrire au nom de l'équipe Polytechnique.org, ou bien, si tu le veux
-  bien, en ton nom. A toi de choisir la solution qui te paraît la plus adaptée !! Une fois {$prenom}
-  {$nom} inscrit, nous t'enverrons un email pour te prévenir que son inscription a réussi.
+  bien, en ton nom. A toi de choisir la solution qui te paraît la plus adaptée !! Une fois
+  {$full_name} inscrit, nous t'enverrons un email pour te prévenir que son inscription a réussi.
 </p>
 
 <form method="post" action="{$platal->path}">
   {xsrf_token_field}
   <table class="bicol" summary="Fiche camarade">
-    <tr class="impair"><td>Nom&nbsp;:</td><td>{$nom}</td></tr>
-    <tr class="pair"><td>Prénom&nbsp;:</td><td>{$prenom}</td></tr>
+    <tr class="impair"><td>Nom&nbsp;:</td><td>{$full_name}</td></tr>
     <tr class="impair"><td>Promo&nbsp;:</td><td>{$promo}</td></tr>
     <tr class="pair">
       <td>Adresse email&nbsp;:</td>
index 15180f4..7af1a5d 100644 (file)
 </h1>
 
 <p>
-Photo actuelle de {$forlife}
+Photo actuelle de {$user->login()}
 </p>
 
-<img src="photo/{$forlife}" alt="[ PHOTO ]" />
+<img src="photo/{$user->login()}" alt="[ PHOTO ]" />
 <br />
 
 <p>
-<a href="admin/trombino/{$uid}/delete?token={xsrf_token}">Supprimer cette photo</a>
+<a href="admin/trombino/{$user->login()}/delete?token={xsrf_token}">Supprimer cette photo</a>
 </p>
 
 <p>
-<a href="admin/trombino/{$uid}/original">Voir sa photo de trombi récupérée à l'école (si disponible)</a>
+<a href="admin/trombino/{$user->login()}/original">Voir sa photo de trombi récupérée à l'école (si disponible)</a>
 </p>
 
-<form action="admin/trombino/{$uid}/new" method="post" enctype="multipart/form-data">
+<form action="admin/trombino/{$user->login()}/new" method="post" enctype="multipart/form-data">
   {xsrf_token_field}
   <div>
     <input name="userfile" type="file" size="20" maxlength="150" />
index 138fca4..ad3816d 100644 (file)
@@ -41,7 +41,7 @@ function chgMainWinLoc(strPage)
 
 <div id="fiche">
   <div id="photo" class="part">
-    {if $photo_url}<img alt="Photo de {$x.forlife}" src="{$photo_url}" width="{$x.x}"/>{/if}
+    {if $photo_url}<img alt="Photo de {$user->login()}" src="{$photo_url}" width="{$x.x}"/>{/if}
     {if $logged && ( $x.section|smarty:nodefaults || $x.binets_join|smarty:nodefaults || $x.gpxs_join|smarty:nodefaults)}
       <h2>À l'X...</h2>
       {if $x.section}<div><em class="intitule">Section&nbsp;: </em><span>{$x.section}</span></div>{/if}
@@ -57,27 +57,27 @@ function chgMainWinLoc(strPage)
   </div>
   <div id="fiche_identite" class="part">
     <div class="civilite">
-      {if $x.sexe}&bull;{/if}
-      {$x.prenom} {if $x.nom_usage eq ""}{$x.nom}{else}{$x.nom_usage} ({$x.nom}){/if}
+      {if $user->isFemale()}&bull;{/if}
+      {$user->fullName()}{if $x.nom_usage neq ""} ({$x.nom}){/if}
       {if $logged}
       {if $x.nickname} (alias {$x.nickname}){/if}
       {/if}
       {if $x.web}&nbsp;<a href="{$x.web}">{icon name="world_go" title="Site Web"}</a>{/if}
       {if $logged}
-      &nbsp;{if !$x.dcd}<a href="vcard/{$x.forlife}.vcf">{*
+      &nbsp;{if !$x.dcd}<a href="vcard/{$user->login()}.vcf">{*
         *}{icon name=vcard title="Afficher la carte de visite"}</a>{/if}
       {if !$x.is_contact}
-      <a href="javascript:chgMainWinLoc('carnet/contacts?action=ajouter&amp;user={$x.forlife}&amp;token={xsrf_token}')">
+      <a href="javascript:chgMainWinLoc('carnet/contacts?action=ajouter&amp;user={$user->login()}&amp;token={xsrf_token}')">
         {icon name=add title="Ajouter à mes contacts"}</a>
       {else}
-      <a href="javascript:chgMainWinLoc('carnet/contacts?action=retirer&amp;user={$x.forlife}&amp;token={xsrf_token}')">
+      <a href="javascript:chgMainWinLoc('carnet/contacts?action=retirer&amp;user={$user->login()}&amp;token={xsrf_token}')">
         {icon name=cross title="Retirer de mes contacts"}</a>
       {/if}
       {if hasPerm('admin')}
-      <a href="javascript:chgMainWinLoc('admin/user/{$x.forlife}')">
+      <a href="javascript:chgMainWinLoc('admin/user/{$user->login()}')">
         {icon name=wrench title="administrer user"}</a>
       {/if}
-      {if $x.forlife eq $smarty.session.forlife}
+      {if $user->login() eq $smarty.session.hruid}
       <a href="javascript:chgMainWinLoc('profile/edit')">{icon name="user_edit" title="Modifier ma fiche"}</a>
       {/if}
       {/if}
@@ -93,20 +93,20 @@ function chgMainWinLoc(strPage)
       {if $logged}
       <div class='email'>
         {if $x.dcd}
-        Décédé{if $x.sexe}e{/if} le {$x.deces|date_format}
+        Décédé{if $user->isFemale()}e{/if} le {$x.deces|date_format}
         {elseif !$x.actif}
         Ce{if $c.sexe}tte{/if} camarade n'a plus d'adresse de redirection valide,<br />
-        <a href="marketing/broken/{$x.forlife}" class="popup">clique ici si tu connais son adresse email !</a>
+        <a href="marketing/broken/{$user->login()}" class="popup">clique ici si tu connais son adresse email !</a>
         {elseif !$x.inscrit}
         Cette personne n'est pas inscrite à Polytechnique.org,<br />
-        <a href="marketing/public/{$x.user_id}" class="popup">clique ici si tu connais son adresse email !</a>
+        <a href="marketing/public/{$user->login()}" class="popup">clique ici si tu connais son adresse email !</a>
         {else}
         {if $virtualalias}
         <a href="mailto:{$virtualalias}">{$virtualalias}</a><br />
         {/if}
-        <a href="mailto:{$x.bestalias}@{#globals.mail.domain#}">{$x.bestalias}@{#globals.mail.domain#}</a>
-        {if $x.bestalias neq $x.forlife}<br />
-        <a href="mailto:{$x.forlife}@{#globals.mail.domain#}">{$x.forlife}@{#globals.mail.domain#}</a>
+        <a href="mailto:{$user->bestEmail()}">{$user->bestEmail()}</a>
+        {if $user->bestEmail() neq $user->forlifeEmail()}<br />
+        <a href="mailto:{$user->forlifeEmail()}">{$user->forlifeEmail()}</a>
         {/if}
         {/if}
       </div>
@@ -123,15 +123,15 @@ function chgMainWinLoc(strPage)
       {if $x.iso3166}
       <img src='images/flags/{$x.iso3166}.gif' alt='{$x.nationalite}' height='11' title='{$x.nationalite}' />&nbsp;
       {/if}
-      X {$x.promo}
-      {if ($x.promo_sortie-3 > $x.promo)}
+      X {$user->promo()}
+      {if $x.promo_sortie && ($x.promo_sortie-3 > $x.promo)}
         - X {math equation="a-b" a=$x.promo_sortie b=3}
       {/if}
       {if $x.applis_join}
         &nbsp;-&nbsp;Formation&nbsp;: {$x.applis_join|smarty:nodefaults}
       {/if}
       {if $logged && $x.is_referent}
-      [<a href="referent/{$x.forlife}" class='popup2'>Ma fiche référent</a>]
+      [<a href="referent/{$user->login()}" class='popup2'>Ma fiche référent</a>]
       {/if}
     </div>
   </div>
@@ -193,7 +193,7 @@ function chgMainWinLoc(strPage)
   <div class="part">
     <small>
     Cette fiche est publique et visible par tout internaute,<br />
-    vous pouvez aussi voir <a href="profile/private/{$x.forlife}?display=light">celle&nbsp;réservée&nbsp;aux&nbsp;X</a>.
+    vous pouvez aussi voir <a href="profile/private/{$user->login()}?display=light">celle&nbsp;réservée&nbsp;aux&nbsp;X</a>.
     </small>
   </div>
   {elseif $view eq 'ax'}
index 67096d0..9b509dc 100644 (file)
@@ -33,7 +33,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index d7f74cc..0dc1684 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 4c98b24..42a6b00 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index fb21d00..f77d251 100644 (file)
@@ -33,7 +33,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 0bf94c1..d1de067 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index aae8664..21ba9e1 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index bee60d7..730fbee 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 41a54c4..035c0c5 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index dce826d..5c9914b 100644 (file)
@@ -33,7 +33,7 @@
     <table id="suid" cellpadding="0" cellspacing="0">
       <tr>
         <td>
-          {$smarty.session.suid} ({$smarty.session.forlife})
+          {$smarty.session.suid} ({$smarty.session.hruid})
           [<a href="exit">exit</a>]
         </td>
       </tr>
index b634ca7..9c424f1 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid} 
     <div id="suid"> 
       <a href="exit"> 
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()}) 
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()}) 
       </a> 
     </div> 
     {/if} 
index 74049ab..8988cfd 100644 (file)
@@ -33,7 +33,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index 4696bc4..33c893b 100644 (file)
@@ -33,7 +33,7 @@
     <table id="suid" cellpadding="0" cellspacing="0">
       <tr>
         <td>
-          {$smarty.session.suid} ({$smarty.session.forlife})
+          {$smarty.session.suid} ({$smarty.session.hruid})
           [<a href="exit">exit</a>]
         </td>
       </tr>
index 9144454..8a0e715 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index cee1f4e..0a11efd 100644 (file)
@@ -34,7 +34,7 @@
     {if $smarty.session.suid}
     <div id="suid">
       <a href="exit">
-        Quitter le SU sur {$smarty.session.forlife} ({$smarty.session.perms->flags()})
+        Quitter le SU sur {$smarty.session.hruid} ({$smarty.session.perms->flags()})
       </a>
     </div>
     {/if}
index ab1561f..1febab4 100644 (file)
   <tr>
     <th>
       {if $smarty.session.core_rss_hash}
-      <a href='{$platal->ns}rss/{$smarty.session.forlife}/{$smarty.session.core_rss_hash}/rss.xml' style="display:block;float:right">
+      <a href='{$platal->ns}rss/{$smarty.session.hruid}/{$smarty.session.core_rss_hash}/rss.xml' style="display:block;float:right">
         {icon name=feed title='fil rss'}
       </a>
       {else}
index 961bd54..0dfe367 100644 (file)
@@ -67,7 +67,7 @@
       <div style="float: right">
       <small>
         Annonce proposée par
-        <a class="popup2" href="https://www.polytechnique.org/profile/{$art.forlife}">
+        <a class="popup2" href="https://www.polytechnique.org/profile/{$art.hruid}">
           {$art.prenom} {$art.nom} (X{$art.promo})
         </a>
       </small>
index edf1b49..b79e460 100644 (file)
 
 <h1>Demande d'inscription à {$asso.nom}</h1>
 
-{if $u && $is_admin && $show_form}
+{if $user && $is_admin && $show_form}
 
 <h2>
-  Demande de la part de&nbsp;: <a href="profile/{$u}" class="popup2">{$prenom} {$nom} (X{$promo})</a>
+  Demande de la part de&nbsp;: <a href="profile/{$user->login()}" class="popup2">{$user->fullName()} (X{$user->promo()})</a>
 </h2>
 
 {if $reason}
@@ -35,7 +35,7 @@
 </fieldset>
 {/if}
 
-<form action="{$platal->ns}subscribe/{$u}" method="post">
+<form action="{$platal->ns}subscribe/{$user->login()}" method="post">
   {xsrf_token_field}
   <table class="bicol">
     <tr>
@@ -90,7 +90,7 @@ Bien cordialement,
 
 --
 Ma fiche sur Polytechnique.org&nbsp;:
-https://www.polytechnique.org/profile/{$smarty.session.forlife}
+https://www.polytechnique.org/profile/{$smarty.session.hruid}
 </textarea>
   <div class="center">
     <input type="submit" name="inscrire" value="M'inscrire !" />
index 521bae3..324833d 100644 (file)
     </tr>
     {iterate from=$valid item=user}
     <tr>
-      <td><input type="checkbox" name="subs[{$user.forlife}]" value="1" class="select_sub" /></td>
-      <td><a href="profile/{$user.forlife}" class="popup2">{$user.prenom} {$user.nom} (X{$user.promo})</a></td>
+      <td><input type="checkbox" name="subs[{$user.hruid}]" value="1" class="select_sub" /></td>
+      <td><a href="profile/{$user.hruid}" class="popup2">{$user.prenom} {$user.nom} (X{$user.promo})</a></td>
       <td>{$user.date|date_format}</td>
-      <td><a href="{$platal->ns}subscribe/{$user.forlife}">{icon name=magnifier title="Détails"}</a></td>
+      <td><a href="{$platal->ns}subscribe/{$user.hruid}">{icon name=magnifier title="Détails"}</a></td>
     </tr>
     {/iterate}
   </table>
diff --git a/upgrade/hruid/03_hruid.sql b/upgrade/hruid/03_hruid.sql
new file mode 100644 (file)
index 0000000..49b0f78
--- /dev/null
@@ -0,0 +1,13 @@
+# 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:
similarity index 86%
rename from plugins/function.make_forlife.php
rename to upgrade/hruid/connect.db.inc.php
index faa8684..2e66895 100644 (file)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-function smarty_function_make_forlife($params, &$smarty)
-{
-  return make_forlife($params['prenom'], $params['nom'], $params['promo']);
-}
+ini_set('include_path', dirname(__FILE__).'/../../include:' . dirname(__FILE__).'/../../classes:/usr/share/php');
 
-/* vim: set expandtab enc=utf-8: */
+require_once 'xorg.inc.php';
+require_once 'xdb.php';
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
 ?>
diff --git a/upgrade/hruid/hruid.update.php b/upgrade/hruid/hruid.update.php
new file mode 100755 (executable)
index 0000000..8edb887
--- /dev/null
@@ -0,0 +1,20 @@
+#!/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";
+    }
+}
+?>
diff --git a/upgrade/hruid/update.sh b/upgrade/hruid/update.sh
new file mode 100755 (executable)
index 0000000..0e99620
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+. ../inc/pervasive.sh
+
+mailman_stop
+mailman_templates
+mailman_start
+
+
+###########################################################
+for sql in *.sql
+do
+    echo -n $sql
+    $MYSQL x4dat < $sql &>/dev/null || echo -n " ERROR"
+    echo .
+done
+
+###########################################################
+echo "Creating forlife ids for unregistered user (takes a while)."
+
+./hruid.update.php
+
+###########################################################
+