Merge branch 'xorg/maint' into xorg/master
[platal.git] / modules / lists.php
index 8b417e0..8a5ccb9 100644 (file)
@@ -26,25 +26,25 @@ class ListsModule extends PLModule
     function handlers()
     {
         return array(
-            'lists'              => $this->make_hook('lists',     AUTH_MDP),
-            'lists/ajax'         => $this->make_hook('ajax',      AUTH_MDP,    'user', NO_AUTH),
-            'lists/create'       => $this->make_hook('create',    AUTH_MDP,    'lists'),
-
-            'lists/members'      => $this->make_hook('members',   AUTH_COOKIE),
-            'lists/csv'          => $this->make_hook('csv',       AUTH_COOKIE),
-            'lists/annu'         => $this->make_hook('annu',      AUTH_COOKIE),
-            'lists/archives'     => $this->make_hook('archives',  AUTH_COOKIE),
+            'lists'              => $this->make_hook('lists',     AUTH_PASSWD, 'user'),
+            'lists/ajax'         => $this->make_hook('ajax',      AUTH_PASSWD, 'user', NO_AUTH),
+            'lists/create'       => $this->make_hook('create',    AUTH_PASSWD, 'lists'),
+
+            'lists/members'      => $this->make_hook('members',   AUTH_COOKIE, 'user'),
+            'lists/csv'          => $this->make_hook('csv',       AUTH_COOKIE, 'user'),
+            'lists/annu'         => $this->make_hook('annu',      AUTH_COOKIE, 'user'),
+            'lists/archives'     => $this->make_hook('archives',  AUTH_COOKIE, 'user'),
             'lists/archives/rss' => $this->make_hook('rss',       AUTH_PUBLIC, 'user', NO_HTTPS),
 
-            'lists/moderate'     => $this->make_hook('moderate',  AUTH_MDP),
-            'lists/admin'        => $this->make_hook('admin',     AUTH_MDP),
-            'lists/options'      => $this->make_hook('options',   AUTH_MDP),
-            'lists/delete'       => $this->make_hook('delete',    AUTH_MDP),
+            'lists/moderate'     => $this->make_hook('moderate',  AUTH_PASSWD, 'user'),
+            'lists/admin'        => $this->make_hook('admin',     AUTH_PASSWD, 'user'),
+            'lists/options'      => $this->make_hook('options',   AUTH_PASSWD, 'user'),
+            'lists/delete'       => $this->make_hook('delete',    AUTH_PASSWD, 'user'),
 
-            'lists/soptions'     => $this->make_hook('soptions',  AUTH_MDP),
-            'lists/check'        => $this->make_hook('check',     AUTH_MDP),
-            'admin/lists'        => $this->make_hook('admin_all', AUTH_MDP,    'admin'),
-            'admin/aliases'      => $this->make_hook('aaliases',  AUTH_MDP,    'admin')
+            'lists/soptions'     => $this->make_hook('soptions',  AUTH_PASSWD, 'user'),
+            'lists/check'        => $this->make_hook('check',     AUTH_PASSWD, 'user'),
+            'admin/lists'        => $this->make_hook('admin_all', AUTH_PASSWD, 'admin'),
+            'admin/aliases'      => $this->make_hook('aaliases',  AUTH_PASSWD, 'admin')
         );
     }
 
@@ -61,6 +61,19 @@ class ListsModule extends PLModule
         return $globals->mail->domain;
     }
 
+    function verify_list_owner($page, $liste)
+    {
+        if (list(, , $owners) = $this->client->get_members($liste)) {
+            if (!(in_array(S::user()->forlifeEmail(), $owners) || S::admin())) {
+                $page->kill("La liste n'existe pas ou tu n'as pas le droit de l'administrer.");
+            }
+        } else {
+            $page->kill("La liste n'existe pas ou tu n'as pas le droit de l'administrer.<br />"
+                      . " Si tu penses qu'il s'agit d'une erreur, "
+                      . "<a href='mailto:support@polytechnique.org'>contact le support</a>.");
+        }
+    }
+
     function get_pending_ops($domain, $list)
     {
         list($subs,$mails) = $this->client->get_pending_ops($list);
@@ -346,11 +359,11 @@ class ListsModule extends PLModule
         $this->prepare_client($page);
         $members = $this->client->get_members($liste);
         $list = list_fetch_basic_info(list_extract_members($members[1]));
-        pl_cached_content_headers('text/x-csv', 1);
+        pl_cached_content_headers('text/x-csv', 'iso-8859-1', 1);
 
-        echo "email,nom,promo\n";
-        echo implode("\n", $list);
-        exit;
+        echo utf8_decode("Nom;Prénom;Promotion\n");
+        echo utf8_decode(implode("\n", $list));
+        exit();
     }
 
     function handler_annu($page, $liste = null, $action = null, $subaction = null)
@@ -399,8 +412,7 @@ class ListsModule extends PLModule
         if (empty($GLOBALS['IS_XNET_SITE'])) {
             $view->addMod('minifiche', 'Mini-fiches', false);
         }
-        // TODO: Reactivate when the new map is completed.
-        // $view->addMod('geoloc', 'Planisphère');
+        $view->addMod('map', 'Planisphère');
         $view->apply("lists/annu/$liste", $page, $action, $subaction);
 
         $page->changeTpl('lists/annu.tpl');
@@ -484,6 +496,7 @@ class ListsModule extends PLModule
         }
 
         $domain = $this->prepare_client($page);
+        $this->verify_list_owner($page, $liste);
 
         $page->changeTpl('lists/moderate.tpl');
 
@@ -603,6 +616,17 @@ class ListsModule extends PLModule
         }
 
         $domain = $this->prepare_client($page);
+        $force_rights = false;
+        if ($GLOBALS['IS_XNET_SITE']) {
+            $perms = S::v('perms');
+            if (is_object($perms) && $perms->hasFlag('groupadmin')) {
+                $force_rights = true;
+            }
+        }
+        $page->assign('group_admin', $force_rights);
+        if (!$force_rights) {
+            $this->verify_list_owner($page, $liste);
+        }
 
         $page->changeTpl('lists/admin.tpl');
 
@@ -619,8 +643,9 @@ class ListsModule extends PLModule
 
                   case 'marketu': case 'markets':
                     require_once 'emails.inc.php';
+                    $user = User::get($uids[$key]);
                     $mail = valide_email($mails[$key]);
-                    if (isvalid_email_redirection($mail)) {
+                    if (isvalid_email_redirection($mail, $user)) {
                         $from = ($action == 'marketu') ? 'user' : 'staff';
                         $market = Marketing::get($uids[$key], $mail);
                         if (!$market) {
@@ -638,34 +663,52 @@ class ListsModule extends PLModule
             }
         }
 
-        if (Env::has('add_member')) {
+        if (Env::has('add_member') ||
+            isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
             S::assert_xsrf_token();
 
-            $members = User::getBulkForlifeEmails(Env::v('add_member'),
+            if (isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
+                $upload =& PlUpload::get($_FILES['add_member_file'], S::user()->login(), 'list.addmember', true);
+                if (!$upload) {
+                    $page->trigError("Une erreur s'est produite lors du téléchargement du fichier.");
+                } else {
+                    $logins = $upload->getContents();
+                }
+            } else {
+                $logins = Env::v('add_member');
+            }
+
+            $logins = preg_split("/[; ,\r\n\|]+/", $logins);
+            $members = User::getBulkForlifeEmails($logins,
                                                   true,
                                                   array('ListsModule', 'no_login_callback'));
+            $unfound = array_diff_key($logins, $members);
+
+            // Make sure we send a list (array_values) of unique (array_unique)
+            // emails.
+            $members = array_values(array_unique($members));
+
             $arr = $this->client->mass_subscribe($liste, $members);
+
+            $successes = array();
             if (is_array($arr)) {
                 foreach($arr as $addr) {
+                    $successes[] = $addr[1];
                     $page->trigSuccess("{$addr[0]} inscrit.");
                 }
             }
-        }
 
-        if (isset($_FILES['add_member_file']) && $_FILES['add_member_file']['tmp_name']) {
-            S::assert_xsrf_token();
+            $already = array_diff($members, $successes);
+            if (is_array($already)) {
+                foreach ($already as $item) {
+                    $page->trigWarning($item . ' est déjà inscrit.');
+                }
+            }
 
-            $upload =& PlUpload::get($_FILES['add_member_file'], S::user()->login(), 'list.addmember', true);
-            if (!$upload) {
-                $page->trigError('Une erreur s\'est produite lors du téléchargement du fichier');
-            } else {
-                $members = User::getBulkForlifeEmails($upload->getContents(),
-                                                      true,
-                                                      array('ListsModule', 'no_login_callback'));
-                $arr = $this->client->mass_subscribe($liste, $members);
-                if (is_array($arr)) {
-                    foreach($arr as $addr) {
-                        $page->trigSuccess("{$addr[0]} inscrit.");
+            if (is_array($unfound)) {
+                foreach ($unfound as $item) {
+                    if (trim($item) != '') {
+                        $page->trigError($item . " ne correspond pas à un compte existant et n'est pas une adresse email.");
                     }
                 }
             }
@@ -722,7 +765,6 @@ class ListsModule extends PLModule
             $page->assign_by_ref('members', $membres);
             $page->assign_by_ref('owners',  $moderos);
             $page->assign('np_m', count($mem));
-
         } else {
             $page->kill("La liste n'existe pas ou tu n'as pas le droit de l'administrer.<br />"
                       . " Si tu penses qu'il s'agit d'une erreur, "
@@ -737,6 +779,7 @@ class ListsModule extends PLModule
         }
 
         $this->prepare_client($page);
+        $this->verify_list_owner($page, $liste);
 
         $page->changeTpl('lists/options.tpl');
 
@@ -805,6 +848,7 @@ class ListsModule extends PLModule
         }
 
         $domain = $this->prepare_client($page);
+        $this->verify_list_owner($page, $liste);
         $page->changeTpl('lists/delete.tpl');
         if (Post::v('valid') == 'OUI') {
             S::assert_xsrf_token();
@@ -839,6 +883,7 @@ class ListsModule extends PLModule
         }
 
         $this->prepare_client($page);
+        $this->verify_list_owner($page, $liste);
 
         $page->changeTpl('lists/soptions.tpl');
 
@@ -868,6 +913,7 @@ class ListsModule extends PLModule
         }
 
         $this->prepare_client($page);
+        $this->verify_list_owner($page, $liste);
 
         $page->changeTpl('lists/check.tpl');