Merge commit 'origin/fusionax' into account
authorStéphane Jacob <sj@m4x.org>
Fri, 13 Nov 2009 22:36:17 +0000 (23:36 +0100)
committerStéphane Jacob <sj@m4x.org>
Fri, 13 Nov 2009 22:36:17 +0000 (23:36 +0100)
37 files changed:
1  2 
Makefile
classes/platalglobals.php.in
classes/platallogger.php
classes/xnetpage.php
classes/xnetsession.php
classes/xorgsession.php
configs/platal.ini
htdocs/javascript/.gitignore
include/banana/forum.inc.php
include/banana/hooks.inc.php
include/user.func.inc.php
include/validations/listes.inc.php
modules/admin.php
modules/auth.php
modules/auth/auth.inc.php
modules/carnet.php
modules/email.php
modules/events.php
modules/lists.php
modules/newsletter.php
modules/payment.php
modules/platal.php
modules/profile.php
modules/profile/groups.inc.php
modules/search.php
modules/stats.php
modules/survey/survey.inc.php
modules/xnetevents.php
modules/xnetevents/xnetevents.inc.php
modules/xnetgrp.php
modules/xnetgrp/feed.inc.php
modules/xnetlists.php
templates/admin/deces_promo.tpl
templates/carnet/mescontacts.tpl
templates/emails/send.tpl
templates/xnet/skin.tpl
templates/xnetevents/edit.tpl

diff --cc Makefile
+++ b/Makefile
@@@ -26,11 -26,8 +26,11 @@@ ende
  
  all: build
  
- build: core conf banana wiki openid medals jquery
+ build: core conf static banana wiki openid medals jquery
  
 +check:
 +      @!(find . -name '*.php' -exec php -l {} ";" | grep -v 'No syntax errors detected')
 +
  q:
        @echo -e "Code statistics\n"
        @sloccount $(filter-out wiki/ spool/, $(wildcard */)) 2> /dev/null | egrep '^[a-z]*:'
Simple merge
@@@ -71,8 -74,8 +71,8 @@@ class PlatalLogger extends PlLogge
              $proxy = 'proxy';
          }
  
-         XDB::execute("INSERT INTO  logger.sessions
 -        XDB::execute("INSERT INTO #logger#.sessions
 -                         SET uid={?}, host={?}, ip={?}, forward_ip={?}, forward_host={?}, browser={?}, suid={?}, flags={?}",
++        XDB::execute("INSERT INTO  #logger#.sessions
 +                              SET  uid={?}, host={?}, ip={?}, forward_ip={?}, forward_host={?}, browser={?}, suid={?}, flags={?}",
                       $uid, $host, ip_to_uint($ip), ip_to_uint($forward_ip), $forward_host, $browser, $suid, $proxy);
          if ($forward_ip) {
              $this->proxy_ip = $ip;
      public function log($action, $data = null)
      {
          if (isset($this->actions[$action])) {
-             XDB::execute("INSERT INTO  logger.events
 -            XDB::execute("INSERT INTO #logger#.events
 -                             SET session={?}, action={?}, data={?}",
++            XDB::execute("INSERT INTO  #logger#.events
 +                                  SET  session={?}, action={?}, data={?}",
                           $this->session, $this->actions[$action], $data);
          } else {
              trigger_error("PlLogger: unknown action, $action", E_USER_WARNING);
@@@ -138,10 -141,11 +141,10 @@@ function list_all_my_groups($params
      if (!S::logged()) {
          return;
      }
 -    $res = XDB::iterRow(
 -            "SELECT  a.nom, a.diminutif
 -               FROM  #groupex#.asso    AS a
 -         INNER JOIN  #groupex#.membres AS m ON m.asso_id = a.id
 -              WHERE  m.uid={?}", S::v('uid'));
 +    $res = XDB::iterRow('SELECT  a.nom, a.diminutif
-                            FROM  groupex.asso    AS a
-                      INNER JOIN  groupex.membres AS m ON m.asso_id = a.id
++                           FROM  #groupex#.asso    AS a
++                     INNER JOIN  #groupex#.membres AS m ON m.asso_id = a.id
 +                          WHERE  m.uid = {?}', S::i('uid'));
      $links = '<a href="exit">déconnexion</a>';
      $html = '<div>Mes groupes (' . $links . ') :</div>';
      while (list($nom, $mini) = $res->next()) {
Simple merge
@@@ -191,24 -206,17 +191,24 @@@ class XorgSession extends PlSessio
          }
  
          // Retrieves main user properties.
 -        $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,
 -                                    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,
 -                                    UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
 -                              FROM  auth_user_md5   AS u
 -                        INNER JOIN  auth_user_quick AS q  USING(user_id)
 -                         LEFT JOIN  gapps_accounts  AS g  ON (u.user_id = g.l_userid AND g.g_status = 'active')
 -                         LEFT JOIN  #logger#.last_sessions AS ls ON (ls.uid = u.user_id)
 +        /** TODO: Move needed informations to account tables */
 +        /** TODO: Currently suppressed data are matricule, promo */
 +        /** TODO: Use the User object to fetch all this */
 +        $res  = XDB::query("SELECT  a.uid, a.hruid, a.display_name, a.full_name,
 +                                    a.sex = 'female' AS femme, a.email_format,
 +                                    a.token, FIND_IN_SET('watch', a.flags) AS watch_account,
 +                                    UNIX_TIMESTAMP(fp.last_seen) AS banana_last, UNIX_TIMESTAMP(w.last) AS watch_last,
 +                                    a.last_version, g.g_account_name IS NOT NULL AS googleapps,
 +                                    UNIX_TIMESTAMP(s.start) AS lastlogin, s.host,
 +                                    a.is_admin, at.perms
 +                              FROM  accounts        AS a
 +                        INNER JOIN  account_types   AS at ON(a.type = at.type)
 +                        INNER JOIN  watch           AS w  ON(w.uid = a.uid)
 +                         LEFT JOIN  forum_profiles  AS fp ON(fp.uid = a.uid)
 +                         LEFT JOIN  gapps_accounts  AS g  ON(a.uid = g.l_userid AND g.g_status = 'active')
-                          LEFT JOIN  logger.last_sessions AS ls ON (ls.uid = a.uid)
-                          LEFT JOIN  logger.sessions AS s  ON(s.id = ls.id)
++                         LEFT JOIN  #logger#.last_sessions AS ls ON (ls.uid = a.uid)
+                          LEFT JOIN  #logger#.sessions AS s  ON(s.id = ls.id)
 -                             WHERE  u.user_id = {?} AND u.perms IN('admin', 'user')", $uid);
 +                             WHERE  a.uid = {?} AND a.state = 'active'", $user->id());
          if ($res->numRows() != 1) {
              return false;
          }
Simple merge
@@@ -1,4 -1,6 +1,7 @@@
+ # Versioning links
+ /0.10.*
  # jQuery and its plugins are downloaded by the Makefile
  /jquery.*js
 +/ui.*js
  !/jquery.autocomplete.js
@@@ -233,15 -214,33 +233,15 @@@ class ForumsBanana extends Banan
              }
          }
  
 -        $req = XDB::query("
 -            SELECT  nom, mail, sig,
 -                    FIND_IN_SET('threads', flags),
 -                    FIND_IN_SET('automaj', flags),
 -                    FIND_IN_SET('xface', flags),
 -                    tree_unread,
 -                    tree_read
 -              FROM  #forums#.profils
 -             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::user()->forlifeEmail();
 -            $sig   = $nom.' ('.S::v('promo').')';
 -            $disp  = 0;
 -            $maj   = 0;
 -            $xface = 0;
 -            $unread = 'o';
 -            $read  = 'dg';
 -        }
 -        $page->assign('nom' ,  $nom);
 -        $page->assign('mail',  $mail);
 -        $page->assign('sig',   $sig);
 -        $page->assign('disp',  $disp);
 -        $page->assign('maj',   $maj);
 -        $page->assign('xface', $xface);
 -        $page->assign('unread', $unread);
 -        $page->assign('read', $read);
 +        $infos = $this->fetchProfile();
-         $page->assign('nom' ,  $infos['name']);
-         $page->assign('mail',  $infos['mail']);
-         $page->assign('sig',   $infos['sig']);
-         $page->assign('disp',  $infos['threads']);
-         $page->assign('maj',   $infos['maj']);
-         $page->assign('xface', $infos['xface']);
++        $page->assign('nom' ,   $infos['name']);
++        $page->assign('mail',   $infos['mail']);
++        $page->assign('sig',    $infos['sig']);
++        $page->assign('disp',   $infos['threads']);
++        $page->assign('maj',    $infos['maj']);
++        $page->assign('xface',  $infos['xface']);
 +        $page->assign('unread', $infos['tree_unread']);
-         $page->assign('read', $infos['tree_read']);
++        $page->assign('read',   $infos['tree_read']);
          return null;
      }
  }
@@@ -189,13 -185,12 +189,13 @@@ function hook_getXFace($headers
          return false;
      }
      if (isset($headers['x-face'])) {
 -        $res = XDB::query("SELECT  p.uid
 -                             FROM  #forums#.profils AS p
 -                       INNER JOIN  #x4dat#.aliases  AS a ON (p.uid = a.id)
 -                            WHERE  FIND_IN_SET('xface', p.flags) AND a.alias = {?}",
 -                          $login);
 +        $user = User::getSilent($login);
-         $res = XDB::query('SELECT  pf.uid
++        $res = XDB::query("SELECT  pf.uid
 +                             FROM  forum_profiles AS pf
-                             WHERE  pf.uid = {?} AND FIND_IN_SET(\'xface\', pf.flags)',
++                            WHERE  pf.uid = {?} AND FIND_IN_SET('xface', pf.flags)",
 +                          $user->id());
          if ($res->numRows()) {
 +            // User wants his xface to be showed, fallback to default handler
              return false;
          }
      }
@@@ -42,14 -41,16 +42,14 @@@ function user_clear_all_subs($user_id, 
                               'user_id' => array('requests', 'user_changes'));
  
      if ($really_del) {
-         array_push($tables_to_clear['uid'], 'emails', 'groupex.membres', 'contacts', 'adresses', 'profile_phones',
+         array_push($tables_to_clear['uid'], 'emails', '#groupex#.membres', 'contacts', 'adresses', 'profile_phones',
 -                                            'photo', 'perte_pass', 'langues_ins', '#forums#.abos', 'forums.profils');
 -        array_push($tables_to_clear['user_id'], 'newsletter_ins', 'auth_user_quick', 'binets_ins');
 +                                            'photo', 'perte_pass', 'langues_ins', 'forum_subs', 'forum_profiles');
 +        array_push($tables_to_clear['user_id'], 'newsletter_ins', 'binets_ins');
          $tables_to_clear['id'] = array('aliases');
          $tables_to_clear['contact'] = array('contacts');
 -        XDB::execute("UPDATE auth_user_md5
 -                         SET date_ins = 0, promo_sortie = 0, nom_usage = '',  password = '', perms = 'pending',
 -                             nationalite = '', nationalite2 = '', nationalite3 = '', cv = '', section = 0,
 -                             date = 0, smtppass = '', mail_storage = ''
 -                       WHERE user_id = {?}", $uid);
 +        XDB::execute("UPDATE accounts
 +                         SET registration_date = 0, state = 'pending', password = NULL, weak_password = NULL, token = NULL, is_admin = 0
 +                       WHERE uid = {?}", $uid);
          XDB::execute("DELETE virtual.* FROM virtual INNER JOIN virtual_redirect AS r USING(vid) WHERE redirect = {?}",
                       $alias.'@'.$globals->mail->domain);
          XDB::execute("DELETE virtual.* FROM virtual INNER JOIN virtual_redirect AS r USING(vid) WHERE redirect = {?}",
Simple merge
@@@ -405,201 -398,264 +405,200 @@@ class AdminModule extends PLModul
              }
          }
  
 -        // 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);
 -
 -        // Processes admin requests, if any.
 -        foreach($_POST as $key => $val) {
 -            S::assert_xsrf_token();
 -
 -            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 "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");
 -                        break;
 -                    }
 -
 -                    // 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 {
 -                            $page->trigError("Impossible d'ajouter l'alias '$alias@$domain', 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("Impossible d'ajouter l'alias '$alias', il est probablement déjà attribué");
 -                        }
 -                    } else {
 -                        $page->trigError("Le domaine '$domain' n'est pas valide");
 -                    }
 -                    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;
 -
 -                // 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;
 -                    }
 -
 -                    // 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();
 -
 -                        // Also serve a reminder to the admin: disabling an account
 -                        // does not deactivate email forwarding.
 -                        $page->trigWarning("N'oubliez pas, le cas échéant, de désactiver les redirections et le compte GoogleApps de l'utilisateur.");
 -                    }
 -
 -                    // 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();
 -
 -                        // Redacts the password in the notification, to avoid transmitting
 -                        // sensitive information by email.
 -                        $new_fields['password'] = ($old_fields['password'] != $new_fields['password'] ? 'new' : 'old');
 -                        $old_fields['password'] = 'old';
 -
 -                        // Notifies the admins of the profile update.
 -                        $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();
 -
 -                        $globals->updateNbIns();
 -                        $page->trigSuccess("La mise à jour a été faite avec succès.");
 -                    } else {
 -                        $page->trigError("La mise à jour a échoué. S'il te plaît, vérifie les valeurs.");
 -                    }
 -
 -                    // 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);
 -                    }
 -
 -                    // 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($user);
 -                            if ($account->active() && $account->sync_password) {
 -                                $account->set_password($pass_encrypted);
 -                            }
 -                        }
 -                    }
 -
 -
 -                    // Reloads the user profile, to ensure the latest version will
 -                    // be served to the administrator.
 -                    $mr = XDB::query($userinfo_query, $user->id())->fetchOneAssoc();
 +        // Account Form {{{
 +        $to_update = array();
 +        if (Post::has('disable_weak_access')) {
 +            $to_update['weak_password'] = null;
 +        } else if (Post::has('update_account')) {
 +            if (Post::s('full_name') != $user->fullName()) {
 +                // XXX: Update profile if a profile is associated
 +                $to_update['full_name'] = Post::s('full_name');
 +            }
 +            if (Post::s('display_name') != $user->displayName()) {
 +                // XXX: Update profile if a profile is associated
 +                $to_update['display_name'] = Post::s('display_name');
 +            }
 +            if (Post::s('sex') != ($user->isFemale() ? 'female' : 'male')) {
 +                $to_update['sex'] = Post::s('sex');
 +            }
 +            if (!Post::blank('hashpass')) {
 +                $to_update['password'] = Post::s('hashpass');
 +                // TODO: Propagate the password update to GoogleApps, when required. Eg:
 +                // $account = new GoogleAppsAccount($user);
 +                // if ($account->active() && $account->sync_password) {
 +                //     $account->set_password($pass_encrypted);
 +                // }
 +            }
 +            if (!Post::blank('weak_password')) {
 +                $to_update['weak_password'] = Post::s('weak_password');
 +            }
 +            if (Post::i('token_access', 0) != ($user->token_access ? 1 : 0)) {
 +                $to_update['token'] = Post::i('token_access') ? rand_url_id(16) : null;
 +            }
 +            if (Post::i('skin', 0) != $user->skin) {
 +                $to_update['skin'] = Post::i('skin', 0);
 +                if ($to_update['skin'] == 0) {
 +                    $to_update['skin'] = null;
 +                }
 +            }
 +            if (Post::s('state') != $user->state) {
 +                $to_update['state'] = Post::s('state');
 +            }
 +            if (Post::i('is_admin', 0) != ($user->is_admin ? 1 : 0)) {
 +                $to_update['is_admin'] = Post::b('is_admin');
 +            }
 +            if (Post::s('type') != $user->type) {
 +                $to_update['type'] = Post::s('type');
 +            }
 +            if (Post::i('watch', 0) != ($user->watch ? 1 : 0)) {
 +                $to_update['flags'] = new PlFlagset();
 +                $to_update['flags']->addFlag('watch', Post::i('watch'));
 +            }
 +            if (Post::t('comment') != $user->comment) {
 +                $to_update['comment'] = Post::blank('comment') ? null : Post::t('comment');
 +            }
 +        }
 +        if (!empty($to_update)) {
 +            // TODO: fetch the initial values of the fields, and eventually send
 +            // a summary of the changes to an admin.
 +            $set = array();
 +            foreach ($to_update as $k => $value) {
 +                $set[] = XDB::format($k . ' = {?}', $value);
 +            }
 +            XDB::execute('UPDATE  accounts
 +                             SET  ' . implode(', ', $set) . ' 
 +                           WHERE  uid = ' . XDB::format('{?}', $user->id()));
 +            $page->trigSuccess('Données du compte mise à jour avec succès');
 +            $user = User::getWithUID($user->id());
 +        }
 +        // }}}
 +
 +        // Profile form {{{
 +        if (Post::has('add_profile') || Post::has('del_profile') || Post::has('owner')) {
 +            if (Post::i('del_profile', 0) != 0) {
 +                XDB::execute('DELETE FROM  account_profiles
 +                                    WHERE  uid = {?} AND pid = {?}',
 +                             $user->id(), Post::i('del_profile'));
 +            } else if (!Post::blank('new_profile')) {
 +                $profile = Profile::get(Post::t('new_profile'));
 +                if (!$profile) {
 +                    $page->trigError('Le profil ' . Post::t('new_profile') . ' n\'existe pas');
 +                } else {
 +                    XDB::execute('INSERT IGNORE INTO  account_profiles (uid, pid)
 +                                              VALUES  ({?}, {?})',
 +                                 $user->id(), $profile->id());
 +                }
 +            }
 +            XDB::execute('UPDATE  account_profiles
 +                             SET  perms = IF(pid = {?}, CONCAT(perms, \',owner\'), REPLACE(perms, \'owner\', \'\'))
 +                           WHERE  uid = {?}',
 +                         Post::i('owner'), $user->id());
 +        }
 +        // }}}
  
 -                    break;
 +        // Email forwards form {{{
 +        require_once("emails.inc.php");
 +        $redirect = ($registered ? new Redirect($user) : null);
 +        if (Post::has('add_fwd')) {
 +            $email = Post::t('email');
 +            if (!isvalid_email_redirection($email)) {
 +                $page->trigError("Email non valide: $email");
 +            } else {
 +                $redirect->add_email($email);
 +                $page->trigSuccess("Ajout de $email effectué");
 +            }
 +        } else if (!Post::blank('del_fwd')) {
 +            $redirect->delete_email(Post::t('del_fwd'));
 +        } else if (!Post::blank('activate_fwd')) {
 +            $redirect->modify_one_email(Post::t('activate_fwd', true));
 +        } else if (!Post::blank('deactivate_fwd')) {
 +            $redirect->modify_one_email(Post::t('deactivate_fwd', false));
 +        } else if (Post::has('disable_fwd')) {
 +            $redirect->disable();
 +        } else if (Post::has('enable_fwd')) {
 +            $redirect->enable();
 +        } else if (!Post::blank('clean_fwd')) {
 +            $redirect->clean_errors(Post::t('clean_fwd'));
 +        }
 +        // }}}
 +
 +        // Email alias form {{{
 +        if (Post::has('add_alias')) {
 +            // Splits new alias in user and fqdn.
 +            $alias = Env::t('email');
 +            if (strpos($alias, '@') !== false) {
 +                list($alias, $domain) = explode('@', $alias);
 +            } else {
 +                $domain = $globals->mail->domain;
 +            }
  
 -                // User re-registration.
 -                case "u_kill":
 -                    require_once('user.func.inc.php');
 -                    user_clear_all_subs($user->id());
 -                    $globals->updateNbIns();
 -                    $page->trigSuccess($user->login() . ' a été désinscrit&nbsp;!');
 -
 -                    $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;
 +            // Checks for alias' user validity.
 +            if (!preg_match('/[-a-z0-9\.]+/s', $alias)) {
 +                $page->trigError("'$alias' n'est pas un alias valide");
 +            }
  
 -                // 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;
 +            // 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 {
 +                    $page->trigError("Impossible d'ajouter l'alias '$alias@$domain', 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);
 +                $page->trigSuccess("Nouvel alias '$alias' ajouté");
 +            } else {
 +                $page->trigError("Le domaine '$domain' n'est pas valide");
              }
 +        } else if (!Post::blank('del_alias')) {
 +            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é");
 +        } else if (!Post::blank('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);
          }
 +        // }}}
 +
 +        // Forum form {{{
 +        if (Post::has('b_edit')) {
 +            XDB::execute("DELETE FROM  forum_innd
 +                                WHERE  uid = {?}", $user->id());
 +            if (Env::v('write_perm') != "" || Env::v('read_perm') != ""  || Env::v('commentaire') != "" ) {
 +                XDB::execute("INSERT INTO  forum_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());
 +            }
 +        }
 +        // }}}
 +
 +
 +        $page->addJsLink('ui.core.js');
 +        $page->addJsLink('ui.tabs.js');
  
          // Displays last login and last host information.
          $res = XDB::query("SELECT  start, host
-                              FROM  logger.sessions
+                              FROM  #logger#.sessions
                              WHERE  uid = {?} AND suid = 0
                           ORDER BY  start DESC
                              LIMIT  1", $user->id());
          $page->setTitle('Administration - Décédés');
  
          $res = XDB::iterator(
 -                "SELECT  u.promo, u.nom, u.prenom, u.deces, u.hruid, DATE(MAX(s.start)) AS last
 -                   FROM  #x4dat#.auth_user_md5 AS u
 -              LEFT JOIN  #logger#.sessions     AS s ON (s.uid = u.user_id AND suid = 0)
 -                  WHERE  perms IN ('admin', 'user') AND deces <> 0
 -               GROUP BY  u.user_id
 -               ORDER BY  u.promo, u.nom");
 +                "SELECT  a.hruid, pd.promo, p.ax_id, pd.directory_name, p.deathdate, DATE(MAX(s.start)) AS last
-                    FROM  accounts AS a
-              INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))
-              INNER JOIN  profiles AS p ON (p.pid = ap.pid)
-              INNER JOIN  profile_display AS pd ON (pd.pid = p.pid)
-               LEFT JOIN  logger.sessions AS s ON (s.uid = a.uid AND suid = 0)
++                   FROM  #x4dat#.accounts         AS a
++             INNER JOIN  #x4dat#.account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))
++             INNER JOIN  #x4dat#.profiles         AS p ON (p.pid = ap.pid)
++             INNER JOIN  #x4dat#.profile_display  AS pd ON (pd.pid = p.pid)
++              LEFT JOIN  #logger#.sessions        AS s ON (s.uid = a.uid AND suid = 0)
 +                  WHERE  a.state = 'active' AND p.deathdate IS NOT NULL
 +               GROUP BY  a.uid
 +               ORDER BY  pd.promo, pd.sort_name");
          $page->assign('dead', $res);
      }
  
          $table_editor->describe('text', 'Description du problème', false);
          $table_editor->apply($page, $action, $id);
      }
 -    function handler_logger_actions(&$page, $action = 'list', $id = null) {
 +
 +    function handler_logger_actions(&$page, $action = 'list', $id = null)
 +    {
          $page->setTitle('Administration - Actions');
          $page->assign('title', 'Gestion des actions de logger');
-         $table_editor = new PLTableEditor('admin/logger/actions','logger.actions','id');
+         $table_editor = new PLTableEditor('admin/logger/actions','#logger#.actions','id');
          $table_editor->describe('text','intitulé',true);
          $table_editor->describe('description','description',true);
          $table_editor->apply($page, $action, $id);
              $sql = "SELECT  w.ip, IF(s.ip IS NULL,
                                       IF(w.ip = s2.ip, s2.host, s2.forward_host),
                                       IF(w.ip = s.ip, s.host, s.forward_host)),
 -                            w.mask, w.detection, w.state, u.hruid
 -                      FROM  #x4dat#.ip_watch      AS w
 -                 LEFT JOIN  #logger#.sessions     AS s  ON (s.ip = w.ip)
 -                 LEFT JOIN  #logger#.sessions     AS s2 ON (s2.forward_ip = w.ip)
 -                 LEFT JOIN  #x4dat#.auth_user_md5 AS u  ON (u.user_id = s.uid)
 -                  GROUP BY  w.ip, u.hruid
 -                  ORDER BY  w.state, w.ip, u.hruid";
 +                            w.mask, w.detection, w.state, a.hruid
-                       FROM  ip_watch        AS w
-                  LEFT JOIN  logger.sessions AS s  ON (s.ip = w.ip)
-                  LEFT JOIN  logger.sessions AS s2 ON (s2.forward_ip = w.ip)
-                  LEFT JOIN  accounts        AS a  ON (a.uid = s.uid)
++                      FROM  #x4dat#.ip_watch  AS w
++                 LEFT JOIN  #logger#.sessions AS s  ON (s.ip = w.ip)
++                 LEFT JOIN  #logger#.sessions AS s2 ON (s2.forward_ip = w.ip)
++                 LEFT JOIN  #x4dat#.accounts  AS a  ON (a.uid = s.uid)
 +                  GROUP BY  w.ip, a.hruid
 +                  ORDER BY  w.state, w.ip, a.hruid";
              $it = Xdb::iterRow($sql);
  
              $table = array();
              $page->assign('table', $table);
          } elseif ($action == 'edit') {
              $sql = "SELECT  w.detection, w.state, w.last, w.description, w.mask,
 -                            u1.hruid AS edit, u2.hruid AS hruid, s.host
 -                      FROM  #x4dat#.ip_watch      AS w
 -                 LEFT JOIN  #x4dat#.auth_user_md5 AS u1 ON (u1.user_id = w.uid)
 -                 LEFT JOIN  #logger#.sessions     AS s  ON (w.ip = s.ip)
 -                 LEFT JOIN  #x4dat#.auth_user_md5 AS u2 ON (u2.user_id = s.uid)
 +                            a1.hruid AS edit, a2.hruid AS hruid, s.host
-                       FROM  ip_watch        AS w
-                  LEFT JOIN  accounts        AS a1 ON (a1.uid = w.uid)
-                  LEFT JOIN  logger.sessions AS s  ON (w.ip = s.ip)
-                  LEFT JOIN  accounts        AS a2 ON (a2.uid = s.uid)
++                      FROM  #x4dat#.ip_watch  AS w
++                 LEFT JOIN  #x4dat#.accounts  AS a1 ON (a1.uid = w.uid)
++                 LEFT JOIN  #logger#.sessions AS s  ON (w.ip = s.ip)
++                 LEFT JOIN  #x4dat#.accounts  AS a2 ON (a2.uid = s.uid)
                       WHERE  w.ip = {?}
 -                  GROUP BY  u2.hruid
 -                  ORDER BY  u2.hruid";
 +                  GROUP BY  a2.hruid
 +                  ORDER BY  a2.hruid";
              $it = Xdb::iterRow($sql, ip_to_uint($ip));
  
              $props = array();
@@@ -68,9 -66,29 +68,9 @@@ class AuthModule extends PLModul
                      }
                  }
              }
 -
 -            $where = join(' OR ',$membres);
 -
 -            $all = XDB::iterRow(
 -                    "SELECT  u.prenom,u.nom,a.alias
 -                       FROM  auth_user_md5 AS u
 -                 INNER JOIN  aliases       AS a ON ( u.user_id = a.id AND a.type!='homonyme' )
 -                      WHERE  $where
 -                   ORDER BY  nom");
 -
 -            $res = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<membres>\n\n";
 -
 -            while (list ($prenom1,$nom1,$email1) = $all->next()) {
 -                    $res .= "<membre>\n";
 -                    $res .= "\t<nom>$nom1</nom>\n";
 -                    $res .= "\t<prenom>$prenom1</prenom>\n";
 -                    $res .= "\t<email>$email1</email>\n";
 -                    $res .= "</membre>\n\n";
 -            }
 -
              $res .= "</membres>\n\n";
  
-             header('Content-Type: text/xml; charset="UTF-8"');
+             pl_content_headers("text/xml");
              echo $res;
          }
          exit;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -192,19 -196,19 +192,19 @@@ class PaymentModule extends PLModul
          }
  
          echo ($ref = $matches[1]);
 -        $res = XDB::query("SELECT  mail,text,confirmation
 +        $res = XDB::query("SELECT  mail, text, confirmation
-                              FROM  paiement.paiements
+                              FROM  #paiement#.paiements
                              WHERE  id={?}", $ref);
 -        if (!list($conf_mail,$conf_title,$conf_text) = $res->fetchOneRow()) {
 +        if (!list($conf_mail, $conf_title, $conf_text) = $res->fetchOneRow()) {
              cb_erreur("référence de commande inconnue");
          }
  
          /* on extrait le code de retour */
          if ($champ906 != "0000") {
 -            $res = XDB::query("SELECT  rcb.text,c.id,c.text
 +            $res = XDB::query('SELECT  rcb.text, c.id, c.text
-                                  FROM  paiement.codeRCB AS rcb
-                             LEFT JOIN  paiement.codeC   AS c ON (rcb.codeC = c.id)
+                                  FROM  #paiement#.codeRCB AS rcb
 -                            LEFT JOIN  #paiement#.codeC   AS c ON rcb.codeC=c.id
 -                                WHERE  rcb.id={?}", $champ906);
++                            LEFT JOIN  #paiement#.codeC   AS c ON (rcb.codeC = c.id)
 +                                WHERE  rcb.id = {?}', $champ906);
              if (list($rcb_text, $c_id, $c_text) = $res->fetchOneRow()) {
                  cb_erreur("erreur lors du paiement : $c_text ($c_id)");
              } else{
          }
  
          /* on fait l'insertion en base de donnees */
-         XDB::execute("INSERT INTO  paiement.transactions (id, uid, ref, fullref, montant, cle, comment)
 -        XDB::execute("INSERT INTO  #paiement#.transactions (id,uid,ref,fullref,montant,cle,comment)
 -                           VALUES  ({?},{?},{?},{?},{?},{?},{?})",
 -                     $champ901, $uid, $ref, $champ200, $montant, $champ905,Env::v('comment'));
++        XDB::execute("INSERT INTO  #paiement#.transactions (id, uid, ref, fullref, montant, cle, comment)
 +                           VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?})",
 +                     $champ901, $user->id(), $ref, $champ200, $montant, $champ905, Env::v('comment'));
  
          // We check if it is an Xnet payment and then update the related ML.
          $res = XDB::query('SELECT  eid
          }
  
          $ref = $matches[1];
 -        $res = XDB::query("SELECT  mail,text,confirmation
 +        $res = XDB::query("SELECT  mail, text, confirmation
-                              FROM  paiement.paiements
+                              FROM  #paiement#.paiements
 -                            WHERE  id={?}", $ref);
 +                            WHERE  id = {?}", $ref);
          if (!list($conf_mail,$conf_title,$conf_text) = $res->fetchOneRow()) {
              paypal_erreur("référence de commande inconnue");
          }
  
          /* on fait l'insertion en base de donnees */
-         XDB::execute("INSERT INTO  paiement.transactions (id, uid, ref, fullref, montant, cle, comment)
 -        XDB::execute("INSERT INTO  #paiement#.transactions (id,uid,ref,fullref,montant,cle,comment)
 -                           VALUES  ({?},{?},{?},{?},{?},{?},{?})",
 -                    $no_transaction, $uid, $ref, $fullref, $montant, $clef, Env::v('comment'));
++        XDB::execute("INSERT INTO  #paiement#.transactions (id, uid, ref, fullref, montant, cle, comment)
 +                           VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?})",
 +                    $no_transaction, $user->id(), $ref, $fullref, $montant, $clef, Env::v('comment'));
  
          // We check if it is an Xnet payment and then update the related ML.
          $res = XDB::query('SELECT  eid
          foreach($tit as $foo) {
              $pid = $foo['id'];
              if (may_update()) {
 -                $res = XDB::query("SELECT  IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom,
 -                                           u.prenom, u.promo, a.alias, timestamp AS `date`, t.comment, montant
 -                                     FROM  {$globals->money->mpay_tprefix}transactions AS t
 -                               INNER JOIN  auth_user_md5  AS u ON ( t.uid = u.user_id )
 -                               INNER JOIN  aliases        AS a ON ( t.uid = a.id AND a.type='a_vie' )
 -                                    WHERE  ref = {?} ".$orderby, $pid);
 -                    $trans[$pid] = $res->fetchAllAssoc();
 -                    $sum = 0;
 -                    foreach ($trans[$pid] as $i => $t) {
 -                        $sum += strtr(substr($t['montant'], 0, strpos($t['montant'], 'EUR')), ',', '.');
 -                        $trans[$pid][$i]['montant'] = str_replace('EUR', '€', $t['montant']);
 -                    }
 -                    $trans[$pid][] = array('nom' => 'somme totale',
 -                                           'montant' => strtr($sum, '.', ',').' €');
 +                $res = XDB::query('SELECT  t.uid, timestamp AS `date`, t.comment, montant
 +                                     FROM  ' . $globals->money->mpay_tprefix . 'transactions AS t
 +                                    WHERE  t.ref = {?}', $pid);
 +                $trans[$pid] = User::getBulkUsersWithUIDs($res->fetchAllAssoc(), 'uid', 'user');
 +                $sum = 0;
 +                foreach ($trans[$pid] as $i => $t) {
 +                    $sum += strtr(substr($t['montant'], 0, strpos($t['montant'], 'EUR')), ',', '.');
 +                    $trans[$pid][$i]['montant'] = str_replace('EUR', '€', $t['montant']);
 +                }
 +                $trans[$pid][] = array('nom' => 'somme totale',
 +                                       'montant' => strtr($sum, '.', ',').' €');
              }
              $res = XDB::iterRow("SELECT e.eid, e.short_name, e.intitule, ep.nb, ei.montant, ep.paid
-                                    FROM groupex.evenements AS e
-                               LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND uid = {?})
-                              INNER JOIN groupex.evenements_items AS ei ON (ep.eid = ei.eid AND ep.item_id = ei.item_id)
+                                    FROM #groupex#.evenements AS e
+                               LEFT JOIN #groupex#.evenements_participants AS ep ON (ep.eid = e.eid AND uid = {?})
+                              INNER JOIN #groupex#.evenements_items AS ei ON (ep.eid = ei.eid AND ep.item_id = ei.item_id)
                                    WHERE e.paiement_id = {?}",
                                   S::v('uid'), $pid);
              $event[$pid] = array();
Simple merge
Simple merge
@@@ -109,14 -109,14 +109,14 @@@ class ProfileGroups extends ProfilePag
      public function _prepare(PlPage &$page, $id)
      {
          $page->assign('mygroups', XDB::iterator("SELECT  a.nom, a.site, a.diminutif, a.unsub_url, a.pub, m.perms
-                                                    FROM  groupex.asso    AS a
-                                              INNER JOIN  groupex.membres AS m ON (m.asso_id = a.id)
+                                                    FROM  #groupex#.asso    AS a
+                                              INNER JOIN  #groupex#.membres AS m ON (m.asso_id = a.id)
                                                    WHERE  m.uid = {?} AND (a.cat = 'GroupesX' OR a.cat = 'Institutions')",
 -                                                  S::i('uid')));
 +                                                $this->pid()));
          $page->assign('listgroups', XDB::iterator("SELECT  a.nom, a.diminutif, a.sub_url,
                                                             IF (a.cat = 'Institutions', a.cat, d.nom) AS dom
-                                                      FROM  groupex.asso  AS a
-                                                 LEFT JOIN  groupex.dom   AS d ON (d.id = a.dom)
+                                                      FROM  #groupex#.asso  AS a
+                                                 LEFT JOIN  #groupex#.dom   AS d ON (d.id = a.dom)
                                                      WHERE  a.inscriptible != 0
                                                             AND (a.cat = 'GroupesX' OR a.cat = 'Institutions')
                                                   ORDER BY  a.cat, a.dom, a.nom"));
@@@ -429,11 -431,11 +429,11 @@@ class SearchModule extends PLModul
              $page->assign('onchange', 'changeCountry(this.value)');
              break;
            case 'fonction':
 -            $db = '`fonctions_def`';
 -            $field = '`fonction_fr`';
 +            $db = 'fonctions_def';
 +            $field = 'fonction_fr';
              break;
            case 'diploma':
-             header('Content-Type: text/xml; charset="UTF-8"');
+             pl_content_headers("text/xml");
              $this->get_diplomas();
              $page->changeTpl('search/adv.grade.form.tpl', NO_SKIN);
              return;
Simple merge
Simple merge
@@@ -116,18 -116,20 +116,18 @@@ class XnetEventsModule extends PLModul
          }
  
          $page->assign('archive', $archive);
 -        $evenements = XDB::iterator(
 -                "SELECT  e.*, LEFT(10, e.debut) AS first_day, LEFT(10, e.fin) AS last_day,
 -                         IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10),
 -                            1) AS inscr_open, e.deadline_inscription,
 -                         u.nom, u.prenom, u.promo, a.alias,
 -                         MAX(ep.nb) IS NOT NULL AS inscrit, MAX(ep.paid) AS paid
 -                  FROM  #groupex#.evenements  AS e
 -            INNER JOIN  #x4dat#.auth_user_md5 AS u ON u.user_id = e.organisateur_uid
 -            INNER JOIN  #x4dat#.aliases       AS a ON (a.type = 'a_vie' AND a.id = u.user_id)
 -             LEFT JOIN  #groupex#.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
 -                 WHERE  asso_id = {?}
 -                   AND  archive = " . ($archive ? "1 " : "0 ")
 -              . "GROUP BY  e.eid
 -                 ORDER BY  inscr_open DESC, debut DESC", S::v('uid'), $globals->asso('id'));
 +        $evenements = XDB::iterator('SELECT  e.*, LEFT(10, e.debut) AS first_day, LEFT(10, e.fin) AS last_day,
 +                                             IF(e.deadline_inscription,
 +                                                     e.deadline_inscription >= LEFT(NOW(), 10),
 +                                                     1) AS inscr_open,
 +                                             e.deadline_inscription,
 +                                             MAX(ep.nb) IS NOT NULL AS inscrit, MAX(ep.paid) AS paid
-                                        FROM  groupex.evenements              AS e
-                                   LEFT JOIN  groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
++                                       FROM  #groupex#.evenements              AS e
++                                  LEFT JOIN  #groupex#.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
 +                                      WHERE  asso_id = {?} AND  archive = {?}
 +                                   GROUP BY  e.eid
 +                                   ORDER BY  inscr_open DESC, debut DESC',
 +                                     S::i('uid'), $globals->asso('id'), $archive ? 1 : 0);
  
          $evts = array();
          $undisplayed_events = 0;
              }
  
              $e['show_participants'] = ($e['show_participants'] && (is_member() || may_update()));
 -            $res = XDB::query(
 -                "SELECT titre, details, montant, ei.item_id, nb, ep.paid
 -                   FROM #groupex#.evenements_items AS ei
 -              LEFT JOIN #groupex#.evenements_participants AS ep
 -                        ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
 -                  WHERE ei.eid = {?}",
 -                    S::v('uid'), $e['eid']);
 -            $e['moments'] = $res->fetchAllAssoc();
 +            $e['moments'] = XDB::fetchAllAssoc('SELECT  titre, details, montant, ei.item_id, nb, ep.paid
-                                                   FROM  groupex.evenements_items AS ei
-                                              LEFT JOIN  groupex.evenements_participants AS ep
++                                                  FROM  #groupex#.evenements_items AS ei
++                                             LEFT JOIN  #groupex#.evenements_participants AS ep
 +                                                           ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND ep.uid = {?})
 +                                                 WHERE ei.eid = {?}',
 +                                                S::i('uid'), $e['eid']);
  
              $e['topay'] = 0;
              $e['paid']  = $e['moments'][0]['paid'];
              $page->assign('moments', $evt['moments']);
          }
  
 -        $tri = (Env::v('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo');
 -        $whereitemid = is_null($item_id) ? '' : "AND ep.item_id = $item_id";
 -        $res = XDB::iterRow(
 -                    'SELECT  UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
 -                                                IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
 -                             COUNT(DISTINCT ep.uid)
 -                       FROM  #groupex#.evenements_participants AS ep
 -                 INNER JOIN  #groupex#.evenements              AS e ON (ep.eid = e.eid)
 -                  LEFT JOIN  #groupex#.membres                 AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
 -                  LEFT JOIN  #x4dat#.auth_user_md5             AS u ON ( u.user_id = ep.uid )
 -                      WHERE  ep.eid = {?} '.$whereitemid . '
 -                   GROUP BY  UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
 -
 -        $alphabet = array();
 -        $nb_tot = 0;
 -        while (list($char, $nb) = $res->next()) {
 -            $alphabet[ord($char)] = $char;
 -            $nb_tot += $nb;
 -            if (Env::has('initiale') && $char == mb_strtoupper(Env::v('initiale'))) {
 -                $tot = $nb;
 -            }
 -        }
 -        ksort($alphabet);
 -        $page->assign('alphabet', $alphabet);
 -
          if ($evt['paiement_id']) {
 -            $res = XDB::iterator(
 -                "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
 -                        u.promo, a.alias AS email, t.montant
 -                   FROM {$globals->money->mpay_tprefix}transactions AS t
 -             INNER JOIN #x4dat#.auth_user_md5             AS u ON(t.uid = u.user_id)
 -             INNER JOIN #x4dat#.aliases                   AS a ON (a.id = t.uid AND a.type='a_vie' )
 -              LEFT JOIN #groupex#.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
 -                  WHERE t.ref = {?} AND ep.uid IS NULL",
 -                  $evt['eid'], $evt['paiement_id']);
 -            $page->assign('oublis', $res->total());
 -            $page->assign('oubliinscription', $res);
 -        }
 -
 -        $absents = XDB::iterator("SELECT  p.uid,
 -                                          IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
 -                                          IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
 -                                          IF(m.origine = 'X', u.promo, m.origine) AS promo,
 -                                          IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
 -                                          IF(m.origine = 'X', a.alias, m.email) AS email
 -                                    FROM  #groupex#.evenements_participants AS p
 -                              INNER JOIN  #groupex#.membres                 AS m USING(uid)
 -                               LEFT JOIN  #groupex#.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
 -                                                                                      AND p2.nb != 0)
 -                               LEFT JOIN  #x4dat#.auth_user_md5             AS u ON (u.user_id = m.uid)
 -                               LEFT JOIN  #x4dat#.aliases                   AS a ON (a.id = u.user_id AND a.type = 'a_vie')
 -                                   WHERE  p.eid = {?} AND p2.eid IS NULL
 -                                       " . (Env::v('initiale') ? " AND IF(u.nom IS NULL, m.nom,
 -                                          IF(u.nom_usage<>'', u.nom_usage, u.nom)) LIKE '" . Env::v('initiale') . "%'"
 -                                         : "") . "
 -                                GROUP BY  m.uid
 -                                ORDER BY  nom, prenom, promo", $evt['eid']);
 +            $infos = User::getBulkUsersWithUIDs(
 +                            XDB::fetchAllAssoc('SELECT  t.uid, t.montant
 +                                                  FROM  ' . $globals->money->mpay_tprefix . 'transactions AS t
-                                              LEFT JOIN  groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
++                                             LEFT JOIN  #groupex#.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
 +                                                 WHERE  t.ref = {?} AND ep.uid IS NULL',
 +                                               $evt['eid'], $evt['paiement_id']),
 +                            'uid', 'user');
 +            $page->assign('oublis', count($infos));
 +            $page->assign('oubliinscription', $infos);
 +        }
 +
 +        $absents = User::getBulkUsersFromDB('SELECT  p.uid
-                                                FROM  groupex.evenements_participants AS p
-                                           LEFT JOIN  groupex.evenements_participants AS p2 ON (p2.uid = p.uid
++                                               FROM  #groupex#.evenements_participants AS p
++                                          LEFT JOIN  #groupex#.evenements_participants AS p2 ON (p2.uid = p.uid
 +                                                                                               AND p2.eid = p.eid
 +                                                                                               AND p2.nb != 0)
 +                                              WHERE  p.eid = {?} AND p2.eid IS NULL
 +                                           GROUP BY  p.uid', $evt['eid']);
  
          $ofs   = Env::i('offset');
          $tot   = (Env::v('initiale') ? $tot : $nb_tot);
@@@ -27,25 -27,31 +27,25 @@@ function get_event_detail($eid, $item_i
      if (is_null($asso_id)) {
          $asso_id = $globals->asso('id');
      }
 -    $res = XDB::query(
 -        "SELECT  SUM(nb) AS nb_tot, COUNT(DISTINCT ep.uid) AS nb, e.*,
 -                 IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10), 1) AS inscr_open,
 -                 LEFT(10, e.debut) AS first_day, LEFT(10, e.fin) AS last_day,
 -                 LEFT(NOW(), 10) AS now, ei.titre,
 -                 al.vid AS absent_list, pl.vid AS participant_list,
 -                 bl.vid AS payed_list, ul.vid AS booked_unpayed_list,
 -                 a.nom, a.prenom, a.promo, aa.alias
 -           FROM  #groupex#.evenements              AS e
 -     INNER JOIN  #x4dat#.auth_user_md5             AS a  ON a.user_id = e.organisateur_uid
 -     INNER JOIN  #x4dat#.aliases                   AS aa ON (aa.type = 'a_vie' AND aa.id = a.user_id)
 -     INNER JOIN  #groupex#.evenements_items        AS ei ON (e.eid = ei.eid)
 -      LEFT JOIN  #groupex#.evenements_participants AS ep ON (e.eid = ep.eid AND ei.item_id = ep.item_id)
 -      LEFT JOIN  #x4dat#.virtual                   AS al ON (al.type = 'evt' AND al.alias = CONCAT(short_name, {?}))
 -      LEFT JOIN  #x4dat#.virtual                   AS pl ON (pl.type = 'evt' AND pl.alias = CONCAT(short_name, {?}))
 -      LEFT JOIN  #x4dat#.virtual                   AS bl ON (bl.type = 'evt' AND bl.alias = CONCAT(short_name, {?}))
 -      LEFT JOIN  #x4dat#.virtual                   AS ul ON (ul.type = 'evt' AND ul.alias = CONCAT(short_name, {?}))
 -          WHERE  (e.eid = {?} OR e.short_name = {?}) AND ei.item_id = {?} AND e.asso_id = {?}
 -       GROUP BY  ei.item_id",
 -        '-absents@' . $globals->xnet->evts_domain,
 -        '-participants@' . $globals->xnet->evts_domain,
 -        '-paye@' . $globals->xnet->evts_domain,
 -        '-participants-non-paye@' . $globals->xnet->evts_domain,
 -        $eid, $eid, $item_id ? $item_id : 1, $asso_id);
 -
 +    $res = XDB::query('SELECT  SUM(nb) AS nb_tot, COUNT(DISTINCT ep.uid) AS nb, e.*,
 +                               IF(e.deadline_inscription,
 +                                     e.deadline_inscription >= LEFT(NOW(), 10),
 +                                     1) AS inscr_open,
 +                               LEFT(10, e.debut) AS start_day, LEFT(10, e.fin) AS last_day,
 +                               LEFT(NOW(), 10) AS now,
 +                               ei.titre, al.vid AS absent_list, pl.vid AS participant_list
-                          FROM  groupex.evenements              AS e
-                    INNER JOIN  groupex.evenements_items        AS ei ON (e.eid = ei.eid)
-                     LEFT JOIN  groupex.evenements_participants AS ep ON(e.eid = ep.eid AND ei.item_id = ep.item_id)
-                     LEFT JOIN  virtual AS al ON(al.type = \'evt\' AND al.alias = CONCAT(short_name, {?}))
-                     LEFT JOIN  virtual AS pl ON(pl.type = \'evt\' AND pl.alias = CONCAT(short_name, {?}))
++                         FROM  #groupex#.evenements              AS e
++                   INNER JOIN  #groupex#.evenements_items        AS ei ON (e.eid = ei.eid)
++                    LEFT JOIN  #groupex#.evenements_participants AS ep ON(e.eid = ep.eid AND ei.item_id = ep.item_id)
++                    LEFT JOIN  #x4dat#.virtual AS al ON(al.type = \'evt\' AND al.alias = CONCAT(short_name, {?}))
++                    LEFT JOIN  #x4dat#.virtual AS pl ON(pl.type = \'evt\' AND pl.alias = CONCAT(short_name, {?}))
 +                        WHERE  (e.eid = {?} OR e.short_name = {?}) AND ei.item_id = {?} AND e.asso_id = {?}
 +                     GROUP BY  ei.item_id',
 +                   '-absents@'.$globals->xnet->evts_domain,
 +                   '-participants@'.$globals->xnet->evts_domain,
 +                   '-paye@' . $globals->xnet->evts_domain,
 +                   '-participants-non-paye@' . $globals->xnet->evts_domain,
 +                   $eid, $eid, $item_id ? $item_id : 1, $asso_id);
      $evt = $res->fetchOneAssoc();
  
      if (!$evt) {
  
      // smart calculation of the total number
      if (!$item_id) {
 -        $res = XDB::query(
 -               "SELECT MAX(nb)
 -                  FROM #groupex#.evenements              AS e
 -            INNER JOIN #groupex#.evenements_items        AS ei ON (e.eid = ei.eid)
 -             LEFT JOIN #groupex#.evenements_participants AS ep
 -                       ON (e.eid = ep.eid AND ei.item_id = ep.item_id)
 -                 WHERE e.eid = {?}
 -              GROUP BY ep.uid", $evt['eid']);
 +        $res = XDB::query('SELECT  MAX(nb)
-                              FROM  groupex.evenements              AS e
-                        INNER JOIN  groupex.evenements_items        AS ei ON (e.eid = ei.eid)
-                         LEFT JOIN  groupex.evenements_participants AS ep ON (e.eid = ep.eid AND ei.item_id = ep.item_id)
++                             FROM  #groupex#.evenements              AS e
++                       INNER JOIN  #groupex#.evenements_items        AS ei ON (e.eid = ei.eid)
++                        LEFT JOIN  #groupex#.evenements_participants AS ep ON (e.eid = ep.eid AND ei.item_id = ep.item_id)
 +                            WHERE  e.eid = {?}
 +                         GROUP BY  ep.uid', $evt['eid']);
          $evt['nb_tot'] = array_sum($res->fetchColumn());
          $evt['titre'] = '';
          $evt['item_id'] = 0;
      }
  
 -    $res = XDB::query(
 -        "SELECT titre, details, montant, ei.item_id, nb, ep.paid, FIND_IN_SET('notify_payment', ep.flags) AS notify_payment
 -           FROM #groupex#.evenements_items        AS ei
 -      LEFT JOIN #groupex#.evenements_participants AS ep
 -                ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
 -          WHERE ei.eid = {?}",
 -            S::v('uid'), $evt['eid']);
 -    $evt['moments'] = $res->fetchAllAssoc();
 -
 +    $evt['moments'] = XDB::fetchAllAssoc('SELECT  titre, details, montant, ei.item_id, nb,
 +                                                  ep.paid, FIND_IN_SET(\'notify_payment\', ep.flags) AS notify_payment
-                                             FROM  groupex.evenements_items        AS ei
-                                        LEFT JOIN  groupex.evenements_participants AS ep ON (ep.eid = ei.eid AND ep.item_id = ei.item_id
++                                            FROM  #groupex#.evenements_items        AS ei
++                                       LEFT JOIN  #groupex#.evenements_participants AS ep ON (ep.eid = ei.eid AND ep.item_id = ei.item_id
 +                                                                                                             AND uid = {?})
 +                                           WHERE  ei.eid = {?}',
 +                                           S::i('uid'), $evt['eid']);
      $evt['topay'] = 0;
      $evt['paid'] = 0;
      $evt['notify_payment'] = false;
@@@ -114,25 -133,36 +114,25 @@@ function get_event_participants(&$evt, 
      $money  = $evt['money'] && (function_exists('may_update')) && may_update();
      $pay_id = $evt['paiement_id'];
  
 -    $query =
 -          "SELECT  IF(m.origine != 'X',m.nom,IF(u.nom_usage<>'', u.nom_usage, u.nom)) AS nom,
 -                   IF(m.origine != 'X',m.prenom,u.prenom) AS prenom,
 -                   IF(m.origine != 'X','extérieur',u.promo) AS promo,
 -                   IF(m.origine != 'X' OR u.perms = 'pending',m.email,a.alias) AS email,
 -                   IF(m.origine != 'X',m.sexe,FIND_IN_SET('femme', u.flags)) AS femme,
 -                   m.perms='admin' AS admin,
 -                   (m.origine = 'X' OR m.origine IS NULL) AS x,
 -                   ep.uid, SUM(ep.paid) AS paid, SUM(ep.nb) AS nb,
 -                   FIND_IN_SET('notify_payment', ep.flags) AS notify_payment
 -             FROM  #groupex#.evenements_participants AS ep
 -       INNER JOIN  #groupex#.evenements  AS e ON (ep.eid = e.eid)
 -        LEFT JOIN  #groupex#.membres     AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
 -        LEFT JOIN  #x4dat#.auth_user_md5 AS u ON ( u.user_id = ep.uid )
 -        LEFT JOIN  #x4dat#.aliases       AS a ON ( a.id = ep.uid AND a.type='a_vie' )
 -            WHERE  ep.eid = {?}
 -                    ".(($item_id)?" AND item_id = $item_id":"")."
 -                    $where
 -         GROUP BY  ep.uid
 -         ORDER BY  $tri $limit";
 +    $append = $item_id ? XDB::foramt(' AND ep.item_id = {?}', $item_id) : '';
 +    $query = XDB::fetchAllAssoc('uid', 'SELECT  ep.uid, SUM(ep.paid) AS paid, SUM(ep.nb) AS nb,
 +                                                FIND_IN_SET(\'notify_payment\', ep.flags) AS notify_payment
-                                           FROM  groupex.evenements_participants AS ep
++                                          FROM  #groupex#.evenements_participants AS ep
 +                                         WHERE  ep.eid = {?} AND nb > 0 ' . $append . '
 +                                      GROUP BY  ep.uid', $eid);
 +    $uf = new UserFilter(new UFC_True(), $tri);
 +    $users = User::getBulkUsersWithUIDs($uf->filter(array_keys($query), $count, $offset));
 +    $tab = array();
 +    foreach ($users as $user) {
 +        $uid = $user->id();
 +        $tab[$uid] = $query[$uid];
 +        $tab[$uid]['user'] = $user;
 +    }
  
      if ($item_id) {
 -        $res = XDB::query($query, $eid);
 -        return $res->fetchAllAssoc();
 +        return $tab;
      }
  
 -    $res = XDB::iterator($query, $eid);
 -    $tab = array();
 -    $user = 0;
 -
      $evt['adminpaid'] = 0;
      $evt['telepaid']  = 0;
      $evt['topay']     = 0;
              }
          }
          $u['telepayment'] = $u['paid'] - $u['adminpaid'];
 -        $res_ = XDB::iterator(
 -                "SELECT  ep.nb, ep.item_id, ei.montant
 -                   FROM  #groupex#.evenements_participants AS ep
 -             INNER JOIN  #groupex#.evenements_items AS ei ON (ei.eid = ep.eid AND ei.item_id = ep.item_id)
 -                  WHERE  ep.eid = {?} AND ep.uid = {?}",
 -            $eid, $u['uid']);
 +        $res_ = XDB::iterator('SELECT  ep.nb, ep.item_id, ei.montant
-                                  FROM  groupex.evenements_participants AS ep
-                            INNER JOIN  groupex.evenements_items AS ei ON (ei.eid = ep.eid AND ei.item_id = ep.item_id)
++                                 FROM  #groupex#.evenements_participants AS ep
++                           INNER JOIN  #groupex#.evenements_items AS ei ON (ei.eid = ep.eid AND ei.item_id = ep.item_id)
 +                                WHERE  ep.eid = {?} AND ep.uid = {?}',
 +                            $eid, $uid);
          while ($i = $res_->next()) {
              $u[$i['item_id']] = $i['nb'];
              $u['montant'] += $i['montant']*$i['nb'];
@@@ -299,24 -336,25 +299,24 @@@ function event_change_shortname(&$page
          }
  
          foreach (array('-participants@', '-paye@', '-participants-non-paye@') as $v) {
 -            XDB::execute("INSERT IGNORE INTO virtual_redirect (
 -                SELECT  {?} AS vid, IF(a.alias IS NULL, m.email, CONCAT(a.alias, {?})) AS redirect
 -                  FROM  #groupex#.evenements_participants AS ep
 -             LEFT JOIN  #groupex#.membres     AS m ON (ep.uid = m.uid)
 -             LEFT JOIN  #x4dat#.auth_user_md5 AS u ON (u.user_id = ep.uid)
 -             LEFT JOIN  #x4dat#.aliases       AS a ON (a.id = ep.uid AND a.type = 'a_vie')
 -                 WHERE  ep.eid = {?} AND " . $where[$v] . "
 -              GROUP BY  ep.uid)",
 -                $lastid[$v], '@' . $globals->mail->domain, $eid);
 +            XDB::execute("INSERT IGNORE INTO  virtual_redirect (
 +                                      SELECT  {?} AS vid, IF(al.alias IS NULL, a.email, CONCAT(al.alias, {?})) AS redirect
-                                         FROM  groupex.evenements_participants AS ep
-                                    LEFT JOIN  accounts        AS a  ON (ep.uid = a.uid)
-                                    LEFT JOIN  aliases         AS al ON (al.id = a.uid AND al.type = 'a_vie')
++                                        FROM  #groupex#.evenements_participants AS ep
++                                   LEFT JOIN  #x4dat#.accounts AS a  ON (ep.uid = a.uid)
++                                   LEFT JOIN  #x4dat#.aliases  AS al ON (al.id = a.uid AND al.type = 'a_vie')
 +                                       WHERE  ep.eid = {?} AND " . $where[$v] . "
 +                                    GROUP BY  ep.uid)",
 +                         $lastid[$v], '@' . $globals->mail->domain, $eid);
          }
 -        XDB::execute("INSERT IGNORE INTO virtual_redirect (
 -            SELECT  {?} AS vid, IF(a.alias IS NULL, m.email, CONCAT(a.alias, {?})) AS redirect
 -              FROM  #groupex#.membres     AS m
 -         LEFT JOIN  #groupex#.evenements_participants AS ep ON (ep.uid = m.uid AND ep.eid = {?})
 -         LEFT JOIN  #x4dat#.auth_user_md5 AS u ON (u.user_id = m.uid)
 -         LEFT JOIN  #x4dat#.aliases       AS a ON (a.id = m.uid AND a.type = 'a_vie')
 -             WHERE  m.asso_id = {?} AND ep.uid IS NULL
 -          GROUP BY  m.uid)",
 -            $lastid['-absents@'], '@' . $globals->mail->domain, $eid, $globals->asso('id'));
 +        XDB::execute("INSERT IGNORE INTO  virtual_redirect (
 +                                  SELECT  {?} AS vid, IF(al.alias IS NULL, a.email, CONCAT(al.alias, {?})) AS redirect
-                                     FROM  groupex.membres AS m
-                                LEFT JOIN  groupex.evenements_participants AS ep ON (ep.uid = m.uid AND ep.eid = {?})
-                                LEFT JOIN  accounts        AS a  ON (a.uid = m.uid)
-                                LEFT JOIN  aliases         AS al ON (al.id = a.uid AND al.type = 'a_vie')
++                                    FROM  #groupex#.membres AS m
++                               LEFT JOIN  #x4dat#.accounts  AS a  ON (a.uid = m.uid)
++                               LEFT JOIN  #x4dat#.aliases   AS al ON (al.id = a.uid AND al.type = 'a_vie')
++                               LEFT JOIN  #groupex#.evenements_participants AS ep ON (ep.uid = m.uid AND ep.eid = {?})
 +                                   WHERE  m.asso_id = {?} AND ep.uid IS NULL
 +                                GROUP BY  m.uid)",
 +                     $lastid['-absents@'], '@' . $globals->mail->domain, $eid, $globals->asso('id'));
  
          return $new;
      }
@@@ -81,30 -130,32 +81,30 @@@ class XnetGrpModule extends PLModul
                              Env::i('unread'), S::i('uid'));
                  pl_redirect("#art" . Env::i('unread'));
              }
 -            $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 #x4dat#.auth_user_md5    AS u USING(user_id)
 -                                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 <= {?})
 -                                          AND (promo_max = 0 OR promo_max >= {?})
 -                                          AND r.announce_id IS NULL
 -                                 ORDER BY a.peremption",
 -                                   S::i('uid'), $globals->asso('id'), S::i('promo'), S::i('promo'));
 -            $index = XDB::iterator("SELECT a.id, a.titre, r.user_id IS NULL AS nonlu
 -                                      FROM #groupex#.announces AS a
 -                                 LEFT JOIN #groupex#.announces_read AS r ON (a.id = r.announce_id AND r.user_id = {?})
 -                                     WHERE asso_id = {?} AND peremption >= CURRENT_DATE()
 +            // XXX: Fix promo_min; promo_max
-             $arts = XDB::iterator("SELECT a.*, FIND_IN_SET('photo', a.flags) AS photo
-                                      FROM groupex.announces AS a
-                                 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 <= {?})
-                                           AND (promo_max = 0 OR promo_max >= {?})
-                                           AND r.announce_id IS NULL
-                                  ORDER BY a.peremption",
-                                    S::i('uid'), $globals->asso('id'), S::i('promo'), S::i('promo'));
-             $index = XDB::iterator("SELECT a.id, a.titre, r.user_id IS NULL AS nonlu
-                                       FROM groupex.announces AS a
-                                  LEFT JOIN groupex.announces_read AS r ON (a.id = r.announce_id AND r.user_id = {?})
-                                      WHERE asso_id = {?} AND peremption >= CURRENT_DATE()
++            $arts = XDB::iterator("SELECT  a.*, FIND_IN_SET('photo', a.flags) AS photo
++                                     FROM  #groupex#.announces AS a
++                                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 <= {?})
                                             AND (promo_max = 0 OR promo_max >= {?})
--                                  ORDER BY a.peremption",
++                                           AND r.announce_id IS NULL
++                                 ORDER BY  a.peremption",
++                                   S::i('uid'), $globals->asso('id'), S::i('promo'), S::i('promo'));
++            $index = XDB::iterator("SELECT  a.id, a.titre, r.user_id IS NULL AS nonlu
++                                      FROM  #groupex#.announces AS a
++                                 LEFT JOIN  #groupex#.announces_read AS r ON (a.id = r.announce_id AND r.user_id = {?})
++                                     WHERE  asso_id = {?} AND peremption >= CURRENT_DATE()
++                                            AND (promo_min = 0 OR promo_min <= {?})
++                                            AND (promo_max = 0 OR promo_max >= {?})
++                                  ORDER BY  a.peremption",
                                     S::i('uid'), $globals->asso('id'), S::i('promo'), S::i('promo'));
              $page->assign('article_index', $index);
          } else {
-             $arts = XDB::iterator("SELECT a.*, FIND_IN_SET('photo', a.flags) AS photo
-                                      FROM groupex.announces AS a
 -            $arts = XDB::iterator("SELECT a.*, u.nom, u.prenom, u.promo, FIND_IN_SET('photo', a.flags) AS photo
 -                                     FROM #groupex#.announces   AS a
 -                               INNER JOIN #x4dat#.auth_user_md5 AS u USING(user_id)
--                                    WHERE asso_id = {?} AND peremption >= CURRENT_DATE()
-                                           AND FIND_IN_SET('public', a.flags)",
 -                                          AND FIND_IN_SET('public', u.flags)",
++            $arts = XDB::iterator("SELECT  a.*, FIND_IN_SET('photo', a.flags) AS photo
++                                     FROM  #groupex#.announces AS a
++                                    WHERE  asso_id = {?} AND peremption >= CURRENT_DATE()
++                                           AND FIND_IN_SET('public', a.flags)",
                                    $globals->asso('id'));
          }
          if (may_update()) {
      {
          global $globals;
  
-         $logo = $globals->asso('logo');
-         if (!empty($logo)) {
-             header('Content-type: ' . $globals->asso('logo_mime'));
-             header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-             header('Last-Modified:' . gmdate('D, d M Y H:i:s') . ' GMT');
-             header('Cache-Control: no-cache, must-revalidate');
-             header('Pragma: no-cache');
-             echo $logo;
-         } else {
-             header('Content-type: image/jpeg');
-             header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-             header('Last-Modified:' . gmdate('D, d M Y H:i:s') . ' GMT');
-             header('Cache-Control: no-cache, must-revalidate');
-             header('Pragma: no-cache');
-             readfile(dirname(__FILE__).'/../htdocs/images/dflt_carre.jpg');
-         }
 -        $res = XDB::query("SELECT logo, logo_mime
 -                             FROM #groupex#.asso WHERE id = {?}",
++        $res = XDB::query("SELECT  logo, logo_mime
++                             FROM  #groupex#.asso
++                            WHERE  id = {?}",
+                           $globals->asso('id'));
+         list($logo, $logo_mime) = $res->fetchOneRow();
  
 -        if (!empty($logo)) {
 -            echo $logo;
 -        } else {
 -            readfile(dirname(__FILE__) . '/../htdocs/images/dflt_carre.jpg');
 -        }
+         pl_cached_dynamic_content_headers(empty($logo) ? "image/jpeg" : $logo_mime);
          exit;
      }
  
                        $flags, $globals->asso('id'));
              }
  
 +
              if ($_FILES['logo']['name']) {
 -                $logo = file_get_contents($_FILES['logo']['tmp_name']);
 -                $mime = $_FILES['logo']['type'];
 -                XDB::execute('UPDATE #groupex#.asso
 -                                 SET logo={?}, logo_mime={?}
 -                               WHERE id={?}', $logo, $mime,
 -                             $globals->asso('id'));
 +                $upload = PlUpload::get($_FILES['logo'], $globals->asso('id'), 'asso.logo', true);
 +                if (!$upload) {
-                     $page->trigError("Impossible de télécharger le logo");
++                    $page->trigError("Impossible de télécharger le logo.");
 +                } else {
-                     XDB::execute('UPDATE groupex.asso
-                                      SET logo={?}, logo_mime={?}
-                                    WHERE id={?}', $upload->getContents(), $upload->contentType(),
++                    XDB::execute('UPDATE  #groupex#.asso
++                                     SET  logo = {?}, logo_mime = {?}
++                                   WHERE  id = {?}', $upload->getContents(), $upload->contentType(),
 +                                 $globals->asso('id'));
 +                    $upload->rm();
 +                }
              }
  
              pl_redirect('../'.Post::v('diminutif', $globals->asso('diminutif')).'/edit');
          if (is_null($filename)) {
              $filename = $globals->asso('diminutif') . '.csv';
          }
 -        $ann = XDB::iterator(
 -                  "SELECT  IF(m.origine='X',IF(u.nom_usage<>'', u.nom_usage, u.nom) ,m.nom) AS nom,
 -                           IF(m.origine='X',u.prenom,m.prenom) AS prenom,
 -                           IF(m.origine='X', u.promo, IF(m.origine='ext', 'extérieur', 'personne morale')) AS promo,
 -                           IF(m.origine='X' AND u.perms != 'pending',CONCAT(a.alias, '@', {?}), m.email) AS email,
 -                           IF(m.origine='X',FIND_IN_SET('femme', u.flags), m.sexe) AS femme,
 -                           m.comm as comm
 -                     FROM  #groupex#.membres     AS m
 -                LEFT JOIN  #x4dat#.auth_user_md5 AS u ON ( u.user_id = m.uid )
 -                LEFT JOIN  #x4dat#.aliases       AS a ON ( a.id = m.uid AND a.type = 'a_vie' )
 -                    WHERE  m.asso_id = {?}
 -                           AND (m.origine != 'X' OR u.perms != 'pending' OR m.email IS NOT NULL)
 -                 GROUP BY  m.uid
 -                 ORDER BY  nom, prenom",
 -                 $globals->mail->domain, $globals->asso('id'));
 +        $users = $globals->asso()->getMembers(null, new UFO_Name('directory_name'))->getUsers();
 +        header('Content-Type: text/x-csv; charset=utf-8;');
 +        header('Pragma: ');
 +        header('Cache-Control: ');
+         pl_content_headers("text/x-csv");
          $page->changeTpl('xnetgrp/annuaire-csv.tpl', NO_SKIN);
 -        $page->assign('ann', $ann);
 +        $page->assign('users', $users);
      }
  
      private function removeSubscriptionRequest($uid)
              }
          }
  
 -        $it = XDB::iterator("SELECT  IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom,
 -                                     u.prenom, u.promo, u.hruid, s.ts AS date
 +        $it = XDB::iterator('SELECT  s.uid, a.hruid, s.ts AS date
-                                FROM  groupex.membres_sub_requests AS s
-                          INNER JOIN  accounts AS a ON(s.uid = a.uid)
+                                FROM  #groupex#.membres_sub_requests AS s
 -                         INNER JOIN  #x4dat#.auth_user_md5          AS u ON (s.uid = u.user_id)
 -                              WHERE  asso_id = {?}
 -                           ORDER BY  nom, prenom",
 -                           $globals->asso('id'));
 -
++                         INNER JOIN  #x4dat#.accounts AS a ON(s.uid = a.uid)
 +                              WHERE  s.asso_id = {?}
 +                           ORDER BY  s.ts',  $globals->asso('id'));
          $page->changeTpl('xnetgrp/subscribe-valid.tpl');
          $page->assign('valid', $it);
      }
  
      function handler_admin_member_new_ajax(&$page)
      {
-         header('Content-Type: text/html; charset="UTF-8"');
-         $page->changeTpl('xnetgrp/membres-new-search.tpl',  NO_SKIN);
+         pl_content_headers("text/html");
+         $page->changeTpl('xnetgrp/membres-new-search.tpl', NO_SKIN);
 -        $res = null;
 +        $users = array();
          if (Env::has('login')) {
 -            require_once 'user.func.inc.php';
 -            $res = get_not_registered_user(Env::v('login'), true);
 +            $user = User::getSilent(Env::t('login'));
 +            if ($user && $user->state != 'pending') {
 +                $users = array($user);
 +            }
          }
 -        if (is_null($res)) {
 -            list($nom, $prenom) = str_replace(array('-', ' ', "'"), '%', array(Env::v('nom'), Env::v('prenom')));
 -            $where = "perms = 'pending'";
 +        if (empty($users)) {
 +            list($nom, $prenom) = str_replace(array('-', ' ', "'"), '%', array(Env::t('nom'), Env::t('prenom')));
 +            $cond = new UFC_And(new UFC_Not(new UFC_Registered()));
              if (!empty($nom)) {
 -                $where .= " AND nom LIKE '%$nom%'";
 +                $cond->addChild(new UFC_Name(UserFilter::LASTNAME, $nom, UFC_Name::CONTAINS));
              }
              if (!empty($prenom)) {
 -                $where .= " AND prenom LIKE '%$prenom%'";
 +                $cond->addChild(new UFC_Name(UserFilter::FIRSTNAME, $prenom, UFC_Name::CONTAINS));
              }
 -            if (preg_match('/^[0-9]{4}$/', Env::v('promo'))) {
 -                $where .= " AND promo = " . Env::i('promo');
 -            } elseif (preg_match('/^[0-9]{2}$/', Env::v('promo'))) {
 -                $where .= " AND MOD(promo, 100) = " . Env::i('promo');
 -            } elseif (Env::has('promo')) {
 -                return;
 +            if (Env::i('promo')) {
 +                $cond->addChild(new UFC_Promo('=', UserFilter::GRADE_ING, Env::i('promo')));
 +            }
 +            $uf = new UserFilter($cond);
 +            $users = $uf->getUsers(30);
 +            if ($uf->getTotalCount() > 30) {
 +                $page->assign('too_many', true);
 +                $users = array();
              }
 -            $res = XDB::iterator("SELECT user_id, nom, prenom, promo
 -                                    FROM auth_user_md5
 -                                   WHERE $where");
 -        }
 -        if ($res && $res->total() < 30) {
 -            $page->assign("choix", $res);
          }
 +        $page->assign('users', $users);
      }
  
 -    function unsubscribe(&$user)
 +    function unsubscribe(PlUser &$user)
      {
          global $globals;
-         XDB::execute("DELETE FROM  groupex.membres
 -        XDB::execute(
 -                "DELETE FROM  #groupex#.membres WHERE uid={?} AND asso_id={?}",
 -                $user['uid'], $globals->asso('id'));
++        XDB::execute("DELETE FROM  #groupex#.membres
 +                            WHERE  uid = {?} AND asso_id = {?}",
 +                     $user->id(), $globals->asso('id'));
  
          if ($globals->asso('notif_unsub')) {
              $mailer = new PlMailer('xnetgrp/unsubscription-notif.mail.tpl');
              }
  
              $perms = Post::i('is_admin');
 -            $comm  = trim(Post::s('comm'));
 +            $comm  = Post::t('comm');
              if ($user['perms'] != $perms || $user['comm'] != $comm) {
-                 XDB::query('UPDATE groupex.membres
-                                SET perms={?}, comm={?}
-                              WHERE uid={?} AND asso_id={?}',
+                 XDB::query('UPDATE  #groupex#.membres
+                                SET  perms = {?}, comm = {?}
+                              WHERE  uid = {?} AND asso_id = {?}',
                              $perms ? 'admin' : 'membre', $comm,
                              $user['uid'], $globals->asso('id'));
                  if ($perms != $user['perms']) {
          }
  
          if (empty($art) && !is_null($aid)) {
-             $res = XDB::query("SELECT a.*, FIND_IN_SET('public', a.flags) AS public,
 -            $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
 -                                 FROM #groupex#.announces   AS a
 -                           INNER JOIN #x4dat#.auth_user_md5 AS u USING(user_id)
--                                WHERE asso_id = {?} AND a.id = {?}",
++            $res = XDB::query("SELECT  a.*, FIND_IN_SET('public', a.flags) AS public,
++                                       FIND_IN_SET('photo', a.flags) AS photo
++                                 FROM  #groupex#.announces AS a
++                                WHERE  asso_id = {?} AND a.id = {?}",
                                $globals->asso('id'), $aid);
              if ($res->numRows()) {
                  $art = $res->fetchOneAssoc();
@@@ -74,20 -37,25 +74,20 @@@ class XnetGrpEventFeed extends PlFee
      {
          global $globals;
          if (!is_null($user)) {
 -            return XDB::iterator("SELECT a.id, a.titre AS title, a.texte, a.contacts,
 -                                         a.create_date AS publication,
 -                                         CONCAT(u2.prenom, ' ', IF(u2.nom_usage != '', u2.nom_usage, u2.nom), ' (X',  u2.promo, ')') AS author,
 -                                         FIND_IN_SET('photo', a.flags) AS photo,
 -                                         CONCAT({?}, '/#art', a.id) AS link
 -                                   FROM #x4dat#.auth_user_md5 AS u
 -                             INNER JOIN #groupex#.announces   AS a ON ((a.promo_min = 0 OR a.promo_min <= u.promo)
 -                                                                       AND (a.promo_max = 0 OR a.promo_max <= u.promo))
 -                             INNER JOIN #x4dat#.auth_user_md5 AS u2 ON (u2.user_id = a.user_id)
 -                             WHERE u.user_id = {?} AND peremption >= NOW() AND a.asso_id = {?}",
 -                                   $this->link, $user->id(), $globals->asso('id'));
 +            return new UserFilterIterator(
 +                   XDB::iterator("SELECT  a.id, a.titre AS title, a.texte, a.contacts,
 +                                          a.create_date AS publication,
 +                                          FIND_IN_SET('photo', a.flags) AS photo,
 +                                          CONCAT({?}, '/#art', a.id) AS link
-                                     FROM  groupex.announces AS a
++                                    FROM  #groupex#.announces AS a
 +                                   WHERE  peremption >= NOW() AND a.asso_id = {?}",
 +                                   $this->link, $globals->asso('id'), $user));
          } else {
 -            return  XDB::iterator("SELECT a.id, a.titre AS title, a.texte, a.create_date AS publication,
 -                                         CONCAT(u.prenom, ' ', IF(u.nom_usage != '', u.nom_usage, u.nom), ' (X',  u.promo, ')') AS author,
 -                                         CONCAT({?}, '/#art', a.id) AS link,
 -                                         NULL AS photo, NULL AS contacts
 -                                    FROM #groupex#.announces   AS a
 -                              INNER JOIN #x4dat#.auth_user_md5 AS u USING(user_id)
 -                                   WHERE FIND_IN_SET('public', a.flags) AND peremption >= NOW() AND a.asso_id = {?}",
 +            return  XDB::iterator("SELECT  a.id, a.titre AS title, a.texte, a.create_date AS publication,
 +                                           CONCAT({?}, '/#art', a.id) AS link,
 +                                           NULL AS photo, NULL AS contacts
-                                      FROM  groupex.announces AS a
++                                     FROM  #groupex#.announces AS a
 +                                    WHERE  FIND_IN_SET('public', a.flags) AND peremption >= NOW() AND a.asso_id = {?}",
                                    $this->link, $globals->asso('id'));
          }
      }
@@@ -221,14 -219,25 +221,15 @@@ class XnetListsModule extends ListsModu
          $not_in_group_x = array();
          $not_in_group_ext = array();
  
 -        $ann = XDB::iterator(
 -                  "SELECT  if (m.origine='X',if (u.nom_usage<>'', u.nom_usage, u.nom) ,m.nom) AS nom,
 -                           if (m.origine='X',u.prenom,m.prenom) AS prenom,
 -                           if (m.origine='X',u.promo,'extérieur') AS promo,
 -                           if (m.origine='X',CONCAT(a.alias, '@{$globals->mail->domain}'),m.email) AS email,
 -                           if (m.origine='X',FIND_IN_SET('femme', u.flags),0) AS femme,
 -                           m.perms='admin' AS admin,
 -                           m.origine='X' AS x
 -                     FROM  #groupex#.membres     AS m
 -                LEFT JOIN  #x4dat#.auth_user_md5 AS u ON ( u.user_id = m.uid )
 -                LEFT JOIN  #x4dat#.aliases       AS a ON ( a.id = m.uid AND a.type='a_vie' )
 -                    WHERE  m.asso_id = {?}
 -                 ORDER BY  promo, nom, prenom", $globals->asso('id'));
 +        $ann = XDB::fetchColumn('SELECT  uid
-                                    FROM  groupex.membres
++                                   FROM  #groupex#.membres
 +                                  WHERE  asso_id = {?}', $globals->asso('id'));
 +        $users = User::getBuildUsersWithUIDs($ann, 'promo,full_name');
          $not_in_list = array();
 -
 -        while ($tmp = $ann->next()) {
 -            if (!in_array(strtolower($tmp['email']), $subscribers)) {
 -                $not_in_list[] = $tmp;
 +        foreach ($users as $user) {
 +            if (!in_array(strtolower($user->forlifeEmail()), $subscribers)) {
 +                $not_in_list[] = $user;
              }
          }
  
          if (Env::has('add_member')) {
              S::assert_xsrf_token();
  
 -            $add = Env::v('add_member');
 -            if (strstr($add, '@')) {
 -                list($mbox,$dom) = explode('@', strtolower($add));
 -            } else {
 -                $mbox = $add;
 -                $dom = 'm4x.org';
 +            $add = Env::t('add_member');
 +            $user = User::getSilent($add);
 +            if ($user) {
 +                $add = $user->forlifeEmail();
 +            } else if (!User::isForeignEmailAddress($add)) {
 +                $add = null;
              }
 -            if ($dom == 'polytechnique.org' || $dom == 'm4x.org') {
 -                $res = XDB::query(
 -                        "SELECT  a.alias, b.alias
 -                           FROM  aliases AS a
 -                      LEFT JOIN  aliases AS b ON (a.id=b.id AND b.type = 'a_vie')
 -                          WHERE  a.alias={?} AND a.type!='homonyme'", $mbox);
 -                if (list($alias, $blias) = $res->fetchOneRow()) {
 -                    $alias = empty($blias) ? $alias : $blias;
 -                    XDB::query(
 -                        "INSERT IGNORE INTO  virtual_redirect (vid,redirect)
 -                                     SELECT  vid, {?}
 -                                       FROM  virtual
 -                                      WHERE  alias={?}", "$alias@m4x.org", $lfull);
 -                   $page->trigSuccess("$alias@m4x.org ajouté");
 -                } else {
 -                    $page->trigError("$mbox@{$globals->mail->domain} n'existe pas.");
 -                }
 +            if (!empty($add)) {
-                 XDB::execute('INSERT INTO  x4dat.virtual_redirect (vid, redirect)
-                                    SELECT  vid, {?},
-                                      FROM  x4dat.virtual
++                XDB::execute('INSERT INTO  virtual_redirect (vid, redirect)
++                                   SELECT  vid, {?}
++                                     FROM  virtual
 +                                    WHERE  alias = {?}', strtolower($add), $lfull);
 +                $page->trigSuccess($add . ' ajouté.');
              } else {
 -                XDB::query(
 -                        "INSERT IGNORE INTO  virtual_redirect (vid,redirect)
 -                                     SELECT  vid,{?}
 -                                       FROM  virtual
 -                                      WHERE  alias={?}", "$mbox@$dom", $lfull);
 -                $page->trigSuccess("$mbox@$dom ajouté");
 +                $page->trigError($add . " n'existe pas.");
              }
          }
  
  
  <script type="text/javascript">//<![CDATA[
    {literal}
-   $('input.deathDate').change(
-     function ()
-     {
-       $(this).addClass('sendDate');
-     });
+   $('input.deathDate').change(function () {
+     $(this).addClass('sendDate');
+   });
    
-   $('#deathDateList').submit(
-     function ()
-     {
-       // Avoid sending useless data to the webserver
-       $('input.deathDate').not('.sendDate').attr('disabled', true);
-     });
+   $('#deathDateList').submit(function () {
+     // Avoid sending useless data to the webserver
+     $('input.deathDate').not('.sendDate').attr('disabled', true);
+   });
    {/literal}
  //]]></script>
 -
 +{/if}
  
  {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
Simple merge
Simple merge
Simple merge
Simple merge