X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fadmin.php;h=f63a6e2f557b0bef376fac460fb19165c606928e;hb=5cfb3dd10421468779a740595b3e5e68aba9838e;hp=ea0928be5486391a4005de01bec8c08317e04a2a;hpb=b284e2fafb82ac7b02748e1c944bb1b6e7fa6b4b;p=platal.git diff --git a/modules/admin.php b/modules/admin.php index ea0928b..f63a6e2 100644 --- a/modules/admin.php +++ b/modules/admin.php @@ -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') ); } @@ -585,9 +587,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 +606,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 +622,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\', \'\' 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 +639,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 +657,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 @@ -709,12 +710,12 @@ class AdminModule extends PLModule $aliases = XDB::iterator("SELECT CONCAT(s.email, '@', d.name) AS email, (s.type = 'forlife') AS forlife, (s.email REGEXP '\\\\.[0-9]{2}$') AS hundred_year, FIND_IN_SET('bestalias', s.flags) AS bestalias, s.expire, - (d.name = {?}) AS alias + (s.type = 'alias_aux') AS alias FROM email_source_account AS s INNER JOIN email_virtual_domains AS d ON (s.domain = d.id) WHERE s.uid = {?} ORDER BY !alias, s.email", - $globals->mail->alias_dom, $user->id()); + $user->id()); $page->assign('aliases', $aliases); $page->assign('account_types', XDB::iterator('SELECT * FROM account_types ORDER BY type')); $page->assign('skins', XDB::iterator('SELECT id, name FROM skins ORDER BY name')); @@ -778,9 +779,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 +807,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 +818,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 +832,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 +848,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 +862,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 ({?}, {?}, {?}), @@ -943,8 +950,8 @@ class AdminModule extends PLModule $this->load("homonyms.inc.php"); if ($target) { - $user = User::getSilent($target); - if (!$user || !($loginbis = select_if_homonyme($user))) { + $user = User::getSilentWithUID($target); + if (!$user || !($loginbis = select_if_homonym($user))) { $target = 0; } else { $page->assign('user', $user); @@ -955,15 +962,16 @@ class AdminModule extends PLModule $page->assign('op', $op); $page->assign('target', $target); - // on a un $target valide, on prepare les mails + // When we have a valid target, prepare emails. if ($target) { - // on examine l'op a effectuer + require_once 'emails.inc.php'; + // Examine what operation needs to be performed. switch ($op) { case 'mail': S::assert_xsrf_token(); send_warning_homonyme($user, $loginbis); - switch_bestalias($user, $loginbis); + fix_bestalias($user); $op = 'list'; $page->trigSuccess('Email envoyé à ' . $user->forlifeEmail() . '.'); break; @@ -971,12 +979,15 @@ class AdminModule extends PLModule case 'correct': S::assert_xsrf_token(); - switch_bestalias($user, $loginbis); - XDB::execute("UPDATE aliases - SET type = 'homonyme', expire=NOW() - WHERE alias = {?}", $loginbis); - XDB::execute('INSERT IGNORE INTO homonyms (homonyme_id, uid) - VALUES ({?}, {?})', $target, $target); + 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 {?}, {?}, id, \'homonym\', NOW() + FROM email_virtual_domains + WHERE name = {?}', + User::makeHomonymHrmid($loginbis), $loginbis, $user->mainEmailDomain()); + fix_bestalias($user); send_robot_homonyme($user, $loginbis); $op = 'list'; $page->trigSuccess('Email envoyé à ' . $user->forlifeEmail() . ', alias supprimé.'); @@ -985,21 +996,32 @@ class AdminModule extends PLModule } if ($op == 'list') { - $res = XDB::iterator( - "SELECT a.alias AS homonyme, s.alias AS forlife, - IF(h.homonyme_id = s.uid, a.expire, NULL) AS expire, - IF(h.homonyme_id = s.uid, a.type, NULL) AS type, ac.uid - FROM aliases AS a - LEFT JOIN homonyms AS h ON (h.homonyme_id = a.uid) - INNER JOIN aliases AS s ON (s.uid = h.uid AND s.type = 'a_vie') - INNER JOIN accounts AS ac ON (ac.uid = a.uid) - WHERE a.type = 'homonyme' OR a.expire != '' - ORDER BY a.alias, forlife"); - $hnymes = Array(); - while ($tab = $res->next()) { - $hnymes[$tab['homonyme']][] = $tab; - } - $page->assign_by_ref('hnymes', $hnymes); + // Retrieves homonyms that are already been fixed. + $res = XDB::iterator('SELECT o.email AS homonym, f.email AS forlife, o.expire, f.uid + 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\') + WHERE o.expire IS NOT NULL + ORDER BY homonym, forlife'); + $homonyms = array(); + while ($item = $res->next()) { + $homonyms[$item['homonym']][] = $item; + } + $page->assign_by_ref('homonyms', $homonyms); + + // Retrieves homonyms that needs to be fixed. + $res = XDB::iterator('SELECT e.email AS homonym, f.email AS forlife, e.expire, e.uid, (e.expire < NOW()) AS urgent + FROM email_source_account AS e + 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\') + WHERE e.expire IS NOT NULL + ORDER BY homonym, forlife'); + $homonyms_to_fix = array(); + while ($item = $res->next()) { + $homonyms_to_fix[$item['homonym']][] = $item; + } + $page->assign_by_ref('homonyms_to_fix', $homonyms_to_fix); } } @@ -1246,7 +1268,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 @@ -1680,6 +1702,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'); @@ -1793,6 +1825,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: