Merge commit 'origin/master' into fusionax
[platal.git] / modules / xnetgrp.php
index b361dac..4454a63 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'),
         );
     }
 
@@ -232,13 +225,22 @@ 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');
             }
-            if (S::has_perms()) {
+            $site = trim(Post::v('site'));
+            if ($site && ($site != "http://")) {
+                $scheme = parse_url($site, PHP_URL_SCHEME);
+                if (!$scheme) {
+                    $site = "http://" . $site;
+                }
+            } else {
+                $site = "";
+            }
+            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(
@@ -251,7 +253,7 @@ class XnetGrpModule extends PLModule
                       WHERE  id={?}",
                       Post::v('nom'), Post::v('diminutif'),
                       Post::v('cat'), Post::i('dom'),
-                      Post::v('descr'), Post::v('site'),
+                      Post::v('descr'), $site,
                       Post::v('mail'), Post::v('resp'),
                       Post::v('forum'), Post::v('mail_domain'),
                       Post::has('ax'), Post::v('pub'),
@@ -265,13 +267,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'), Post::v('site'),
+                      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'));
             }
@@ -288,16 +289,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)
@@ -308,6 +304,7 @@ class XnetGrpModule extends PLModule
         $mmlist = new MMList(S::v('uid'), S::v('password'),
                            $globals->asso('mail_domain'));
         $page->assign('listes', $mmlist->get_lists());
+        $page->assign('user', S::user());
         $page->addJsLink('ajax.js');
 
         if (Post::has('send')) {
@@ -322,12 +319,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);
         }
     }
@@ -398,7 +401,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;
             }
         }
@@ -478,8 +481,9 @@ class XnetGrpModule extends PLModule
         $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);
+        $vcard = new VCard($photos == 'photos', 'Membre du groupe ' . $globals->asso('nom'));
+        $vcard->addUsers($res->fetchColumn());
+        $vcard->show();
     }
 
     function handler_csv(&$page, $filename = null)
@@ -522,23 +526,25 @@ class XnetGrpModule extends PLModule
     {
         global $globals;
         $this->removeSubscriptionRequest($user->id());
-        XDB::execute("INSERT INTO  groupex.membres (asso_id, uid)
-                           VALUES  ({?}, {?})",
+        XDB::execute("INSERT IGNORE INTO  groupex.membres (asso_id, uid)
+                                  VALUES  ({?}, {?})",
                      $globals->asso('id'), $user->id());
-        $mailer = new PlMailer();
-        $mailer->addTo($user->forlifeEmail());
-        $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
-        $mailer->setSubject('[' . $globals->asso('nom') . '] Demande d\'inscription');
-        $message = ($user->isFemale() ? 'Chère' : '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"
-                 . "-- \n"
-                 . S::user()->fullName() . '.';
-        $mailer->setTxtBody($message);
-        $mailer->send();
+        if (XDB::affectedRows() == 1) {
+            $mailer = new PlMailer();
+            $mailer->addTo($user->forlifeEmail());
+            $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
+            $mailer->setSubject('[' . $globals->asso('nom') . '] Demande d\'inscription');
+            $message = ($user->isFemale() ? 'Chère' : '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"
+                     . "-- \n"
+                     . S::user()->fullName() . '.';
+            $mailer->setTxtBody($message);
+            $mailer->send();
+        }
     }
 
     function handler_subscribe(&$page, $u = null)
@@ -575,7 +581,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();
 
@@ -591,7 +597,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);
@@ -600,7 +606,7 @@ class XnetGrpModule extends PLModule
         }
 
         if (is_member()) {
-            $page->kill("Tu es déjà membre !");
+            $page->kill("Tu es déjà membre&nbsp;!");
             return;
         }
 
@@ -642,7 +648,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"
@@ -801,8 +808,8 @@ class XnetGrpModule extends PLModule
                                 $market->add();
                             }
                         }
-                        XDB::execute('INSERT INTO groupex.membres (uid, asso_id, origine, email)
-                                           VALUES ({?}, {?}, "X", {?})',
+                        XDB::execute('REPLACE INTO  groupex.membres (uid, asso_id, origine, email)
+                                            VALUES  ({?}, {?}, "X", {?})',
                                      $uid, $globals->asso('id'), $email);
                         $this->removeSubscriptionRequest($uid);
                         pl_redirect("member/$email");
@@ -811,13 +818,13 @@ class XnetGrpModule extends PLModule
                 } else {
                     $res = XDB::query('SELECT MAX(uid)+1 FROM groupex.membres');
                     $uid = max(intval($res->fetchOneCell()), 50001);
-                    XDB::execute('INSERT INTO  groupex.membres (uid,asso_id,origine,email)
-                                            VALUES({?},{?},"ext",{?})', $uid,
-                                            $globals->asso('id'), $email);
+                    XDB::execute('REPLACE INTO  groupex.membres (uid, asso_id, origine, email)
+                                        VALUES  ({?}, {?}, "ext", {?})',
+                                 $uid, $globals->asso('id'), $email);
                     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.");
             }
         }
     }
@@ -957,9 +964,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;!");
         }
     }
 
@@ -1085,7 +1092,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.');