Serves javascript file from a per-version directory, to prevent cross-version caching...
[platal.git] / modules / xnetgrp.php
index 53b7667..187151d 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2009 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -73,41 +73,34 @@ class XnetGrpModule extends PLModule
     function handlers()
     {
         return array(
-            '%grp'                => $this->make_hook('index',     AUTH_PUBLIC),
-            '%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/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/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),
-            '%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),
-
-            '%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, 'user', NO_AUTH),
-            '%grp/member/del'
-                 => $this->make_hook('admin_member_del', AUTH_MDP, 'groupadmin'),
-
-            '%grp/rss'             => $this->make_hook('rss', AUTH_PUBLIC, 'user', NO_HTTPS),
-            '%grp/announce/new'    => $this->make_hook('edit_announce', AUTH_MDP,  'groupadmin'),
-            '%grp/announce/edit'   => $this->make_hook('edit_announce', AUTH_MDP,  'groupadmin'),
-            '%grp/announce/photo'  => $this->make_hook('photo_announce', AUTH_PUBLIC),
-            '%grp/admin/announces' => $this->make_hook('admin_announce', AUTH_MDP, 'groupadmin'),
+            '%grp'                 => $this->make_hook('index',                 AUTH_PUBLIC),
+            '%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/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/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),
+            '%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),
+            '%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,    'user', NO_AUTH),
+            '%grp/member/del'      => $this->make_hook('admin_member_del',      AUTH_MDP,    'groupadmin'),
+
+            '%grp/rss'             => $this->make_hook('rss',                   AUTH_PUBLIC, 'user', NO_HTTPS),
+            '%grp/announce/new'    => $this->make_hook('edit_announce',         AUTH_MDP,    'groupadmin'),
+            '%grp/announce/edit'   => $this->make_hook('edit_announce',         AUTH_MDP,    'groupadmin'),
+            '%grp/announce/photo'  => $this->make_hook('photo_announce',        AUTH_PUBLIC),
+            '%grp/admin/announces' => $this->make_hook('admin_announce',        AUTH_MDP,    'groupadmin'),
         );
     }
 
@@ -193,22 +186,12 @@ class XnetGrpModule extends PLModule
                           $globals->asso('id'));
         list($logo, $logo_mime) = $res->fetchOneRow();
 
+        pl_cached_dynamic_content_headers(empty($logo) ? "image/jpeg" : $logo_mime);
         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');
+            readfile(dirname(__FILE__) . '/../htdocs/images/dflt_carre.jpg');
         }
-
         exit;
     }
 
@@ -232,7 +215,7 @@ class XnetGrpModule extends PLModule
         if (Post::has('submit')) {
             S::assert_xsrf_token();
 
-            $flags = new PlFlagSet('wiki_desc');
+            $flags = new PlFlagSet();
             if (Post::has('notif_unsub') && Post::i('notif_unsub') == 1) {
                 $flags->addFlag('notif_unsub');
             }
@@ -245,9 +228,9 @@ class XnetGrpModule extends PLModule
             } else {
                 $site = "";
             }
-            if (S::has_perms()) {
+            if (S::admin()) {
                 if (Post::v('mail_domain') && (strstr(Post::v('mail_domain'), '.') === false)) {
-                    $page->trigError("le domaine doit être un FQDN (aucune modif effectuée) !!!");
+                    $page->trigError('Le domaine doit être un FQDN (aucune modification effectuée)&nbsp;!!!');
                     return;
                 }
                 XDB::execute(
@@ -274,13 +257,12 @@ class XnetGrpModule extends PLModule
                 XDB::execute(
                     "UPDATE  groupex.asso
                         SET  descr={?}, site={?}, mail={?}, resp={?},
-                             forum={?}, ax={?}, pub= {?}, sub_url={?},
+                             forum={?}, pub= {?}, sub_url={?},
                              unsub_url={?},flags={?}
                       WHERE  id={?}",
                       Post::v('descr'), $site,
                       Post::v('mail'), Post::v('resp'),
-                      Post::v('forum'), Post::has('ax'),
-                      Post::v('pub'),
+                      Post::v('forum'), Post::v('pub'),
                       Post::v('sub_url'), Post::v('unsub_url'),
                       $flags, $globals->asso('id'));
             }
@@ -297,16 +279,11 @@ class XnetGrpModule extends PLModule
             pl_redirect('../'.Post::v('diminutif', $globals->asso('diminutif')).'/edit');
         }
 
-        if (S::has_perms()) {
+        if (S::admin()) {
             $dom = XDB::iterator('SELECT * FROM groupex.dom ORDER BY nom');
             $page->assign('dom', $dom);
             $page->assign('super', true);
         }
-        if (!$globals->asso('wiki_desc') && $globals->asso('descr')) {
-            $page->trigWarning("Attention, le format de la description a changé et utilise désormais la syntaxe wiki "
-                      . "intégrée au site. Il te faudra probablement adapter le formatage du texte actuel pour "
-                      . "qu'il s'affiche correctement avec cette nouvelle syntaxe.");
-        }
     }
 
     function handler_mail(&$page)
@@ -332,12 +309,18 @@ class XnetGrpModule extends PLModule
             $this->load('mail.inc.php');
             set_time_limit(120);
             $tos = get_all_redirects($mbr,  $mls, $mmlist);
+
             $upload = PlUpload::get($_FILES['uploaded'], S::user()->login(), 'xnet.emails', true);
+            if (!$upload && @$_FILES['uploaded']['name'] && PlUpload::$lastError != null) {
+                $page->trigError(PlUpload::$lastError);
+                return;
+            }
+
             send_xnet_mails($from, $sujet, $body, Env::v('wiki'), $tos, Post::v('replyto'), $upload, @$_FILES['uploaded']['name']);
             if ($upload) {
                 $upload->rm();
             }
-            $page->kill("Email envoyé !");
+            $page->killSuccess("Email envoyé&nbsp;!");
             $page->assign('sent', true);
         }
     }
@@ -408,7 +391,7 @@ class XnetGrpModule extends PLModule
         while (list($char, $nb) = $res->next()) {
             $alphabet[] = $char;
             $nb_tot += $nb;
-            if (Env::has($group) && $char == strtoupper(Env::v($group))) {
+            if (Env::has($group) && $char == mb_strtoupper(Env::v($group))) {
                 $tot = $nb;
             }
         }
@@ -514,9 +497,7 @@ class XnetGrpModule extends PLModule
                  GROUP BY  m.uid
                  ORDER BY  nom, prenom",
                  $globals->mail->domain, $globals->asso('id'));
-        header('Content-Type: text/x-csv; charset=utf-8;');
-        header('Pragma: ');
-        header('Cache-Control: ');
+        pl_content_headers("text/x-csv");
         $page->changeTpl('xnetgrp/annuaire-csv.tpl', NO_SKIN);
         $page->assign('ann', $ann);
     }
@@ -588,7 +569,7 @@ class XnetGrpModule extends PLModule
             // Handles the membership request.
             if ($already_member) {
                 $this->removeSubscriptionRequest($user->id());
-                $page->kill($user->fullName() . " est déjà membre du groupe !");
+                $page->kill($user->fullName() . ' est déjà membre du groupe&nbsp;!');
             } elseif (Env::has('accept')) {
                 S::assert_xsrf_token();
 
@@ -604,7 +585,7 @@ class XnetGrpModule extends PLModule
                 $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription annulée');
                 $mailer->setTxtBody(Env::v('motif'));
                 $mailer->send();
-                $page->kill("La demande de {$user->fullName()} a bien été refusée.");
+                $page->killSuccess("La demande de {$user->fullName()} a bien été refusée.");
             } else {
                 $page->assign('show_form', true);
                 $page->assign('reason', $reason);
@@ -613,7 +594,7 @@ class XnetGrpModule extends PLModule
         }
 
         if (is_member()) {
-            $page->kill("Tu es déjà membre !");
+            $page->kill("Tu es déjà membre&nbsp;!");
             return;
         }
 
@@ -655,7 +636,8 @@ class XnetGrpModule extends PLModule
                     . "à l'adresse : support@polytechnique.org\n";
 
             if (!$to) {
-                $to = $globals->asso("mail").", support@polytechnique.org";
+                $to = ($globals->asso('mail') != '') ? $globals->asso('mail') . ', ' : '';
+                $to .= '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"
@@ -830,14 +812,14 @@ class XnetGrpModule extends PLModule
                     pl_redirect("member/$email");
                 }
             } else {
-                $page->trigError("« <strong>$email</strong> » n'est pas une adresse email valide.");
+                $page->trigError("«&nbsp;<strong>$email</strong>&nbsp;» n'est pas une adresse email valide.");
             }
         }
     }
 
     function handler_admin_member_new_ajax(&$page)
     {
-        header('Content-Type: text/html; charset="UTF-8"');
+        pl_content_headers("text/html");
         $page->changeTpl('xnetgrp/membres-new-search.tpl', NO_SKIN);
         $res = null;
         if (Env::has('login')) {
@@ -970,9 +952,9 @@ class XnetGrpModule extends PLModule
         }
 
         if ($this->unsubscribe($user)) {
-            $page->trigSuccess("{$user['prenom']} {$user['nom']} a été désabonné du groupe !");
+            $page->trigSuccess("{$user['prenom']} {$user['nom']} a été désabonné du groupe&nbsp;!");
         } else {
-            $page->trigWarning("{$user['prenom']} {$user['nom']} a été désabonné du groupe, mais des erreurs subsistent !");
+            $page->trigWarning("{$user['prenom']} {$user['nom']} a été désabonné du groupe, mais des erreurs subsistent&nbsp;!");
         }
     }
 
@@ -1098,7 +1080,7 @@ class XnetGrpModule extends PLModule
                             $perms ? 'admin' : 'membre', $comm,
                             $user['uid'], $globals->asso('id'));
                 if ($perms != $user['perms']) {
-                    $page->trigSuccess('Permissions modifiées !');
+                    $page->trigSuccess('Permissions modifiées&nbsp;!');
                 }
                 if ($comm != $user['comm']) {
                     $page->trigSuccess('Commentaire mis à jour.');
@@ -1201,20 +1183,20 @@ class XnetGrpModule extends PLModule
             $res = XDB::query("SELECT * FROM groupex.announces_photo WHERE eid = {?}", $eid);
             if ($res->numRows()) {
                 $photo = $res->fetchOneAssoc();
-                header('Content-Type: image/' . $photo['attachmime']);
+                pl_cached_dynamic_content_headers("image/" . $photo['attachmime']);
                 echo $photo['attach'];
                 exit;
             }
         } else {
             $upload = new PlUpload(S::user()->login(), 'xnetannounce');
             if ($upload->exists() && $upload->isType('image')) {
-                header('Content-Type: ' . $upload->contentType());
+                pl_cached_dynamic_content_headers($upload->contentType());
                 echo $upload->getContents();
                 exit;
             }
         }
         global $globals;
-        header('Content-Type: image/png');
+        pl_cached_dynamic_content_headers("image/png");
         echo file_get_contents($globals->spoolroot . '/htdocs/images/logo.png');
         exit;
     }