Updates MLs on email updates on xnet. Updates aliases email updates on
[platal.git] / modules / admin.php
index 5dc2859..a8e62eb 100644 (file)
@@ -24,35 +24,37 @@ class AdminModule extends PLModule
     function handlers()
     {
         return array(
-            'phpinfo'                      => $this->make_hook('phpinfo',                AUTH_MDP, 'admin'),
+            'phpinfo'                      => $this->make_hook('phpinfo',                AUTH_MDP,    'admin'),
             'get_rights'                   => $this->make_hook('get_rights',             AUTH_COOKIE, 'admin'),
             'set_skin'                     => $this->make_hook('set_skin',               AUTH_COOKIE, 'admin'),
-            'admin'                        => $this->make_hook('default',                AUTH_MDP, 'admin'),
-            'admin/dead-but-active'        => $this->make_hook('dead_but_active',        AUTH_MDP, 'admin'),
-            'admin/deaths'                 => $this->make_hook('deaths',                 AUTH_MDP, 'admin'),
-            'admin/downtime'               => $this->make_hook('downtime',               AUTH_MDP, 'admin'),
-            'admin/homonyms'               => $this->make_hook('homonyms',               AUTH_MDP, 'admin'),
-            'admin/logger'                 => $this->make_hook('logger',                 AUTH_MDP, 'admin'),
-            'admin/logger/actions'         => $this->make_hook('logger_actions',         AUTH_MDP, 'admin'),
-            'admin/postfix/blacklist'      => $this->make_hook('postfix_blacklist',      AUTH_MDP, 'admin'),
-            'admin/postfix/delayed'        => $this->make_hook('postfix_delayed',        AUTH_MDP, 'admin'),
-            'admin/postfix/regexp_bounces' => $this->make_hook('postfix_regexpsbounces', AUTH_MDP, 'admin'),
-            'admin/postfix/whitelist'      => $this->make_hook('postfix_whitelist',      AUTH_MDP, 'admin'),
-            'admin/mx/broken'              => $this->make_hook('mx_broken',              AUTH_MDP, 'admin'),
-            'admin/skins'                  => $this->make_hook('skins',                  AUTH_MDP, 'admin'),
-            'admin/user'                   => $this->make_hook('user',                   AUTH_MDP, 'admin'),
-            'admin/add_accounts'           => $this->make_hook('add_accounts',           AUTH_MDP, 'admin'),
-            'admin/validate'               => $this->make_hook('validate',               AUTH_MDP, 'admin,edit_directory'),
-            'admin/validate/answers'       => $this->make_hook('validate_answers',       AUTH_MDP, 'admin'),
-            'admin/wiki'                   => $this->make_hook('wiki',                   AUTH_MDP, 'admin'),
-            'admin/ipwatch'                => $this->make_hook('ipwatch',                AUTH_MDP, 'admin'),
-            'admin/icons'                  => $this->make_hook('icons',                  AUTH_MDP, 'admin'),
-            'admin/geocoding'              => $this->make_hook('geocoding',              AUTH_MDP, 'admin'),
-            'admin/accounts'               => $this->make_hook('accounts',               AUTH_MDP, 'admin'),
-            'admin/account/watch'          => $this->make_hook('account_watch',          AUTH_MDP, 'admin'),
-            'admin/account/types'          => $this->make_hook('account_types',          AUTH_MDP, 'admin'),
-            'admin/jobs'                   => $this->make_hook('jobs',                   AUTH_MDP, 'admin,edit_directory'),
-            'admin/profile'                => $this->make_hook('profile',                AUTH_MDP, 'admin,edit_directory')
+            'admin'                        => $this->make_hook('default',                AUTH_MDP,    'admin'),
+            'admin/dead-but-active'        => $this->make_hook('dead_but_active',        AUTH_MDP,    'admin'),
+            'admin/deaths'                 => $this->make_hook('deaths',                 AUTH_MDP,    'admin'),
+            'admin/downtime'               => $this->make_hook('downtime',               AUTH_MDP,    'admin'),
+            'admin/homonyms'               => $this->make_hook('homonyms',               AUTH_MDP,    'admin'),
+            'admin/logger'                 => $this->make_hook('logger',                 AUTH_MDP,    'admin'),
+            'admin/logger/actions'         => $this->make_hook('logger_actions',         AUTH_MDP,    'admin'),
+            'admin/postfix/blacklist'      => $this->make_hook('postfix_blacklist',      AUTH_MDP,    'admin'),
+            'admin/postfix/delayed'        => $this->make_hook('postfix_delayed',        AUTH_MDP,    'admin'),
+            'admin/postfix/regexp_bounces' => $this->make_hook('postfix_regexpsbounces', AUTH_MDP,    'admin'),
+            'admin/postfix/whitelist'      => $this->make_hook('postfix_whitelist',      AUTH_MDP,    'admin'),
+            'admin/mx/broken'              => $this->make_hook('mx_broken',              AUTH_MDP,    'admin'),
+            'admin/skins'                  => $this->make_hook('skins',                  AUTH_MDP,    'admin'),
+            'admin/user'                   => $this->make_hook('user',                   AUTH_MDP,    'admin'),
+            'admin/add_accounts'           => $this->make_hook('add_accounts',           AUTH_MDP,    'admin'),
+            'admin/validate'               => $this->make_hook('validate',               AUTH_MDP,    'admin,edit_directory'),
+            'admin/validate/answers'       => $this->make_hook('validate_answers',       AUTH_MDP,    'admin'),
+            'admin/wiki'                   => $this->make_hook('wiki',                   AUTH_MDP,    'admin'),
+            'admin/ipwatch'                => $this->make_hook('ipwatch',                AUTH_MDP,    'admin'),
+            'admin/icons'                  => $this->make_hook('icons',                  AUTH_MDP,    'admin'),
+            'admin/geocoding'              => $this->make_hook('geocoding',              AUTH_MDP,    'admin'),
+            'admin/accounts'               => $this->make_hook('accounts',               AUTH_MDP,    'admin'),
+            'admin/account/watch'          => $this->make_hook('account_watch',          AUTH_MDP,    'admin'),
+            'admin/account/types'          => $this->make_hook('account_types',          AUTH_MDP,    'admin'),
+            'admin/xnet_without_group'     => $this->make_hook('xnet_without_group',     AUTH_MDP,    'admin'),
+            'admin/jobs'                   => $this->make_hook('jobs',                   AUTH_MDP,    'admin,edit_directory'),
+            'admin/profile'                => $this->make_hook('profile',                AUTH_MDP,    'admin,edit_directory'),
+            'admin/phd'                    => $this->make_hook('phd',                    AUTH_MDP,    'admin')
         );
     }
 
@@ -442,6 +444,7 @@ class AdminModule extends PLModule
         }
 
         // Account Form {{{
+        require_once 'emails.inc.php';
         $to_update = array();
         if (Post::has('disable_weak_access')) {
             $to_update['weak_password'] = null;
@@ -502,9 +505,10 @@ class AdminModule extends PLModule
             if (Post::t('comment') != $user->comment) {
                 $to_update['comment'] = Post::blank('comment') ? null : Post::t('comment');
             }
-            if (!$user->checkPerms(User::PERM_MAIL) && Post::t('email') != $user->forlifeEmail()) {
+            if (require_email_update($user, Post::t('email'))) {
                 $to_update['email'] = Post::t('email');
                 $listClient->change_user_email($user->forlifeEmail(), Post::t('email'));
+                update_alias_user($user->forlifeEmail(), Post::t('email'));
             }
         }
         if (!empty($to_update)) {
@@ -572,7 +576,6 @@ class AdminModule extends PLModule
         // }}}
 
         // Email forwards form {{{
-        require_once("emails.inc.php");
         $redirect = ($registered ? new Redirect($user) : null);
         if (Post::has('add_fwd')) {
             $email = Post::t('email');
@@ -585,9 +588,9 @@ class AdminModule extends PLModule
         } 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));
+            $redirect->modify_one_email(Post::t('activate_fwd'), true);
         } else if (!Post::blank('deactivate_fwd')) {
-            $redirect->modify_one_email(Post::t('deactivate_fwd', false));
+            $redirect->modify_one_email(Post::t('deactivate_fwd'), false);
         } else if (Post::has('disable_fwd')) {
             $redirect->disable();
         } else if (Post::has('enable_fwd')) {
@@ -604,7 +607,7 @@ class AdminModule extends PLModule
             if (strpos($alias, '@') !== false) {
                 list($alias, $domain) = explode('@', $alias);
             } else {
-                $domain = $globals->mail->domain;
+                $domain = $user->mainEmailDomain();
             }
 
             // Checks for alias' user validity.
@@ -620,15 +623,15 @@ class AdminModule extends PLModule
                 } 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) {
+            } elseif ($domain == $user->mainEmailDomain()) {
                 XDB::execute('INSERT INTO  email_source_account (email, uid, domain, type, flags)
-                                   SELECT  {?}, {?}, id, \'alias_aux\', \'\'
+                                   SELECT  {?}, {?}, id, \'alias\', \'\'
                                      FROM  email_virtual_domains
                                     WHERE  name = {?}',
-                              $alias, $user->id(), $globals->mail->alias_dom);
+                              $alias, $user->id(), $domain);
                 $page->trigSuccess("Nouvel alias '$alias' ajouté");
             } else {
-                $page->trigError("Le domaine '$domain' n'est pas valide");
+                $page->trigError("Le domaine '$domain' n'est pas valide pour cet utilisateur.");
             }
         } else if (!Post::blank('del_alias')) {
             $delete_alias = Post::t('del_alias');
@@ -637,7 +640,7 @@ class AdminModule extends PLModule
                             FROM  email_source_account  AS s
                       INNER JOIN  email_virtual_domains AS m ON (s.domain = m.id)
                       INNER JOIN  email_virtual_domains AS d ON (d.aliasing = m.id)
-                           WHERE  s.email = {?} AND s.uid = {?} AND d.name = {?} AND type = \'alias\'',
+                           WHERE  s.email = {?} AND s.uid = {?} AND d.name = {?} AND type != \'forlife\'',
                           $email, $user->id(), $domain);
             XDB::execute('UPDATE  email_redirect_account AS r
                       INNER JOIN  email_virtual_domains  AS m ON (m.name = {?})
@@ -655,10 +658,9 @@ class AdminModule extends PLModule
                            WHERE  uid = {?}", $user->id());
             // Then gives the bestalias flag to the given email.
             list($email, $domain) = explode('@', $best_alias);
-            XDB::execute("UPDATE  email_source_account  AS s
-                      INNER JOIN  email_virtual_domains AS d ON (s.domain = d.id)
-                             SET  s.flags = CONCAT_WS(',', IF(s.flags = '', NULL, s.flags), 'bestalias')
-                           WHERE  s.uid = {?} AND s.email = {?} AND d.name = {?}", $user->id(), $email, $domain);
+            XDB::execute("UPDATE  email_source_account
+                             SET  flags = CONCAT_WS(',', IF(flags = '', NULL, flags), 'bestalias')
+                           WHERE  uid = {?} AND email = {?}", $user->id(), $email);
 
             // As having a non-null bestalias value is critical in
             // plat/al's code, we do an a posteriori check on the
@@ -778,9 +780,9 @@ class AdminModule extends PLModule
     {
         switch ($sex) {
           case 'F':
-            return PlUser::GENDER_FEMALE;
+            return 'female';
           case 'M':
-            return PlUser::GENDER_MALE;
+            return 'male';
           default:
             $page->trigError("La ligne $line n'a pas été ajoutée car le sexe $sex n'est pas pris en compte.");
             return null;
@@ -806,7 +808,6 @@ class AdminModule extends PLModule
             $nameTypes = array_flip($nameTypes);
 
             if (Env::t('add_type') == 'promo') {
-                $type = 'x';
                 $eduSchools = DirEnum::getOptions(DirEnum::EDUSCHOOLS);
                 $eduSchools = array_flip($eduSchools);
                 $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES);
@@ -818,6 +819,7 @@ class AdminModule extends PLModule
                     $grad_year = $promotion + 3;
                     $promo = 'X' . $promotion;
                     $hrpromo = $promotion;
+                    $type = 'x';
                     break;
                   case 'M':
                     $degreeid = $eduDegrees[Profile::DEGREE_M];
@@ -831,12 +833,12 @@ class AdminModule extends PLModule
                     $degreeid = $eduDegrees[Profile::DEGREE_D];
                     $grad_year = $promotion;
                     $entry_year = $promotion - 3;
-                    $promo = 'D' . $promotion;
+                    $promo = 'D (en cours)';
                     $hrpromo = $promo;
                     $type = 'phd';
                     break;
                   default:
-                    $page->killError("La formation n'est pas reconnue:" . Env::t('edu_type') . '.');
+                    $page->killError("La formation n'est pas reconnue : " . Env::t('edu_type') . '.');
                 }
 
                 XDB::startTransaction();
@@ -847,7 +849,13 @@ class AdminModule extends PLModule
                             $fullName = $infos[1] . ' ' . $infos[0];
                             $directoryName = $infos[0] . ' ' . $infos[1];
                             $birthDate = self::formatBirthDate($infos[2]);
-                            $xorgId = Profile::getXorgId($infos[4]);
+                            if ($type == 'x') {
+                                $xorgId = Profile::getXorgId($infos[4]);
+                            } elseif (isset($infos[4])) {
+                                $xorgId = trim($infos[4]);
+                            } else {
+                                $xorgId = 0;
+                            }
                             if (is_null($xorgId)) {
                                 $page->trigError("La ligne $line n'a pas été ajoutée car le matricule École est mal renseigné.");
                                 continue;
@@ -855,7 +863,7 @@ class AdminModule extends PLModule
 
                             XDB::execute('INSERT INTO  profiles (hrpid, xorg_id, ax_id, birthdate_ref, sex)
                                                VALUES  ({?}, {?}, {?}, {?}, {?})',
-                                         $infos['hrid'], $xorgId, $infos[5], $birthDate, $sex);
+                                         $infos['hrid'], $xorgId, (isset($infos[5]) ? $infos[5] : null), $birthDate, $sex);
                             $pid = XDB::insertId();
                             XDB::execute('INSERT INTO  profile_name (pid, name, typeid)
                                                VALUES  ({?}, {?}, {?}),
@@ -938,7 +946,6 @@ class AdminModule extends PLModule
 
     function handler_homonyms($page, $op = 'list', $target = null)
     {
-        global $globals;
         $page->changeTpl('admin/homonymes.tpl');
         $page->setTitle('Administration - Homonymes');
         $this->load("homonyms.inc.php");
@@ -973,19 +980,14 @@ class AdminModule extends PLModule
                 case 'correct':
                     S::assert_xsrf_token();
 
-                    XDB::execute('DELETE  e
-                                    FROM  email_source_account  AS e
-                              INNER JOIN  email_virtual_domains AS d ON (e.domain = d.id)
-                                   WHERE  e.email = {?} AND d.name = {?}',
-                                 $loginbis, $globals->mail->domain);
+                    XDB::execute('DELETE FROM  email_source_account
+                                        WHERE  email = {?} AND type = \'alias\'',
+                                 $loginbis);
                     XDB::execute('INSERT INTO  email_source_other (hrmid, email, domain, type, expire)
-                                       SELECT  CONCAT(\'h.\', {?}, \'.\', {?}), {?}, id, \'homonym\', NOW()
+                                       SELECT  {?}, {?}, id, \'homonym\', NOW()
                                          FROM  email_virtual_domains
                                         WHERE  name = {?}',
-                                 $loginbis, $globals->mail->domain, $loginbis, $globals->mail->domain);
-                    XDB::execute('INSERT IGNORE INTO  homonyms_list (hrmid, uid)
-                                              VALUES  ({?}, {?})',
-                                 'h.' . $loginbis . '.' . $globals->mail->domain, $target);
+                                 User::makeHomonymHrmid($loginbis), $loginbis, $user->mainEmailDomain());
                     fix_bestalias($user);
                     send_robot_homonyme($user, $loginbis);
                     $op = 'list';
@@ -1000,10 +1002,8 @@ class AdminModule extends PLModule
                                     FROM  email_source_other    AS o
                               INNER JOIN  homonyms_list         AS h ON (o.hrmid = h.hrmid)
                               INNER JOIN  email_source_account  AS f ON (h.uid = f.uid AND f.type = \'forlife\')
-                              INNER JOIN  email_virtual_domains AS d ON (f.domain = d.id)
-                                   WHERE  o.expire IS NOT NULL AND d.name = {?}
-                                ORDER BY  homonym, forlife',
-                                 $globals->mail->domain);
+                                   WHERE  o.expire IS NOT NULL
+                                ORDER BY  homonym, forlife');
             $homonyms = array();
             while ($item = $res->next()) {
                 $homonyms[$item['homonym']][] = $item;
@@ -1016,10 +1016,8 @@ class AdminModule extends PLModule
                               INNER JOIN  homonyms_list         AS l ON (e.uid = l.uid)
                               INNER JOIN  homonyms_list         AS h ON (l.hrmid = h.hrmid)
                               INNER JOIN  email_source_account  AS f ON (h.uid = f.uid AND f.type = \'forlife\')
-                              INNER JOIN  email_virtual_domains AS d ON (f.domain = d.id)
-                                   WHERE  e.expire IS NOT NULL AND d.name = {?}
-                                ORDER BY  homonym, forlife',
-                                 $globals->mail->domain);
+                                   WHERE  e.expire IS NOT NULL
+                                ORDER BY  homonym, forlife');
             $homonyms_to_fix = array();
             while ($item = $res->next()) {
                 $homonyms_to_fix[$item['homonym']][] = $item;
@@ -1271,7 +1269,7 @@ class AdminModule extends PLModule
 
     private static function updateLanguage(array $item) {}
 
-    function handler_geocoding(&$page, $category = null, $action = null, $id = null)
+    function handler_geocoding($page, $category = null, $action = null, $id = null)
     {
         // Warning, this handler requires the following packages:
         //  * pkg-isocodes
@@ -1705,6 +1703,16 @@ class AdminModule extends PLModule
                                              ORDER BY  a.hruid'));
     }
 
+    function handler_xnet_without_group($page)
+    {
+        $page->changeTpl('admin/xnet_without_group.tpl');
+        $page->assign('accounts', XDB::iterator('SELECT  a.hruid, a.state
+                                                   FROM  accounts      AS a
+                                              LEFT JOIN  group_members AS m ON (a.uid = m.uid)
+                                                  WHERE  a.type = \'xnet\' AND m.uid IS NULL
+                                               ORDER BY  a.state, a.hruid'));
+    }
+
     function handler_jobs($page, $id = -1)
     {
         $page->changeTpl('admin/jobs.tpl');
@@ -1818,6 +1826,61 @@ class AdminModule extends PLModule
                             ORDER BY  pd.directory_name');
         $page->assign('updates', $res);
     }
+
+    function handler_phd($page, $promo = null, $validate = false)
+    {
+        $page->changeTpl('admin/phd.tpl');
+        $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES);
+        $eduDegrees = array_flip($eduDegrees);
+
+        if (is_null($promo)) {
+            $promo_list = XDB::fetchColumn('SELECT  DISTINCT(grad_year)
+                                              FROM  profile_education
+                                             WHERE  FIND_IN_SET(\'primary\', flags) AND NOT FIND_IN_SET(\'completed\', flags) AND degreeid = {?}
+                                          ORDER BY  grad_year',
+                                           $eduDegrees[Profile::DEGREE_D]);
+            $page->assign('promo_list', $promo_list);
+            $page->assign('nothing', count($promo_list) == 0);
+            return;
+        }
+
+        if ($validate) {
+            S::assert_xsrf_token();
+
+            $list = XDB::iterator('SELECT  pe.pid, pd.directory_name
+                                     FROM  profile_education AS pe
+                               INNER JOIN  profile_display   AS pd ON (pe.pid = pd.pid)
+                                    WHERE  FIND_IN_SET(\'primary\', pe.flags) AND NOT FIND_IN_SET(\'completed\', pe.flags)
+                                           AND pe.degreeid = {?} AND pe.grad_year = {?}',
+                                  $eduDegrees[Profile::DEGREE_D], $promo);
+            while ($res = $list->next()) {
+                $pid = $res['pid'];
+                $name = $res['directory_name'];
+                if (Post::b('completed_' . $pid)) {
+                    $grad_year = Post::t('grad_year_' . $pid);
+                    XDB::execute('UPDATE  profile_education
+                                     SET  flags = \'primary,completed\', grad_year = {?}
+                                   WHERE  FIND_IN_SET(\'primary\', flags) AND pid = {?}',
+                                 $grad_year, $pid);
+                    XDB::execute('UPDATE  profile_display
+                                     SET  promo = {?}
+                                   WHERE  pid = {?}',
+                                 'D' . $grad_year, $pid);
+                    $page->trigSuccess("Promotion de $name validée.");
+                }
+            }
+        }
+
+        $list = XDB::iterator('SELECT  pe.pid, pd.directory_name
+                                 FROM  profile_education AS pe
+                           INNER JOIN  profile_display   AS pd ON (pe.pid = pd.pid)
+                                WHERE  FIND_IN_SET(\'primary\', pe.flags) AND NOT FIND_IN_SET(\'completed\', pe.flags)
+                                       AND pe.degreeid = {?} AND pe.grad_year = {?}
+                             ORDER BY  pd.directory_name',
+                              $eduDegrees[Profile::DEGREE_D], $promo);
+        $page->assign('list', $list);
+        $page->assign('promo', $promo);
+    }
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: