+ function handler_index(&$page, $arg = null)
+ {
+ global $globals, $platal;
+
+ if (!is_null($arg)) {
+ return PL_NOT_FOUND;
+ }
+ $page->changeTpl('xnetgrp/asso.tpl');
+
+ if (S::logged()) {
+ if (Env::has('read')) {
+ XDB::query('DELETE r.*
+ FROM groupex.announces_read AS r
+ INNER JOIN groupex.announces AS a ON a.id = r.announce_id
+ WHERE peremption < CURRENT_DATE()');
+ XDB::query('INSERT INTO groupex.announces_read
+ VALUES ({?}, {?})',
+ Env::i('read'), S::i('uid'));
+ pl_redirect("");
+ }
+ if (Env::has('unread')) {
+ XDB::query('DELETE FROM groupex.announces_read
+ WHERE announce_id={?} AND user_id={?}',
+ Env::i('unread'), S::i('uid'));
+ pl_redirect("#art" . Env::i('unread'));
+ }
+ $arts = XDB::iterator("SELECT a.*, u.nom, u.prenom, u.promo, l.alias AS forlife
+ FROM groupex.announces AS a
+ INNER JOIN auth_user_md5 AS u USING(user_id)
+ INNER JOIN aliases AS l ON (u.user_id = l.id AND l.type = 'a_vie')
+ 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()
+ 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.*, u.nom, u.prenom, u.promo
+ FROM groupex.announces AS a
+ INNER JOIN auth_user_md5 AS u USING(user_id)
+ WHERE asso_id = {?} AND peremption >= CURRENT_DATE()
+ AND FIND_IN_SET('public', u.flags)",
+ $globals->asso('id'));
+ }
+
+ if (!S::has('core_rss_hash')) {
+ $page->setRssLink("Polytechnique.net :: {$globals->asso("nom")} :: News publiques",
+ "rss/rss.xml");
+ } else {
+ $page->setRssLink("Polytechnique.net :: {$globals->asso("nom")} :: News",
+ 'rss/'.S::v('forlife') .'/'.S::v('core_rss_hash').'/rss.xml');
+ }
+
+ $page->register_modifier('wiki_to_html', array('MiniWiki','WikiToHTML'));
+ $page->assign('articles', $arts);
+
+ $page->assign('asso', $globals->asso());
+ }
+
+ function handler_logo(&$page)
+ {
+ global $globals;
+
+ $res = XDB::query("SELECT logo, logo_mime
+ FROM groupex.asso WHERE id = {?}",
+ $globals->asso('id'));
+ list($logo, $logo_mime) = $res->fetchOneRow();
+
+ if (!empty($logo)) {
+ header("Content-type: $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');
+ }
+
+ exit;
+ }
+
+ function handler_site(&$page)
+ {
+ global $globals;
+ $site = $globals->asso('site');
+ if (!$site) {
+ $page->trig('Le groupe n\'a pas de site web');
+ return $this->handler_index($page);
+ }
+ http_redirect($site);
+ exit;
+ }
+
+ function handler_edit(&$page)
+ {
+ global $globals;
+ $page->changeTpl('xnetgrp/edit.tpl');
+
+ if (Post::has('submit')) {
+ if (S::has_perms()) {
+ if (Post::v('mail_domain') && (strstr(Post::v('mail_domain'), '.') === false)) {
+ $page->trig("le domaine doit être un FQDN (aucune modif effectuée) !!!");
+ return;
+ }
+ XDB::execute(
+ "UPDATE groupex.asso
+ SET nom={?}, diminutif={?}, cat={?}, dom={?},
+ descr={?}, site={?}, mail={?}, resp={?},
+ forum={?}, mail_domain={?}, ax={?}, pub={?},
+ sub_url={?}, inscriptible={?}, unsub_url={?}
+ WHERE id={?}",
+ Post::v('nom'), Post::v('diminutif'),
+ Post::v('cat'), Post::i('dom'),
+ Post::v('descr'), Post::v('site'),
+ Post::v('mail'), Post::v('resp'),
+ Post::v('forum'), Post::v('mail_domain'),
+ Post::has('ax'), Post::has('pub')?'private':'public',
+ Post::v('sub_url'), Post::v('inscriptible'),
+ Post::v('unsub_url'),$globals->asso('id'));
+ if (Post::v('mail_domain')) {
+ XDB::execute('INSERT INTO virtual_domains (domain) VALUES({?})',
+ Post::v('mail_domain'));
+ }
+ } else {
+ XDB::execute(
+ "UPDATE groupex.asso
+ SET descr={?}, site={?}, mail={?}, resp={?},
+ forum={?}, ax={?}, pub= {?}, sub_url={?},
+ unsub_url={?}
+ WHERE id={?}",
+ Post::v('descr'), Post::v('site'),
+ Post::v('mail'), Post::v('resp'),
+ Post::v('forum'), Post::has('ax'),
+ Post::has('pub')?'private':'public',
+ Post::v('sub_url'), Post::v('unsub_url'),
+ $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'));
+ }
+
+ pl_redirect('../'.Post::v('diminutif', $globals->asso('diminutif')).'/edit');
+ }
+
+ if (S::has_perms()) {
+ $dom = XDB::iterator('SELECT * FROM groupex.dom ORDER BY nom');
+ $page->assign('dom', $dom);
+ $page->assign('super', true);
+ }
+ }
+
+ function handler_mail(&$page)
+ {
+ global $globals;
+
+ $page->changeTpl('xnetgrp/mail.tpl');
+ $mmlist = new MMList(S::v('uid'), S::v('password'),
+ $globals->asso('mail_domain'));
+ $page->assign('listes', $mmlist->get_lists());
+ $page->addJsLink('ajax.js');
+
+ if (Post::has('send')) {
+ $from = Post::v('from');
+ $sujet = Post::v('sujet');
+ $body = Post::v('body');
+
+ $mls = array_keys(Env::v('ml', array()));
+ $mbr = array_keys(Env::v('membres', array()));
+
+ require_once dirname(__FILE__) . '/xnetgrp/mail.inc.php';
+ $tos = get_all_redirects($mbr, $mls, $mmlist);
+ $upload = PlUpload::get($_FILES['uploaded'], S::v('forlife'), 'xnet.emails', true);
+ send_xnet_mails($from, $sujet, $body, Env::v('wiki'), $tos, Post::v('replyto'), $upload, @$_FILES['uploaded']['name']);
+ if ($upload) {
+ $upload->rm();
+ }
+ $page->kill("Mail envoyé !");
+ $page->assign('sent', true);
+ }
+ }
+
+ function handler_forum(&$page, $group = null, $artid = null)
+ {
+ global $globals;
+ $page->changeTpl('xnetgrp/forum.tpl');
+ if (!$globals->asso('forum')) {
+ return PL_NOT_FOUND;
+ }
+ require_once 'banana/forum.inc.php';
+ $get = array();
+ get_banana_params($get, $globals->asso('forum'), $group, $artid);
+ run_banana($page, 'ForumsBanana', $get);
+ }
+
+ function handler_annuaire(&$page, $action = null, $subaction = null)
+ {
+ global $globals;
+
+ if ($action == 'geoloc' || $action == 'trombi') {
+ $view = new UserSet();
+ $view->addMod('trombi', 'Trombinoscope');
+ $view->addMod('geoloc', 'Planisphère');
+ $view->apply('annuaire', $page, $action, $subaction);
+ if ($action == 'geoloc' && $subaction) {
+ return;
+ }
+ }
+ $page->changeTpl('xnetgrp/annuaire.tpl');
+
+ $sort = Env::v('order');
+ switch (Env::v('order')) {
+ case 'promo' : $group = 'promo'; $tri = 'promo_o DESC, nom, prenom'; break;
+ case 'promo_inv': $group = 'promo'; $tri = 'promo_o, nom, prenom'; break;
+ case 'alpha_inv': $group = 'initiale'; $tri = 'nom DESC, prenom DESC, promo'; break;
+ default : $group = 'initiale'; $tri = 'nom, prenom, promo'; $sort = 'alpha';
+ }
+ $page->assign('sort', $sort);
+
+ if ($group == 'initiale') {
+ $res = XDB::iterRow(
+ 'SELECT UPPER(SUBSTRING(
+ IF(m.origine="X", IF(u.nom_usage<>"", u.nom_usage, u.nom),m.nom),
+ 1, 1)) as letter, COUNT(*)
+ FROM groupex.membres AS m
+ LEFT JOIN auth_user_md5 AS u ON ( u.user_id = m.uid)
+ WHERE asso_id = {?} and (u.perms != \'pending\' OR u.perms IS NULL)
+ GROUP BY letter
+ ORDER BY letter', $globals->asso('id'));
+ } else {
+ $res = XDB::iterRow(
+ 'SELECT IF(m.origine="X",u.promo,
+ IF(m.origine="ext", "extérieur", "personne morale")) AS promo,
+ COUNT(*), IF(m.origine="X",u.promo,"") AS promo_o
+ FROM groupex.membres AS m
+ LEFT JOIN auth_user_md5 AS u ON ( u.user_id = m.uid )
+ WHERE asso_id = {?}
+ GROUP BY promo
+ ORDER BY promo_o DESC', $globals->asso('id'));
+ }
+ $alphabet = array();
+ $nb_tot = 0;
+ while (list($char, $nb) = $res->next()) {
+ $alphabet[] = $char;
+ $nb_tot += $nb;
+ if (Env::has($group) && $char == strtoupper(Env::v($group))) {
+ $tot = $nb;
+ }
+ }
+ $page->assign('group', $group);
+ $page->assign('request_group', Env::v($group));
+ $page->assign('only_admin', Env::has('admin'));
+ $page->assign('alphabet', $alphabet);
+ $page->assign('nb_tot', $nb_tot);
+
+ $ofs = Env::i('offset');
+ $tot = Env::v($group) ? $tot : $nb_tot;
+ $nbp = intval(($tot-1)/NB_PER_PAGE);
+ $links = array();
+ if ($ofs) {
+ $links['précédent'] = $ofs-1;
+ }
+ for ($i = 0; $i <= $nbp; $i++) {
+ $links[(string)($i+1)] = $i;
+ }
+ if ($ofs < $nbp) {
+ $links['suivant'] = $ofs+1;
+ }
+ if (count($links)>1) {
+ $page->assign('links', $links);
+ }
+
+ $ini = '';
+ if (Env::has('initiale')) {
+ $ini = 'AND IF(m.origine="X",
+ IF(u.nom_usage<>"", u.nom_usage, u.nom),
+ m.nom) LIKE "'.addslashes(Env::v('initiale')).'%"';
+ } elseif (Env::has('promo')) {
+ $ini = 'AND IF(m.origine="X", u.promo, IF(m.origine="ext", "extérieur", "personne morale")) = "'
+ .addslashes(Env::v('promo')).'"';
+ } elseif (Env::has('admin')) {
+ $ini = 'AND m.perms = "admin"';
+ }
+
+ $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',u.promo,'') AS promo_o,
+ IF(m.origine='X' AND u.perms != 'pending',a.alias,m.email) AS email,
+ IF(m.origine='X',FIND_IN_SET('femme', u.flags), m.sexe) AS femme,
+ m.perms='admin' AS admin,
+ m.origine='X' AS x,
+ u.perms!='pending' AS inscrit,
+ m.uid, IF(e.email IS NULL,NULL,1) AS actif
+ FROM groupex.membres AS m
+ LEFT JOIN auth_user_md5 AS u ON ( u.user_id = m.uid )
+ LEFT JOIN aliases AS a ON ( a.id = m.uid AND a.type='a_vie' )
+ LEFT JOIN emails AS e ON ( e.flags = 'active' AND e.uid = m.uid)
+ WHERE m.asso_id = {?} $ini
+ AND (m.origine != 'X' OR u.perms != 'pending' OR m.email IS NOT NULL)
+ GROUP BY m.uid
+ ORDER BY $tri
+ LIMIT {?},{?}", $globals->asso('id'), $ofs*NB_PER_PAGE, NB_PER_PAGE);
+ $page->assign('ann', $ann);
+ $page->jsonAssign('ann', $ann);
+ }
+
+ function handler_trombi(&$page)
+ {
+ pl_redirect('annuaire/trombi');
+ }
+
+ function handler_geoloc(&$page)
+ {
+ pl_redirect('annuaire/geoloc');
+ }
+
+ function handler_vcard(&$page, $photos = null)
+ {
+ global $globals;
+ $res = XDB::query('SELECT uid
+ FROM groupex.membres
+ WHERE asso_id = {?}', $globals->asso('id'));
+ $vcard = new VCard($res->fetchColumn(), $photos == 'photos', 'Membre du groupe ' . $globals->asso('nom'));
+ $vcard->do_page($page);
+ }
+
+ function handler_subscribe(&$page, $u = null)
+ {
+ global $globals;
+ $page->changeTpl('xnetgrp/inscrire.tpl');
+
+ if (!$globals->asso('inscriptible'))
+ $page->kill("Il n'est pas possible de s'inscire en ligne à ce "
+ ."groupe. Essaie de joindre le contact indiqué "
+ ."sur la page de présentation.");
+
+ if (!is_null($u) && may_update()) {
+ $page->assign('u', $u);
+ $res = XDB::query("SELECT nom, prenom, promo, user_id
+ FROM auth_user_md5 AS u
+ INNER JOIN aliases AS al ON (al.id = u.user_id
+ AND al.type != 'liste')
+ WHERE al.alias = {?}", $u);
+
+ if (list($nom, $prenom, $promo, $uid) = $res->fetchOneRow()) {
+ $res = XDB::query("SELECT COUNT(*)
+ FROM groupex.membres AS m
+ INNER JOIN aliases AS a ON (m.uid = a.id
+ AND a.type != 'homonyme')
+ WHERE a.alias = {?} AND m.asso_id = {?}",
+ $u, $globals->asso('id'));
+ $n = $res->fetchOneCell();
+ if ($n) {
+ $page->kill("$prenom $nom est déjà membre du groupe !");
+ return;
+ }
+ elseif (Env::has('accept'))
+ {
+ XDB::execute("INSERT INTO groupex.membres
+ VALUES ({?}, {?}, 'membre', 'X', NULL, NULL, NULL, NULL, NULL)",
+ $globals->asso('id'), $uid);
+ $mailer = new PlMailer();
+ $mailer->addTo("$u@polytechnique.org");
+ $mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
+ .'" <'.S::v('forlife').'@polytechnique.org>');
+ $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription');
+ $message = "Cher Camarade,\n"
+ . "\n"
+ . " Suite à ta demande d'adhésion à ".$globals->asso('nom').",\n"
+ . "j'ai le plaisir de t'annoncer que ton inscription a été validée !\n"
+ . "\n"
+ . "Bien cordialement,\n"
+ . "{$_SESSION["prenom"]} {$_SESSION["nom"]}.";
+ $mailer->setTxtBody($message);
+ $mailer->send();
+ $page->kill("$prenom $nom a bien été inscrit");
+ }
+ elseif (Env::has('refuse'))
+ {
+ $mailer = new PlMailer();
+ $mailer->addTo("$u@polytechnique.org");
+ $mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
+ .'" <'.S::v('forlife').'@polytechnique.org>');
+ $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription annulée');
+ $mailer->setTxtBody(Env::v('motif'));
+ $mailer->send();
+ $page->kill("la demande $prenom $nom a bien été refusée");
+ } else {
+ $page->assign('show_form', true);
+ $page->assign('prenom', $prenom);
+ $page->assign('nom', $nom);
+ $page->assign('promo', $promo);
+ $page->assign('uid', $uid);
+ }
+ return;
+ }
+ return PL_NOT_FOUND;
+ }
+
+ if (is_member()) {
+ $page->kill("tu es déjà membre !");
+ return;
+ }
+
+ if (Post::has('inscrire')) {
+ $res = XDB::query('SELECT IF(m.email IS NULL,
+ CONCAT(al.alias,"@polytechnique.org"),
+ m.email)
+ FROM groupex.membres AS m
+ INNER JOIN aliases AS al ON (al.type = "a_vie"
+ AND al.id = m.uid)
+ WHERE perms="admin" AND m.asso_id = {?}',
+ $globals->asso('id'));
+ $emails = $res->fetchColumn();
+ $to = implode(',', $emails);
+
+ $append = "\n"
+ . "-- \n"
+ . "Ce message a été envoyé suite à la demande d'inscription de\n"
+ . S::v('prenom').' '.S::v('nom').' (X'.S::v('promo').")\n"
+ . "Via le site www.polytechnique.net. Tu peux choisir de valider ou\n"
+ . "de refuser sa demande d'inscription depuis la page :\n"
+ .
+ "http://www.polytechnique.net/".$globals->asso("diminutif")."/subscribe/"
+ .S::v('forlife')."\n"
+ . "\n"
+ . "En cas de problème, contacter l'équipe de Polytechnique.org\n"
+ . "à l'adresse : support@polytechnique.org\n";
+
+ if (!$to) {
+ $to = $globals->asso("mail").", support@polytechnique.org";
+ $append = "\n-- \nLe groupe ".$globals->asso("nom")
+ ." n'a pas d'administrateur, l'équipe de"
+ ." Polytechnique.org a été prévenue et va rapidement"
+ ." résoudre ce problème.\n";
+ }
+
+ $mailer = new PlMailer();
+ $mailer->addTo($to);
+ $mailer->setFrom('"'.S::v('prenom').' '.S::v('nom')
+ .'" <'.S::v('forlife').'@polytechnique.org>');
+ $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription');
+ $mailer->setTxtBody(Post::v('message').$append);
+ $mailer->send();
+ }
+ }
+
+ function handler_change_rights(&$page)
+ {
+ if (Env::has('right') && (may_update() || S::has('suid'))) {
+ switch (Env::v('right')) {
+ case 'admin':
+ XnetSession::killSuid();
+ break;
+ case 'anim':
+ XnetSession::doSelfSuid();
+ may_update(true);
+ is_member(true);
+ break;
+ case 'member':
+ XnetSession::doSelfSuid();
+ may_update(false, true);
+ is_member(true);
+ break;
+ case 'logged':
+ XnetSession::doSelfSuid();
+ may_update(false, true);
+ is_member(false, true);
+ break;
+ }
+ }
+ pl_redirect("");
+ }
+
+ function handler_admin_annuaire(&$page)
+ {
+ global $globals;
+
+ require_once dirname(__FILE__) . '/xnetgrp/mail.inc.php';
+ $page->changeTpl('xnetgrp/annuaire-admin.tpl');
+ $mmlist = new MMList(S::v('uid'), S::v('password'),
+ $globals->asso('mail_domain'));
+ $lists = $mmlist->get_lists();
+ if (!$lists) $lists = array();
+ $listes = array_map(create_function('$arr', 'return $arr["list"];'), $lists);
+
+ $subscribers = array();
+
+ foreach ($listes as $list) {
+ list(,$members) = $mmlist->get_members($list);
+ $mails = array_map(create_function('$arr', 'return $arr[1];'), $members);
+ $subscribers = array_unique(array_merge($subscribers, $mails));
+ }
+
+ $not_in_group_x = array();
+ $not_in_group_ext = array();
+
+ foreach ($subscribers as $mail) {
+ $res = XDB::query(
+ 'SELECT COUNT(*)
+ FROM groupex.membres AS m
+ LEFT JOIN auth_user_md5 AS u ON (m.uid=u.user_id AND m.uid<50000)
+ LEFT JOIN aliases AS a ON (a.id=u.user_id and a.type="a_vie")
+ WHERE asso_id = {?} AND
+ (m.email = {?} OR CONCAT(a.alias, "@polytechnique.org") = {?})',
+ $globals->asso('id'), $mail, $mail);
+ if ($res->fetchOneCell() == 0) {
+ if (strstr($mail, '@polytechnique.org') === false) {
+ $not_in_group_ext[] = $mail;
+ } else {
+ $not_in_group_x[] = $mail;
+ }
+ }
+ }
+
+ $page->assign('not_in_group_ext', $not_in_group_ext);
+ $page->assign('not_in_group_x', $not_in_group_x);
+ $page->assign('lists', $lists);
+ }
+
+ function handler_admin_member_new(&$page, $email = null)