diff -urN cahier-de-prepa4.0.3/admin/docs.php cahier-de-prepa4.0.4/admin/docs.php
--- cahier-de-prepa4.0.3/admin/docs.php	2014-08-30 23:27:51.512191421 +0200
+++ cahier-de-prepa4.0.4/admin/docs.php	2014-09-20 15:05:44.805288387 +0200
@@ -177,7 +177,7 @@
 
   // Récupération des données relatives au document
   if ( $id )  {
-    $resultat = $mysqli->query("SELECT nom, protection, ext, lien FROM docs WHERE id = $id AND parent = $rid");
+    $resultat = $mysqli->query("SELECT nom, protection, ext, lien, parent FROM docs WHERE id = $id AND FIND_IN_SET(matiere,'0,${_SESSION['matieres']}')");
     if ( $resultat->num_rows )  {
       $doc = $resultat->fetch_assoc();
       $resultat->free();
@@ -222,7 +222,7 @@
         ) ? " L'accès au document <em>${doc['nom']}</em> a bien été modifié." : " L'accès au document <em>${doc['nom']}</em> n'a pas pu être modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
 
       // Déplacement dans un autre répertoire
-      if ( is_numeric($parent = $_REQUEST['parent']) && ( $parent != $rid ) )  {
+      if ( is_numeric($parent = $_REQUEST['parent']) && ( $parent != $doc['parent'] ) )  {
         $resultat = $mysqli->query("SELECT parents, matiere FROM reps WHERE id = $parent AND FIND_IN_SET(matiere,'0,${_SESSION['matieres']}')");
         if ( $resultat->num_rows )  {
           $r = $resultat->fetch_assoc();
@@ -246,7 +246,7 @@
           if ( $doc['protection'] == 4 )
             recent($mysqli,3,$id,"<img class=\"icone\" src=\"icones/$icone.png\"> $path","download?id=$id","<p>Nouveau document&nbsp;: <a href=\"download?id=$id\">$path</a></p>");
           // Document auparavant visible : on met à jour les chemins, sans mettre en avant le document
-          // Remarque : le RSS n'est pas modifié, le sera leur d'une nouvelle information récente
+          // Remarque : le RSS n'est pas modifié, le sera lors d'une nouvelle information récente
           // Le lien de téléchargement est de toutes façons inchangé
           else
             $mysqli->query("UPDATE recents SET texte = '<p>Nouveau document&nbsp;: <a href=\"download?id=$id\">$path</a></p>', titre = '<img class=\"icone\" src=\"icones/$icone.png\"> $path' WHERE id = 3000+$id");
@@ -309,7 +309,8 @@
   elseif ( isset($_REQUEST['envoie']) )  {
     // Vérifications des données envoyées (on fait confiance aux utilisateurs connectés pour ne pas envoyer de scripts malsains)
     $nom = $_FILES['fichier']['name'];
-    $ext = ( strpos($nom,'.') ) ? strrchr($nom,'.') : '';
+    // $est ne doit pas faire plus de 4 caractères sinon fichier plus accessible
+    $ext = ( strpos($nom,'.') ) ? substr(strrchr($nom,'.'),0,4) : '';
     setlocale(LC_CTYPE, "fr_FR.UTF-8");
     $nom = basename(str_replace('/','-',str_replace($ext,'', ( strlen($_REQUEST['nom']) ) ? $_REQUEST['nom'] : $nom )));
     $protection = ( in_array($_REQUEST['protection'],array(0,1,2,3,4)) ) ? $_REQUEST['protection'] : 0;
@@ -357,9 +358,9 @@
   }
   
   // Mise à jour des champs nbrep/nbdoc dans la table 'reps'
-  $mysqli->query('UPDATE reps AS r SET 
-    nbrep = (SELECT COUNT(id) FROM (SELECT * FROM reps ) AS r1 WHERE r.id = r1.parent),
-    nbrep_v = (SELECT COUNT(id) FROM (SELECT * FROM reps WHERE reps.protection<4) AS r2 WHERE r.id = r2.parent),
+  $mysqli->query('UPDATE reps AS r SET
+    nbrep = IFNULL((SELECT n FROM (SELECT COUNT(id) AS n, parent FROM reps GROUP BY parent) AS r1 WHERE r.id = r1.parent),0),
+    nbrep_v =IFNULL((SELECT n FROM (SELECT COUNT(id) AS n, parent FROM reps WHERE reps.protection<4 GROUP BY parent) AS r1 WHERE r.id =r1.parent),0),
     nbdoc = (SELECT COUNT(id) FROM docs AS d WHERE r.id = d.parent),
     nbdoc_v = (SELECT COUNT(id) FROM docs AS d WHERE r.id = d.parent AND d.protection<4)');
   $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
diff -urN cahier-de-prepa4.0.3/admin/mail.php cahier-de-prepa4.0.4/admin/mail.php
--- cahier-de-prepa4.0.3/admin/mail.php	2014-09-02 14:39:02.663470526 +0200
+++ cahier-de-prepa4.0.4/admin/mail.php	2014-09-19 23:44:59.135520519 +0200
@@ -27,10 +27,11 @@
   case 1 : $g = 'M. '; break;
   case 2 : $g = 'Mme '; break;
   case 3 : $g = 'Melle '; break;
+  default : $g = '';
 }
 switch ( $u['mailexp'] )  {
-  case 1 : $exp = "$g ${u['nom']}"; break;
-  case 2 : $exp = "$g ${u['prenom']} ${u['nom']}"; break;
+  case 1 : $exp = "$g${u['nom']}"; break;
+  case 2 : $exp = "$g${u['prenom']} ${u['nom']}"; break;
   case 3 : $exp = "${u['prenom']} ${u['nom']}"; break;
   case 4 : $exp = "${u['nom']}"; break;
 }
diff -urN cahier-de-prepa4.0.3/admin/notes-saisie.php cahier-de-prepa4.0.4/admin/notes-saisie.php
--- cahier-de-prepa4.0.3/admin/notes-saisie.php	2014-08-30 23:15:13.864167176 +0200
+++ cahier-de-prepa4.0.4/admin/notes-saisie.php	2014-09-19 11:14:46.734080116 +0200
@@ -176,14 +176,15 @@
     </p>
 FIN;
   // Affichage des élèves
-  $select_notes = '        <option value="x"></option><option value="a">Absent</option><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option>';
+  $select_notes = '<option value="a">Absent</option><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option>';
   $eleves = $GLOBALS['eleves'];
   $notes = array_combine(explode(',',$r['eleves']),explode(',',$r['notes']));
   foreach ( $eleves as $eleve )  {
     $id = $eleve['id'];
     echo "
     <p class=\"ligne\"><label for=\"eleve${id}_$s\">${eleve['nom']}</label>
-      <select id=\"eleve${id}_$s\" name=\"notes[$id]\">\n";
+      <select id=\"eleve${id}_$s\" name=\"notes[$id]\">
+        <option value=\"x\">${eleve['nom']}</option>";
     echo ( isset($notes[$id]) ) ? str_replace("\"${notes[$id]}\"","\"${notes[$id]}\" selected",$select_notes) : $select_notes;
     echo "\n      </select>\n    </p>";
   }
diff -urN cahier-de-prepa4.0.3/admin/pages.php cahier-de-prepa4.0.4/admin/pages.php
--- cahier-de-prepa4.0.3/admin/pages.php	2014-08-31 09:25:03.513338050 +0200
+++ cahier-de-prepa4.0.4/admin/pages.php	2014-09-15 23:14:40.936403093 +0200
@@ -144,7 +144,7 @@
     $id = 0;
 
   // Pour les informations récentes
-  $lien_recent = 'pages?'.addslashes($page['cle']);
+  $lien_recent = '?'.addslashes($page['cle']);
 
   // Traitement d'un ajout/modification
   if ( isset($_REQUEST['modifie']) && strlen($_REQUEST['texte']) )  {
diff -urN cahier-de-prepa4.0.3/admin/prefs.php cahier-de-prepa4.0.4/admin/prefs.php
--- cahier-de-prepa4.0.3/admin/prefs.php	2014-08-26 22:21:02.293003883 +0200
+++ cahier-de-prepa4.0.4/admin/prefs.php	2014-09-19 23:31:33.387494735 +0200
@@ -346,10 +346,11 @@
     case 1 : $g = 'M. '; break;
     case 2 : $g = 'Mme '; break;
     case 3 : $g = 'Melle '; break;
+    default : $g = '';
   }
   $select_mailexp = str_replace("\"${u['mailexp']}\"","\"${u['mailexp']}\" selected","
-        <option value=\"1\">$g ${u['nom']}</option>
-        <option value=\"2\">$g ${u['prenom']} ${u['nom']}</option>
+        <option value=\"1\">$g${u['nom']}</option>
+        <option value=\"2\">$g${u['prenom']} ${u['nom']}</option>
         <option value=\"3\">${u['prenom']} ${u['nom']}</option>
         <option value=\"3\">${u['nom']}</option>");
 }
diff -urN cahier-de-prepa4.0.3/admin/utilisateurs.php cahier-de-prepa4.0.4/admin/utilisateurs.php
--- cahier-de-prepa4.0.3/admin/utilisateurs.php	2014-08-26 17:42:35.388469260 +0200
+++ cahier-de-prepa4.0.4/admin/utilisateurs.php	2014-09-03 00:20:39.856587241 +0200
@@ -124,7 +124,7 @@
                                     FROM utilisateurs AS u1 WHERE id = $u AND login RLIKE '^tmp[0-9]{5}'");
         if ( $resultat->num_rows )  {
           $r = $resultat->fetch_assoc();
-          $login = ( $r['n'] ) ? $r['l'].$r['n'] : $r['l'];
+          $login = ( $r['n'] ) ? $mysqli->real_escape_string($r['l'].$r['n']) : $mysqli->real_escape_string($r['l']);
           if ( requete('utilisateurs',"UPDATE utilisateurs SET login = '$login' WHERE id = $u") )  {
             $liste[] = $r['prenom'].' '.$r['nom'];
             if ( strlen($r['mail']) )
diff -urN cahier-de-prepa4.0.3/cdt.php cahier-de-prepa4.0.4/cdt.php
--- cahier-de-prepa4.0.3/cdt.php	2014-08-27 02:16:32.785456061 +0200
+++ cahier-de-prepa4.0.4/cdt.php	2014-09-19 17:03:41.226750023 +0200
@@ -44,6 +44,8 @@
   $mois = array('','janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre');
   return $semaine[substr($date,0,1)].' '.substr($date,7).' '.$mois[intval(substr($date,5,2))].' '.substr($date,1,4);
 }
+// Remarque : génère une erreur de redéfinition si on vient de se connecter
+// (->login.php) avec un mot de passe temporaire (->admin/fonctions.php)
 
 // Récupération de l'ensemble des semaines
 $resultat = $mysqli->query("SELECT id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, vacances FROM semaines");
diff -urN cahier-de-prepa4.0.3/CHANGELOG.php cahier-de-prepa4.0.4/CHANGELOG.php
--- cahier-de-prepa4.0.3/CHANGELOG.php	2014-09-02 16:06:37.779638691 +0200
+++ cahier-de-prepa4.0.4/CHANGELOG.php	2014-09-20 15:40:15.013354634 +0200
@@ -1,4 +1,4 @@
-Version actuelle : 4.0.3 (02/09/14)
+Version actuelle : 4.0.4 (20/09/14)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -129,22 +129,32 @@
 4.0.1 31/08/14 Correction de divers bugs et fautes dans l'aide
 4.0.2 02/09/14 Correction de bug (erreur de syntaxe)
 4.0.3 02/09/14 Correction de bug (réinitialisation des mots de passe)
+4.0.4 20/09/14 Correction de bugs multiples (merci O. Bouverot, E. Saudrais)
 ===================
 
 Todo :
 
 [ 4.1 ] Novembre 2014
+ * Envoi de mail pour les colleurs
  * Gestion des groupes de colles
  * Gestion des informations récentes : suppression/modification
  * Récupération des notes de colles en .xls
+ * Retour d'un compte invité au mot de passe non modifiable
+ * Bug : modification de matière -> modification du nom de répertoire principal
+ * Bug : gestion des informations récentes lors des suppressions/modifications
+  massives (nom de répertoire...)
+ * Bug : supprimer les notes, les entrées de cahier de textes et les programmes
+  de colles lors de la modification du planning
 
 [ 4.2 ] Avril 2015
+ * Suppression multiple de documents
  * Récupération des documents en .zip
  * Version mobile
  * Agenda
  * Récupération des données de la base (via la sauvegarde)
 
 [ 5.0 ] Août 2015
+  * Identité visuelle : favicon, logo
   * Flux RSS multiples et paramétrables
   * Vérification des saisies de texte et aide au formatage en HTML, ajout
   automatique de balises <p>, suppression des lignes vides initiales/finales...
diff -urN cahier-de-prepa4.0.3/css/style.css cahier-de-prepa4.0.4/css/style.css
--- cahier-de-prepa4.0.3/css/style.css	2014-08-28 16:06:32.765814477 +0200
+++ cahier-de-prepa4.0.4/css/style.css	2014-09-19 11:10:15.886071449 +0200
@@ -102,8 +102,8 @@
 .admin h3 span, .aide h3 span { cursor: pointer; font-size: 0.9em; padding: 0 0.2em; border: 1px solid black; margin-left: 1em; }
 #aide_js p, p.boutons, p.ligne, p.symboles { padding: 0; width: 92%; margin: 0.5em 4% 0.2em; }
 input.ligne, textarea { width: 92%; margin: 0.5em 4% 0.2em; }
-p.ligne label { font-weight: 700; vertical-align: sub; }
-p.ligne input, p.ligne select, p.ligne code { width: 60%; float: right; margin-top: -0.2em; }
+p.ligne label { font-weight: 700; vertical-align: middle; }
+p.ligne input, p.ligne select, p.ligne code { width: 60%; float: right; margin-top: -0.1em; }
 p.ligne input[type="checkbox"] { width: 1em;}
 p.ligne code { padding-top: 0.4em; }
 p.ligne + textarea { margin-top: 0; }
diff -urN cahier-de-prepa4.0.3/download.php cahier-de-prepa4.0.4/download.php
--- cahier-de-prepa4.0.3/download.php	2014-08-04 01:35:34.161786739 +0200
+++ cahier-de-prepa4.0.4/download.php	2014-09-20 00:37:24.679621176 +0200
@@ -8,7 +8,7 @@
 ///////////////////////////////////
 
 // Récupération du lien
-if ( isset($_REQUEST['id']) && is_numeric($id = $_REQUEST['id']) )  {
+if ( isset($_REQUEST['id']) && ctype_digit($id = $_REQUEST['id']) )  {
   $mysqli = premiere_connexion();
   $resultat = $mysqli->query("SELECT d.id, d.parents, d.nom, d.lien, d.ext, d.protection, m.cle
                               FROM docs AS d LEFT JOIN matieres AS m ON d.matiere = m.id
diff -urN cahier-de-prepa4.0.3/haut.php cahier-de-prepa4.0.4/haut.php
--- cahier-de-prepa4.0.3/haut.php	2014-08-28 02:10:02.324208377 +0200
+++ cahier-de-prepa4.0.4/haut.php	2014-09-05 14:46:33.435779383 +0200
@@ -69,7 +69,7 @@
       $menu .= "\n      <a href=\"cdt?${r['cle']}\">Cahier de texte</a>";
     if ( $r['docs'] )  {
       $menu .= "\n      <a href=\"docs?${r['cle']}\">Documents à télécharger</a>";
-      $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1");
+      $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1 AND protection < 4");
       if ( $resultat_doc->num_rows )  {
         while ( $d = $resultat_doc->fetch_assoc() )
           $menu .= "\n        <a class=\"menurep\" href=\"docs?rep=${d['id']}\">${d['nom']}</a>";        
@@ -108,13 +108,7 @@
     break;
   // Si compte colleur/professeur
   default:
-    /*/ Si une seule matière, pas de matière à spécifier pour l'ajout de notes de colles
-    if ( is_numeric($_SESSION['matieres']) )  {
-      $resultat = $mysqli->query("SELECT cle FROM matieres WHERE id = ${_SESSION['matieres']}");
-      $r = $resultat->fetch_assoc();
-      $notes = "\n      <a href=\"notes?${r['cle']}\">Ajouter des notes de colles</a>";
-      $resultat->free();
-    }*/
+    // Si une seule matière, pas de matière à spécifier pour l'ajout de notes de colles
     if ( is_numeric($_SESSION['matieres']) )  {
       if ( substr($p,0,5) == 'notes' )
         $p = 'notes';
