X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=modules%2Fadmin.php;h=99e594ae7e955e14e4c69d2dc6039e5984862fdd;hb=eaf30d86cc99df2414cf4f171a9b0f11b0561e3b;hp=62518009385a2972e24a013d91ea10f69433cbf5;hpb=c339246fb6afbd129da3d7ca6ff62703a0a7741c;p=platal.git diff --git a/modules/admin.php b/modules/admin.php index 6251800..99e594a 100644 --- a/modules/admin.php +++ b/modules/admin.php @@ -45,6 +45,7 @@ class AdminModule extends PLModule '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'), ); } @@ -356,7 +357,7 @@ class AdminModule extends PLModule require_once("user.func.inc.php"); if (S::has('suid')) { - $page->kill("déjà en SUID !!!"); + $page->kill("Déjà en SUID !!!"); } if (Env::has('user_id')) { @@ -395,12 +396,12 @@ class AdminModule extends PLModule LEFT JOIN aliases AS a ON (a.id = u.user_id AND type= 'a_vie') WHERE u.user_id = {?}", $login); } else { - $r = XDB::query("SELECT *, a.alias AS forlife, + $r = XDB::query("SELECT *, a.alias AS forlife, FIND_IN_SET('watch', u.flags) AS watch, FIND_IN_SET('femme', u.flags) AS sexe, (year(naissance) > promo - 15 or year(naissance) < promo - 25) AS naiss_err FROM auth_user_md5 AS u INNER JOIN aliases AS a ON ( a.id = u.user_id AND a.alias={?} AND type!='homonyme' )", $login); - } + } $mr = $r->fetchOneAssoc(); if (!is_numeric($login)) { //user has a forlife @@ -434,24 +435,60 @@ class AdminModule extends PLModule XDB::execute("UPDATE emails SET rewrite = '' WHERE uid = {?} AND rewrite LIKE CONCAT({?}, '@%')", - $mr['user_id'], $val); + $mr['user_id'], $val); fix_bestalias($mr['user_id']); $page->trig($val." a été supprimé"); } break; - case "activate_fwd": - if (!empty($val)) { - $redirect->modify_one_email($val, true); - } - break; - case "deactivate_fwd": - if (!empty($val)) { - $redirect->modify_one_email($val, false); - } - break; + case "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->cleanErrors($val); + } + break; case "add_alias": - XDB::execute("INSERT INTO aliases (id,alias,type) VALUES ({?}, {?}, 'alias')", - $mr['user_id'], Env::v('email')); + global $globals; + $alias = trim(Env::v('email')); + if (strpos($alias, '@') !== false) { + list($alias, $domain) = explode('@', $alias); + } else { + $domain = $globals->mail->domain; + } + if (!preg_match('/[-a-z0-9\.]+/s', $alias)) { + $page->trig("'$alias' n'est pas un alias valide"); + } + if ($domain == $globals->mail->alias_dom || $domain == $globals->mail->alias_dom2) { + $req = new AliasReq($mr['user_id'], $alias, 'Admin request', false); + if ($req->commit()) { + $page->trig("Nouvel alias '$alias@$domain' attribué"); + } else { + $page->trig("Impossible d'ajouter l'alias '$alias@$domain', il est probablement déjà attribué"); + } + } elseif ($domain == $globals->mail->domain || $domain == $globals->mail->domain2) { + if (XDB::execute("INSERT INTO aliases (id,alias,type) VALUES ({?}, {?}, 'alias')", + $mr['user_id'], $alias)) { + $page->trig("Nouvel alias '$alias' ajouté"); + } else { + $page->trig("Impossible d'ajouter l'alias '$alias', il est probablement déjà attribué"); + } + } else { + $page->trig("Le domaine '$domain' n'est pas valide"); + } break; case "best": @@ -466,50 +503,60 @@ class AdminModule extends PLModule // Editer un profil case "u_edit": - require_once('secure_hash.inc.php'); - $pass_encrypted = Env::v('newpass_clair') != "********" ? hash_encrypt(Env::v('newpass_clair')) : Env::v('passw'); - $naiss = Env::v('naissanceN'); - $deces = Env::v('decesN'); - $perms = Env::v('permsN'); - $prenm = Env::v('prenomN'); - $nom = Env::v('nomN'); - $promo = Env::i('promoN'); - $sexe = Env::v('sexeN'); - $comm = trim(Env::v('commentN')); - $watch = Env::v('watchN'); - $flags = ''; - if ($sexe) { - $flags = 'femme'; - } - if ($watch) { - if ($flags) { - $flags .= ','; + require_once('secure_hash.inc.php'); + $pass_encrypted = Env::v('newpass_clair') != "********" ? hash_encrypt(Env::v('newpass_clair')) : Env::v('passw'); + $naiss = Env::v('naissanceN'); + $deces = Env::v('decesN'); + $perms = Env::v('permsN'); + $prenm = Env::v('prenomN'); + $nom = Env::v('nomN'); + $promo = Env::i('promoN'); + $sexe = Env::v('sexeN'); + $comm = trim(Env::v('commentN')); + $watch = Env::v('watchN'); + $flags = ''; + if ($sexe) { + $flags = 'femme'; + } + if ($watch) { + if ($flags) { + $flags .= ','; + } + $flags .= 'watch'; } - $flags .= 'watch'; - } - if ($watch && !$comm) { - $page->trig("Il est nécessaire de mettre un commentaire pour surveiller un compte"); - break; - } + if ($watch && !$comm) { + $page->trig("Il est nécessaire de mettre un commentaire pour surveiller un compte"); + break; + } - $query = "UPDATE auth_user_md5 SET - naissance = '$naiss', - deces = '$deces', - password = '$pass_encrypted', - perms = '$perms', - prenom = '".addslashes($prenm)."', - nom = '".addslashes($nom)."', - flags = '$flags', - promo = $promo, - comment = '".addslashes($comm)."' - WHERE user_id = '{$mr['user_id']}'"; - if (XDB::execute($query)) { + $watch = 'SELECT naissance, deces, password, perms, + prenom, nom, flags, promo, comment + FROM auth_user_md5 + WHERE user_id = ' . $mr['user_id']; + $res = XDB::query($watch); + $old_fields = $res->fetchOneAssoc(); + $query = "UPDATE auth_user_md5 SET + naissance = '$naiss', + deces = '$deces', + password = '$pass_encrypted', + perms = '$perms', + prenom = '".addslashes($prenm)."', + nom = '".addslashes($nom)."', + flags = '$flags', + promo = $promo, + comment = '".addslashes($comm)."' + WHERE user_id = '{$mr['user_id']}'"; + if (XDB::execute($query)) { user_reindex($mr['user_id']); + $res = XDB::query($watch); + $new_fields = $res->fetchOneAssoc(); + $mailer = new PlMailer("admin/mail_intervention.tpl"); $mailer->assign("user", S::v('forlife')); - $mailer->assign("query", $query); + $mailer->assign('old', $old_fields); + $mailer->assign('new', $new_fields); $mailer->send(); $page->trig("updaté correctement."); @@ -550,21 +597,19 @@ class AdminModule extends PLModule $page->assign('lastlogin', $lastlogin); $page->assign('host', $host); - $res = XDB::query("SELECT alias - FROM virtual - INNER JOIN virtual_redirect USING(vid) - WHERE type = 'user' AND redirect LIKE '" . $login . "@%'"); - if ($res->numRows()) { - $page->assign('virtual', $res->fetchOneCell()); - } + $res = XDB::iterator("SELECT alias + FROM virtual + INNER JOIN virtual_redirect USING(vid) + WHERE type = 'user' AND redirect LIKE '" . $mr['forlife'] . "@%'"); + $page->assign('virtuals', $res); $page->assign('aliases', XDB::iterator( "SELECT alias, type='a_vie' AS for_life,FIND_IN_SET('bestalias',flags) AS best,expire FROM aliases WHERE id = {?} AND type!='homonyme' ORDER BY type!= 'a_vie'", $mr["user_id"])); - if ($mr['perms'] != 'pending') { - $page->assign('emails',$redirect->emails); + if ($mr['perms'] != 'pending' && isset($redirect)) { + $page->assign('emails', $redirect->emails); } $page->assign('mr',$mr); @@ -588,7 +633,7 @@ class AdminModule extends PLModule { if (Env::has('promo')) { if(Env::i('promo') > 1900 && Env::i('promo') < 2050) { - $action = Env::v('valid_promo') == 'Ajouter des membres' ? 'add' : 'ax'; + $action = Env::v('valid_promo') == 'Ajouter des membres' ? 'add' : 'ax'; pl_redirect('admin/promo/' . $action . '/' . Env::i('promo')); } else { $page->trig('Promo non valide'); @@ -606,7 +651,7 @@ class AdminModule extends PLModule $importer->registerFunction('matricule', 'matricle Ecole vers X.org', array($this, 'getMatricule')); switch ($action) { case 'add': - $fields = array('nom', 'nom_ini', 'prenom', + $fields = array('nom', 'nom_ini', 'prenom', 'naissance_ini', 'prenom_ini', 'promo', 'promo_sortie', 'flags', 'matricule', 'matricule_ax', 'perms'); $importer->forceValue('promo', $promo); @@ -788,11 +833,14 @@ class AdminModule extends PLModule } } - function handler_validate(&$page, $action = 'list', $id = null) { + function handler_validate(&$page, $action = 'list', $id = null) + { $page->changeTpl('admin/valider.tpl'); $page->assign('xorg_title','Polytechnique.org - Administration - Valider une demande'); - $page->addCssLink('nl.css'); - require_once("validations.inc.php"); + $page->addCssLink('nl.css'); + $page->addJsLink('ajax.js'); + require_once("validations.inc.php"); + if ($action == 'edit' and !is_null($id)) { $page->assign('preview_id', $id); @@ -824,6 +872,7 @@ class AdminModule extends PLModule $page->assign('vit', new ValidateIterator()); } + function handler_validate_answers(&$page, $action = 'list', $id = null) { $page->assign('xorg_title','Polytechnique.org - Administration - Réponses automatiques de validation'); $page->assign('title', 'Gestion des réponses automatiques'); @@ -889,10 +938,14 @@ class AdminModule extends PLModule $table_editor->apply($page, $action, $id); } - function handler_wiki(&$page, $action='list') + function handler_wiki(&$page, $action='list', $wikipage='', $wikipage2='') { require_once 'wiki.inc.php'; + if (S::v('core_rss_hash')) { + $page->setRssLink('Changement Récents', + '/Site/AllRecentChanges?action=rss&user=' . S::v('forlife') . '&hash=' . S::v('core_rss_hash')); + } // update wiki perms if ($action == 'update') { $perms_read = Post::v('read'); @@ -911,6 +964,26 @@ class AdminModule extends PLModule } } + if ($action == 'delete' && $wikipage != '') { + if (wiki_delete_page($wikipage)) { + $page->trig("La page ".$wikipage." a été supprimée."); + } else { + $page->trig("Impossible de supprimer la page ".$wikipage."."); + } + } + + if ($action == 'rename' && $wikipage != '' && $wikipage2 != '' && $wikipage != $wikipage2) { + if ($changedLinks = wiki_rename_page($wikipage, $wikipage2)) { + $s = 'La page '.$wikipage.' a été déplacée en '.$wikipage2.'.'; + if (is_numeric($changedLinks)) { + $s .= $changedLinks.' lien'.(($changedLinks>1)?'s ont été modifiés.':' a été modifié.'); + } + $page->trig($s); + } else { + $page->trig("Impossible de déplacer la page ".$wikipage); + } + } + $perms = wiki_perms_options(); // list wiki pages and their perms @@ -938,17 +1011,16 @@ class AdminModule extends PLModule $wiki_tree[$cat][$name] = $desc; } - - $page->changeTpl('admin/wiki.tpl'); + $page->addJsLink('jquery.js'); $page->assign('wiki_pages', $wiki_tree); $page->assign('perms_opts', $perms); } function handler_ipwatch(&$page, $action = 'list', $ip = null) - { + { $page->changeTpl('admin/ipwatcher.tpl'); - + $states = array('safe' => 'Ne pas surveiller', 'unsafe' => 'Surveiller les inscriptions', 'dangerous' => 'Surveiller tous les accès', @@ -961,15 +1033,15 @@ class AdminModule extends PLModule Xdb::execute('INSERT IGNORE INTO ip_watch (ip, state, detection, last, uid, description) VALUES ({?}, {?}, CURDATE(), NOW(), {?}, {?})', trim(Post::v('ipN')), Post::v('stateN'), S::i('uid'), Post::v('descriptionN')); - }; - break; - - case 'edit': - Xdb::execute('UPDATE ip_watch + }; + break; + + case 'edit': + Xdb::execute('UPDATE ip_watch SET state = {?}, last = NOW(), uid = {?}, description = {?} WHERE ip = {?}', Post::v('stateN'), S::i('uid'), Post::v('descriptionN'), Post::v('ipN')); break; - + default: if ($action == 'delete' && !is_null($ip)) { Xdb::execute('DELETE FROM emails_watch WHERE ip = {?}', $ip); @@ -1013,7 +1085,7 @@ class AdminModule extends PLModule $sql = "SELECT w.detection, w.state, w.last, w.description, a1.alias AS edit, a2.alias AS forlife, s.host FROM ip_watch AS w - LEFT JOIN aliases AS a1 ON (a1.id = w.uid AND a1.type = 'a_vie') + LEFT JOIN aliases AS a1 ON (a1.id = w.uid AND a1.type = 'a_vie') LEFT JOIN logger.sessions AS s ON (w.ip = s.ip) LEFT JOIN aliases AS a2 ON (a2.id = s.uid AND a2.type = 'a_vie') WHERE w.ip = {?} @@ -1039,6 +1111,23 @@ class AdminModule extends PLModule $page->assign('ip', $props); } } + + function handler_icons(&$page) + { + $page->changeTpl('admin/icons.tpl'); + $dh = opendir('../htdocs/images/icons'); + if (!$dh) { + $page->trig('Dossier des icones introuvables.'); + } + $icons = array(); + while (($file = readdir($dh)) !== false) { + if (strlen($file) > 4 && substr($file,-4) == '.gif') { + array_push($icons, substr($file, 0, -4)); + } + } + sort($icons); + $page->assign('icons', $icons); + } } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: