Merge branch 'xorg/maint' into xorg/master
authorStéphane Jacob <sj@m4x.org>
Tue, 20 Sep 2011 18:45:31 +0000 (20:45 +0200)
committerStéphane Jacob <sj@m4x.org>
Tue, 20 Sep 2011 18:45:31 +0000 (20:45 +0200)
1  2 
modules/auth.php
modules/xnetgrp.php
templates/xnet/account.mail.tpl

diff --combined modules/auth.php
@@@ -30,9 -30,9 +30,9 @@@ class AuthModule extends PLModul
              'webservices/manageurs.php'     => $this->make_hook('manageurs',          AUTH_PUBLIC, 'user', NO_HTTPS),
  
              'auth-redirect.php'             => $this->make_hook('redirect',           AUTH_COOKIE, 'user'),
-             'auth-groupex.php'              => $this->make_hook('groupex_old',        AUTH_COOKIE, 'user'),
-             'auth-groupex'                  => $this->make_hook('groupex',            AUTH_PUBLIC),
+             'auth-groupex.php'              => $this->make_hook('groupex_old',        AUTH_COOKIE, ''),
+             'auth-groupex'                  => $this->make_hook('groupex',            AUTH_PUBLIC, ''),
 -            'admin/auth-groupes-x'          => $this->make_hook('admin_authgroupesx', AUTH_MDP,    'admin'),
 +            'admin/auth-groupes-x'          => $this->make_hook('admin_authgroupesx', AUTH_PASSWD, 'admin'),
          );
      }
  
              return PL_DO_AUTH;
          }
  
+         if (!S::user()->checkPerms('groups')) {
+             return PL_FORBIDDEN;
+         }
          $this->load('auth.inc.php');
  
          $gpex_pass = Get::s('pass');
diff --combined modules/xnetgrp.php
@@@ -29,34 -29,34 +29,34 @@@ class XnetGrpModule extends PLModul
              '%grp/asso.php'        => $this->make_hook('index',                 AUTH_PUBLIC),
              '%grp/logo'            => $this->make_hook('logo',                  AUTH_PUBLIC),
              '%grp/site'            => $this->make_hook('site',                  AUTH_PUBLIC),
 -            '%grp/edit'            => $this->make_hook('edit',                  AUTH_MDP, 'groupadmin'),
 -            '%grp/mail'            => $this->make_hook('mail',                  AUTH_MDP, 'groupadmin'),
 -            '%grp/forum'           => $this->make_hook('forum',                 AUTH_MDP, 'groupmember'),
 -            '%grp/former_users'    => $this->make_hook('former_users',          AUTH_MDP, 'admin'),
 -            '%grp/annuaire'        => $this->make_hook('annuaire',              AUTH_MDP, 'groupannu'),
 -            '%grp/annuaire/vcard'  => $this->make_hook('vcard',                 AUTH_MDP, 'groupmember:groupannu'),
 -            '%grp/annuaire/csv'    => $this->make_hook('csv',                   AUTH_MDP, 'groupmember:groupannu'),
 -            '%grp/directory/sync'  => $this->make_hook('directory_sync',        AUTH_MDP, 'groupadmin'),
 -            '%grp/directory/unact' => $this->make_hook('non_active',            AUTH_MDP, 'groupadmin'),
 -            '%grp/trombi'          => $this->make_hook('trombi',                AUTH_MDP, 'groupannu'),
 -            '%grp/geoloc'          => $this->make_hook('geoloc',                AUTH_MDP, 'groupannu'),
 -            '%grp/subscribe'       => $this->make_hook('subscribe',             AUTH_MDP, 'groups'),
 -            '%grp/subscribe/valid' => $this->make_hook('subscribe_valid',       AUTH_MDP, 'groupadmin'),
 -            '%grp/unsubscribe'     => $this->make_hook('unsubscribe',           AUTH_MDP, 'groupmember'),
 -
 -            '%grp/change_rights'   => $this->make_hook('change_rights',         AUTH_MDP, 'groups'),
 -            '%grp/admin/annuaire'  => $this->make_hook('admin_annuaire',        AUTH_MDP, 'groupadmin'),
 -            '%grp/member'          => $this->make_hook('admin_member',          AUTH_MDP, 'groupadmin'),
 -            '%grp/member/new'      => $this->make_hook('admin_member_new',      AUTH_MDP, 'groupadmin'),
 -            '%grp/member/new/ajax' => $this->make_hook('admin_member_new_ajax', AUTH_MDP, 'groups', NO_AUTH),
 -            '%grp/member/del'      => $this->make_hook('admin_member_del',      AUTH_MDP, 'groupadmin'),
 -            '%grp/member/suggest'  => $this->make_hook('admin_member_suggest',  AUTH_MDP, 'groupadmin'),
 +            '%grp/edit'            => $this->make_hook('edit',                  AUTH_PASSWD, 'groupadmin'),
 +            '%grp/mail'            => $this->make_hook('mail',                  AUTH_PASSWD, 'groupadmin'),
 +            '%grp/forum'           => $this->make_hook('forum',                 AUTH_PASSWD, 'groupmember'),
 +            '%grp/former_users'    => $this->make_hook('former_users',          AUTH_PASSWD, 'admin'),
 +            '%grp/annuaire'        => $this->make_hook('annuaire',              AUTH_PASSWD, 'groupannu'),
 +            '%grp/annuaire/vcard'  => $this->make_hook('vcard',                 AUTH_PASSWD, 'groupmember:groupannu'),
 +            '%grp/annuaire/csv'    => $this->make_hook('csv',                   AUTH_PASSWD, 'groupmember:groupannu'),
 +            '%grp/directory/sync'  => $this->make_hook('directory_sync',        AUTH_PASSWD, 'groupadmin'),
 +            '%grp/directory/unact' => $this->make_hook('non_active',            AUTH_PASSWD, 'groupadmin'),
 +            '%grp/trombi'          => $this->make_hook('trombi',                AUTH_PASSWD, 'groupannu'),
 +            '%grp/geoloc'          => $this->make_hook('geoloc',                AUTH_PASSWD, 'groupannu'),
 +            '%grp/subscribe'       => $this->make_hook('subscribe',             AUTH_PASSWD, 'groups'),
 +            '%grp/subscribe/valid' => $this->make_hook('subscribe_valid',       AUTH_PASSWD, 'groupadmin'),
 +            '%grp/unsubscribe'     => $this->make_hook('unsubscribe',           AUTH_PASSWD, 'groupmember'),
 +
 +            '%grp/change_rights'   => $this->make_hook('change_rights',         AUTH_PASSWD, 'groups'),
 +            '%grp/admin/annuaire'  => $this->make_hook('admin_annuaire',        AUTH_PASSWD, 'groupadmin'),
 +            '%grp/member'          => $this->make_hook('admin_member',          AUTH_PASSWD, 'groupadmin'),
 +            '%grp/member/new'      => $this->make_hook('admin_member_new',      AUTH_PASSWD, 'groupadmin'),
 +            '%grp/member/new/ajax' => $this->make_hook('admin_member_new_ajax', AUTH_PASSWD, 'groups', NO_AUTH),
 +            '%grp/member/del'      => $this->make_hook('admin_member_del',      AUTH_PASSWD, 'groupadmin'),
 +            '%grp/member/suggest'  => $this->make_hook('admin_member_suggest',  AUTH_PASSWD, 'groupadmin'),
  
              '%grp/rss'             => $this->make_token_hook('rss',             AUTH_PUBLIC),
 -            '%grp/announce/new'    => $this->make_hook('edit_announce',         AUTH_MDP, 'groupadmin'),
 -            '%grp/announce/edit'   => $this->make_hook('edit_announce',         AUTH_MDP, 'groupadmin'),
 +            '%grp/announce/new'    => $this->make_hook('edit_announce',         AUTH_PASSWD, 'groupadmin'),
 +            '%grp/announce/edit'   => $this->make_hook('edit_announce',         AUTH_PASSWD, 'groupadmin'),
              '%grp/announce/photo'  => $this->make_hook('photo_announce',        AUTH_PUBLIC),
 -            '%grp/admin/announces' => $this->make_hook('admin_announce',        AUTH_MDP, 'groupadmin'),
 +            '%grp/admin/announces' => $this->make_hook('admin_announce',        AUTH_PASSWD, 'groupadmin'),
          );
      }
  
                                      WHERE  asso_id = {?} AND expiration >= CURRENT_DATE()
                                             AND FIND_IN_SET('public', flags)",
                                    $globals->asso('id'));
 +            $payments = XDB::fetchAllAssoc("SELECT  id, text
 +                                              FROM  payments
 +                                             WHERE  asso_id = {?} AND NOT FIND_IN_SET('old', flags) AND FIND_IN_SET('public', flags)
 +                                          ORDER BY  id DESC",
 +                                           $globals->asso('id'));
 +            $page->assign('payments', $payments);
          }
          if (may_update()) {
              $subs_valid = XDB::query("SELECT  uid
      {
          global $globals;
          $page->changeTpl('xnetgrp/edit.tpl');
 +        $error = false;
 +
 +        if (S::admin()) {
 +            $domains = XDB::iterator('SELECT  *
 +                                        FROM  group_dom
 +                                    ORDER BY  nom');
 +            $page->assign('domains', $domains);
 +            $page->assign('super', true);
 +        }
  
          if (Post::has('submit')) {
              S::assert_xsrf_token();
  
                  if (Post::v('mail_domain') && (strstr(Post::v('mail_domain'), '.') === false)) {
                      $page->trigError('Le domaine doit être un FQDN (aucune modification effectuée)&nbsp;!!!');
 -                    return;
 +                    $error = true;
                  }
                  if (Post::t('nom') == '' || Post::t('diminutif') == '') {
                      $page->trigError('Ni le nom ni le diminutif du groupe ne peuvent être vide.');
 +                    $error = true;
 +                }
 +                if ($error) {
 +                    $page->assign('nom', Post::t('nom'));
 +                    $page->assign('diminutif', Post::t('diminutif'));
 +                    $page->assign('mail_domain', Post::t('mail_domain'));
 +                    $page->assign('cat', Post::v('cat'));
 +                    $page->assign('dom', Post::v('dom'));
 +                    $page->assign('ax', Post::v('ax'));
 +                    $page->assign('axDate', Post::t('axDate'));
 +                    $page->assign('site', $site);
 +                    $page->assign('resp', Post::t('resp'));
 +                    $page->assign('mail', Post::t('mail'));
 +                    $page->assign('phone', Post::t('phone'));
 +                    $page->assign('fax', Post::t('fax'));
 +                    $page->assign('address', Post::t('address'));
 +                    $page->assign('forum', Post::t('forum'));
 +                    $page->assign('inscriptible', Post::v('inscriptible'));
 +                    $page->assign('sub_url', Post::t('sub_url'));
 +                    $page->assign('unsub_url', Post::t('unsub_url'));
 +                    $page->assign('welcome_msg', Post::t('welcome_msg'));
 +                    $page->assign('pub', Post::v('pub'));
 +                    $page->assign('notif_unsub', Post::i('notif_unsub'));
 +                    $page->assign('descr', Post::t('descr'));
 +                    $page->assign('error', $error);
                      return;
                  }
 +
                  $axDate = make_datetime(Post::v('axDate'));
                  if (Post::t('axDate') != '') {
                      $axDate = make_datetime(Post::v('axDate'))->format('Y-m-d');
  
              pl_redirect('../' . Post::v('diminutif', $globals->asso('diminutif')) . '/edit');
          }
 -
 -        if (S::admin()) {
 -            $dom = XDB::iterator('SELECT  *
 -                                    FROM  group_dom
 -                                ORDER BY  nom');
 -            $page->assign('dom', $dom);
 -            $page->assign('super', true);
 -        }
 +        $page->assign('error', $error);
 +        $page->assign('cat', $globals->asso('cat'));
 +        $page->assign('dom', $globals->asso('dom'));
 +        $page->assign('ax', $globals->asso('ax'));
 +        $page->assign('inscriptible', $globals->asso('inscriptible'));
 +        $page->assign('pub', $globals->asso('pub'));
 +        $page->assign('notif_unsub', $globals->asso('notif_unsub'));
      }
  
      function handler_mail($page)
                  }
              }
          } else {
 -            // User is of type xnet. There are 3 possible cases:
 -            //  * the email is not known yet: we create a new account and
 -            //      propose to send an email to the user so he can activate
 -            //      his account,
 -            //  * the email is known but the user was not contacted in order to
 -            //      activate yet: we propose to send an email to the user so he
 -            //      can activate his account,
 -            //  * the email is known and the user was already contacted or has
 -            //      an active account: nothing to be done.
 -            list($mbox, $domain) = explode('@', strtolower($email));
 -            $hruid = User::makeHrid($mbox, $domain, 'ext');
 -            // User might already have an account (in another group for example).
 -            $user = User::getSilent($hruid);
 -
 -            // If the user has no account yet, creates new account: build names from email address.
 -            if (empty($user)) {
 -                $parts = explode('.', $mbox);
 -                if (count($parts) == 1) {
 -                    $lastname = $display_name = $full_name = $directory_name = ucfirst($mbox);
 -                    $firstname = '';
 -                } else {
 -                    $firstname = ucfirst($parts[0]);
 -                    $lastname = ucwords(implode(' ', array_slice($parts, 1)));
 -                    $display_name = $firstname;
 -                    $full_name = "$firstname $lastname";
 -                    $directory_name = strtoupper($lastname) . " " . $firstname;
 -                }
 -                XDB::execute('INSERT INTO  accounts (hruid, display_name, full_name, directory_name, firstname, lastname, email, type, state)
 -                                   VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, \'xnet\', \'disabled\')',
 -                             $hruid, $display_name, $full_name, $directory_name, $firstname, $lastname, $email);
 +            // Check if the email is a redirection.
 +            $user = User::getSilent($email);
 +
 +            if (is_null($user) || $user->type == 'xnet') {
 +                // User is of type xnet. There are 3 possible cases:
 +                //  * the email is not known yet: we create a new account and
 +                //      propose to send an email to the user so he can activate
 +                //      his account,
 +                //  * the email is known but the user was not contacted in order to
 +                //      activate yet: we propose to send an email to the user so he
 +                //      can activate his account,
 +                //  * the email is known and the user was already contacted or has
 +                //      an active account: nothing to be done.
 +                list($mbox, $domain) = explode('@', strtolower($email));
 +                $hruid = User::makeHrid($mbox, $domain, 'ext');
 +                // User might already have an account (in another group for example).
                  $user = User::getSilent($hruid);
 -            }
  
 -            $suggest_account_activation = $this->suggest($user);
 +                // If the user has no account yet, creates new account: build names from email address.
 +                if (empty($user)) {
 +                    $parts = explode('.', $mbox);
 +                    if (count($parts) == 1) {
 +                        $lastname = $display_name = $full_name = $directory_name = ucfirst($mbox);
 +                        $firstname = '';
 +                    } else {
 +                        $firstname = ucfirst($parts[0]);
 +                        $lastname = ucwords(implode(' ', array_slice($parts, 1)));
 +                        $display_name = $firstname;
 +                        $full_name = "$firstname $lastname";
 +                        $directory_name = strtoupper($lastname) . " " . $firstname;
 +                    }
 +                    XDB::execute('INSERT INTO  accounts (hruid, display_name, full_name, directory_name, firstname, lastname, email, type, state)
 +                                       VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, \'xnet\', \'disabled\')',
 +                                 $hruid, $display_name, $full_name, $directory_name, $firstname, $lastname, $email);
 +                    $user = User::getSilent($hruid);
 +                }
 +
 +                $suggest_account_activation = $this->suggest($user);
 +            }
          }
  
          if ($user) {
              }
  
              // Update user info
-             $email_changed = (!$user->profile() && strtolower($user->forlifeEmail()) != strtolower(Post::v('email')));
-             $from_email = $user->forlifeEmail();
              if ($user->type == 'virtual' || ($user->type == 'xnet' && !$user->perms)) {
                  $lastname = Post::s('lastname');
                  if (Post::s('type') != 'virtual') {
                                 SET  email = {?}
                               WHERE  uid = {?}',
                             Post::t('email'), $user->id());
-             }
-             if (require_email_update($user, Post::t('email'))) {
-                 $listClient = new MMList(S::user());
-                 $listClient->change_user_email($user->forlifeEmail(), Post::t('email'));
-                 update_alias_user($user->forlifeEmail(), Post::t('email'));
+                 if (Post::has('email') && require_email_update($user, Post::t('email'))) {
+                     $listClient = new MMList(S::user());
+                     $listClient->change_user_email($user->forlifeEmail(), Post::t('email'));
+                     update_alias_user($user->forlifeEmail(), Post::t('email'));
+                 }
              }
              if (XDB::affectedRows()) {
                  $page->trigSuccess('Données de l\'utilisateur mises à jour.');
              }
  
 -            if (($user->type == 'xnet' && !$user->perms) && Post::b('suggest')) {
 -                $request = new AccountReq(S::user(), $user->hruid, Post::t('email'), $globals->asso('nom'));
 -                $request->submit();
 -                $page->trigSuccess('Le compte va bientôt être activé.');
 +            if (($user->type == 'xnet' && !$user->perms)) {
 +                if (Post::b('suggest')) {
 +                    $request = new AccountReq(S::user(), $user->hruid, Post::t('email'), $globals->asso('nom'));
 +                    $request->submit();
 +                    $page->trigSuccess('Le compte va bientôt être activé.');
 +                }
 +                if (Post::b('again')) {
 +                    $data = XDB::fetchOneAssoc('SELECT  hash, group_name, sender_name, email
 +                                                  FROM  register_pending_xnet
 +                                                 WHERE  uid = {?}',
 +                                               $user->id());
 +
 +                    $mailer = new PlMailer('xnet/account.mail.tpl');
 +                    $mailer->addCc('validation+xnet_account@polytechnique.org');
 +                    $mailer->setTo($data['email']);
 +                    $mailer->assign('hash', $data['hash']);
 +                    $mailer->assign('email', $data['email']);
 +                    $mailer->assign('group', $data['group_name']);
 +                    $mailer->assign('sender_name', $data['sender_name']);
 +                    $mailer->assign('again', true);
 +                    $mailer->send();
 +                    $page->trigSuccess('Relance effectuée avec succès.');
 +                }
              }
  
              // Update group params for user
              foreach (Env::v('ml1', array()) as $ml => $state) {
                  $ask = empty($_REQUEST['ml2'][$ml]) ? 0 : 2;
                  if ($ask == $state) {
-                     if ($state && $email_changed) {
-                         $mmlist->replace_email($ml, $from_email, $user->forlifeEmail());
-                         $page->trigSuccess("L'abonnement de {$user->fullName()} à $ml@ a été mis à jour.");
-                     }
                      continue;
                  }
                  if ($state == '1') {
                      $mmlist->mass_subscribe($ml, Array($user->forlifeEmail()));
                      $page->trigSuccess("{$user->fullName()} a été abonné à $ml@.");
                  } else {
-                     if ($email_changed) {
-                         $mmlist->mass_unsubscribe($ml, Array($from_email));
-                     } else {
-                         $mmlist->mass_unsubscribe($ml, Array($user->forlifeEmail()));
-                     }
+                     $mmlist->mass_unsubscribe($ml, Array($user->forlifeEmail()));
                      $page->trigSuccess("{$user->fullName()} a été désabonné de $ml@.");
                  }
              }
                  require_once 'emails.inc.php';
                  $ask = !empty($_REQUEST['ml4'][$ml]);
                  list($local_part, ) = explode('@', $ml);
-                 if($state == $ask) {
-                     if ($state && $email_changed) {
-                         update_list_alias($user->id(), $from_email, $local_part, $globals->asso('mail_domain'));
-                         $page->trigSuccess("L'abonnement de {$user->fullName()} à $ml a été mis à jour.");
-                     }
-                 } else if($ask) {
+                 if ($ask == $state) {
+                     continue;
+                 }
+                 if ($ask) {
                      add_to_list_alias($user->id(), $local_part, $globals->asso('mail_domain'));
                      $page->trigSuccess("{$user->fullName()} a été abonné à $ml.");
                  } else {
                  if (Post::i('newsletter') == 1) {
                      $nl->subscribe($user);
                  } else {
 -                    $nl->unsubscribe(null, $user->id);
 +                    $nl->unsubscribe(null, $user->id());
                  }
              }
          }
          $page->assign('alias', $user->emailGroupAliases($globals->asso('mail_domain')));
          $page->assign('positions', explode(',', $positions));
          $page->assign('nl_registered', $nl_registered);
 +        $page->assign('pending_xnet_account', XDB::fetchOneCell('SELECT  1
 +                                                                   FROM  register_pending_xnet
 +                                                                  WHERE  uid = {?}',
 +                                                                $user->id()));
      }
  
      function handler_rss(PlPage $page, PlUser $user)
@@@ -28,7 -28,7 +28,7 @@@
  {elseif $mail_part eq 'text'}
  Bonjour,
  
 -{$sender_name} nous a demandé de vous créer un compte pour que vous puissiez disposer pleinement de toutes les fonctionnalités liées au groupe {$group}.
 +{$sender_name} nous a demandé de vous {if $again}relancer{else}créer un compte{/if} pour que vous puissiez disposer pleinement de toutes les fonctionnalités liées au groupe {$group}.
  
  Après activation, vos paramètres de connexion seront :
  
@@@ -37,7 -37,7 +37,7 @@@ mot de passe : celui que vous choisire
  
  Vous pouvez, dès à présent et pendant une période d'un mois, activer votre compte en cliquant sur le lien suivant :
  
- {$globals->baseurl}/register/ext/{$hash}
+ {$globals->baseurl}register/ext/{$hash}
  
  Si le lien ne fonctionne pas, copiez intégralement ce lien dans la barre d'adresse de votre navigateur.